TRI_fulltext_list_t* TRI_CloneListFulltextIndex( TRI_fulltext_list_t const* source) { uint32_t numEntries; if (source == nullptr) { numEntries = 0; } else { numEntries = GetNumEntries(source); } TRI_fulltext_list_t* list = TRI_CreateListFulltextIndex(numEntries); if (list != nullptr) { if (numEntries > 0) { memcpy(GetStart(list), GetStart(source), numEntries * sizeof(TRI_fulltext_list_entry_t)); SetNumEntries(list, numEntries); } } return list; }
TRI_fulltext_list_t* TRI_CloneListFulltextIndex (const TRI_fulltext_list_t* const source) { TRI_fulltext_list_t* list; uint32_t numEntries; if (source == NULL) { numEntries = 0; } else { numEntries = GetNumEntries(source); } list = TRI_CreateListFulltextIndex(numEntries); if (list == NULL) { return NULL; } if (numEntries > 0) { memcpy(GetStart(list), GetStart(source), numEntries * sizeof(TRI_fulltext_list_entry_t)); SetNumEntries(list, numEntries); } return list; }
TRI_fulltext_list_t* TRI_IntersectListFulltextIndex(TRI_fulltext_list_t* lhs, TRI_fulltext_list_t* rhs) { TRI_fulltext_list_t* list; TRI_fulltext_list_entry_t last; TRI_fulltext_list_entry_t* lhsEntries; TRI_fulltext_list_entry_t* rhsEntries; TRI_fulltext_list_entry_t* listEntries; uint32_t l, r; uint32_t numLhs, numRhs; uint32_t listPos; // check if one of the pointers is NULL if (lhs == nullptr) { return rhs; } if (rhs == nullptr) { return lhs; } numLhs = GetNumEntries(lhs); numRhs = GetNumEntries(rhs); // printf("list intersection lhs: %lu rhs: %lu\n\n", (unsigned long) numLhs, // (unsigned long) numRhs); // check the easy cases when one of the lists is empty if (numLhs == 0 || numRhs == 0) { if (lhs != nullptr) { TRI_FreeListFulltextIndex(lhs); } if (rhs != nullptr) { TRI_FreeListFulltextIndex(rhs); } return TRI_CreateListFulltextIndex(0); } // we have at least one entry in each list list = TRI_CreateListFulltextIndex(numLhs < numRhs ? numLhs : numRhs); if (list == nullptr) { TRI_FreeListFulltextIndex(lhs); TRI_FreeListFulltextIndex(rhs); return nullptr; } SortList(lhs); lhsEntries = GetStart(lhs); l = 0; SortList(rhs); rhsEntries = GetStart(rhs); r = 0; listPos = 0; listEntries = GetStart(list); last = 0; while (true) { while (l < numLhs && lhsEntries[l] <= last) { ++l; } while (r < numRhs && rhsEntries[r] <= last) { ++r; } again: if (l >= numLhs || r >= numRhs) { break; } if (lhsEntries[l] < rhsEntries[r]) { ++l; goto again; } else if (lhsEntries[l] > rhsEntries[r]) { ++r; goto again; } // match listEntries[listPos++] = last = lhsEntries[l]; ++l; ++r; } SetNumEntries(list, listPos); SetIsSorted(list, true); TRI_FreeListFulltextIndex(lhs); TRI_FreeListFulltextIndex(rhs); // printf("result list has %lu\n\n", (unsigned long) listPos); return list; }
TRI_fulltext_list_t* TRI_UnioniseListFulltextIndex(TRI_fulltext_list_t* lhs, TRI_fulltext_list_t* rhs) { TRI_fulltext_list_t* list; TRI_fulltext_list_entry_t last; TRI_fulltext_list_entry_t* lhsEntries; TRI_fulltext_list_entry_t* rhsEntries; TRI_fulltext_list_entry_t* listEntries; uint32_t l, r; uint32_t numLhs, numRhs; uint32_t listPos; if (lhs == nullptr) { return rhs; } if (rhs == nullptr) { return lhs; } numLhs = GetNumEntries(lhs); numRhs = GetNumEntries(rhs); // check the easy cases when one of the lists is empty if (numLhs == 0) { TRI_FreeListFulltextIndex(lhs); return rhs; } if (numRhs == 0) { TRI_FreeListFulltextIndex(rhs); return lhs; } list = TRI_CreateListFulltextIndex(numLhs + numRhs); if (list == nullptr) { TRI_FreeListFulltextIndex(lhs); TRI_FreeListFulltextIndex(rhs); return nullptr; } SortList(lhs); lhsEntries = GetStart(lhs); l = 0; SortList(rhs); rhsEntries = GetStart(rhs); r = 0; listPos = 0; listEntries = GetStart(list); last = 0; while (true) { while (l < numLhs && lhsEntries[l] <= last) { ++l; } while (r < numRhs && rhsEntries[r] <= last) { ++r; } if (l >= numLhs && r >= numRhs) { break; } if (l >= numLhs && r < numRhs) { listEntries[listPos++] = last = rhsEntries[r++]; } else if (l < numLhs && r >= numRhs) { listEntries[listPos++] = last = lhsEntries[l++]; } else if (lhsEntries[l] < rhsEntries[r]) { listEntries[listPos++] = last = lhsEntries[l++]; } else { listEntries[listPos++] = last = rhsEntries[r++]; } } SetNumEntries(list, listPos); SetIsSorted(list, true); TRI_FreeListFulltextIndex(lhs); TRI_FreeListFulltextIndex(rhs); return list; }