diff --git a/js/actions/api-graph.js b/js/actions/api-graph.js index a0ed9253ba..e255ef4205 100644 --- a/js/actions/api-graph.js +++ b/js/actions/api-graph.js @@ -252,13 +252,11 @@ function post_graph_graph (req, res) { } var name = json._key; - var vertices = json.edgeDefinitions[0].from[0]; - var edges = json.edgeDefinitions[0].collection; + var vertices = json.vertices; + var edges = json.edges; var waitForSync = false; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } var g = new graph.Graph(name, vertices, edges, waitForSync); @@ -483,9 +481,7 @@ function delete_graph_graph (req, res) { } var waitForSync = g._gdb.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -576,9 +572,7 @@ function post_graph_vertex (req, res, g) { } var waitForSync = g._vertices.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -779,9 +773,7 @@ function delete_graph_vertex (req, res, g) { } var waitForSync = g._vertices.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -823,9 +815,7 @@ function update_graph_vertex (req, res, g, isPatch) { } var waitForSync = g._vertices.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -1477,9 +1467,7 @@ function post_graph_edge (req, res, g) { } var waitForSync = g._edges.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -1686,9 +1674,7 @@ function delete_graph_edge (req, res, g) { } var waitForSync = g._edges.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } @@ -1730,9 +1716,7 @@ function update_graph_edge (req, res, g, isPatch) { } var waitForSync = g._edges.properties().waitForSync; - if (req.parameters.waitForSync && - (req.parameters.waitForSync === "true" || - req.parameters.waitForSync === true)) { + if (req.parameters.waitForSync) { waitForSync = true; } diff --git a/js/client/modules/org/arangodb/graph-blueprint.js b/js/client/modules/org/arangodb/graph-blueprint.js index 15a81b14b1..380f9f8da6 100644 --- a/js/client/modules/org/arangodb/graph-blueprint.js +++ b/js/client/modules/org/arangodb/graph-blueprint.js @@ -212,11 +212,10 @@ Graph.prototype.initialize = function (name, vertices, edges) { edges = edges.name(); } - var newEdgeDefinition = [{"collection": edges, "from" :[vertices], "to": [vertices]}]; - results = GraphAPI.postGraph({ _key: name, - edgeDefinitions: newEdgeDefinition + vertices: vertices, + edges: edges }); } diff --git a/js/common/modules/org/arangodb/general-graph.js b/js/common/modules/org/arangodb/general-graph.js index fd307f455f..717805e786 100644 --- a/js/common/modules/org/arangodb/general-graph.js +++ b/js/common/modules/org/arangodb/general-graph.js @@ -222,9 +222,15 @@ AQLStatement.prototype.allowsRestrict = function() { }; // ----------------------------------------------------------------------------- -// --SECTION-- AQL Generator +// --SECTION-- AQL Generator for fluent interface // ----------------------------------------------------------------------------- +//////////////////////////////////////////////////////////////////////////////// +/// @brief Starting point of the fluent interface. +/// +/// Only for internal use. +//////////////////////////////////////////////////////////////////////////////// + var AQLGenerator = function(graph) { this.stack = []; this.bindVars = { @@ -235,6 +241,12 @@ var AQLGenerator = function(graph) { this.lastVar = ""; }; +//////////////////////////////////////////////////////////////////////////////// +/// @brief Dispose and reset the current cursor of the query +/// +/// Only for internal use. +//////////////////////////////////////////////////////////////////////////////// + AQLGenerator.prototype._clearCursor = function() { if (this.cursor) { this.cursor.dispose(); @@ -242,12 +254,28 @@ AQLGenerator.prototype._clearCursor = function() { } }; +//////////////////////////////////////////////////////////////////////////////// +/// @brief Execute the query and keep the cursor +/// +/// Only for internal use. +//////////////////////////////////////////////////////////////////////////////// + AQLGenerator.prototype._createCursor = function() { if (!this.cursor) { this.cursor = this.execute(); } }; +//////////////////////////////////////////////////////////////////////////////// +/// @brief General edge query, takes direction as parameter +/// +/// This will create the general AQL statement to load edges +/// connected to the vertices selected in the step before. +/// Will also bind the options into bindVars. +/// +/// Only for internal use, user gets different functions for directions +//////////////////////////////////////////////////////////////////////////////// + AQLGenerator.prototype._edges = function(edgeExample, options) { this._clearCursor(); this.options = options || {}; @@ -273,6 +301,79 @@ AQLGenerator.prototype._edges = function(edgeExample, options) { return this; }; +//////////////////////////////////////////////////////////////////////////////// +/// @fn JSF_general_graph_fluent_aql_edges +/// @brief select all connected edges +/// +/// @FUN{graph-query.edges(@FA{examples})} +/// +/// Creates an AQL statement to select all edges for each of the vertices selected +/// in the step before. +/// This will include `inbound` as well as `outbound` edges. +/// The resulting set of edges can be filtered by defining one or more @FA{examples}. +/// +/// @EXAMPLES +/// +/// To request unfiltered edges: +/// +/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphFluentAQLEdgesUnfiltered} +/// var graph = require("org/arangodb/general-graph"); +/// var edgeDefinition = []; +/// edgeDefinition.push(graph._undirectedRelationDefinition("friend", "user")); +/// var g = graph._create("social", edgeDefinition); +/// var a = g.user.save({name: "Alice"}); +/// var b = g.user.save({name: "Bob"}); +/// var c = g.user.save({name: "Charly"}); +/// var d = g.user.save({name: "Diana"}); +/// var e1 = g.friend.save(a._id, b._id, {type: "married"}); +/// var e2 = g.friend.save(a._id, c._id, {type: "friend"}); +/// var e3 = g.friend.save(c._id, d._id, {type: "married"}); +/// var e4 = g.friend.save(b,_id, d._id, {type: "friend"}); +/// var query = g._vertices([{name: "Alice"}, {name: "Bob"}]); +/// query.edges().toArray(); +/// @END_EXAMPLE_ARANGOSH_OUTPUT +/// +/// To request filtered edges by a single example: +/// +/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphFluentAQLEdgesFilteredSingle} +/// var graph = require("org/arangodb/general-graph"); +/// var edgeDefinition = []; +/// edgeDefinition.push(graph._undirectedRelationDefinition("friend", "user")); +/// var g = graph._create("social", edgeDefinition); +/// var a = g.user.save({name: "Alice"}); +/// var b = g.user.save({name: "Bob"}); +/// var c = g.user.save({name: "Charly"}); +/// var d = g.user.save({name: "Diana"}); +/// var e1 = g.friend.save(a._id, b._id, {type: "married"}); +/// var e2 = g.friend.save(a._id, c._id, {type: "friend"}); +/// var e3 = g.friend.save(c._id, d._id, {type: "married"}); +/// var e4 = g.friend.save(b,_id, d._id, {type: "friend"}); +/// var query = g._vertices([{name: "Alice"}, {name: "Bob"}]); +/// query.edges({type: "married"}).toArray(); +/// @END_EXAMPLE_ARANGOSH_OUTPUT +/// +/// To request filtered edges by multiple examples: +/// +/// @EXAMPLE_ARANGOSH_OUTPUT{generalGraphFluentAQLEdgesFilteredMultiple} +/// var graph = require("org/arangodb/general-graph"); +/// var edgeDefinition = []; +/// edgeDefinition.push(graph._undirectedRelationDefinition("friend", "user")); +/// var g = graph._create("social", edgeDefinition); +/// var a = g.user.save({name: "Alice"}); +/// var b = g.user.save({name: "Bob"}); +/// var c = g.user.save({name: "Charly"}); +/// var d = g.user.save({name: "Diana"}); +/// var e1 = g.friend.save(a._id, b._id, {type: "married"}); +/// var e2 = g.friend.save(a._id, c._id, {type: "friend"}); +/// var e3 = g.friend.save(c._id, d._id, {type: "married"}); +/// var e4 = g.friend.save(b,_id, d._id, {type: "friend"}); +/// var query = g._vertices([{name: "Alice"}, {name: "Bob"}]); +/// query.edges([{type: "married"}, {type: "friend"}]).toArray(); +/// @END_EXAMPLE_ARANGOSH_OUTPUT +/// To define a relation between several vertex collections: +/// +//////////////////////////////////////////////////////////////////////////////// + AQLGenerator.prototype.edges = function(example) { return this._edges(example, {direction: "any"}); }; diff --git a/js/server/modules/org/arangodb/graph-blueprint.js b/js/server/modules/org/arangodb/graph-blueprint.js index 6dac5f4432..be053a3f2e 100644 --- a/js/server/modules/org/arangodb/graph-blueprint.js +++ b/js/server/modules/org/arangodb/graph-blueprint.js @@ -318,7 +318,6 @@ Vertex.prototype.setProperty = function (name, value) { //////////////////////////////////////////////////////////////////////////////// Graph.prototype.initialize = function (name, vertices, edges, waitForSync) { - this._name = name; var gdb = db._collection("_graphs"); var graphProperties; @@ -415,8 +414,7 @@ Graph.prototype.initialize = function (name, vertices, edges, waitForSync) { if (graphProperties === null) { - // check if edge is used in a graph - //hole alle graphen nud schau nach O.o + // check if edge is used in a graph gdb.toArray().forEach( function(singleGraph) { var sGEDs = singleGraph.edgeDefinitions; @@ -455,7 +453,9 @@ Graph.prototype.initialize = function (name, vertices, edges, waitForSync) { } } else { - if (graphProperties.vertices !== vertices || graphProperties.edges !== edges) { + if (graphProperties.edgeDefinitions[0].from[0] !== vertices + || graphProperties.edgeDefinitions[0].to[0] !== vertices + || graphProperties.edgeDefinitions[0].collection !== edges) { throw "graph with that name already exists!"; } }