1
0
Fork 0

Merge branch 'devel' of https://github.com/triAGENS/ArangoDB into devel

This commit is contained in:
Jan Steemann 2013-01-13 14:48:19 +01:00
commit dc9969fb27
4 changed files with 112 additions and 59 deletions

View File

@ -1,10 +1,4 @@
/*jslint indent: 2, /*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, vars: true, white: true, plusplus: true */
nomen: true,
maxlen: 100,
sloppy: true,
vars: true,
white: true,
plusplus: true */
/*global require, arango, db, edges, Module */ /*global require, arango, db, edges, Module */
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -1,8 +1,4 @@
/*jslint indent: 2, /*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, plusplus: true */
nomen: true,
maxlen: 100,
sloppy: true,
plusplus: true */
/*global require, WeakDictionary, exports */ /*global require, WeakDictionary, exports */
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -104,7 +100,7 @@ findOrCreateEdgeCollectionByName = function (name) {
/// @brief constructs a new edge object /// @brief constructs a new edge object
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
function Edge(graph, id) { function Edge (graph, id) {
var properties = graph._edges.document(id); var properties = graph._edges.document(id);
this._graph = graph; this._graph = graph;

View File

@ -467,6 +467,26 @@ function CollectionInboundExpander (config, vertex, path) {
return connections; return connections;
} }
///////////////////////////////////////////////////////////////////////////////////////////
/// @brief default expander that expands all edges labeled with one label in config.labels
///////////////////////////////////////////////////////////////////////////////////////////
var ExpandEdgesWithLabels = function (config, vertex, path) {
var result = [ ];
if (!Array.isArray(config.labels)) {
config.labels = [config.labels];
}
var edgesList = edges[vertex._id];
if (edgesList != undefined) {
for (i = 0; i < edgesList.length; ++i) {
if (!!~config.labels.indexOf(edgesList[i].label)) {
result.push({ edge: edgesList[i], vertex: vertices[edgesList[i]._to] });
}
}
}
return result;
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief default visitor that just tracks every visit /// @brief default visitor that just tracks every visit
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -648,6 +668,7 @@ exports.VisitAllFilter = VisitAllFilter;
exports.TrackingVisitor = TrackingVisitor; exports.TrackingVisitor = TrackingVisitor;
exports.MinDepthFilter = MinDepthFilter; exports.MinDepthFilter = MinDepthFilter;
exports.MaxDepthFilter = MaxDepthFilter; exports.MaxDepthFilter = MaxDepthFilter;
exports.ExpandEdgesWithLabels = ExpandEdgesWithLabels;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}

View File

@ -47,8 +47,10 @@ var traversal = require("org/arangodb/graph/traversal");
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
function GraphTreeTraversalSuite () { function GraphTreeTraversalSuite () {
var vertices; //var vertices;
var edges; //var edges;
var datasourceWorld;
var visitor = traversal.TrackingVisitor; var visitor = traversal.TrackingVisitor;
@ -66,10 +68,10 @@ function GraphTreeTraversalSuite () {
var expander = function (config, vertex, path) { var expander = function (config, vertex, path) {
var r = [ ]; var r = [ ];
var edgesList = edges[vertex._id]; var edgesList = config.datasource.getOutEdges(vertex._id);
if (edgesList != undefined) { if (edgesList != undefined) {
for (i = 0; i < edgesList.length; ++i) { for (i = 0; i < edgesList.length; ++i) {
r.push({ edge: edgesList[i], vertex: vertices[edgesList[i]._to] }); r.push({ edge: edgesList[i], vertex: config.datasource.vertices[edgesList[i]._to] });
} }
} }
return r; return r;
@ -109,6 +111,7 @@ function GraphTreeTraversalSuite () {
visitor: visitor, visitor: visitor,
filter: filter, filter: filter,
expander: expander, expander: expander,
datasource: datasourceWorld,
noVisit: { noVisit: {
"vertices/Antarctica" : true, "vertices/Antarctica" : true,
@ -127,8 +130,9 @@ function GraphTreeTraversalSuite () {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
setUp : function () { setUp : function () {
vertices = { }; var worldVertices = { };
edges = { }; var worldInEdges = { };
var worldOutEdges = { };
[ "World", "Nothing", [ "World", "Nothing",
"Europe", "Asia", "America", "Australia", "Antarctica", "Africa", "Blackhole", "Europe", "Asia", "America", "Australia", "Antarctica", "Africa", "Blackhole",
@ -141,10 +145,10 @@ function GraphTreeTraversalSuite () {
_key : key, _key : key,
name : item name : item
}; };
vertices[vertex._id] = vertex; worldVertices[vertex._id] = vertex;
}); });
var connect = function (from, to) { var connect = function (from, to, inlist, outlist) {
var key = from + "x" + to; var key = from + "x" + to;
var edge = { var edge = {
_id : "edges/" + key, _id : "edges/" + key,
@ -154,29 +158,52 @@ function GraphTreeTraversalSuite () {
what : from + "->" + to what : from + "->" + to
}; };
if (edges[edge._from] == undefined) { if (outlist[edge._from] == undefined) {
edges[edge._from] = [ ]; outlist[edge._from] = [ ];
} }
edges[edge._from].push(edge); outlist[edge._from].push(edge);
if (inlist[edge._to] == undefined) {
inlist[edge._to] = [ ];
}
inlist[edge._to].push(edge);
}; };
connect("World", "Europe"); connect("World", "Europe", worldInEdges, worldOutEdges);
connect("World", "Asia"); connect("World", "Asia", worldInEdges, worldOutEdges);
connect("World", "America"); connect("World", "America", worldInEdges, worldOutEdges);
connect("World", "Australia"); connect("World", "Australia", worldInEdges, worldOutEdges);
connect("World", "Africa"); connect("World", "Africa", worldInEdges, worldOutEdges);
connect("World", "Antarctica"); connect("World", "Antarctica", worldInEdges, worldOutEdges);
connect("Europe", "DE"); connect("Europe", "DE", worldInEdges, worldOutEdges);
connect("Europe", "FR"); connect("Europe", "FR", worldInEdges, worldOutEdges);
connect("Europe", "GB"); connect("Europe", "GB", worldInEdges, worldOutEdges);
connect("Europe", "IE"); connect("Europe", "IE", worldInEdges, worldOutEdges);
connect("Asia", "CN"); connect("Asia", "CN", worldInEdges, worldOutEdges);
connect("Asia", "JP"); connect("Asia", "JP", worldInEdges, worldOutEdges);
connect("Asia", "TW"); connect("Asia", "TW", worldInEdges, worldOutEdges);
connect("America", "US"); connect("America", "US", worldInEdges, worldOutEdges);
connect("America", "MX"); connect("America", "MX", worldInEdges, worldOutEdges);
connect("Australia", "AU"); connect("Australia", "AU", worldInEdges, worldOutEdges);
connect("Antarctica", "AN"); connect("Antarctica", "AN", worldInEdges, worldOutEdges);
datasourceWorld = {
inEdges: worldInEdges,
outEdges: worldOutEdges,
vertices: worldVertices,
getAllEdges: function (vertexId) {
return this.inEdges[vertexId].concat(outEdges[vertex_id]);
},
getInEdges: function (vertexId) {
return this.inEdges[vertexId];
},
getOutEdges: function (vertexId) {
return this.outEdges[vertexId];
}
};
}, },
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -198,7 +225,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -255,7 +282,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -312,7 +339,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/DE", "vertices/DE",
@ -369,7 +396,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/AN", "vertices/AN",
@ -426,7 +453,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -483,7 +510,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -540,7 +567,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/DE", "vertices/DE",
@ -597,7 +624,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/AN", "vertices/AN",
@ -648,6 +675,7 @@ function GraphTreeTraversalSuite () {
testMinDepthFilterWithDepth0 : function () { testMinDepthFilterWithDepth0 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MinDepthFilter, filter: traversal.MinDepthFilter,
minDepth: 0 minDepth: 0
@ -655,7 +683,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -711,6 +739,7 @@ function GraphTreeTraversalSuite () {
testMinDepthFilterWithDepth1 : function () { testMinDepthFilterWithDepth1 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MinDepthFilter, filter: traversal.MinDepthFilter,
minDepth: 1 minDepth: 1
@ -718,7 +747,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/Europe", "vertices/Europe",
@ -774,6 +803,7 @@ function GraphTreeTraversalSuite () {
testMinDepthFilterWithDepth2 : function () { testMinDepthFilterWithDepth2 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MinDepthFilter, filter: traversal.MinDepthFilter,
minDepth: 2 minDepth: 2
@ -781,7 +811,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/DE", "vertices/DE",
@ -823,6 +853,7 @@ function GraphTreeTraversalSuite () {
testMaxDepthFilterWithDepth0 : function () { testMaxDepthFilterWithDepth0 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MaxDepthFilter, filter: traversal.MaxDepthFilter,
maxDepth: 0 maxDepth: 0
@ -830,7 +861,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -852,6 +883,7 @@ function GraphTreeTraversalSuite () {
testMaxDepthFilterWithDepth1 : function () { testMaxDepthFilterWithDepth1 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MaxDepthFilter, filter: traversal.MaxDepthFilter,
maxDepth: 1 maxDepth: 1
@ -859,7 +891,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -893,6 +925,7 @@ function GraphTreeTraversalSuite () {
testMaxDepthFilterWithDepth2 : function () { testMaxDepthFilterWithDepth2 : function () {
var config = { var config = {
datasource: datasourceWorld,
expander: expander, expander: expander,
filter: traversal.MaxDepthFilter, filter: traversal.MaxDepthFilter,
maxDepth: 2 maxDepth: 2
@ -900,7 +933,7 @@ function GraphTreeTraversalSuite () {
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/World", "vertices/World",
@ -993,12 +1026,13 @@ function GraphTreeTraversalSuite () {
exclude2: "AU", exclude2: "AU",
exclude3: "World", exclude3: "World",
prune1: "Asia", prune1: "Asia",
prune2: "Europe" prune2: "Europe",
datasource: datasourceWorld
}; };
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = [ var expectedVisits = [
"vertices/Asia", "vertices/Asia",
@ -1044,12 +1078,13 @@ function GraphTreeTraversalSuite () {
excludeAndPrune, excludeAndPrune,
traversal.VisitAllFilter traversal.VisitAllFilter
], ],
excludeAndPrune: "World" excludeAndPrune: "World",
datasource: datasourceWorld
}; };
var result = getResult(); var result = getResult();
var traverser = new traversal.Traverser(config); var traverser = new traversal.Traverser(config);
traverser.traverse(result, vertices["vertices/World"]); traverser.traverse(result, config.datasource.vertices["vertices/World"]);
var expectedVisits = []; var expectedVisits = [];
@ -1058,6 +1093,13 @@ function GraphTreeTraversalSuite () {
var expectedPaths = []; var expectedPaths = [];
assertEqual(expectedPaths, getVisitedPaths(result.visited.paths)); assertEqual(expectedPaths, getVisitedPaths(result.visited.paths));
},
testFollowEdgesWithLabels : function () {
var config = {
expander: traversal.ExpandEdgesWithLabels,
edgeLabels: ["likes", "hates"]
}
} }
}; };
} }