You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by jo...@apache.org on 2017/11/30 13:48:16 UTC

[37/47] tinkerpop git commit: Support bulk

Support bulk


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

Branch: refs/heads/TINKERPOP-1489
Commit: ec6f4855436081f7024419fa5f588ebe9bad6231
Parents: fd8cdec
Author: Jorge Bay Gondra <jo...@gmail.com>
Authored: Mon Nov 27 12:13:28 2017 +0100
Committer: Jorge Bay Gondra <jo...@gmail.com>
Committed: Thu Nov 30 14:45:02 2017 +0100

----------------------------------------------------------------------
 gremlin-javascript/glv/TraversalSource.template | 48 +++++++------
 .../gremlin-javascript/lib/process/traversal.js | 48 +++++++------
 .../test/unit/traversal-test.js                 | 71 ++++++++++++++++++--
 3 files changed, 119 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ec6f4855/gremlin-javascript/glv/TraversalSource.template
----------------------------------------------------------------------
diff --git a/gremlin-javascript/glv/TraversalSource.template b/gremlin-javascript/glv/TraversalSource.template
index dbb7bc4..f75765f 100644
--- a/gremlin-javascript/glv/TraversalSource.template
+++ b/gremlin-javascript/glv/TraversalSource.template
@@ -22,15 +22,15 @@
  */
 'use strict';
 
-var utils = require('../utils');
-var parseArgs = utils.parseArgs;
-var itemDone = Object.freeze({ value: null, done: true });
-var emptyArray = Object.freeze([]);
+const utils = require('../utils');
+const parseArgs = utils.parseArgs;
+const itemDone = Object.freeze({ value: null, done: true });
 
 function Traversal(graph, traversalStrategies, bytecode) {
   this.graph = graph;
   this.traversalStrategies = traversalStrategies;
   this.bytecode = bytecode;
+  /** @type {Array<Traverser>} */
   this.traversers = null;
   this.sideEffects = null;
   this._traversalStrategiesPromise = null;
@@ -47,17 +47,13 @@ Traversal.prototype.getBytecode = function () {
  * @returns {Promise.<Array>}
  */
 Traversal.prototype.toList = function () {
-  var self = this;
-  return this._applyStrategies().then(function () {
-    if (!self.traversers || self._traversersIteratorIndex === self.traversers.length) {
-      return emptyArray;
+  return this._applyStrategies().then(() => {
+    const result = [];
+    let it;
+    while ((it = this._getNext()) && !it.done) {
+      result.push(it.value);
     }
-    var arr = new Array(self.traversers.length - self._traversersIteratorIndex);
-    for (var i = self._traversersIteratorIndex; i < self.traversers.length; i++) {
-      arr[i] = self.traversers[i].object;
-    }
-    self._traversersIteratorIndex = self.traversers.length;
-    return arr;
+    return result;
   });
 };
 
@@ -67,13 +63,23 @@ Traversal.prototype.toList = function () {
  * @returns {Promise.<{value, done}>}
  */
 Traversal.prototype.next = function () {
-  var self = this;
-  return this._applyStrategies().then(function () {
-    if (!self.traversers || self._traversersIteratorIndex === self.traversers.length) {
-      return itemDone;
+  return this._applyStrategies().then(() => this._getNext());
+};
+
+/**
+ * Synchronous iterator of traversers including
+ * @private
+ */
+Traversal.prototype._getNext = function () {
+  while (this.traversers && this._traversersIteratorIndex < this.traversers.length) {
+    let traverser = this.traversers[this._traversersIteratorIndex];
+    if (traverser.bulk > 0) {
+      traverser.bulk--;
+      return { value: traverser.object, done: false };
     }
-    return { value: self.traversers[self._traversersIteratorIndex++].object, done: false };
-  });
+    this._traversersIteratorIndex++;
+  }
+  return itemDone;
 };
 
 Traversal.prototype._applyStrategies = function () {
@@ -133,7 +139,7 @@ P.prototype.or = function (arg) {
 
 function Traverser(object, bulk) {
   this.object = object;
-  this.bulk = bulk == undefined ? 1 : bulk;
+  this.bulk = bulk || 1;
 }
 
 function TraversalSideEffects() {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ec6f4855/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js
index 49c6aef..ebf8755 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js
@@ -22,15 +22,15 @@
  */
 'use strict';
 
-var utils = require('../utils');
-var parseArgs = utils.parseArgs;
-var itemDone = Object.freeze({ value: null, done: true });
-var emptyArray = Object.freeze([]);
+const utils = require('../utils');
+const parseArgs = utils.parseArgs;
+const itemDone = Object.freeze({ value: null, done: true });
 
 function Traversal(graph, traversalStrategies, bytecode) {
   this.graph = graph;
   this.traversalStrategies = traversalStrategies;
   this.bytecode = bytecode;
+  /** @type {Array<Traverser>} */
   this.traversers = null;
   this.sideEffects = null;
   this._traversalStrategiesPromise = null;
@@ -47,17 +47,13 @@ Traversal.prototype.getBytecode = function () {
  * @returns {Promise.<Array>}
  */
 Traversal.prototype.toList = function () {
-  var self = this;
-  return this._applyStrategies().then(function () {
-    if (!self.traversers || self._traversersIteratorIndex === self.traversers.length) {
-      return emptyArray;
+  return this._applyStrategies().then(() => {
+    const result = [];
+    let it;
+    while ((it = this._getNext()) && !it.done) {
+      result.push(it.value);
     }
-    var arr = new Array(self.traversers.length - self._traversersIteratorIndex);
-    for (var i = self._traversersIteratorIndex; i < self.traversers.length; i++) {
-      arr[i] = self.traversers[i].object;
-    }
-    self._traversersIteratorIndex = self.traversers.length;
-    return arr;
+    return result;
   });
 };
 
@@ -67,13 +63,23 @@ Traversal.prototype.toList = function () {
  * @returns {Promise.<{value, done}>}
  */
 Traversal.prototype.next = function () {
-  var self = this;
-  return this._applyStrategies().then(function () {
-    if (!self.traversers || self._traversersIteratorIndex === self.traversers.length) {
-      return itemDone;
+  return this._applyStrategies().then(() => this._getNext());
+};
+
+/**
+ * Synchronous iterator of traversers including
+ * @private
+ */
+Traversal.prototype._getNext = function () {
+  while (this.traversers && this._traversersIteratorIndex < this.traversers.length) {
+    let traverser = this.traversers[this._traversersIteratorIndex];
+    if (traverser.bulk > 0) {
+      traverser.bulk--;
+      return { value: traverser.object, done: false };
     }
-    return { value: self.traversers[self._traversersIteratorIndex++].object, done: false };
-  });
+    this._traversersIteratorIndex++;
+  }
+  return itemDone;
 };
 
 Traversal.prototype._applyStrategies = function () {
@@ -193,7 +199,7 @@ P.prototype.or = function (arg) {
 
 function Traverser(object, bulk) {
   this.object = object;
-  this.bulk = bulk == undefined ? 1 : bulk;
+  this.bulk = bulk || 1;
 }
 
 function TraversalSideEffects() {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ec6f4855/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/traversal-test.js
----------------------------------------------------------------------
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/traversal-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/traversal-test.js
index c5271c9..635c7e8 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/traversal-test.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/traversal-test.js
@@ -22,14 +22,17 @@
  */
 'use strict';
 
-var assert = require('assert');
-var graph = require('../../lib/structure/graph');
-var utils = require('../../lib/utils');
-var t = require('../../lib/process/traversal');
-var TraversalStrategies = require('../../lib/process/traversal-strategy').TraversalStrategies;
+const assert = require('assert');
+const expect = require('chai').expect;
+const graph = require('../../lib/structure/graph');
+const utils = require('../../lib/utils');
+const t = require('../../lib/process/traversal');
+const TraversalStrategies = require('../../lib/process/traversal-strategy').TraversalStrategies;
 
 describe('Traversal', function () {
+
   describe('#getByteCode()', function () {
+
     it('should add steps for with a string parameter', function () {
       var g = new graph.Graph().traversal();
       var bytecode = g.V().out('created').getBytecode();
@@ -40,6 +43,7 @@ describe('Traversal', function () {
       assert.strictEqual(bytecode.stepInstructions[1][0], 'out');
       assert.strictEqual(bytecode.stepInstructions[1][1], 'created');
     });
+
     it('should add steps with an enum value', function () {
       var g = new graph.Graph().traversal();
       var bytecode = g.V().order().by('age', t.order.decr).getBytecode();
@@ -55,7 +59,9 @@ describe('Traversal', function () {
       assert.strictEqual(bytecode.stepInstructions[2][2].elementName, 'decr');
     });
   });
+
   describe('#next()', function () {
+
     it('should apply the strategies and return a Promise with the iterator item', function () {
       var strategyMock = {
         apply: function (traversal) {
@@ -83,8 +89,43 @@ describe('Traversal', function () {
           return traversal.next();
         });
     });
+
+    it('should support bulk', function () {
+      const strategyMock = {
+        apply: function (traversal) {
+          traversal.traversers = [ new t.Traverser(1, 2), new t.Traverser(2, 1) ];
+          return utils.resolvedPromise();
+        }
+      };
+      const strategies = new TraversalStrategies();
+      strategies.addStrategy(strategyMock);
+      const traversal = new t.Traversal(null, strategies, null);
+      return traversal.next()
+        .then(function (item) {
+          assert.strictEqual(item.value, 1);
+          assert.strictEqual(item.done, false);
+          return traversal.next();
+        })
+        .then(function (item) {
+          assert.strictEqual(item.value, 1);
+          assert.strictEqual(item.done, false);
+          return traversal.next();
+        })
+        .then(function (item) {
+          assert.strictEqual(item.value, 2);
+          assert.strictEqual(item.done, false);
+          return traversal.next();
+        })
+        .then(function (item) {
+          assert.strictEqual(item.value, null);
+          assert.strictEqual(item.done, true);
+          return traversal.next();
+        });
+    });
   });
+
   describe('#toList()', function () {
+
     it('should apply the strategies and return a Promise with an array', function () {
       var strategyMock = {
         apply: function (traversal) {
@@ -100,6 +141,7 @@ describe('Traversal', function () {
         assert.deepEqual(list, [ 'a', 'b' ]);
       });
     });
+
     it('should return an empty array when traversers is empty', function () {
       var strategyMock = {
         apply: function (traversal) {
@@ -114,6 +156,23 @@ describe('Traversal', function () {
         assert.ok(Array.isArray(list));
         assert.strictEqual(list.length, 0);
       });
-    })
+    });
+
+    it('should support bulk', function () {
+      const strategyMock = {
+        apply: function (traversal) {
+          traversal.traversers = [ new t.Traverser(1, 1), new t.Traverser(2, 3), new t.Traverser(3, 2),
+            new t.Traverser(4, 1) ];
+          return utils.resolvedPromise();
+        }
+      };
+      const strategies = new TraversalStrategies();
+      strategies.addStrategy(strategyMock);
+      const traversal = new t.Traversal(null, strategies, null);
+      return traversal.toList()
+        .then(list => {
+          expect(list).to.have.members([1, 2, 2, 2, 3, 3, 4]);
+        });
+    });
   });
 });
\ No newline at end of file