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)
|
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
|
* inception could get caught in a trap, where agent configuration
|
||||||
version and timeout multiplier lead to incapacitated agency
|
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
|
// / internal helper to sort a graph's edge definitions
|
||||||
// //////////////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
var sortEdgeDefinition = function (edgeDefinition) {
|
var sortEdgeDefinitionInplace = function (edgeDefinition) {
|
||||||
edgeDefinition.from = edgeDefinition.from.sort();
|
edgeDefinition.from.sort();
|
||||||
edgeDefinition.to = edgeDefinition.to.sort();
|
edgeDefinition.to.sort();
|
||||||
return edgeDefinition;
|
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
|
// / @brief create a new graph
|
||||||
// //////////////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -729,6 +737,8 @@ var checkIfMayBeDropped = function (colName, graphName, graphs) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const edgeDefinitionsEqual = function (leftEdgeDef, rightEdgeDef) {
|
const edgeDefinitionsEqual = function (leftEdgeDef, rightEdgeDef) {
|
||||||
|
leftEdgeDef = sortEdgeDefinition(leftEdgeDef);
|
||||||
|
rightEdgeDef = sortEdgeDefinition(rightEdgeDef);
|
||||||
const stringify = obj => JSON.stringify(obj, Object.keys(obj).sort());
|
const stringify = obj => JSON.stringify(obj, Object.keys(obj).sort());
|
||||||
return stringify(leftEdgeDef) === stringify(rightEdgeDef);
|
return stringify(leftEdgeDef) === stringify(rightEdgeDef);
|
||||||
};
|
};
|
||||||
|
@ -781,7 +791,7 @@ class Graph {
|
||||||
|
|
||||||
// Create Hidden Functions
|
// Create Hidden Functions
|
||||||
createHiddenProperty(this, '__updateBindCollections', updateBindCollections);
|
createHiddenProperty(this, '__updateBindCollections', updateBindCollections);
|
||||||
createHiddenProperty(this, '__sortEdgeDefinition', sortEdgeDefinition);
|
createHiddenProperty(this, '__sortEdgeDefinition', sortEdgeDefinitionInplace);
|
||||||
updateBindCollections(self);
|
updateBindCollections(self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1558,7 +1568,7 @@ class Graph {
|
||||||
// //////////////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
_extendEdgeDefinitions (edgeDefinition) {
|
_extendEdgeDefinitions (edgeDefinition) {
|
||||||
edgeDefinition = sortEdgeDefinition(edgeDefinition);
|
sortEdgeDefinitionInplace(edgeDefinition);
|
||||||
var self = this;
|
var self = this;
|
||||||
var err;
|
var err;
|
||||||
// check if edgeCollection not already used
|
// check if edgeCollection not already used
|
||||||
|
@ -1632,7 +1642,7 @@ class Graph {
|
||||||
// //////////////////////////////////////////////////////////////////////////////
|
// //////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
_editEdgeDefinitions (edgeDefinition) {
|
_editEdgeDefinitions (edgeDefinition) {
|
||||||
edgeDefinition = sortEdgeDefinition(edgeDefinition);
|
sortEdgeDefinitionInplace(edgeDefinition);
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
// check, if in graphs edge definition
|
// check, if in graphs edge definition
|
||||||
|
@ -2078,12 +2088,7 @@ exports._create = function (graphName, edgeDefinitions, orphanCollections, optio
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
edgeDefinitions.forEach(
|
edgeDefinitions.forEach(sortEdgeDefinitionInplace);
|
||||||
(eD, index) => {
|
|
||||||
var tmp = sortEdgeDefinition(eD);
|
|
||||||
edgeDefinitions[index] = tmp;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
orphanCollections = orphanCollections.sort();
|
orphanCollections = orphanCollections.sort();
|
||||||
|
|
||||||
var data = gdb.save({
|
var data = gdb.save({
|
||||||
|
|
|
@ -481,6 +481,9 @@ function GeneralGraphCreationSuite() {
|
||||||
// definitions, which did rely on the edge definition object's key order
|
// definitions, which did rely on the edge definition object's key order
|
||||||
// and thus sometimes reported spurious inequality.
|
// and thus sometimes reported spurious inequality.
|
||||||
test_createGraphsWithOverlappingEdgeDefinitions: function () {
|
test_createGraphsWithOverlappingEdgeDefinitions: function () {
|
||||||
|
if (db._collection("_graphs").exists(gn)) {
|
||||||
|
db._collection("_graphs").remove(gn);
|
||||||
|
}
|
||||||
// try to provoke differently ordered keys in
|
// try to provoke differently ordered keys in
|
||||||
// edge definitions that are actually equal.
|
// edge definitions that are actually equal.
|
||||||
const edgeDefs1 = [
|
const edgeDefs1 = [
|
||||||
|
@ -501,6 +504,35 @@ function GeneralGraphCreationSuite() {
|
||||||
graph._create(gn2, edgeDefs2);
|
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 () {
|
test_get_graph : function () {
|
||||||
if (db._collection("_graphs").exists(gn)) {
|
if (db._collection("_graphs").exists(gn)) {
|
||||||
db._collection("_graphs").remove(gn);
|
db._collection("_graphs").remove(gn);
|
||||||
|
|
Loading…
Reference in New Issue