1
0
Fork 0

added new graph function _connectingEdges

This commit is contained in:
scottashton 2014-11-19 09:26:40 +01:00
parent be42c1559d
commit a5bc4aaa4a
3 changed files with 120 additions and 1 deletions

View File

@ -1032,9 +1032,12 @@ AQLGenerator.prototype._getLastRestrictableStatementInfo = function() {
////////////////////////////////////////////////////////////////////////////////
AQLGenerator.prototype.restrict = function(restrictions) {
var rest = stringToArray(restrictions);
if (rest.length == 0) {
return this;
}
this._addToPrint("restrict", restrictions);
this._clearCursor();
var rest = stringToArray(restrictions);
var lastQueryInfo = this._getLastRestrictableStatementInfo();
var lastQuery = lastQueryInfo.statement;
var opts = lastQueryInfo.options;
@ -1185,6 +1188,7 @@ AQLGenerator.prototype.execute = function() {
AQLGenerator.prototype.toArray = function() {
this._createCursor();
return this.cursor.toArray();
};
@ -4486,6 +4490,83 @@ Graph.prototype._removeVertexCollection = function(vertexCollectionName, dropCol
};
////////////////////////////////////////////////////////////////////////////////
/// @startDocuBlock JSF_general_graph_connectingEdges
/// @brief Get all connecting edges between 2 groups of vertices defined by the examples
///
/// `graph._connectingEdges(vertexExample, vertexExample2, options)`
///
/// The function accepts an id, an example, a list of examples or even an empty
/// example as parameter for vertexExample.
///
/// @PARAMS
///
/// @PARAM{vertexExample1, object, optional}
/// See [Definition of examples](#definition_of_examples)
/// @PARAM{vertexExample2, object, optional}
/// See [Definition of examples](#definition_of_examples)
/// @PARAM{options, object, optional}
/// An object defining further options. Can have the following values:
/// * *edgeExamples*: Filter the edges, see [Definition of examples](#definition_of_examples)
/// * *edgeCollectionRestriction* : One or a list of edge-collection names that should be
/// considered to be on the path.
/// * *vertex1CollectionRestriction* : One or a list of vertex-collection names that should be
/// considered on the intermediate vertex steps.
/// * *vertex2CollectionRestriction* : One or a list of vertex-collection names that should be
/// considered on the intermediate vertex steps.
///
/// @EXAMPLES
///
/// A route planner example, all neighbors of capitals.
///
/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphModuleNeighbors1}
/// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var graph = examples.loadGraph("routeplanner");
/// graph._neighbors({isCapital : true});
/// @END_EXAMPLE_ARANGOSH_OUTPUT
///
/// A route planner example, all outbound neighbors of Hamburg.
///
/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphModuleNeighbors2}
/// var examples = require("org/arangodb/graph-examples/example-graph.js");
/// var graph = examples.loadGraph("routeplanner");
/// graph._neighbors('germanCity/Hamburg', {direction : 'outbound', maxDepth : 2});
/// @END_EXAMPLE_ARANGOSH_OUTPUT
///
/// @endDocuBlock
//
////////////////////////////////////////////////////////////////////////////////
Graph.prototype._getConnectingEdges = function(vertexExample1, vertexExample2, options) {
var AQLStmt = new AQLGenerator(this);
if (!options) {
options = {};
}
var opts = {
};
options.vertex1CollectionRestriction ? opts.startVertexCollectionRestriction = options.vertex1CollectionRestriction : null ;
options.vertex2CollectionRestriction ? opts.endVertexCollectionRestriction = options.vertex2CollectionRestriction : null ;
options.edgeCollectionRestriction ? opts.edgeCollectionRestriction = options.edgeCollectionRestriction : null ;
options.edgeExamples ? opts.edgeExamples = options.edgeExamples : null ;
vertexExample2 ? opts.neighborExamples = vertexExample2 : null ;
var query = "RETURN"
+ " GRAPH_EDGES(@graphName"
+ ',@vertexExample'
+ ',@options'
+ ')';
options = options || {};
var bindVars = {
"graphName": this.__name,
"vertexExample": vertexExample1,
"options": opts
};
var result = db._query(query, bindVars).toArray();
return result[0];
};
////////////////////////////////////////////////////////////////////////////////

View File

@ -1894,6 +1894,41 @@ function EdgesAndVerticesSuite() {
graph._drop(unitTestGraphName, true);
},
test_connectingEdges : function () {
fillCollections();
var res = g._getConnectingEdges({first_name: "Tam"}, {first_name: "Tem"}, {});
assertTrue(res.length == 3);
},
test_connectingEdgesWithEdgeCollectionRestriction : function () {
fillCollections();
var res = g._getConnectingEdges({first_name: "Tam"}, null, {});
assertTrue(res.length == 13);
var res = g._getConnectingEdges({first_name: "Tam"}, null, {edgeCollectionRestriction : "unitTestEdgeCollection2"});
assertTrue(res.length == 5);
},
test_connectingEdgesWithVertexCollectionRestriction : function () {
fillCollections();
var res = g._getConnectingEdges(null, null, {});
assertTrue(res.length == 13);
var res = g._getConnectingEdges(null, null, {vertex1CollectionRestriction : "unitTestVertexCollection1"});
assertTrue(res.length == 13);
var res = g._getConnectingEdges(null, null, {
vertex1CollectionRestriction : "unitTestVertexCollection1",
vertex2CollectionRestriction : "unitTestVertexCollection3"
});
assertTrue(res.length == 5);
},
test_connectingEdgesWithIds : function () {
var ids = fillCollections();
var res = g._getConnectingEdges(ids.vId11, ids.vId13, {});
assertTrue(res.length == 2);
},
test_dropGraph1 : function () {
var myGraphName = unitTestGraphName + "2";
var myEdgeColName = "unitTestEdgeCollection4711";

View File

@ -5891,6 +5891,9 @@ function AQL_GRAPH_NEIGHBORS (graphName,
if (options.vertexCollectionRestriction) {
params.filterVertexCollections = options.vertexCollectionRestriction;
}
if (options.endVertexCollectionRestriction) {
params.filterVertexCollections = options.endVertexCollectionRestriction;
}
fromVertices.forEach(function (v) {
var e = TRAVERSAL_FUNC("GRAPH_NEIGHBORS",
factory,