From aa1242b67c78b31f8ad0cb1f61fe8b5d8211f939 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Tue, 22 Sep 2015 11:46:11 +0200 Subject: [PATCH] Fixed a bug with AQL EDGES() function. It did not include the correct end of the edge when using inbound or outbound in combination with includeVertices. Reported at https://groups.google.com/forum/#!topic/arangodb/6yIpzLHprrk --- js/server/modules/org/arangodb/aql.js | 4 +- js/server/tests/aql-graph.js | 122 +++++++++++++++++++++++++- 2 files changed, 121 insertions(+), 5 deletions(-) diff --git a/js/server/modules/org/arangodb/aql.js b/js/server/modules/org/arangodb/aql.js index 99c6775b36..f345167bcc 100644 --- a/js/server/modules/org/arangodb/aql.js +++ b/js/server/modules/org/arangodb/aql.js @@ -7222,7 +7222,7 @@ function AQL_EDGES (edgeCollection, if (options && options.includeVertices) { for (let i = 0; i < result.length; ++i) { try { - result[i] = { edge: CLONE(result[i]), vertex: DOCUMENT_HANDLE(result[i]._from) }; + result[i] = { edge: CLONE(result[i]), vertex: DOCUMENT_HANDLE(result[i]._to) }; } catch (err) { } @@ -7234,7 +7234,7 @@ function AQL_EDGES (edgeCollection, if (options && options.includeVertices) { for (let i = 0; i < result.length; ++i) { try { - result[i] = { edge: CLONE(result[i]), vertex: DOCUMENT_HANDLE(result[i]._to) }; + result[i] = { edge: CLONE(result[i]), vertex: DOCUMENT_HANDLE(result[i]._from) }; } catch (err) { } diff --git a/js/server/tests/aql-graph.js b/js/server/tests/aql-graph.js index eca94ca10d..b12b073ea4 100644 --- a/js/server/tests/aql-graph.js +++ b/js/server/tests/aql-graph.js @@ -27,7 +27,6 @@ /// @author Jan Steemann /// @author Copyright 2012, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// - var jsunity = require("jsunity"); var db = require("org/arangodb").db; var internal = require("internal"); @@ -173,7 +172,125 @@ function ahuacatlQueryEdgesTestSuite () { assertEqual(actual, [ ]); assertQueryError(errors.ERROR_ARANGO_COLLECTION_NOT_FOUND.code, "FOR e IN EDGES(UnitTestsAhuacatlEdge, 'thefox/thefox', 'outbound') SORT e.what RETURN e.what"); - } + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief checks EDGES() with includeVertices +//////////////////////////////////////////////////////////////////////////////// + + testEdgesAnyInclVertices : function () { + "use strict"; + let actual; + const query = "FOR e IN EDGES(@@col, @start, @dir, null, {includeVertices: true}) SORT e.edge.what RETURN e.vertex._key"; + let bindVars = { + "@col": "UnitTestsAhuacatlEdge", + "dir": "any" + }; + + bindVars.start = "UnitTestsAhuacatlVertex/v1"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v2", "v3"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v2"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v1", "v3", "v4"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v3"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v1", "v2", "v4", "v6", "v7", "v6", "v7"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v8"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "UnitTestsAhuacatlVertex/thefox"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "thefox/thefox"; + + assertQueryError(errors.ERROR_ARANGO_COLLECTION_NOT_FOUND.code, query, bindVars); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief checks EDGES() with includeVertices +//////////////////////////////////////////////////////////////////////////////// + + testEdgesInInclVertices : function () { + "use strict"; + let actual; + const query = "FOR e IN EDGES(@@col, @start, @dir, null, {includeVertices: true}) SORT e.edge.what RETURN e.vertex._key"; + let bindVars = { + "@col": "UnitTestsAhuacatlEdge", + "dir": "inbound" + }; + + bindVars.start = "UnitTestsAhuacatlVertex/v1"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, []); + + bindVars.start = "UnitTestsAhuacatlVertex/v2"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v1", "v4"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v3"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v1", "v2", "v6", "v7"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v8"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "UnitTestsAhuacatlVertex/thefox"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "thefox/thefox"; + assertQueryError(errors.ERROR_ARANGO_COLLECTION_NOT_FOUND.code, query, bindVars); + }, + +//////////////////////////////////////////////////////////////////////////////// +/// @brief checks EDGES() with includeVertices +//////////////////////////////////////////////////////////////////////////////// + + testEdgesOutInclVertices : function () { + "use strict"; + let actual; + const query = "FOR e IN EDGES(@@col, @start, @dir, null, {includeVertices: true}) SORT e.edge.what RETURN e.vertex._key"; + let bindVars = { + "@col": "UnitTestsAhuacatlEdge", + "dir": "outbound" + }; + + bindVars.start = "UnitTestsAhuacatlVertex/v1"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v2", "v3"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v2"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v3"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v3"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, ["v4", "v6", "v7"]); + + bindVars.start = "UnitTestsAhuacatlVertex/v8"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "UnitTestsAhuacatlVertex/v5"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "UnitTestsAhuacatlVertex/thefox"; + actual = getQueryResults(query, bindVars); + assertEqual(actual, [ ]); + + bindVars.start = "thefox/thefox"; + assertQueryError(errors.ERROR_ARANGO_COLLECTION_NOT_FOUND.code, query, bindVars); + }, + + }; } @@ -1941,7 +2058,6 @@ if (internal.debugCanUseFailAt() && ! cluster.isCluster()) { jsunity.run(ahuacatlQueryNeighborsErrorsSuite); jsunity.run(ahuacatlQueryShortestpathErrorsSuite); } - return jsunity.done(); // Local Variables: