diff --git a/arangod/Indexes/skiplist-helper.cpp b/arangod/Indexes/skiplist-helper.cpp index 67f339e837..4e62c24def 100644 --- a/arangod/Indexes/skiplist-helper.cpp +++ b/arangod/Indexes/skiplist-helper.cpp @@ -581,149 +581,6 @@ static bool skiplistIndex_findHelperIntervalIntersectionValid ( return skiplistIndex_findHelperIntervalValid(skiplistIndex, interval); } -static void SkiplistIndex_findHelper (SkiplistIndex* skiplistIndex, - TRI_vector_t const* shapeList, - TRI_index_operator_t const* indexOperator, - TRI_vector_t* resultIntervalList) { - TRI_skiplist_index_key_t values; - TRI_vector_t leftResult; - TRI_vector_t rightResult; - TRI_skiplist_iterator_interval_t interval; - triagens::basics::SkipListNode* temp; - - TRI_InitVector(&(leftResult), TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_skiplist_iterator_interval_t)); - TRI_InitVector(&(rightResult), TRI_UNKNOWN_MEM_ZONE, sizeof(TRI_skiplist_iterator_interval_t)); - - TRI_relation_index_operator_t* relationOperator = (TRI_relation_index_operator_t*) indexOperator; - TRI_logical_index_operator_t* logicalOperator = (TRI_logical_index_operator_t*) indexOperator; - - switch (indexOperator->_type) { - case TRI_EQ_INDEX_OPERATOR: - case TRI_LE_INDEX_OPERATOR: - case TRI_LT_INDEX_OPERATOR: - case TRI_GE_INDEX_OPERATOR: - case TRI_GT_INDEX_OPERATOR: - - values._fields = relationOperator->_fields; - values._numFields = relationOperator->_numFields; - break; // this is to silence a compiler warning - - default: { - // must not access relationOperator->xxx if the operator is not a - // relational one otherwise we'll get invalid reads and the prog - // might crash - } - } - - switch (indexOperator->_type) { - case TRI_AND_INDEX_OPERATOR: { - SkiplistIndex_findHelper(skiplistIndex, shapeList, logicalOperator->_left, &leftResult); - SkiplistIndex_findHelper(skiplistIndex, shapeList, logicalOperator->_right, &rightResult); - - size_t nl = TRI_LengthVector(&leftResult); - size_t nr = TRI_LengthVector(&rightResult); - for (size_t i = 0; i < nl; ++i) { - for (size_t j = 0; j < nr; ++j) { - auto tempLeftInterval = static_cast(TRI_AddressVector(&leftResult, i)); - auto tempRightInterval = static_cast(TRI_AddressVector(&rightResult, j)); - - if (skiplistIndex_findHelperIntervalIntersectionValid( - skiplistIndex, - tempLeftInterval, - tempRightInterval, - &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - } - } - TRI_DestroyVector(&leftResult); - TRI_DestroyVector(&rightResult); - return; - } - - - case TRI_EQ_INDEX_OPERATOR: { - temp = skiplistIndex->skiplist->leftKeyLookup(&values); - TRI_ASSERT(nullptr != temp); - interval._leftEndPoint = temp; - - bool const allAttributesCoveredByCondition = (values._numFields == skiplistIndex->_numFields); - - if (skiplistIndex->unique && allAttributesCoveredByCondition) { - // At most one hit: - temp = temp->nextNode(); - if (nullptr != temp) { - if (0 == CmpKeyElm(skiplistIndex, &values, temp->document())) { - interval._rightEndPoint = temp->nextNode(); - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, - &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - } - } - } - else { - temp = skiplistIndex->skiplist->rightKeyLookup(&values); - interval._rightEndPoint = temp->nextNode(); - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, - &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - } - return; - } - - case TRI_LE_INDEX_OPERATOR: { - interval._leftEndPoint = skiplistIndex->skiplist->startNode(); - temp = skiplistIndex->skiplist->rightKeyLookup(&values); - interval._rightEndPoint = temp->nextNode(); - - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - return; - } - - case TRI_LT_INDEX_OPERATOR: { - interval._leftEndPoint = skiplistIndex->skiplist->startNode(); - temp = skiplistIndex->skiplist->leftKeyLookup(&values); - interval._rightEndPoint = temp->nextNode(); - - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - return; - } - - case TRI_GE_INDEX_OPERATOR: { - temp = skiplistIndex->skiplist->leftKeyLookup(&values); - interval._leftEndPoint = temp; - interval._rightEndPoint = skiplistIndex->skiplist->endNode(); - - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - return; - } - - case TRI_GT_INDEX_OPERATOR: { - temp = skiplistIndex->skiplist->rightKeyLookup(&values); - interval._leftEndPoint = temp; - interval._rightEndPoint = skiplistIndex->skiplist->endNode(); - - if (skiplistIndex_findHelperIntervalValid(skiplistIndex, &interval)) { - TRI_PushBackVector(resultIntervalList, &interval); - } - return; - } - - default: { - TRI_ASSERT(false); - } - - } // end of switch statement -} - static void SkiplistIndex_findHelper (SkiplistIndex* skiplistIndex, TRI_index_operator_t const* indexOperator, TRI_vector_t* resultIntervalList) {