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 2019/06/27 20:08:56 UTC
[tinkerpop] 01/01: TINKERPOP-2020 Added withComputer() in
javascript.
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch TINKERPOP-2020
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 30ce71a38c4aaefbba64f5d063ee2f0db05586ed
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Thu Jun 27 16:08:17 2019 -0400
TINKERPOP-2020 Added withComputer() in javascript.
---
CHANGELOG.asciidoc | 1 +
docs/src/upgrade/release-3.3.x.asciidoc | 8 +++++++
.../glv/GraphTraversalSource.template | 16 ++++++++++++-
.../lib/process/graph-traversal.js | 16 ++++++++++++-
.../lib/process/traversal-strategy.js | 28 +++++++++++++++++++++-
.../lib/structure/io/graph-serializer.js | 2 ++
.../lib/structure/io/type-serializers.js | 16 +++++++++++++
.../test/cucumber/feature-steps.js | 13 ----------
8 files changed, 84 insertions(+), 16 deletions(-)
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 88e8a44..151b06d 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -23,6 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
[[release-3-3-8]]
=== TinkerPop 3.3.8 (Release Date: NOT OFFICIALLY RELEASED YET)
+* Provided support for `withComputer()` in gremlin-javascript.
* Bump to Groovy 2.4.17.
* Bump to Jackson 2.9.9.
* Improved error messaging when an attempt is made to serialize multi-properties to GraphML.
diff --git a/docs/src/upgrade/release-3.3.x.asciidoc b/docs/src/upgrade/release-3.3.x.asciidoc
index 51da497..26de75f 100644
--- a/docs/src/upgrade/release-3.3.x.asciidoc
+++ b/docs/src/upgrade/release-3.3.x.asciidoc
@@ -27,6 +27,14 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
Please see the link:https://github.com/apache/tinkerpop/blob/3.3.8/CHANGELOG.asciidoc#release-3-3-8[changelog] for a complete list of all the modifications that are part of this release.
+== Upgrading for Users
+
+==== JavaScript withComputer()
+
+Gremlin-Javascript now supports `withComputer()` syntax, which means that it is now possible in Javascript to utilize
+Gremlin steps that require a `GraphComputer` to execute (e.g. `pageRank()` and `peerPressure()`).
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2251[TINKERPOP-2251]
== TinkerPop 3.3.7
diff --git a/gremlin-javascript/glv/GraphTraversalSource.template b/gremlin-javascript/glv/GraphTraversalSource.template
index 9f94828..a684693 100644
--- a/gremlin-javascript/glv/GraphTraversalSource.template
+++ b/gremlin-javascript/glv/GraphTraversalSource.template
@@ -26,7 +26,7 @@ const { Traversal } = require('./traversal');
const remote = require('../driver/remote-connection');
const utils = require('../utils');
const Bytecode = require('./bytecode');
-const { TraversalStrategies } = require('./traversal-strategy');
+const { TraversalStrategies, VertexProgramStrategy } = require('./traversal-strategy');
/**
@@ -61,6 +61,20 @@ class GraphTraversalSource {
}
/**
+ * @param graphComputer
+ * @param workers
+ * @param result
+ * @param persist
+ * @param vertices
+ * @param edges
+ * @param configuration
+ * @returns {GraphTraversalSource}
+ */
+ withComputer(graphComputer, workers, result, persist, vertices, edges, configuration) {
+ return this.withStrategies(new VertexProgramStrategy(graphComputer, workers, result, persist, vertices, edges, configuration));
+ }
+
+ /**
* Returns the string representation of the GraphTraversalSource.
* @returns {string}
*/
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js
index 34e06db..6e61bdf 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js
@@ -26,7 +26,7 @@ const { Traversal } = require('./traversal');
const remote = require('../driver/remote-connection');
const utils = require('../utils');
const Bytecode = require('./bytecode');
-const { TraversalStrategies } = require('./traversal-strategy');
+const { TraversalStrategies, VertexProgramStrategy } = require('./traversal-strategy');
/**
@@ -61,6 +61,20 @@ class GraphTraversalSource {
}
/**
+ * @param graphComputer
+ * @param workers
+ * @param result
+ * @param persist
+ * @param vertices
+ * @param edges
+ * @param configuration
+ * @returns {GraphTraversalSource}
+ */
+ withComputer(graphComputer, workers, result, persist, vertices, edges, configuration) {
+ return this.withStrategies(new VertexProgramStrategy(graphComputer, workers, result, persist, vertices, edges, configuration));
+ }
+
+ /**
* Returns the string representation of the GraphTraversalSource.
* @returns {string}
*/
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
index 1037f57..98723df 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal-strategy.js
@@ -59,6 +59,7 @@ class TraversalStrategies {
/** @abstract */
class TraversalStrategy {
+
/**
* @abstract
* @param {Traversal} traversal
@@ -69,7 +70,32 @@ class TraversalStrategy {
}
}
+class VertexProgramStrategy extends TraversalStrategy {
+
+ constructor(graphComputer, workers, persist, result, vertices, edges, configuration) {
+ super();
+ this.configuration = new Map();
+ if (graphComputer !== undefined)
+ this.configuration.set("graphComputer", graphComputer);
+ if (graphComputer !== undefined)
+ this.configuration.set("workers", workers);
+ if (graphComputer !== undefined)
+ this.configuration.set("persist", persist);
+ if (graphComputer !== undefined)
+ this.configuration.set("result", result);
+ if (graphComputer !== undefined)
+ this.configuration.set("vertices", vertices);
+ if (graphComputer !== undefined)
+ this.configuration.set("edges", edges);
+ if (configuration !== undefined)
+ configuration.forEach(function(k,v) {
+ this.configuration.set(k, v);
+ });
+ }
+}
+
module.exports = {
TraversalStrategies: TraversalStrategies,
- TraversalStrategy: TraversalStrategy
+ TraversalStrategy: TraversalStrategy,
+ VertexProgramStrategy: VertexProgramStrategy
};
\ No newline at end of file
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.js
index 94386df..4a7fdf2 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/graph-serializer.js
@@ -157,6 +157,7 @@ class GraphSONReader {
const deserializers = {
'g:Traverser': typeSerializers.TraverserSerializer,
+ 'g:TraversalStrategy': typeSerializers.TraversalStrategySerializer,
'g:Int32': typeSerializers.NumberSerializer,
'g:Int64': typeSerializers.NumberSerializer,
'g:Float': typeSerializers.NumberSerializer,
@@ -178,6 +179,7 @@ const serializers = [
typeSerializers.DateSerializer,
typeSerializers.BytecodeSerializer,
typeSerializers.TraverserSerializer,
+ typeSerializers.TraversalStrategySerializer,
typeSerializers.PSerializer,
typeSerializers.LambdaSerializer,
typeSerializers.EnumSerializer,
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.js
index fc78c0c..c553b47 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/type-serializers.js
@@ -23,6 +23,7 @@
'use strict';
const t = require('../../process/traversal');
+const ts = require('../../process/traversal-strategy');
const Bytecode = require('../../process/bytecode');
const g = require('../graph');
const utils = require('../../utils');
@@ -230,6 +231,20 @@ class TraverserSerializer extends TypeSerializer {
}
}
+class TraversalStrategySerializer extends TypeSerializer {
+ /** @param {TraversalStrategy} item */
+ serialize(item) {
+ return {
+ [typeKey]: 'g:' + item.constructor.name,
+ [valueKey]: item.configuration
+ };
+ }
+
+ canBeUsedFor(value) {
+ return (value instanceof ts.TraversalStrategy);
+ }
+}
+
class VertexSerializer extends TypeSerializer {
deserialize(obj) {
const value = obj[valueKey];
@@ -413,6 +428,7 @@ module.exports = {
SetSerializer,
TSerializer,
TraverserSerializer,
+ TraversalStrategySerializer,
typeKey,
valueKey,
VertexPropertySerializer,
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 9bf9977..651a6ea 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
@@ -57,24 +57,11 @@ const parsers = [
const ignoreReason = {
lambdaNotSupported: 'Lambdas are not supported on gremlin-javascript',
- computerNotSupported: "withComputer() is not supported on gremlin-javascript",
needsFurtherInvestigation: '',
};
const ignoredScenarios = {
// An associative array containing the scenario name as key, for example:
- 'g_V_pageRank_hasXpageRankX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_outXcreatedX_pageRank_byXbothEX_byXprojectRankX_timesX0X_valueMapXname_projectRankX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_pageRank_order_byXpageRank_decrX_byXnameX_name': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_pageRank_order_byXpageRank_decrX_name_limitX2X': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_pageRank_byXoutEXknowsXX_byXfriendRankX_project_byXnameX_byXvaluesXfriendRankX_mathX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_hasLabelXpersonX_pageRank_byXpageRankX_project_byXnameX_byXvaluesXpageRankX_mathX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_pageRank_byXpageRankX_asXaX_outXknowsX_pageRank_asXbX_selectXa_bX_by_byXmathX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_hasLabelXsoftwareX_hasXname_rippleX_pageRankX1X_byXinEXcreatedXX_timesX1X_byXpriorsX_inXcreatedX_unionXboth__identityX_valueMapXname_priorsX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_outXcreatedX_groupXmX_byXlabelX_pageRankX1X_byXpageRankX_byXinEX_timesX1X_inXcreatedX_groupXmX_byXpageRankX_capXmX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_peerPressure_hasXclusterX': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_peerPressure_byXclusterX_byXoutEXknowsXX_pageRankX1X_byXrankX_byXoutEXknowsXX_timesX2X_group_byXclusterX_byXrank_sumX_limitX100X': new IgnoreError(ignoreReason.computerNotSupported),
- 'g_V_hasXname_rippleX_inXcreatedX_peerPressure_byXoutEX_byXclusterX_repeatXunionXidentity__bothX_timesX2X_dedup_valueMapXname_clusterX': new IgnoreError(ignoreReason.computerNotSupported),
'g_withSideEffectXa_setX_V_both_name_storeXaX_capXaX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
'g_V_both_groupCountXaX_out_capXaX_selectXkeysX_unfold_both_groupCountXaX_capXaX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
'g_V_group_byXoutE_countX_byXnameX': new IgnoreError(ignoreReason.needsFurtherInvestigation),