1
0
Fork 0

some fixes for graph functions

This commit is contained in:
Jan Steemann 2015-07-15 09:34:42 +02:00
parent a43832fba3
commit f77dbc005c
3 changed files with 62 additions and 17 deletions

View File

@ -627,6 +627,15 @@ v2.6.0 (2015-06-20)
GRAPH_SHORTEST_PATH(<graph>, <source>, <target>, { includeData: true, includePath: { edges: true, vertices: true } }) GRAPH_SHORTEST_PATH(<graph>, <source>, <target>, { includeData: true, includePath: { edges: true, vertices: true } })
The attributes `startVertex` and `vertex` that were present in the results of `GRAPH_SHORTEST_PATH`
in previous versions of ArangoDB will not be produced in 2.6. To calculate these attributes in 2.6,
please extract the first and last elements from the `vertices` result attribute.
* INCOMPATIBLE CHANGE:
The AQL function `GRAPH_DISTANCE_TO` will now return only the id the destination vertex
in the `vertex` attribute, and not the full vertex data with all vertex attributes.
* INCOMPATIBLE CHANGE: * INCOMPATIBLE CHANGE:
All graph measurements functions in JavaScript module `general-graph` that calculated a All graph measurements functions in JavaScript module `general-graph` that calculated a

View File

@ -2008,7 +2008,7 @@ static VertexId IdStringToVertexId (CollectionNameResolver const* resolver,
char const* str = vertex.c_str(); char const* str = vertex.c_str();
if (! TRI_ValidateDocumentIdKeyGenerator(str, &split)) { if (! TRI_ValidateDocumentIdKeyGenerator(str, &split)) {
throw TRI_ERROR_ARANGO_INVALID_KEY_GENERATOR; throw TRI_ERROR_ARANGO_DOCUMENT_KEY_BAD;
} }
string const collectionName = vertex.substr(0, split); string const collectionName = vertex.substr(0, split);

View File

@ -5292,7 +5292,7 @@ function DOCUMENT_IDS_BY_EXAMPLE (collectionList, example) {
var res = [ ]; var res = [ ];
if (example === "null" || example === null || ! example) { if (example === "null" || example === null || ! example) {
collectionList.forEach(function (c) { collectionList.forEach(function (c) {
res = res.concat(COLLECTION(c).toArray()); res = res.concat(COLLECTION(c).toArray().map(function(t) { return t._id; }));
}); });
return res; return res;
} }
@ -6145,6 +6145,11 @@ function AQL_GRAPH_SHORTEST_PATH (graphName,
return tmp; return tmp;
} }
if (options.hasOwnProperty('edgeExamples')) {
// these two are the same (edgeExamples & filterEdges)...
options.filterEdges = options.edgeExamples;
}
let graph_module = require("org/arangodb/general-graph"); let graph_module = require("org/arangodb/general-graph");
let graph = graph_module._graph(graphName); let graph = graph_module._graph(graphName);
let edgeCollections = graph._edgeCollections().map(function (c) { return c.name();}); let edgeCollections = graph._edgeCollections().map(function (c) { return c.name();});
@ -6167,7 +6172,12 @@ function AQL_GRAPH_SHORTEST_PATH (graphName,
if (options.hasOwnProperty("startVertexCollectionRestriction") if (options.hasOwnProperty("startVertexCollectionRestriction")
&& Array.isArray(options.startVertexCollectionRestriction)) { && Array.isArray(options.startVertexCollectionRestriction)) {
startVertices = DOCUMENT_IDS_BY_EXAMPLE(options.startVertexCollectionRestriction, startVertexExample); startVertices = DOCUMENT_IDS_BY_EXAMPLE(options.startVertexCollectionRestriction, startVertexExample);
} else { }
else if (options.hasOwnProperty("startVertexCollectionRestriction")
&& typeof options.startVertexCollectionRestriction === 'string') {
startVertices = DOCUMENT_IDS_BY_EXAMPLE([ options.startVertexCollectionRestriction ], startVertexExample);
}
else {
startVertices = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, startVertexExample); startVertices = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, startVertexExample);
} }
if (startVertices.length === 0) { if (startVertices.length === 0) {
@ -6178,7 +6188,12 @@ function AQL_GRAPH_SHORTEST_PATH (graphName,
if (options.hasOwnProperty("endVertexCollectionRestriction") if (options.hasOwnProperty("endVertexCollectionRestriction")
&& Array.isArray(options.endVertexCollectionRestriction)) { && Array.isArray(options.endVertexCollectionRestriction)) {
endVertices = DOCUMENT_IDS_BY_EXAMPLE(options.endVertexCollectionRestriction, endVertexExample); endVertices = DOCUMENT_IDS_BY_EXAMPLE(options.endVertexCollectionRestriction, endVertexExample);
} else { }
else if (options.hasOwnProperty("endVertexCollectionRestriction")
&& typeof options.endVertexCollectionRestriction === 'string') {
endVertices = DOCUMENT_IDS_BY_EXAMPLE([ options.endVertexCollectionRestriction ], endVertexExample);
}
else {
endVertices = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, endVertexExample); endVertices = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, endVertexExample);
} }
if (endVertices.length === 0) { if (endVertices.length === 0) {
@ -7274,6 +7289,13 @@ function AQL_GRAPH_COMMON_NEIGHBORS (graphName,
options1 = options1 || {}; options1 = options1 || {};
options2 = options2 || {}; options2 = options2 || {};
if (options1.includeData) {
options2.includeData = true;
}
else if (options2.includeData) {
options1.includeData = true;
}
let graph_module = require("org/arangodb/general-graph"); let graph_module = require("org/arangodb/general-graph");
let graph = graph_module._graph(graphName); let graph = graph_module._graph(graphName);
let vertexCollections = graph._vertexCollections().map(function (c) { return c.name();}); let vertexCollections = graph._vertexCollections().map(function (c) { return c.name();});
@ -7281,7 +7303,8 @@ function AQL_GRAPH_COMMON_NEIGHBORS (graphName,
let vertices2; let vertices2;
if (vertex1Examples === vertex2Examples) { if (vertex1Examples === vertex2Examples) {
vertices2 = vertices1; vertices2 = vertices1;
} else { }
else {
vertices2 = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, vertex2Examples); vertices2 = DOCUMENT_IDS_BY_EXAMPLE(vertexCollections, vertex2Examples);
} }
// Use ES6 Map. Higher performance then Object. // Use ES6 Map. Higher performance then Object.
@ -7289,9 +7312,6 @@ function AQL_GRAPH_COMMON_NEIGHBORS (graphName,
let tmpNeighborsRight = new Map(); let tmpNeighborsRight = new Map();
let result = []; let result = [];
// Legacy Format
// let tmpRes = {};
// Iterate over left side vertex list as left. // Iterate over left side vertex list as left.
// Calculate its neighbors as ln // Calculate its neighbors as ln
// For each entry iterate over right side vertex list as right. // For each entry iterate over right side vertex list as right.
@ -7303,7 +7323,8 @@ function AQL_GRAPH_COMMON_NEIGHBORS (graphName,
let itemNeighbors; let itemNeighbors;
if(tmpNeighborsLeft.has(left)) { if(tmpNeighborsLeft.has(left)) {
itemNeighbors = tmpNeighborsLeft.get(left); itemNeighbors = tmpNeighborsLeft.get(left);
} else { }
else {
itemNeighbors = AQL_GRAPH_NEIGHBORS(graphName, left, options1); itemNeighbors = AQL_GRAPH_NEIGHBORS(graphName, left, options1);
tmpNeighborsLeft.set(left, itemNeighbors); tmpNeighborsLeft.set(left, itemNeighbors);
} }
@ -7315,15 +7336,30 @@ function AQL_GRAPH_COMMON_NEIGHBORS (graphName,
let rNeighbors; let rNeighbors;
if(tmpNeighborsRight.has(right)) { if(tmpNeighborsRight.has(right)) {
rNeighbors = tmpNeighborsRight.get(right); rNeighbors = tmpNeighborsRight.get(right);
} else { }
else {
rNeighbors = AQL_GRAPH_NEIGHBORS(graphName, right, options2); rNeighbors = AQL_GRAPH_NEIGHBORS(graphName, right, options2);
tmpNeighborsRight.set(right, rNeighbors); tmpNeighborsRight.set(right, rNeighbors);
} }
let neighbors = underscore.intersection(itemNeighbors, rNeighbors); let neighbors;
if (! options1.includeData) {
neighbors = underscore.intersection(itemNeighbors, rNeighbors);
}
else {
// create a quick lookup table for left hand side
let lKeys = { };
for (let i = 0; i < itemNeighbors.length; ++i) {
lKeys[itemNeighbors[i]._id] = true;
}
// check which elements of the right-hand side are also present in the left hand side lookup map
neighbors = [];
for (let i = 0; i < rNeighbors.length; ++i) {
if (lKeys.hasOwnProperty(rNeighbors[i]._id)) {
neighbors.push(rNeighbors[i]);
}
}
}
if (neighbors.length > 0) { if (neighbors.length > 0) {
// Legacy Format
// tmpRes[left] = tmpRes[left] || {};
// tmpRes[left][right] = neighbors;
result.push({left, right, neighbors}); result.push({left, right, neighbors});
} }
} }