diff --git a/js/common/modules/org/arangodb/general-graph.js b/js/common/modules/org/arangodb/general-graph.js index f6a89a2c5b..b0dd81cfef 100644 --- a/js/common/modules/org/arangodb/general-graph.js +++ b/js/common/modules/org/arangodb/general-graph.js @@ -78,9 +78,9 @@ var isValidCollectionsParameter = function (x) { /// @brief find or create a collection by name //////////////////////////////////////////////////////////////////////////////// -var findOrCreateCollectionByName = function (name, type) { +var findOrCreateCollectionByName = function (name, type, noCreate) { var col = db._collection(name),res = false; - if (col === null) { + if (col === null && !noCreate) { if (type === ArangoCollection.TYPE_DOCUMENT) { col = db._create(name); } else { @@ -95,6 +95,29 @@ var findOrCreateCollectionByName = function (name, type) { return res; }; + +//////////////////////////////////////////////////////////////////////////////// +/// @brief find or create a collection by name +//////////////////////////////////////////////////////////////////////////////// + +var findOrCreateCollectionsByEdgeDefinitions = function (edgeDefinitions, noCreate) { + var vertexCollections = {}, + edgeCollections = {}; + edgeDefinitions.forEach(function (e) { + e.from.concat(e.to).forEach(function (v) { + findOrCreateCollectionByName(v, ArangoCollection.TYPE_DOCUMENT, noCreate); + vertexCollections[v] = db[v]; + }); + findOrCreateCollectionByName(e.collection, ArangoCollection.TYPE_EDGE, noCreate); + edgeCollections[e.collection] = db[e.collection]; + }); + return [ + vertexCollections, + edgeCollections + ]; +}; + + // ----------------------------------------------------------------------------- // --SECTION-- module "org/arangodb/general-graph" // ----------------------------------------------------------------------------- @@ -170,7 +193,7 @@ var edgeDefinitions = function () { var res = [], args = arguments; Object.keys(args).forEach(function (x) { - res.push(args[x]); + res.push(args[x]); }); return res; @@ -187,20 +210,17 @@ var _create = function (graphName, edgeDefinitions) { var gdb = db["_graphs"], g, graphAlreadyExists = true, - vertexCollections = {}; - edgeCollections = {}; + collections; if (gdb === null) { throw "_graphs collection does not exist."; } - if (!graphName) { throw "a graph name is required to create a graph."; } if (!Array.isArray(edgeDefinitions) || edgeDefinitions.length === 0) { throw "at least one edge definition is required to create a graph."; } - try { g = gdb.document(graphName); } catch (e) { @@ -214,21 +234,14 @@ var _create = function (graphName, edgeDefinitions) { throw "graph " + graphName + " already exists."; } - edgeDefinitions.forEach(function (e) { - e.from.concat(e.to).forEach(function (v) { - findOrCreateCollectionByName(v, ArangoCollection.TYPE_DOCUMENT); - vertexCollections[v] = db[v]; - }); - findOrCreateCollectionByName(e.collection, ArangoCollection.TYPE_EDGE); - edgeCollections[e.collection] = db[e.collection]; - }); + collections = findOrCreateCollectionsByEdgeDefinitions(edgeDefinitions, false); gdb.save({ 'edgeDefinitions' : edgeDefinitions, '_key' : graphName }); - return new Graph(graphName, edgeDefinitions, vertexCollections, edgeCollections); + return new Graph(graphName, edgeDefinitions, collections[0], collections[1]); }; @@ -251,7 +264,6 @@ var Graph = function(graphName, edgeDefinitions, vertexCollections, edgeCollecti _.each(edgeCollections, function(obj, key) { self[key] = obj; }); - }; @@ -263,7 +275,7 @@ var Graph = function(graphName, edgeDefinitions, vertexCollections, edgeCollecti var _graph = function(graphName) { var gdb = db["_graphs"], - g; + g, collections; if (gdb === null) { throw "_graphs collection does not exist."; @@ -272,11 +284,15 @@ var _graph = function(graphName) { try { g = gdb.document(graphName); } catch (e) { - require("internal").print(e) - throw e; - } + if (e.errorNum !== 1202) { + throw e; + } + throw "graph " + graphName + " does not exists."; + } - return new Graph(graphName, g.edgeDefinitions); + collections = findOrCreateCollectionsByEdgeDefinitions(g.edgeDefinitions, true); + + return new Graph(graphName, g.edgeDefinitions, collections[0], collections[1]); }; //////////////////////////////////////////////////////////////////////////////// diff --git a/js/common/tests/shell-general-graph.js b/js/common/tests/shell-general-graph.js index dc6dc010a3..d24bd990b7 100644 --- a/js/common/tests/shell-general-graph.js +++ b/js/common/tests/shell-general-graph.js @@ -223,33 +223,187 @@ function GeneralGraphCreationSuite() { }, -<<<<<<< HEAD test_create : function () { try { arangodb.db._collection("_graphs").remove("_graphs/bla3") } catch (err) { -======= - /*test_create : function () { ->>>>>>> 76b26f15ab96c6c655f4a61f3df27e5a36b84777 - } - - var a = graph._create( + var a = graph._create( "bla3", graph.edgeDefinitions( graph._undirectedRelationDefinition("relationName", "vertexC1"), - graph._directedRelationDefinition("relationName", + graph._directedRelationDefinition("relationName2", ["vertexC1", "vertexC2"], ["vertexC3", "vertexC4"] ) ) ); - require("console").log(JSON.stringify(a)); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC1')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC2')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC3')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC4')); + assertTrue(a.__edgeCollections.hasOwnProperty('relationName')); + assertTrue(a.__edgeCollections.hasOwnProperty('relationName2')); + assertEqual(a.__edgeDefinitions, [ + { + "collection" : "relationName", + "from" : [ + "vertexC1" + ], + "to" : [ + "vertexC1" + ] + }, + { + "collection" : "relationName2", + "from" : [ + "vertexC1", + "vertexC2" + ], + "to" : [ + "vertexC3", + "vertexC4" + ] + } + ] + ); + }, - assertEqual(a, ""); + test_create_WithOut_EdgeDefiniton : function () { + var msg; + try { + arangodb.db._collection("_graphs").remove("_graphs/bla3") + } catch (err) { + } + try { + var a = graph._create( + "bla3", + [] + ); + } catch (err) { + msg = err; + } + assertEqual(msg, "at least one edge definition is required to create a graph."); + }, + + test_create_WithOut_Name : function () { + var msg; + try { + arangodb.db._collection("_graphs").remove("_graphs/bla3") + } catch (err) { + } + + try { + var a = graph._create( + "", + graph.edgeDefinitions( + graph._undirectedRelationDefinition("relationName", "vertexC1"), + graph._directedRelationDefinition("relationName2", + ["vertexC1", "vertexC2"], ["vertexC3", "vertexC4"] + ) + ) + ); + } catch (err) { + msg = err; + } + + assertEqual(msg, "a graph name is required to create a graph."); + + }, + + test_create_With_Already_Existing_Graph : function () { + try { + arangodb.db._collection("_graphs").remove("_graphs/bla3") + } catch (err) { + } + graph._create( + "bla3", + graph.edgeDefinitions( + graph._undirectedRelationDefinition("relationName", "vertexC1"), + graph._directedRelationDefinition("relationName2", + ["vertexC1", "vertexC2"], ["vertexC3", "vertexC4"] + ) + ) + ); + var msg; + try { + var a = graph._create( + "bla3", + graph.edgeDefinitions( + graph._undirectedRelationDefinition("relationName", "vertexC1"), + graph._directedRelationDefinition("relationName2", + ["vertexC1", "vertexC2"], ["vertexC3", "vertexC4"] + ) + ) + ); + } catch (err) { + msg = err; + } + + assertEqual(msg, "graph bla3 already exists."); + + }, + + test_get_graph : function () { + + try { + arangodb.db._collection("_graphs").remove("_graphs/bla3") + } catch (err) { + } + graph._create( + "bla3", + graph.edgeDefinitions( + graph._undirectedRelationDefinition("relationName", "vertexC1"), + graph._directedRelationDefinition("relationName2", + ["vertexC1", "vertexC2"], ["vertexC3", "vertexC4"] + ) + ) + ); + + var a = graph._graph("bla3"); + + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC1')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC2')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC3')); + assertTrue(a.__vertexCollections.hasOwnProperty('vertexC4')); + assertTrue(a.__edgeCollections.hasOwnProperty('relationName')); + assertTrue(a.__edgeCollections.hasOwnProperty('relationName2')); + assertEqual(a.__edgeDefinitions, [ + { + "collection" : "relationName", + "from" : [ + "vertexC1" + ], + "to" : [ + "vertexC1" + ] + }, + { + "collection" : "relationName2", + "from" : [ + "vertexC1", + "vertexC2" + ], + "to" : [ + "vertexC3", + "vertexC4" + ] + } + ] + ); + }, + + test_get_graph_without_hit : function () { + var msg; + try { + var a = graph._graph("bla4"); + } catch (e) { + msg = e; + } + assertEqual(msg, "graph bla4 does not exists."); } };