1
0
Fork 0

[3.3] Bugfix: Creating a graph failed erroneously (v2) (#5898)

* Regression test & bugfix: comparison of edge definitions didn' order from and to

* Updated CHANGELOG
This commit is contained in:
Tobias Gödderz 2018-07-17 12:56:00 +02:00 committed by Michael Hackstein
parent 773a4a231c
commit 9b85243f69
3 changed files with 53 additions and 12 deletions

View File

@ -1,6 +1,10 @@
v3.3.13 (XXXX-XX-XX)
--------------------
* fixed graph creation sometimes failing with 'edge collection
already used in edge def' when the edge definition contained multiple vertex
collections, despite the edge definitions being identical
* inception could get caught in a trap, where agent configuration
version and timeout multiplier lead to incapacitated agency

View File

@ -320,12 +320,20 @@ var transformExampleToAQL = function (examples, collections, bindVars, varname)
// / internal helper to sort a graph's edge definitions
// //////////////////////////////////////////////////////////////////////////////
var sortEdgeDefinition = function (edgeDefinition) {
edgeDefinition.from = edgeDefinition.from.sort();
edgeDefinition.to = edgeDefinition.to.sort();
var sortEdgeDefinitionInplace = function (edgeDefinition) {
edgeDefinition.from.sort();
edgeDefinition.to.sort();
return edgeDefinition;
};
var sortEdgeDefinition = function (edgeDefinition) {
return {
collection: edgeDefinition.collection,
from: edgeDefinition.from.slice().sort(),
to: edgeDefinition.to.slice().sort(),
};
};
// //////////////////////////////////////////////////////////////////////////////
// / @brief create a new graph
// //////////////////////////////////////////////////////////////////////////////
@ -729,6 +737,8 @@ var checkIfMayBeDropped = function (colName, graphName, graphs) {
};
const edgeDefinitionsEqual = function (leftEdgeDef, rightEdgeDef) {
leftEdgeDef = sortEdgeDefinition(leftEdgeDef);
rightEdgeDef = sortEdgeDefinition(rightEdgeDef);
const stringify = obj => JSON.stringify(obj, Object.keys(obj).sort());
return stringify(leftEdgeDef) === stringify(rightEdgeDef);
};
@ -781,7 +791,7 @@ class Graph {
// Create Hidden Functions
createHiddenProperty(this, '__updateBindCollections', updateBindCollections);
createHiddenProperty(this, '__sortEdgeDefinition', sortEdgeDefinition);
createHiddenProperty(this, '__sortEdgeDefinition', sortEdgeDefinitionInplace);
updateBindCollections(self);
}
@ -1558,7 +1568,7 @@ class Graph {
// //////////////////////////////////////////////////////////////////////////////
_extendEdgeDefinitions (edgeDefinition) {
edgeDefinition = sortEdgeDefinition(edgeDefinition);
sortEdgeDefinitionInplace(edgeDefinition);
var self = this;
var err;
// check if edgeCollection not already used
@ -1632,7 +1642,7 @@ class Graph {
// //////////////////////////////////////////////////////////////////////////////
_editEdgeDefinitions (edgeDefinition) {
edgeDefinition = sortEdgeDefinition(edgeDefinition);
sortEdgeDefinitionInplace(edgeDefinition);
var self = this;
// check, if in graphs edge definition
@ -2078,12 +2088,7 @@ exports._create = function (graphName, edgeDefinitions, orphanCollections, optio
}
);
edgeDefinitions.forEach(
(eD, index) => {
var tmp = sortEdgeDefinition(eD);
edgeDefinitions[index] = tmp;
}
);
edgeDefinitions.forEach(sortEdgeDefinitionInplace);
orphanCollections = orphanCollections.sort();
var data = gdb.save({

View File

@ -481,6 +481,9 @@ function GeneralGraphCreationSuite() {
// definitions, which did rely on the edge definition object's key order
// and thus sometimes reported spurious inequality.
test_createGraphsWithOverlappingEdgeDefinitions: function () {
if (db._collection("_graphs").exists(gn)) {
db._collection("_graphs").remove(gn);
}
// try to provoke differently ordered keys in
// edge definitions that are actually equal.
const edgeDefs1 = [
@ -501,6 +504,35 @@ function GeneralGraphCreationSuite() {
graph._create(gn2, edgeDefs2);
},
// Graphs may have overlapping edge collections, as long as their
// definitions are equal.
// This is also a regression test for a broken comparison of edge
// definitions, which did rely on the edge definition's from and to
// arrays to be ordered.
test_createGraphsWithLargeOverlappingEdgeDefinitions: function () {
if (db._collection("_graphs").exists(gn)) {
db._collection("_graphs").remove(gn);
}
// try to provoke differently ordered from and to arrays in
// edge definitions that are actually equal.
const edgeDefs1 = [
{
collection: rn,
from: [vn1, vn2, vn3, vn4],
to: [vn2, vn1, vn4, vn3],
},
];
const edgeDefs2 = [
{
collection: rn,
from: [vn4, vn3, vn2, vn1],
to: [vn3, vn4, vn1, vn2],
},
];
graph._create(gn1, edgeDefs1);
graph._create(gn2, edgeDefs2);
},
test_get_graph : function () {
if (db._collection("_graphs").exists(gn)) {
db._collection("_graphs").remove(gn);