mirror of https://gitee.com/bigwinds/arangodb
enable indexes in even more cases
This commit is contained in:
parent
1ea695c6a2
commit
87b1f7fde3
|
@ -1209,7 +1209,6 @@ static RangeInfoMapVec* BuildRangeInfo (ExecutionPlan* plan,
|
|||
|
||||
bool foundSomething = false;
|
||||
|
||||
|
||||
if (node->type == NODE_TYPE_OPERATOR_BINARY_EQ) {
|
||||
auto lhs = node->getMember(0);
|
||||
auto rhs = node->getMember(1);
|
||||
|
@ -1358,15 +1357,8 @@ static RangeInfoMapVec* BuildRangeInfo (ExecutionPlan* plan,
|
|||
if (node->type == NODE_TYPE_OPERATOR_BINARY_AND) {
|
||||
auto lhs = BuildRangeInfo(plan, node->getMember(0), enumCollVar, attr, mustNotUseRanges, node->type);
|
||||
auto rhs = BuildRangeInfo(plan, node->getMember(1), enumCollVar, attr, mustNotUseRanges, node->type);
|
||||
|
||||
if ((lhs == nullptr || lhs->empty()) && rhs != nullptr) {
|
||||
delete lhs;
|
||||
return rhs;
|
||||
}
|
||||
else if (lhs != nullptr && (rhs == nullptr || rhs->empty())) {
|
||||
delete rhs;
|
||||
return lhs;
|
||||
}
|
||||
|
||||
mustNotUseRanges = false;
|
||||
|
||||
// distribute AND into OR
|
||||
return andCombineRangeInfoMapVecsIgnoreEmpty(lhs, rhs);
|
||||
|
@ -1431,10 +1423,17 @@ static RangeInfoMapVec* BuildRangeInfo (ExecutionPlan* plan,
|
|||
}
|
||||
|
||||
if (node->type == NODE_TYPE_OPERATOR_BINARY_OR) {
|
||||
return orCombineRangeInfoMapVecs(
|
||||
BuildRangeInfo(plan, node->getMember(0), enumCollVar, attr, mustNotUseRanges, node->type),
|
||||
BuildRangeInfo(plan, node->getMember(1), enumCollVar, attr, mustNotUseRanges, node->type)
|
||||
);
|
||||
bool lhsMustNotUseRange = false;
|
||||
bool rhsMustNotUseRange = false;
|
||||
|
||||
auto lhs = BuildRangeInfo(plan, node->getMember(0), enumCollVar, attr, lhsMustNotUseRange, node->type);
|
||||
auto rhs = BuildRangeInfo(plan, node->getMember(1), enumCollVar, attr, rhsMustNotUseRange, node->type);
|
||||
|
||||
if (lhsMustNotUseRange || rhsMustNotUseRange) {
|
||||
mustNotUseRanges = true;
|
||||
}
|
||||
|
||||
return orCombineRangeInfoMapVecs(lhs, rhs);
|
||||
}
|
||||
|
||||
if (combineType == NODE_TYPE_OPERATOR_BINARY_AND) {
|
||||
|
@ -1460,7 +1459,6 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
|||
std::unordered_set<VariableId> _varIds;
|
||||
bool _modified;
|
||||
bool _canThrow;
|
||||
bool _mustNotUseRanges;
|
||||
// The following maps ids of EnumerateCollectionNodes in the original
|
||||
// plan to an index in the (outer vector) of the _changes container.
|
||||
std::unordered_map<size_t, size_t>& _changesPlaces;
|
||||
|
@ -1481,7 +1479,6 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
|||
_varIds(),
|
||||
_modified(false),
|
||||
_canThrow(false),
|
||||
_mustNotUseRanges(false),
|
||||
_changesPlaces(changesPlaces),
|
||||
_changes(changes) {
|
||||
|
||||
|
@ -1512,21 +1509,32 @@ class FilterToEnumCollFinder : public WalkerWorker<ExecutionNode> {
|
|||
std::string attr;
|
||||
Variable const* enumCollVar = nullptr;
|
||||
auto expression = node->expression()->node();
|
||||
bool mustNotUseRanges = false;
|
||||
|
||||
// there is an implicit AND between FILTER statements
|
||||
if (_rangeInfoMapVec == nullptr) {
|
||||
// don't yet have anything to AND-combine
|
||||
_rangeInfoMapVec = BuildRangeInfo(_plan, expression, enumCollVar, attr, _mustNotUseRanges);
|
||||
_rangeInfoMapVec = BuildRangeInfo(_plan, expression, enumCollVar, attr, mustNotUseRanges);
|
||||
}
|
||||
else {
|
||||
// AND-combine with previous ranges
|
||||
_rangeInfoMapVec = andCombineRangeInfoMapVecsIgnoreEmpty(
|
||||
_rangeInfoMapVec,
|
||||
BuildRangeInfo(_plan, expression, enumCollVar, attr, _mustNotUseRanges)
|
||||
);
|
||||
auto other = BuildRangeInfo(_plan, expression, enumCollVar, attr, mustNotUseRanges);
|
||||
|
||||
if (mustNotUseRanges) {
|
||||
mustNotUseRanges = false;
|
||||
|
||||
if (other != nullptr) {
|
||||
delete other;
|
||||
}
|
||||
// keep existing _rangeInfoMapVec
|
||||
}
|
||||
else {
|
||||
// AND-combine ranges in FILTER found with previous ranges
|
||||
_rangeInfoMapVec = andCombineRangeInfoMapVecsIgnoreEmpty(_rangeInfoMapVec, other);
|
||||
}
|
||||
}
|
||||
|
||||
if (_rangeInfoMapVec != nullptr && _mustNotUseRanges) {
|
||||
if (_rangeInfoMapVec != nullptr && mustNotUseRanges) {
|
||||
// it is unsafe to use the ranges found. throw them away immediately
|
||||
delete _rangeInfoMapVec;
|
||||
_rangeInfoMapVec = nullptr;
|
||||
|
|
|
@ -991,7 +991,7 @@ function optimizerIndexesTestSuite () {
|
|||
/// @brief test index usage
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testIndexAndNoIndex : function () {
|
||||
testIndexAndUseIndex : function () {
|
||||
c.ensureSkiplist("value2");
|
||||
AQL_EXECUTE("FOR i IN " + c.name() + " UPDATE i WITH { value2: i.value } IN " + c.name());
|
||||
|
||||
|
@ -1054,14 +1054,14 @@ function optimizerIndexesTestSuite () {
|
|||
var queries = [
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 || i.value2 != i.value RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != i.value || i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value != 1 || i.value != 2) && i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 && (i.value != 1 || i.value != 2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value2 != 1 || i.value2 != 2) && i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 && (i.value2 != 1 || i.value2 != 2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value != 1 && PASSTHRU(i.value2) == 2 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value != 1 FILTER PASSTHRU(i.value2) == 2 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER PASSTHRU(i.value2) == 2 && i.value != 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER PASSTHRU(i.value2) == 2 FILTER i.value != 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != 2 && PASSTHRU(i.value) == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != 2 FILTER PASSTHRU(i.value) == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER PASSTHRU(i.value) == 1 && i.value2 != 2 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER PASSTHRU(i.value) == 1 FILTER i.value2 != 2 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 || i.value3 != 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value3 != 1 || i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value3 != 1 || i.value2 == 2 RETURN i.value",
|
||||
|
@ -1104,7 +1104,24 @@ function optimizerIndexesTestSuite () {
|
|||
"FOR i IN " + c.name() + " FILTER 1 + PASSTHRU(2) == 3 && i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER 1 + PASSTHRU(2) && i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value IN [ 1 ] && RAND() >= -1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() >= -1 && i.value IN [ 1 ] RETURN i.value"
|
||||
"FOR i IN " + c.name() + " FILTER RAND() >= -1 FILTER i.value IN [ 1 ] RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER RAND() >= -1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER RAND() >= -1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER RAND() != -1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER RAND() <= 10 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER RAND() < 10 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER PASSTHRU(true) == true RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER 1 + PASSTHRU(2) == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER 1 + PASSTHRU(2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() >= -1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() >= -1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() != -1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() <= 10 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() < 10 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER 1 + PASSTHRU(2) == 3 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER 1 + PASSTHRU(2) FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value IN [ 1 ] FILTER RAND() >= -1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER RAND() >= -1 FILTER i.value IN [ 1 ] RETURN i.value"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1140,7 +1157,21 @@ function optimizerIndexesTestSuite () {
|
|||
"FOR j IN 1..1 FOR i IN " + c.name() + " FILTER i.value == 1 && j == 1 RETURN i.value",
|
||||
"FOR j IN 1..1 FOR i IN " + c.name() + " FILTER j == 1 && i.value == 1 RETURN i.value",
|
||||
"FOR j IN [ { value: 1 } ] FOR i IN " + c.name() + " FILTER i.value == 1 && j.value == 1 RETURN i.value",
|
||||
"FOR j IN [ { value: 1 } ] FOR i IN " + c.name() + " FILTER j.value == 1 && i.value == 1 RETURN i.value"
|
||||
"FOR j IN [ { value: 1 } ] FOR i IN " + c.name() + " FILTER j.value == 1 && i.value == 1 RETURN i.value",
|
||||
"LET a = 1 FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a == 1 RETURN i.value",
|
||||
"LET a = 1 FOR i IN " + c.name() + " FILTER a == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER a == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = { value: 1 } FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a.value == 1 RETURN i.value",
|
||||
"LET a = { value: 1 } FOR i IN " + c.name() + " FILTER a.value == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU({ value: 1 }) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU({ value: 1 }) FOR i IN " + c.name() + " FILTER a.value == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET sub = (FOR x IN [ 1, 2, 3 ] RETURN x) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER (1 IN sub) RETURN i.value",
|
||||
"LET sub = (FOR x IN [ 1, 2, 3 ] RETURN x) FOR i IN " + c.name() + " FILTER (1 IN sub) FILTER i.value == 1 RETURN i.value",
|
||||
"FOR j IN 1..1 FOR i IN " + c.name() + " FILTER i.value == 1 FILTER j == 1 RETURN i.value",
|
||||
"FOR j IN 1..1 FOR i IN " + c.name() + " FILTER j == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR j IN [ { value: 1 } ] FOR i IN " + c.name() + " FILTER i.value == 1 FILTER j.value == 1 RETURN i.value",
|
||||
"FOR j IN [ { value: 1 } ] FOR i IN " + c.name() + " FILTER j.value == 1 FILTER i.value == 1 RETURN i.value"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1164,7 +1195,9 @@ function optimizerIndexesTestSuite () {
|
|||
testIndexAndDespiteOtherCollection : function () {
|
||||
var queries = [
|
||||
"FOR j IN " + c.name() + " FOR i IN " + c.name() + " FILTER i.value == 1 && j.value == 1 LIMIT 2000 RETURN i.value",
|
||||
"FOR j IN " + c.name() + " FOR i IN " + c.name() + " FILTER j.value == 1 && i.value == 1 LIMIT 2000 RETURN i.value"
|
||||
"FOR j IN " + c.name() + " FOR i IN " + c.name() + " FILTER j.value == 1 && i.value == 1 LIMIT 2000 RETURN i.value",
|
||||
"FOR j IN " + c.name() + " FOR i IN " + c.name() + " FILTER i.value == 1 FILTER j.value == 1 LIMIT 2000 RETURN i.value",
|
||||
"FOR j IN " + c.name() + " FOR i IN " + c.name() + " FILTER j.value == 1 FILTER i.value == 1 LIMIT 2000 RETURN i.value"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1198,7 +1231,26 @@ function optimizerIndexesTestSuite () {
|
|||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 && a IN [ 0, 1 ] RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a IN [ 0, 1 ] && i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 && NOT (i.value != 1) RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 || NOT NOT (i.value == 1) RETURN i"
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 || NOT NOT (i.value == 1) RETURN i",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a != 2 RETURN i.value",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER a != 2 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER i.value != 2 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value != 2 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER i.value - 1 == 0 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value - 1 == 0 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a + 1 == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a + 1 == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a IN [ 0, 1 ] RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a IN [ 0, 1 ] FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 && (i.value != 1 || i.value != 2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 FILTER (i.value != 1 || i.value != 2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER NOT (i.value != 1) RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value != 1 || i.value != 2) && i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value != 1 || i.value != 2) FILTER i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value2 != 1 || i.value2 != 2) && i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER (i.value2 != 1 || i.value2 != 2) FILTER i.value == 3 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 && (i.value2 != 1 || i.value2 != 2) RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 3 FILTER (i.value2 != 1 || i.value2 != 2) RETURN i.value"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1259,7 +1311,17 @@ function optimizerIndexesTestSuite () {
|
|||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 && a + 1 == 0 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a + 1 == 0 && i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 && a IN [ 1 ] RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a IN [ 1 ] && i.value == 1 RETURN i.value"
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a IN [ 1 ] && i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a != 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(1) FOR i IN " + c.name() + " FILTER a != 1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER i.value != 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value != 1 FILTER i.value == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 1 FILTER i.value - 1 == 1 RETURN i.value",
|
||||
"FOR i IN " + c.name() + " FILTER i.value - 1 == 1 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a + 1 == 0 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a + 1 == 0 FILTER i.value == 1 RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER i.value == 1 FILTER a IN [ 1 ] RETURN i.value",
|
||||
"LET a = PASSTHRU(0) FOR i IN " + c.name() + " FILTER a IN [ 1 ] FILTER i.value == 1 RETURN i.value"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1271,7 +1333,7 @@ function optimizerIndexesTestSuite () {
|
|||
assertNotEqual(-1, nodeTypes.indexOf("IndexRangeNode"), query);
|
||||
var results = AQL_EXECUTE(query);
|
||||
assertEqual(0, results.json.length);
|
||||
assertTrue(results.stats.scannedIndex > 0);
|
||||
assertTrue(results.stats.scannedIndex >= 0);
|
||||
assertEqual(0, results.stats.scannedFull);
|
||||
});
|
||||
},
|
||||
|
@ -1423,7 +1485,7 @@ function optimizerIndexesTestSuite () {
|
|||
"FOR i IN " + c.name() + " FILTER i.value == 2 FILTER i.value2 != 1 RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER i.value == 2 && i.value2 != 1 RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != 1 FILTER i.value == 2 RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != 1 && i.value == 2 RETURN i",
|
||||
"FOR i IN " + c.name() + " FILTER i.value2 != 1 && i.value == 2 RETURN i"
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1633,7 +1695,11 @@ function optimizerIndexesTestSuite () {
|
|||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 && NOT (i.value == 2) RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 && NOT (i.value != 1) RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER NOT (i.value != 1) && i.value == 1 RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 || NOT (i.value != -1) RETURN i", 1 ]
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 || NOT (i.value != -1) RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER NOT (i.value == 2) FILTER i.value == 1 RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 FILTER NOT (i.value == 2) RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value == 1 FILTER NOT (i.value != 1) RETURN i", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER NOT (i.value != 1) FILTER i.value == 1 RETURN i", 1 ]
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1911,9 +1977,13 @@ function optimizerIndexesInOrTestSuite () {
|
|||
var queries = [
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value1 == 30 && i.value2 == 30 RETURN i.value1", 1 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value1 IN [ 30, 31, 32 ] && i.value2 IN [ 30, 31, 32, 130 ] RETURN i.value1", 4 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER i.value1 IN [ 30, 31, 32 ] FILTER i.value2 IN [ 30, 31, 32, 130 ] RETURN i.value1", 4 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) && (i.value2 == 32 || i.value2 == 29 || i.value2 == 30) RETURN i.value1", 3 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) && (i.value2 == 32 || i.value2 == 29 || i.value2 == 30 || i.value2 == 35) RETURN i.value1", 3 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) && i.value2 IN [ 32, 30, 45, 99, 12, 7 ] RETURN i.value1", 2 ]
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) && i.value2 IN [ 32, 30, 45, 99, 12, 7 ] RETURN i.value1", 2 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) FILTER (i.value2 == 32 || i.value2 == 29 || i.value2 == 30) RETURN i.value1", 3 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) FILTER (i.value2 == 32 || i.value2 == 29 || i.value2 == 30 || i.value2 == 35) RETURN i.value1", 3 ],
|
||||
[ "FOR i IN " + c.name() + " FILTER (i.value1 == 30 || i.value1 == 29 || i.value1 == 32) FILTER i.value2 IN [ 32, 30, 45, 99, 12, 7 ] RETURN i.value1", 2 ]
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
@ -1944,7 +2014,12 @@ function optimizerIndexesInOrTestSuite () {
|
|||
[ "LET a = PASSTHRU(30), b = PASSTHRU(31), c = PASSTHRU(32), d = PASSTHRU(130) FOR i IN " + c.name() + " FILTER i.value1 IN [ a, b, c ] && i.value2 IN [ a, b, c, d ] RETURN i.value1", 4 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) && (i.value2 == c || i.value2 == a || i.value2 == b) RETURN i.value1", 3 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32), d = PASSTHRU(35) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) && (i.value2 == c || i.value2 == a || i.value2 == b || i.value2 == d) RETURN i.value1", 3 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) && i.value2 IN [ c, b, 45, 99, 12, 7 ] RETURN i.value1", 2 ]
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) && i.value2 IN [ c, b, 45, 99, 12, 7 ] RETURN i.value1", 2 ],
|
||||
[ "LET a = PASSTHRU(30) FOR i IN " + c.name() + " FILTER i.value1 == a FILTER i.value2 == a RETURN i.value1", 1 ],
|
||||
[ "LET a = PASSTHRU(30), b = PASSTHRU(31), c = PASSTHRU(32), d = PASSTHRU(130) FOR i IN " + c.name() + " FILTER i.value1 IN [ a, b, c ] FILTER i.value2 IN [ a, b, c, d ] RETURN i.value1", 4 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) FILTER (i.value2 == c || i.value2 == a || i.value2 == b) RETURN i.value1", 3 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32), d = PASSTHRU(35) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) FILTER (i.value2 == c || i.value2 == a || i.value2 == b || i.value2 == d) RETURN i.value1", 3 ],
|
||||
[ "LET a = PASSTHRU(29), b = PASSTHRU(30), c = PASSTHRU(32) FOR i IN " + c.name() + " FILTER (i.value1 == b || i.value1 == a || i.value1 == c) FILTER i.value2 IN [ c, b, 45, 99, 12, 7 ] RETURN i.value1", 2 ]
|
||||
];
|
||||
|
||||
queries.forEach(function(query) {
|
||||
|
|
Loading…
Reference in New Issue