mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'aql-jmmh-conditions' of https://github.com/arangodb/arangodb into aql-jmmh-conditions
This commit is contained in:
commit
c6c6ba8f6f
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue