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/05/02 12:23:43 UTC

[tinkerpop] 01/01: TINKERPOP-2206 Fixed g:List serialization

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch TINKERPOP-2206
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 2671290a3624acb9456c510f6251fcdf76929fbe
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Thu May 2 08:21:49 2019 -0400

    TINKERPOP-2206 Fixed g:List serialization
    
    Seems like javascript arrays were being serialized as naked JSON objects rather than g:List. Java serialization seemed to forgive that for some reason, but prevented certain operations to really work right in the process like P.within() logic from TINKERPOP-2199 which was also fixed in this change.
---
 CHANGELOG.asciidoc                                 |  1 +
 gremlin-javascript/glv/TraversalSource.template    | 19 ++++++++++++++-
 .../gremlin-javascript/lib/process/traversal.js    | 27 ++++++++++++++--------
 .../lib/structure/io/graph-serializer.js           | 12 ++++++----
 .../lib/structure/io/type-serializers.js           |  2 +-
 .../gremlin-javascript/test/unit/graphson-test.js  | 18 +++++++++++++++
 6 files changed, 62 insertions(+), 17 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 6099549..e10a0c7 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -31,6 +31,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Ensured that `gremlin.sh` works when directories contain spaces.
 * Enabled `ctrl+c` to interrupt long running processes in Gremlin Console.
 * Quieted "host unavailable" warnings for both the driver and Gremlin Console.
+* Fixed construction of `g:List` from arrays in gremlin-javascript.
 * Fixed bug in `GremlinGroovyScriptEngine` interpreter mode around class definitions.
 * Implemented `EdgeLabelVerificationStrategy`.
 * Added parameter to configure the `processor` in the gremlin-javascript `client` constructor.
diff --git a/gremlin-javascript/glv/TraversalSource.template b/gremlin-javascript/glv/TraversalSource.template
index 0072e52..d38c0cf 100644
--- a/gremlin-javascript/glv/TraversalSource.template
+++ b/gremlin-javascript/glv/TraversalSource.template
@@ -149,7 +149,24 @@ class P {
   or(arg) {
     return new P('or', this, arg);
   }
-<% pmethods.each{ method -> %>
+
+  static within(...args) {
+    if (args.length == 1 && Array.isArray(args[0])) {
+      return new P("within", args[0], null);
+    } else {
+      return new P("within", args, null);
+    }
+  }
+
+  static without(...args) {
+    if (args.length == 1 && Array.isArray(args[0])) {
+      return new P("without", args[0], null);
+    } else {
+      return new P("without", args, null);
+    }
+  }
+
+<% pmethods.findAll{!(it in ["within","without"])}.each{ method -> %>
   /** @param {...Object} args */
   static <%= toJs.call(method) %>(...args) {
     return createP('<%= method %>', args);
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 1ef0b7c..d89f803 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
@@ -150,6 +150,23 @@ class P {
     return new P('or', this, arg);
   }
 
+  static within(...args) {
+    if (args.length == 1 && Array.isArray(args[0])) {
+      return new P("within", args[0], null);
+    } else {
+      return new P("within", args, null);
+    }
+  }
+
+  static without(...args) {
+    if (args.length == 1 && Array.isArray(args[0])) {
+      return new P("without", args[0], null);
+    } else {
+      return new P("without", args, null);
+    }
+  }
+
+
   /** @param {...Object} args */
   static between(...args) {
     return createP('between', args);
@@ -205,16 +222,6 @@ class P {
     return createP('test', args);
   }
 
-  /** @param {...Object} args */
-  static within(...args) {
-    return createP('within', args);
-  }
-
-  /** @param {...Object} args */
-  static without(...args) {
-    return createP('without', args);
-  }
-
 }
 
 function createP(operator, args) {
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 9ce1761..a5a3c1c 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
@@ -50,27 +50,29 @@ class GraphSONWriter {
       }
       s.writer = this;
       // Insert custom serializers first
-      this._serializers.unshift(s);
+      th
+      is._serializers.unshift(s);
     });
   }
 
   adaptObject(value) {
     let s;
+    let o = value;
     if (Array.isArray(value)) {
-      return value.map(item => this.adaptObject(item));
+      o = value.map(item => this.adaptObject(item));
     }
     for (let i = 0; i < this._serializers.length; i++) {
       const currentSerializer = this._serializers[i];
-      if (currentSerializer.canBeUsedFor && currentSerializer.canBeUsedFor(value)) {
+      if (currentSerializer.canBeUsedFor && currentSerializer.canBeUsedFor(o)) {
         s = currentSerializer;
         break;
       }
     }
     if (s) {
-      return s.serialize(value);
+      return s.serialize(o);
     }
     // Default (strings / objects / ...)
-    return value;
+    return o;
   }
 
   /**
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 b00cf82..fc78c0c 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
@@ -144,7 +144,7 @@ class BytecodeSerializer extends TypeSerializer {
     const result = new Array(instructions.length);
     result[0] = instructions[0];
     for (let i = 0; i < instructions.length; i++) {
-      result[i] = this.writer.adaptObject(instructions[i]);
+      result[i] = instructions[i].map(item => this.writer.adaptObject(item));
     }
     return result;
   }
diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphson-test.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphson-test.js
index b23e542..261baf6 100644
--- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphson-test.js
+++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/unit/graphson-test.js
@@ -26,6 +26,7 @@ const assert = require('assert');
 const graph = require('../../lib/structure/graph');
 const t = require('../../lib/process/traversal.js');
 const gs = require('../../lib/structure/io/graph-serializer.js');
+const utils = require('../../lib/utils');
 const GraphSONReader = gs.GraphSONReader;
 const GraphSONWriter = gs.GraphSONWriter;
 const P = t.P;
@@ -151,6 +152,11 @@ describe('GraphSONWriter', function () {
     assert.strictEqual(writer.write(true), 'true');
     assert.strictEqual(writer.write(false), 'false');
   });
+  it('should write list values', function () {
+    const writer = new GraphSONWriter();
+    const expected = JSON.stringify({"@type": "g:List", "@value": ["marko"]});
+    assert.strictEqual(writer.write(["marko"]), expected);
+  });
   it('should write enum values', function () {
     const writer = new GraphSONWriter();
     assert.strictEqual(writer.write(t.cardinality.set), '{"@type":"g:Cardinality","@value":"set"}');
@@ -163,4 +169,16 @@ describe('GraphSONWriter', function () {
       {"@type":"g:P","@value":{"predicate":"neq","value":"d"}}]}});
     assert.strictEqual(writer.write(P.lt("b").or(P.gt("c")).and(P.neq("d"))), expected);
   });
+  it('should write P.within single', function () {
+    const writer = new GraphSONWriter();
+    const expected = JSON.stringify({"@type": "g:P", "@value": {"predicate": "within", "value": {"@type": "g:List", "@value": [ "marko" ]}}});
+    assert.strictEqual(writer.write(P.within(["marko"])), expected);
+    assert.strictEqual(writer.write(P.within("marko")), expected);
+  });
+  it('should write P.within multiple', function () {
+    const writer = new GraphSONWriter();
+    const expected = JSON.stringify({"@type": "g:P", "@value": {"predicate": "within", "value": {"@type": "g:List", "@value": [ "marko", "josh"]}}});
+    assert.strictEqual(writer.write(P.within(["marko","josh"])), expected);
+    assert.strictEqual(writer.write(P.within("marko","josh")), expected);
+  });
 });
\ No newline at end of file