@@ -371,15 +371,8 @@ Vector *NumericRangeNode_FindRange(NumericRangeNode *n, const NumericFilter *nf)
371371
372372void 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
508489NRN_AddRv NumericRangeTree_TrimEmptyLeaves (NumericRangeTree * t ) {
0 commit comments