mirror of https://gitee.com/bigwinds/arangodb
[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:
parent
773a4a231c
commit
9b85243f69
|
@ -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
|
||||
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue