1
0
Fork 0

Merge branch 'aql-jmmh-conditions' of https://github.com/arangodb/arangodb into aql-jmmh-conditions

This commit is contained in:
Jan Steemann 2015-10-08 15:10:38 +02:00
commit c6c6ba8f6f
2 changed files with 86 additions and 60 deletions

View File

@ -1180,7 +1180,7 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
// We set an lower bound // We set an lower bound
TRI_ASSERT(lower == nullptr); TRI_ASSERT(lower == nullptr);
lower = value->toJsonValue(TRI_UNKNOWN_MEM_ZONE); lower = value->toJsonValue(TRI_UNKNOWN_MEM_ZONE);
includeUpper = includeBound; includeLower = includeBound;
} }
}; };
// This is not an equalityCheck, set lower or upper // This is not an equalityCheck, set lower or upper
@ -1210,53 +1210,72 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
searchValues.reserve(maxPermutations); searchValues.reserve(maxPermutations);
std::unique_ptr<TRI_index_operator_t> rangeOperator(nullptr); auto buildRangeOperator = [] (TRI_json_t* lowerBound,
bool lowerBoundInclusive,
TRI_json_t* upperBound,
bool upperBoundInclusive,
TRI_json_t* parameters,
VocShaper* shaper) -> TRI_index_operator_t* {
std::unique_ptr<TRI_index_operator_t> rangeOperator;
if (lower != nullptr) { if (lowerBound != nullptr) {
TRI_index_operator_type_e type; TRI_index_operator_type_e type;
if (includeLower) { if (lowerBoundInclusive) {
type = TRI_LE_INDEX_OPERATOR;
}
else {
type = TRI_LT_INDEX_OPERATOR;
}
std::unique_ptr<TRI_json_t> parameter(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 1));
if (parameter == nullptr) {
return nullptr;
}
TRI_PushBack2ArrayJson(parameter.get(), TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, lower));
std::cout << parameter.get() << std::endl;
rangeOperator.reset(TRI_CreateIndexOperator(type,
nullptr,
nullptr,
parameter.get(),
_shaper,
1));
parameter.release();
}
if (upper != nullptr) {
TRI_index_operator_type_e type;
if (includeUpper) {
type = TRI_GE_INDEX_OPERATOR; type = TRI_GE_INDEX_OPERATOR;
} }
else { else {
type = TRI_GT_INDEX_OPERATOR; type = TRI_GT_INDEX_OPERATOR;
} }
std::unique_ptr<TRI_json_t> parameter(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 1)); std::unique_ptr<TRI_json_t> paramCopy;
if (parameter == nullptr) { if (parameters == nullptr) {
paramCopy.reset(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 1));
}
else {
paramCopy.reset(TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, parameters));
}
if (paramCopy == nullptr) {
return nullptr; return nullptr;
} }
TRI_PushBack2ArrayJson(parameter.get(), TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, upper));
TRI_PushBack2ArrayJson(paramCopy.get(), TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, lowerBound));
rangeOperator.reset(TRI_CreateIndexOperator(type,
nullptr,
nullptr,
paramCopy.get(),
shaper,
1));
paramCopy.release();
}
if (upperBound != nullptr) {
TRI_index_operator_type_e type;
if (upperBoundInclusive) {
type = TRI_LE_INDEX_OPERATOR;
}
else {
type = TRI_LT_INDEX_OPERATOR;
}
std::unique_ptr<TRI_json_t> paramCopy;
if (parameters == nullptr) {
paramCopy.reset(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 1));
}
else {
paramCopy.reset(TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, parameters));
}
if (paramCopy == nullptr) {
return nullptr;
}
TRI_PushBack2ArrayJson(paramCopy.get(), TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, upperBound));
std::unique_ptr<TRI_index_operator_t> tmpOp(TRI_CreateIndexOperator(type, std::unique_ptr<TRI_index_operator_t> tmpOp(TRI_CreateIndexOperator(type,
nullptr, nullptr,
nullptr, nullptr,
parameter.get(), paramCopy.get(),
_shaper, shaper,
1)); 1));
parameter.release(); paramCopy.release();
if (rangeOperator == nullptr) { if (rangeOperator == nullptr) {
rangeOperator.reset(tmpOp.release()); rangeOperator.reset(tmpOp.release());
} }
@ -1265,16 +1284,17 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
rangeOperator.release(), rangeOperator.release(),
tmpOp.get(), tmpOp.get(),
nullptr, nullptr,
_shaper, shaper,
2)); 2));
tmpOp.release(); tmpOp.release();
} }
} }
return rangeOperator.release();
};
if (usedFields == 0) { if (usedFields == 0) {
// We have a range query based on the first _field // We have a range query based on the first _field
searchValues.emplace_back(rangeOperator.get()); searchValues.emplace_back(buildRangeOperator(lower, includeLower, upper, includeUpper, nullptr, _shaper));
rangeOperator.release();
} }
else { else {
bool done = false; bool done = false;
@ -1301,15 +1321,18 @@ IndexIterator* SkiplistIndex::iteratorForCondition (IndexIteratorContext* contex
parameter.get(), parameter.get(),
_shaper, _shaper,
usedFields)); usedFields));
// Note we create a new RangeOperator always.
std::unique_ptr<TRI_index_operator_t> rangeOperator(buildRangeOperator(lower, includeLower, upper, includeUpper, parameter.get(), _shaper));
parameter.release(); parameter.release();
if (rangeOperator != nullptr) { if (rangeOperator != nullptr) {
// NOTE: We might have to clone the rangeOperator here!
std::unique_ptr<TRI_index_operator_t> combinedOp(TRI_CreateIndexOperator(TRI_AND_INDEX_OPERATOR, std::unique_ptr<TRI_index_operator_t> combinedOp(TRI_CreateIndexOperator(TRI_AND_INDEX_OPERATOR,
rangeOperator.get(),
tmpOp.get(), tmpOp.get(),
rangeOperator.get(),
nullptr, nullptr,
_shaper, _shaper,
2)); 2));
rangeOperator.release();
tmpOp.release(); tmpOp.release();
searchValues.emplace_back(combinedOp.get()); searchValues.emplace_back(combinedOp.get());
combinedOp.release(); combinedOp.release();

View File

@ -213,6 +213,9 @@ TRI_json_t* JsonHelper::fromString (char const* data,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
std::string JsonHelper::toString (TRI_json_t const* json) { std::string JsonHelper::toString (TRI_json_t const* json) {
if (json == nullptr) {
return "";
}
TRI_string_buffer_t buffer; TRI_string_buffer_t buffer;
TRI_InitStringBuffer(&buffer, TRI_UNKNOWN_MEM_ZONE); TRI_InitStringBuffer(&buffer, TRI_UNKNOWN_MEM_ZONE);