Skip to content

Commit 7dfe6a2

Browse files
[2.10] Cleanup for the trimming tree logic (#5226)
Cleanup for the trimming tree logic (#5224) * fix trimming tree logic * make them const (cherry picked from commit f5d68e0) Co-authored-by: GuyAv46 <47632673+GuyAv46@users.noreply.github.com>
1 parent f396732 commit 7dfe6a2

1 file changed

Lines changed: 19 additions & 38 deletions

File tree

src/numeric_index.c

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,8 @@ Vector *NumericRangeNode_FindRange(NumericRangeNode *n, const NumericFilter *nf)
371371

372372
void NumericRangeNode_Free(NumericRangeNode *n, NRN_AddRv *rv) {
373373
if (!n) return;
374-
if (n->range) {
375-
rv->sz -= n->range->invertedIndexSize;
376-
InvertedIndex_Free(n->range->entries);
377-
array_free(n->range->values);
378-
rm_free(n->range);
379-
n->range = NULL;
380-
rv->numRanges--;
381-
}
382374

375+
removeRange(n, rv);
383376
NumericRangeNode_Free(n->left, rv);
384377
NumericRangeNode_Free(n->right, rv);
385378

@@ -446,7 +439,7 @@ void NumericRangeNode_Traverse(NumericRangeNode *n,
446439
#define CHILD_EMPTY 1
447440
#define CHILD_NOT_EMPTY 0
448441

449-
int NumericRangeNode_RemoveChild(NumericRangeNode **node, NRN_AddRv *rv) {
442+
bool NumericRangeNode_RemoveChild(NumericRangeNode **node, NRN_AddRv *rv) {
450443
NumericRangeNode *n = *node;
451444
// stop condition - we are at leaf
452445
if (NumericRangeNode_IsLeaf(n)) {
@@ -458,10 +451,8 @@ int NumericRangeNode_RemoveChild(NumericRangeNode **node, NRN_AddRv *rv) {
458451
}
459452

460453
// run recursively on both children
461-
int rvRight = NumericRangeNode_RemoveChild(&n->right, rv);
462-
int rvLeft = NumericRangeNode_RemoveChild(&n->left, rv);
463-
NumericRangeNode *rightChild = n->right;
464-
NumericRangeNode *leftChild = n->left;
454+
const bool rvRight = NumericRangeNode_RemoveChild(&n->right, rv);
455+
const bool rvLeft = NumericRangeNode_RemoveChild(&n->left, rv);
465456

466457
// balance if required
467458
if (rvRight == CHILD_NOT_EMPTY && rvLeft == CHILD_NOT_EMPTY) {
@@ -471,38 +462,28 @@ int NumericRangeNode_RemoveChild(NumericRangeNode **node, NRN_AddRv *rv) {
471462
return CHILD_NOT_EMPTY;
472463
}
473464

474-
rv->changed = 1;
475-
476-
// we can remove local and use child's instead
477-
if (n->range) {
478-
if (n->range->entries->numDocs != 0) {
479-
return CHILD_NOT_EMPTY;
480-
}
481-
removeRange(n, rv);
465+
if (n->range && n->range->entries->numDocs != 0) {
466+
// We are on a non-leaf node, with some data in it but some of its children are empty.
467+
// Ideally we would like to trim the empty children, but today we don't fix missing ranges
468+
// of inner nodes, so we better keep the node as is.
469+
// TODO: remove this block when we fix the missing ranges issue.
470+
return CHILD_NOT_EMPTY;
482471
}
483472

484-
// both children are empty, save one as parent
485-
if (rvRight == CHILD_EMPTY && rvLeft == CHILD_EMPTY) {
486-
rm_free(n);
487-
*node = rightChild;
488-
NumericRangeNode_Free(leftChild, rv);
489-
490-
return CHILD_EMPTY;
491-
}
473+
rv->changed = 1;
492474

493-
// one child is not empty, save copy as parent and free
475+
// at least one child is empty. keep an empty child and replace the parent with the other child
494476
if (rvRight == CHILD_EMPTY) {
495-
// right child is empty, save left as parent
496-
rm_free(n);
497-
*node = leftChild;
498-
NumericRangeNode_Free(rightChild, rv);
477+
// right child is empty, save left as parent (might be empty)
478+
*node = n->left;
479+
n->left = NULL; // avoid freeing it
499480
} else {
500481
// left child is empty, save right as parent
501-
rm_free(n);
502-
*node = rightChild;
503-
NumericRangeNode_Free(leftChild, rv);
482+
*node = n->right;
483+
n->right = NULL; // avoid freeing it
504484
}
505-
return CHILD_NOT_EMPTY;
485+
NumericRangeNode_Free(n, rv); // free the current node and its potential subtree
486+
return (rvRight == CHILD_NOT_EMPTY || rvLeft == CHILD_NOT_EMPTY) ? CHILD_NOT_EMPTY : CHILD_EMPTY;
506487
}
507488

508489
NRN_AddRv NumericRangeTree_TrimEmptyLeaves(NumericRangeTree *t) {

0 commit comments

Comments
 (0)