mirror of https://gitee.com/bigwinds/arangodb
Implement tests for de/serializing of TraversalNodes.
This commit is contained in:
parent
1b86f280de
commit
f51e5efb34
|
@ -1501,7 +1501,8 @@ triagens::arango::TransactionContext* Query::createTransactionContext () {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief create a TransactionContext
|
/// @brief look up a graph either from our cache list or from the _graphs
|
||||||
|
/// collection
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Graph const* Query::lookupGraphByName (std::string &name) {
|
Graph const* Query::lookupGraphByName (std::string &name) {
|
||||||
|
@ -1517,7 +1518,6 @@ Graph const* Query::lookupGraphByName (std::string &name) {
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// --SECTION-- END-OF-FILE
|
// --SECTION-- END-OF-FILE
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
|
@ -485,7 +485,7 @@ namespace triagens {
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief create a TransactionContext
|
/// @brief look up a graph in the _graphs collection
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
Graph const* lookupGraphByName (std::string &name);
|
Graph const* lookupGraphByName (std::string &name);
|
||||||
|
|
|
@ -44,6 +44,7 @@ TraversalNode::TraversalNode (ExecutionPlan* plan,
|
||||||
_edgeOutVariable(nullptr),
|
_edgeOutVariable(nullptr),
|
||||||
_pathOutVariable(nullptr),
|
_pathOutVariable(nullptr),
|
||||||
_graphObj(nullptr),
|
_graphObj(nullptr),
|
||||||
|
_CalculationNodeId(0),
|
||||||
_condition(nullptr)
|
_condition(nullptr)
|
||||||
{
|
{
|
||||||
TRI_ASSERT(_vocbase != nullptr);
|
TRI_ASSERT(_vocbase != nullptr);
|
||||||
|
@ -175,7 +176,8 @@ TraversalNode::TraversalNode (ExecutionPlan* plan,
|
||||||
_minDepth(minDepth),
|
_minDepth(minDepth),
|
||||||
_maxDepth(maxDepth),
|
_maxDepth(maxDepth),
|
||||||
_direction(direction),
|
_direction(direction),
|
||||||
_condition(nullptr) {
|
_CalculationNodeId(0),
|
||||||
|
_condition(nullptr) {
|
||||||
for (auto& it : edgeColls) {
|
for (auto& it : edgeColls) {
|
||||||
_edgeColls.push_back(it);
|
_edgeColls.push_back(it);
|
||||||
}
|
}
|
||||||
|
@ -200,13 +202,13 @@ TraversalNode::TraversalNode (ExecutionPlan* plan,
|
||||||
_direction = TRI_EDGE_ANY;
|
_direction = TRI_EDGE_ANY;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
_direction = TRI_EDGE_OUT;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
_direction = TRI_EDGE_IN;
|
_direction = TRI_EDGE_IN;
|
||||||
break;
|
break;
|
||||||
|
case 2:
|
||||||
|
_direction = TRI_EDGE_OUT;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
TRI_ASSERT(false);
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "unsupported 'direction'");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,17 +217,54 @@ TraversalNode::TraversalNode (ExecutionPlan* plan,
|
||||||
_inVariable = varFromJson(plan->getAst(), base, "inVariable");
|
_inVariable = varFromJson(plan->getAst(), base, "inVariable");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
triagens::basics::JsonHelper::getStringValue(base.json(), "vertexId", _vertexId);
|
_vertexId = triagens::basics::JsonHelper::getStringValue(base.json(), "vertexId", "");
|
||||||
|
if (_vertexId.size() == 0) {
|
||||||
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "start vertex mustn't be empty.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRI_json_t const* condition = JsonHelper::checkAndGetObjectValue(base.json(), "condition");
|
if (base.has("condition")) {
|
||||||
|
TRI_json_t const* condition = JsonHelper::checkAndGetObjectValue(base.json(), "condition");
|
||||||
|
|
||||||
if (condition != nullptr) {
|
if (condition != nullptr) {
|
||||||
triagens::basics::Json conditionJson(TRI_UNKNOWN_MEM_ZONE, condition, triagens::basics::Json::NOFREE);
|
triagens::basics::Json conditionJson(TRI_UNKNOWN_MEM_ZONE, condition, triagens::basics::Json::NOFREE);
|
||||||
_condition = Condition::fromJson(plan, conditionJson);
|
_condition = Condition::fromJson(plan, conditionJson);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string graphName;
|
||||||
|
if (base.has("graph") && (base.get("graph").isString())) {
|
||||||
|
graphName = JsonHelper::checkAndGetStringValue(base.json(), "graph");
|
||||||
|
if (base.has("graphDefinition")) {
|
||||||
|
_graphObj = plan->getAst()->query()->lookupGraphByName(graphName);
|
||||||
|
|
||||||
|
auto eColls = _graphObj->edgeCollections();
|
||||||
|
for (const auto& n: eColls) {
|
||||||
|
_edgeColls.push_back(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "missing graphDefinition.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_condition = nullptr;
|
|
||||||
|
_graphJson = base.get("graph").copy();
|
||||||
|
if (!_graphJson.isArray()) {
|
||||||
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "graph has to be an array.");
|
||||||
|
}
|
||||||
|
size_t edgeCollectionCount = _graphJson.size();
|
||||||
|
// List of edge collection names
|
||||||
|
for (size_t i = 0; i < edgeCollectionCount; ++i) {
|
||||||
|
auto at = _graphJson.at(i);
|
||||||
|
if (!at.isString()) {
|
||||||
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "graph has to be an array of strings.");
|
||||||
|
}
|
||||||
|
_edgeColls.push_back(at.json()->_value._string.data);
|
||||||
|
}
|
||||||
|
if (_edgeColls.size() == 0) {
|
||||||
|
THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_QUERY_BAD_JSON_PLAN, "graph has to be a non empty array of strings.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Out variables
|
// Out variables
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jshint esnext: true */
|
/*jshint esnext: true */
|
||||||
/*global assertEqual, fail, AQL_EXECUTE*/
|
/*global assertEqual, fail, AQL_EXECUTE, AQL_EXPLAIN, AQL_EXECUTEJSON */
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief Spec for the AQL FOR x IN GRAPH name statement
|
/// @brief Spec for the AQL FOR x IN GRAPH name statement
|
||||||
|
@ -39,6 +39,7 @@ const gm = require("org/arangodb/general-graph");
|
||||||
const vn = "UnitTestVertexCollection";
|
const vn = "UnitTestVertexCollection";
|
||||||
const en = "UnitTestEdgeCollection";
|
const en = "UnitTestEdgeCollection";
|
||||||
const isCluster = require("org/arangodb/cluster").isCluster();
|
const isCluster = require("org/arangodb/cluster").isCluster();
|
||||||
|
var _ = require("underscore");
|
||||||
var vertex = {};
|
var vertex = {};
|
||||||
var edge = {};
|
var edge = {};
|
||||||
var vc;
|
var vc;
|
||||||
|
@ -74,9 +75,9 @@ function namedGraphSuite () {
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* Graph under test:
|
* Graph under test:
|
||||||
*
|
*
|
||||||
* A -> B -> C -> D
|
* A -> B -> C -> D
|
||||||
* /|\ \|/
|
* /|\ \|/
|
||||||
* E <- F
|
* E <- F
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -94,10 +95,15 @@ function namedGraphSuite () {
|
||||||
|
|
||||||
var g;
|
var g;
|
||||||
const gn = "UnitTestGraph";
|
const gn = "UnitTestGraph";
|
||||||
|
var ruleName = "merge-traversal-filter";
|
||||||
|
var paramEnabled = { optimizer: { rules: [ "-all", "+" + ruleName ] } };
|
||||||
|
var opts = _.clone(paramEnabled);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
||||||
setUp: function() {
|
setUp: function() {
|
||||||
|
opts.allPlans = true;
|
||||||
|
opts.verbosePlans = true;
|
||||||
cleanup();
|
cleanup();
|
||||||
createBaseGraph();
|
createBaseGraph();
|
||||||
try {
|
try {
|
||||||
|
@ -122,6 +128,11 @@ function namedGraphSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
assertEqual(result[0]._id, vertex.C);
|
assertEqual(result[0]._id, vertex.C);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSecondEntryIsEdge: function () {
|
testSecondEntryIsEdge: function () {
|
||||||
|
@ -133,6 +144,11 @@ function namedGraphSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
assertEqual(result[0]._id, edge.BC);
|
assertEqual(result[0]._id, edge.BC);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testThirdEntryIsPath: function () {
|
testThirdEntryIsPath: function () {
|
||||||
|
@ -149,6 +165,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(entry.vertices[1]._id, vertex.C);
|
assertEqual(entry.vertices[1]._id, vertex.C);
|
||||||
assertEqual(entry.edges.length, 1);
|
assertEqual(entry.edges.length, 1);
|
||||||
assertEqual(entry.edges[0]._id, edge.BC);
|
assertEqual(entry.edges[0]._id, edge.BC);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testOutboundDirection: function () {
|
testOutboundDirection: function () {
|
||||||
|
@ -161,6 +182,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
var entry = result[0];
|
var entry = result[0];
|
||||||
assertEqual(entry, vertex.C);
|
assertEqual(entry, vertex.C);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testInboundDirection: function () {
|
testInboundDirection: function () {
|
||||||
|
@ -173,6 +199,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
var entry = result[0];
|
var entry = result[0];
|
||||||
assertEqual(entry, vertex.B);
|
assertEqual(entry, vertex.B);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testAnyDirection: function () {
|
testAnyDirection: function () {
|
||||||
|
@ -189,6 +220,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(entry, vertex.C);
|
assertEqual(entry, vertex.C);
|
||||||
entry = result[2];
|
entry = result[2];
|
||||||
assertEqual(entry, vertex.E);
|
assertEqual(entry, vertex.E);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testExactNumberSteps: function () {
|
testExactNumberSteps: function () {
|
||||||
|
@ -202,6 +238,11 @@ function namedGraphSuite () {
|
||||||
|
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
assertEqual(result[1], vertex.F);
|
assertEqual(result[1], vertex.F);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testRangeNumberSteps: function () {
|
testRangeNumberSteps: function () {
|
||||||
|
@ -216,6 +257,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
assertEqual(result[1], vertex.E);
|
assertEqual(result[1], vertex.E);
|
||||||
assertEqual(result[2], vertex.F);
|
assertEqual(result[2], vertex.F);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testComputedNumberSteps: function () {
|
testComputedNumberSteps: function () {
|
||||||
|
@ -228,6 +274,11 @@ function namedGraphSuite () {
|
||||||
assertEqual(result.length, 2);
|
assertEqual(result.length, 2);
|
||||||
|
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSort: function () {
|
testSort: function () {
|
||||||
|
@ -249,8 +300,12 @@ function namedGraphSuite () {
|
||||||
assertEqual(result.length, 2);
|
assertEqual(result.length, 2);
|
||||||
assertEqual(result[0], vertex.F);
|
assertEqual(result[0], vertex.F);
|
||||||
assertEqual(result[1], vertex.D);
|
assertEqual(result[1], vertex.D);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -271,6 +326,9 @@ function multiCollectionGraphSuite () {
|
||||||
const gn = "UnitTestGraph";
|
const gn = "UnitTestGraph";
|
||||||
const vn2 = "UnitTestVertexCollection2";
|
const vn2 = "UnitTestVertexCollection2";
|
||||||
const en2 = "UnitTestEdgeCollection2";
|
const en2 = "UnitTestEdgeCollection2";
|
||||||
|
var ruleName = "merge-traversal-filter";
|
||||||
|
var paramEnabled = { optimizer: { rules: [ "-all", "+" + ruleName ] } };
|
||||||
|
var opts = _.clone(paramEnabled);
|
||||||
|
|
||||||
// We always use the same query, the result should be identical.
|
// We always use the same query, the result should be identical.
|
||||||
var validateResult = function (result) {
|
var validateResult = function (result) {
|
||||||
|
@ -287,6 +345,8 @@ function multiCollectionGraphSuite () {
|
||||||
return {
|
return {
|
||||||
|
|
||||||
setUp: function() {
|
setUp: function() {
|
||||||
|
opts.allPlans = true;
|
||||||
|
opts.verbosePlans = true;
|
||||||
cleanup();
|
cleanup();
|
||||||
try {
|
try {
|
||||||
gm._drop(gn);
|
gm._drop(gn);
|
||||||
|
@ -310,7 +370,13 @@ function multiCollectionGraphSuite () {
|
||||||
|
|
||||||
testNoBindParameter: function () {
|
testNoBindParameter: function () {
|
||||||
var query = "FOR x, e, p IN OUTBOUND '" + vertex.B + "' " + en + " RETURN {vertex: x, path: p}";
|
var query = "FOR x, e, p IN OUTBOUND '" + vertex.B + "' " + en + " RETURN {vertex: x, path: p}";
|
||||||
validateResult(db._query(query).toArray());
|
var result = db._query(query).toArray();
|
||||||
|
validateResult(result);
|
||||||
|
var plans = AQL_EXPLAIN(query, { }, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testStartBindParameter: function () {
|
testStartBindParameter: function () {
|
||||||
|
@ -318,7 +384,13 @@ function multiCollectionGraphSuite () {
|
||||||
var bindVars = {
|
var bindVars = {
|
||||||
startId: vertex.B
|
startId: vertex.B
|
||||||
};
|
};
|
||||||
validateResult(db._query(query, bindVars).toArray());
|
var result = db._query(query, bindVars).toArray();
|
||||||
|
validateResult(result);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testEdgeCollectionBindParameter: function () {
|
testEdgeCollectionBindParameter: function () {
|
||||||
|
@ -326,7 +398,13 @@ function multiCollectionGraphSuite () {
|
||||||
var bindVars = {
|
var bindVars = {
|
||||||
"@eCol": en
|
"@eCol": en
|
||||||
};
|
};
|
||||||
validateResult(db._query(query, bindVars).toArray());
|
var result = db._query(query, bindVars).toArray();
|
||||||
|
validateResult(result);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testStepsBindParameter: function () {
|
testStepsBindParameter: function () {
|
||||||
|
@ -334,7 +412,13 @@ function multiCollectionGraphSuite () {
|
||||||
var bindVars = {
|
var bindVars = {
|
||||||
steps: 1
|
steps: 1
|
||||||
};
|
};
|
||||||
validateResult(db._query(query, bindVars).toArray());
|
var result = db._query(query, bindVars).toArray();
|
||||||
|
validateResult(result);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testStepsRangeBindParameter: function () {
|
testStepsRangeBindParameter: function () {
|
||||||
|
@ -344,7 +428,13 @@ function multiCollectionGraphSuite () {
|
||||||
lsteps: 1,
|
lsteps: 1,
|
||||||
rsteps: 1
|
rsteps: 1
|
||||||
};
|
};
|
||||||
validateResult(db._query(query, bindVars).toArray());
|
var result = db._query(query, bindVars).toArray();
|
||||||
|
validateResult(result);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testFirstEntryIsVertex: function () {
|
testFirstEntryIsVertex: function () {
|
||||||
|
@ -356,6 +446,11 @@ function multiCollectionGraphSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
assertEqual(result[0]._id, vertex.C);
|
assertEqual(result[0]._id, vertex.C);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSecondEntryIsEdge: function () {
|
testSecondEntryIsEdge: function () {
|
||||||
|
@ -367,6 +462,11 @@ function multiCollectionGraphSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
assertEqual(result[0]._id, edge.BC);
|
assertEqual(result[0]._id, edge.BC);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testThirdEntryIsPath: function () {
|
testThirdEntryIsPath: function () {
|
||||||
|
@ -383,6 +483,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(entry.vertices[1]._id, vertex.C);
|
assertEqual(entry.vertices[1]._id, vertex.C);
|
||||||
assertEqual(entry.edges.length, 1);
|
assertEqual(entry.edges.length, 1);
|
||||||
assertEqual(entry.edges[0]._id, edge.BC);
|
assertEqual(entry.edges[0]._id, edge.BC);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testOutboundDirection: function () {
|
testOutboundDirection: function () {
|
||||||
|
@ -395,6 +500,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
var entry = result[0];
|
var entry = result[0];
|
||||||
assertEqual(entry, vertex.C);
|
assertEqual(entry, vertex.C);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testInboundDirection: function () {
|
testInboundDirection: function () {
|
||||||
|
@ -407,6 +517,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
var entry = result[0];
|
var entry = result[0];
|
||||||
assertEqual(entry, vertex.B);
|
assertEqual(entry, vertex.B);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testAnyDirection: function () {
|
testAnyDirection: function () {
|
||||||
|
@ -423,6 +538,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(entry, vertex.C);
|
assertEqual(entry, vertex.C);
|
||||||
entry = result[2];
|
entry = result[2];
|
||||||
assertEqual(entry, vertex.E);
|
assertEqual(entry, vertex.E);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testExactNumberSteps: function () {
|
testExactNumberSteps: function () {
|
||||||
|
@ -436,6 +556,11 @@ function multiCollectionGraphSuite () {
|
||||||
|
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
assertEqual(result[1], vertex.F);
|
assertEqual(result[1], vertex.F);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testRangeNumberSteps: function () {
|
testRangeNumberSteps: function () {
|
||||||
|
@ -450,6 +575,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
assertEqual(result[1], vertex.E);
|
assertEqual(result[1], vertex.E);
|
||||||
assertEqual(result[2], vertex.F);
|
assertEqual(result[2], vertex.F);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testComputedNumberSteps: function () {
|
testComputedNumberSteps: function () {
|
||||||
|
@ -462,6 +592,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result.length, 2);
|
assertEqual(result.length, 2);
|
||||||
|
|
||||||
assertEqual(result[0], vertex.D);
|
assertEqual(result[0], vertex.D);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSort: function () {
|
testSort: function () {
|
||||||
|
@ -483,6 +618,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result.length, 2);
|
assertEqual(result.length, 2);
|
||||||
assertEqual(result[0], vertex.F);
|
assertEqual(result[0], vertex.F);
|
||||||
assertEqual(result[1], vertex.D);
|
assertEqual(result[1], vertex.D);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSingleDocumentInput: function () {
|
testSingleDocumentInput: function () {
|
||||||
|
@ -496,6 +636,11 @@ function multiCollectionGraphSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
assertEqual(result.length, 1);
|
assertEqual(result.length, 1);
|
||||||
assertEqual(result[0]._id, vertex.C);
|
assertEqual(result[0]._id, vertex.C);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testListDocumentInput: function () {
|
testListDocumentInput: function () {
|
||||||
|
@ -513,6 +658,11 @@ function multiCollectionGraphSuite () {
|
||||||
assertEqual(result[3], vertex.D);
|
assertEqual(result[3], vertex.D);
|
||||||
assertEqual(result[4], vertex.E);
|
assertEqual(result[4], vertex.E);
|
||||||
assertEqual(result[5], vertex.F);
|
assertEqual(result[5], vertex.F);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -672,10 +822,15 @@ function potentialErrorsSuite () {
|
||||||
}
|
}
|
||||||
|
|
||||||
function complexInternaSuite () {
|
function complexInternaSuite () {
|
||||||
|
var ruleName = "merge-traversal-filter";
|
||||||
|
var paramEnabled = { optimizer: { rules: [ "-all", "+" + ruleName ] } };
|
||||||
|
var opts = _.clone(paramEnabled);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|
||||||
setUp: function () {
|
setUp: function () {
|
||||||
|
opts.allPlans = true;
|
||||||
|
opts.verbosePlans = true;
|
||||||
cleanup();
|
cleanup();
|
||||||
createBaseGraph();
|
createBaseGraph();
|
||||||
},
|
},
|
||||||
|
@ -733,6 +888,11 @@ function complexInternaSuite () {
|
||||||
var result = db._query(query, bindVars).toArray();
|
var result = db._query(query, bindVars).toArray();
|
||||||
// Internally: The Query selects elements in chunks, check that nothing is lost.
|
// Internally: The Query selects elements in chunks, check that nothing is lost.
|
||||||
assertEqual(result.length, amount);
|
assertEqual(result.length, amount);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testSkipSome: function () {
|
testSkipSome: function () {
|
||||||
|
@ -769,6 +929,11 @@ function complexInternaSuite () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertEqual(Object.keys(seen).length, 2);
|
assertEqual(Object.keys(seen).length, 2);
|
||||||
|
var plans = AQL_EXPLAIN(query, bindVars, opts).plans;
|
||||||
|
plans.forEach(function(plan) {
|
||||||
|
var jsonResult = AQL_EXECUTEJSON(plan, { optimizer: { rules: [ "-all" ] } }).json;
|
||||||
|
assertEqual(jsonResult, result, query);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
testManyResults: function () {
|
testManyResults: function () {
|
||||||
|
|
Loading…
Reference in New Issue