You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2018/02/01 15:30:22 UTC

[11/50] [abbrv] tinkerpop git commit: Parse traversal parameters and use empty graph

Parse traversal parameters and use empty graph


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/15c86798
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/15c86798
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/15c86798

Branch: refs/heads/TINKERPOP-1857
Commit: 15c86798aacf2732120f303a001421e4111c230c
Parents: e73038c
Author: Jorge Bay Gondra <jo...@gmail.com>
Authored: Fri Nov 24 15:04:41 2017 +0100
Committer: Jorge Bay Gondra <jo...@gmail.com>
Committed: Fri Jan 19 09:30:16 2018 +0100

----------------------------------------------------------------------
 gremlin-javascript/glv/PackageJson.template     |   5 +-
 .../gremlin-javascript/lib/structure/graph.js   |  31 ++++
 .../javascript/gremlin-javascript/package.json  |   5 +-
 .../test/cucumber/feature-steps.js              | 156 +++++++++++++++----
 .../gremlin-javascript/test/cucumber/world.js   |  33 +++-
 .../test/integration/remote-connection-tests.js |   2 +-
 .../test/integration/traversal-test.js          |   2 +-
 7 files changed, 195 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/glv/PackageJson.template
----------------------------------------------------------------------
diff --git a/gremlin-javascript/glv/PackageJson.template b/gremlin-javascript/glv/PackageJson.template
index 52d2c1d..4f1ac05 100644
--- a/gremlin-javascript/glv/PackageJson.template
+++ b/gremlin-javascript/glv/PackageJson.template
@@ -37,7 +37,8 @@
   },
   "devDependencies": {
     "mocha": "~4.0.1",
-    "cucumber": "~3.1.0"
+    "cucumber": "~3.1.0",
+    "chai": "~4.1.2"
   },
   "repository": {
     "type": "git",
@@ -48,7 +49,7 @@
   },
   "scripts": {
     "test": "./node_modules/.bin/mocha test/unit test/integration -t 5000",
-    "features": "./node_modules/.bin/cucumber.js --require test/cucumber ../../../../../gremlin-test/features/map/Count.feature",
+    "features": "./node_modules/.bin/cucumber.js --require test/cucumber ../../../../../gremlin-test/features/map/AddVertex.feature",
     "unit-test": "./node_modules/.bin/mocha test/unit"
   },
   "engines": {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/graph.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/graph.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/graph.js
index 4ef3fd5..95fd30f 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/graph.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/graph.js
@@ -128,6 +128,37 @@ function Path(labels, objects) {
   this.objects = objects;
 }
 
+Path.prototype.equals = function (other) {
+  if (!(other instanceof Path)) {
+    return false;
+  }
+  if (other === this) {
+    return true;
+  }
+  return areEqual(this.objects, other.objects) && areEqual(this.labels, other.labels);
+};
+
+function areEqual(obj1, obj2) {
+  if (obj1 === obj2) {
+    return true;
+  }
+  if (typeof obj1.equals === 'function') {
+    return obj1.equals(obj2);
+  }
+  if (Array.isArray(obj1) && Array.isArray(obj2)) {
+    if (obj1.length !== obj2.length) {
+      return false;
+    }
+    for (let i = 0; i < obj1.length; i++) {
+      if (!areEqual(obj1[i], obj2[i])){
+        return false;
+      }
+    }
+    return true;
+  }
+  return false;
+}
+
 module.exports = {
   Edge: Edge,
   Graph: Graph,

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
index 43cf35f..aae9eb9 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/package.json
@@ -18,7 +18,8 @@
   },
   "devDependencies": {
     "mocha": "~4.0.1",
-    "cucumber": "~3.1.0"
+    "cucumber": "~3.1.0",
+    "chai": "~4.1.2"
   },
   "repository": {
     "type": "git",
@@ -29,7 +30,7 @@
   },
   "scripts": {
     "test": "./node_modules/.bin/mocha test/unit test/integration -t 5000",
-    "features": "./node_modules/.bin/cucumber.js --require test/cucumber ../../../../../gremlin-test/features/map/Count.feature",
+    "features": "./node_modules/.bin/cucumber.js --require test/cucumber ../../../../../gremlin-test/features/",
     "unit-test": "./node_modules/.bin/mocha test/unit"
   },
   "engines": {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
index 5270b39..6625f29 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
@@ -23,36 +23,60 @@
 'use strict';
 
 const defineSupportCode = require('cucumber').defineSupportCode;
-const assert = require('assert');
 const vm = require('vm');
+const expect = require('chai').expect;
 const graphModule = require('../../lib/structure/graph');
 const graphTraversalModule = require('../../lib/process/graph-traversal');
 const traversalModule = require('../../lib/process/traversal');
 const Graph = graphModule.Graph;
+const Path = graphModule.Path;
 const __ = graphTraversalModule.statics;
 
+const parsers = [
+  [ 'd\\[([\\d.]+)\\]\\.[ilfdm]', toNumeric ],
+  [ 'v\\[(.+)\\]', toVertex ],
+  [ 'v\\[(.+)\\]\\.id', toVertexId ],
+  [ 'v\\[(.+)\\]\\.sid', toVertexIdString ],
+  [ 'e\\[(.+)\\]', toEdge ],
+  [ 'e\\[(.+)\\]\\.id', toEdgeId ],
+  [ 'e\\[(.+)\\]\\.sid', toEdgeIdString ],
+  [ 'p\\[(.+)\\]', toPath ],
+  [ 'l\\[(.*)\\]', toArray ],
+  [ 's\\[(.*)\\]', toArray ],
+  [ 'm\\[(.+)\\]', toMap ],
+  [ 'c\\[(.+)\\]', toLambda ]
+].map(x => [ new RegExp('^' + x[0] + '$'), x[1] ]);
+
 defineSupportCode(function(methods) {
   methods.Given(/^the (.+) graph$/, function (graphName) {
+    this.graphName = graphName;
+    const data = this.getData();
+    this.g = new Graph().traversal().withRemote(data.connection);
     if (graphName === 'empty') {
-      //TODO
+      return this.cleanEmptyGraph();
     }
-    const data = this.getDataByGraphName(graphName);
-    this.graphName = graphName;
-    this.g = new Graph().traversal().withRemote(data.connection)
   });
 
-  methods.Given('the graph initializer of', function () {
-    //TODO
+  methods.Given('the graph initializer of', function (traversalText) {
+    const traversal = vm.runInNewContext(translate(traversalText), getSandbox(this.g, this.parameters));
+    return traversal.toList();
   });
 
   methods.Given('an unsupported test', () => {});
 
   methods.Given('the traversal of', function (traversalText) {
-    this.traversal = vm.runInNewContext(translate(traversalText), getSandbox(this.g));
+    this.traversal = vm.runInNewContext(translate(traversalText), getSandbox(this.g, this.parameters));
   });
 
-  methods.Given(/^$/, function (paramName, stringValue) {
-    //TODO: Add parameter
+  methods.Given(/^using the parameter (.+) defined as "(.+)"$/, function (paramName, stringValue) {
+    let p = Promise.resolve();
+    if (this.graphName === 'empty') {
+      p = this.loadEmptyGraphData();
+    }
+    const self = this;
+    return p.then(() => {
+      self.parameters[paramName] = parseValue.call(self, stringValue);
+    });
   });
 
   methods.When('iterated to list', function () {
@@ -63,35 +87,44 @@ defineSupportCode(function(methods) {
     return this.traversal.next().then(it => this.result = it.value);
   });
 
-  methods.Then(/^the result should be (\w+)$/, function (characterizedAs, resultTable) {
+  methods.Then(/^the result should be (\w+)$/, function assertResult(characterizedAs, resultTable) {
+    if (characterizedAs === 'empty') {
+      expect(this.result).to.be.empty;
+      if (typeof resultTable === 'function'){
+        return resultTable();
+      }
+      return;
+    }
+    const expectedResult = resultTable.rows().map(row => parseRow.call(this, row));
     switch (characterizedAs) {
-      case 'empty':
-        assert.strictEqual(0, result.length);
-        break;
       case 'ordered':
-        const expectedResult = resultTable.rows().map(parseRow);
         console.log('--- ordered', expectedResult);
+        expect(this.result).to.have.deep.ordered.members(expectedResult);
+        break;
+      case 'unordered':
+        console.log('--- unordered expected:', expectedResult);
+        console.log('--- obtained:', this.result);
+        expect(this.result).to.have.deep.members(expectedResult);
         break;
-    }
-    //TODO
-    if (typeof resultTable === 'function'){
-      return resultTable();
     }
   });
 
-  methods.Then(/^the graph should return (\d+) for count of (.+)$/, function (stringCount, traversalString) {
-
+  methods.Then(/^the graph should return (\d+) for count of "(.+)"$/, function (stringCount, traversalText) {
+    const traversal = vm.runInNewContext(translate(traversalText), getSandbox(this.g, this.parameters));
+    return traversal.toList().then(list => {
+      expect(list).to.have.lengthOf(parseInt(stringCount, 10));
+    });
   });
 
   methods.Then(/^the result should have a count of (\d+)$/, function (stringCount) {
-
+    expect(this.result).to.have.lengthOf(parseInt(stringCount, 10));
   });
 
-  methods.Then('nothing should happen because', () => {});
+  methods.Then('nothing should happen because', _ => {});
 });
 
-function getSandbox(g) {
-  return {
+function getSandbox(g, parameters) {
+  const sandbox = {
     g: g,
     __: __,
     Cardinality: traversalModule.cardinality,
@@ -104,14 +137,79 @@ function getSandbox(g) {
     Operator: traversalModule.operator,
     T: traversalModule.t,
   };
+  // Pass the parameter to the sandbox
+  Object.keys(parameters).forEach(paramName => sandbox[paramName] = parameters[paramName]);
+  return sandbox;
 }
 
 function translate(traversalText) {
-  traversalText = traversalText.replace('.in(', '.in_(');
-  traversalText = traversalText.replace('.from(', '.from_(');
+  // Remove escaped chars
+  traversalText = traversalText.replace(/\\"/g, '"');
+  // Change according to naming convention
+  traversalText = traversalText.replace(/\.in\(/g, '.in_(');
+  traversalText = traversalText.replace(/\.from\(/g, '.from_(');
   return traversalText;
 }
 
 function parseRow(row) {
-  return row[0];
-}
\ No newline at end of file
+  return parseValue.call(this, row[0]);
+}
+
+function parseValue(stringValue) {
+  let extractedValue = null;
+  let parser = null;
+  for (let item of parsers) {
+    let re = item[0];
+    let match = re.exec(stringValue);
+    if (match && match.length > 1) {
+      parser = item[1];
+      extractedValue = match[1];
+      break;
+    }
+  }
+  return parser !== null ? parser.call(this, extractedValue) : stringValue;
+}
+
+function toNumeric(stringValue) {
+  return parseFloat(stringValue);
+}
+
+function toVertex(name) {
+  return this.getData().vertices[name];
+}
+
+function toVertexId(name) {
+  return toVertex.call(this, name).id;
+}
+
+function toVertexIdString(name) {
+  return toVertex.call(this, name).id.toString();
+}
+
+function toEdge(name) {
+  return this.getData().edges[name];
+}
+
+function toEdgeId(name) {
+  return toEdge.call(this, name).id;
+}
+
+function toEdgeIdString(name) {
+  return toEdge.call(this, name).id.toString();
+}
+
+function toPath(value) {
+  const parts = value.split(',');
+  return new Path(parts.map(_ => new Array(0)), parts.map(x => parseValue.call(this, x)));
+}
+
+function toArray(stringList) {
+  if (stringList === '') {
+    return new Array(0);
+  }
+  return stringList.split(',').map(x => parseValue.call(this, x));
+}
+
+function toMap() {}
+
+function toLambda() {}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
index 8f72c58..946d124 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/world.js
@@ -37,18 +37,43 @@ defineSupportCode(function (methods) {
     this.traversal = null;
     this.result = null;
     this.cache = null;
+    this.graphName = null;
+    this.parameters = {};
   }
 
-  TinkerPopWorld.prototype.getDataByGraphName = function (name) {
-    return this.cache[name];
+  TinkerPopWorld.prototype.getData = function () {
+    if (!this.graphName) {
+      throw new Error("Graph name is not set");
+    }
+    return this.cache[this.graphName];
+  };
+
+  TinkerPopWorld.prototype.cleanEmptyGraph = function () {
+    const connection = this.cache['empty'].connection;
+    const g = new Graph().traversal().withRemote(connection);
+    return g.V().drop().toList();
+  };
+
+  TinkerPopWorld.prototype.loadEmptyGraphData = function () {
+    const cacheData = this.cache['empty'];
+    const c = cacheData.connection;
+    return Promise.all([ getVertices(c), getEdges(c) ]).then(values => {
+      cacheData.vertices = values[0];
+      cacheData.edges = values[1];
+    });
   };
 
   methods.setWorldConstructor(TinkerPopWorld);
 
   methods.BeforeAll(function () {
     // load all traversals
-    const promises = ['modern', 'classic', 'crew', 'grateful'].map(graphName => {
-      const connection = helper.getConnection('g' + graphName);
+    const promises = ['modern', 'classic', 'crew', 'grateful', 'empty'].map(graphName => {
+      let connection = null;
+      if (graphName === 'empty') {
+        connection = helper.getConnection('ggraph');
+        return connection.open().then(() => cache['empty'] = { connection: connection });
+      }
+      connection = helper.getConnection('g' + graphName);
       return connection.open()
         .then(() => Promise.all([getVertices(connection), getEdges(connection)]))
         .then(values => {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/remote-connection-tests.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/remote-connection-tests.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/remote-connection-tests.js
index 268773c..e4895fe 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/remote-connection-tests.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/remote-connection-tests.js
@@ -39,7 +39,7 @@ describe('DriverRemoteConnection', function () {
   });
   describe('#submit()', function () {
     it('should send the request and parse the response', function () {
-      return connection.submit(new Bytecode().addStep('addV', [ 'person' ]).addStep('property', [ 'name', 'marko']))
+      return connection.submit(new Bytecode().addStep('V', []).addStep('tail', []))
         .then(function (response) {
           assert.ok(response);
           assert.ok(response.traversers);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/15c86798/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
index adb7d6c..7109427 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/integration/traversal-test.js
@@ -44,7 +44,7 @@ describe('Traversal', function () {
       var g = new Graph().traversal().withRemote(connection);
       return g.V().toList().then(function (list) {
         assert.ok(list);
-        assert.strictEqual(list.length, 7);
+        assert.strictEqual(list.length, 6);
         list.forEach(v => assert.ok(v instanceof Vertex));
       });
     });