You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2018/03/02 17:41:45 UTC

[01/17] tinkerpop git commit: TINKERPOP-1894 Fixed deserialization of P.not() for GraphSON 2.x [Forced Update!]

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1777 087525e24 -> 912139ee6 (forced update)


TINKERPOP-1894 Fixed deserialization of P.not() for GraphSON 2.x

javascript and python GLVs seemed to respond well to this fix, but .NET did not. The related tests are still failing.


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

Branch: refs/heads/TINKERPOP-1777
Commit: 2350cbe04b5a4ed3fdca389b8a345017a4bc7d0a
Parents: aaf5146
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 12:04:42 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 12:06:43 2018 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                                       |  1 +
 .../gremlin/structure/io/graphson/GraphSONTokens.java    |  1 +
 .../structure/io/graphson/TraversalSerializersV2d0.java  |  2 ++
 .../ser/GraphSONMessageSerializerGremlinV2d0Test.java    | 11 +++++++++++
 .../gremlin-javascript/test/cucumber/feature-steps.js    |  4 ----
 gremlin-python/src/main/jython/radish/feature_steps.py   |  5 -----
 6 files changed, 15 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 92e1d9e..a24b1fb 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Added `checkAdjacentVertices` option to `SubgraphStrategy`.
 * Modified `GremlinDslProcessor` so that it generated the `getAnonymousTraversalClass()` method to return the DSL version of `__`.
 * Added the "Kitchen Sink" test data set.
+* Fixed deserialization of `P.not()` for GraphSON.
 * Added `idleConnectionTimeout` and `keepAliveInterval` to Gremlin Server that enables a "ping" and auto-close for seemingly dead clients.
 * Fixed a bug in `NumberHelper` that led to wrong min/max results if numbers exceeded the Integer limits.
 * Delayed setting of the request identifier until `RequestMessage` construction by the builder.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
index 9f0648a..7ec004a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
@@ -72,6 +72,7 @@ public final class GraphSONTokens {
     public static final String ARGUMENTS = "arguments";
     public static final String PREDICATE = "predicate";
     public static final String AND = "and";
+    public static final String NOT = "not";
     public static final String OR = "or";
     public static final String SOURCE = "source";
     public static final String STEP = "step";

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
index f399cfa..a696280 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV2d0.java
@@ -329,6 +329,8 @@ final class TraversalSerializersV2d0 {
 
             if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) {
                 return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value);
+            } else if (predicate.equals(GraphSONTokens.NOT) && value instanceof P) {
+                return P.not((P<?>) value);
             } else {
                 try {
                     if (value instanceof Collection) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0Test.java
index 1f7efda..fb9bfe2 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerGremlinV2d0Test.java
@@ -22,6 +22,7 @@ import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.buffer.UnpooledByteBufAllocator;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
+import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
@@ -329,6 +330,16 @@ public class GraphSONMessageSerializerGremlinV2d0Test {
         assertEquals(ResponseStatusCode.SUCCESS.getValue(), deserialized.getStatus().getCode().getValue());
         assertEquals("worked", deserialized.getStatus().getMessage());
     }
+
+    @Test
+    public void shouldDeserializeNotPredicate() throws Exception {
+        final String requestMessageWithP = "{\"requestId\":{\"@type\":\"g:UUID\",\"@value\":\"0397b9c0-ffab-470e-a6a8-644fc80c01d6\"},\"op\":\"bytecode\",\"processor\":\"traversal\",\"args\":{\"gremlin\":{\"@type\":\"g:Bytecode\",\"@value\":{\"step\":[[\"V\"],[\"hasLabel\",\"person\"],[\"has\",\"age\",{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"not\",\"value\":{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"lte\",\"value\":{\"@type\":\"g:Int32\",\"@value\":10}}}}}]]}},\"aliases\":{\"g\":\"gmodern\"}}}";
+        final ByteBuf bb = allocator.buffer(requestMessageWithP.length());
+        bb.writeBytes(requestMessageWithP.getBytes());
+        final RequestMessage m = serializer.deserializeRequest(bb);
+        assertEquals("bytecode", m.getOp());
+        assertNotNull(m.getArgs());
+    }
     
     private void assertCommon(final ResponseMessage response) {
         assertEquals(requestId, response.getRequestId());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/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 2bb6ef0..c4eaebc 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
@@ -61,10 +61,6 @@ const ignoreReason = {
 const ignoredScenarios = {
   // An associative array containing the scenario name as key, for example:
   // 'g_V_branchXlabel_eq_person': new IgnoreError(ignoreReason.lambdaNotSupported),
-  'g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name': new IgnoreError(ignoreReason.needsFurtherInvestigation),
-  'g_VX1X_out_aggregateXxX_out_whereXnotXwithinXaXXX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
-  'g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_selectXa_bX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
-  'g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_selectXa_b_c_dX': new IgnoreError(ignoreReason.needsFurtherInvestigation),
 };
 
 defineSupportCode(function(methods) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2350cbe0/gremlin-python/src/main/jython/radish/feature_steps.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/radish/feature_steps.py b/gremlin-python/src/main/jython/radish/feature_steps.py
index 3ba88a2..5cf9059 100644
--- a/gremlin-python/src/main/jython/radish/feature_steps.py
+++ b/gremlin-python/src/main/jython/radish/feature_steps.py
@@ -44,11 +44,6 @@ tail = __.tail
 
 ignores = [
     "g.V(v1Id).out().inject(v2).values(\"name\")",  # bug in attachment won't connect v2
-    # TINKERPOP-1859 - for the following...seems to be related to P.not processing
-    "g.V().hasLabel(\"person\").has(\"age\", P.not(P.lte(d10).and(P.not(P.between(d11, d20)))).and(P.lt(d29).or(P.eq(d35)))).values(\"name\")",
-    "g.V(v1Id).out().aggregate(\"x\").out().where(P.not(P.within(\"x\")))",
-    "g.V().as(\"a\").out().as(\"b\").where(__.and(__.as(\"a\").out(\"knows\").as(\"b\"), __.or(__.as(\"b\").out(\"created\").has(\"name\", \"ripple\"), __.as(\"b\").in(\"knows\").count().is(P.not(P.eq(0)))))).select(\"a\", \"b\")",
-    "g.V().as(\"a\").out(\"created\").as(\"b\").in(\"created\").as(\"c\").both(\"knows\").both(\"knows\").as(\"d\").where(\"c\", P.not(P.eq(\"a\").or(P.eq(\"d\")))).select(\"a\", \"b\", \"c\", \"d\")"
            ]
 
 


[14/17] tinkerpop git commit: Fixed a few test cases

Posted by dk...@apache.org.
Fixed a few test cases


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

Branch: refs/heads/TINKERPOP-1777
Commit: 6c9ae97c05b284717701e5da0153430af9c50ac6
Parents: 6f51fbd
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Wed Feb 28 15:34:00 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Mar 2 10:41:36 2018 -0700

----------------------------------------------------------------------
 .../Gherkin/GherkinTestRunner.cs                | 12 +++++--
 gremlin-test/features/branch/Union.feature      |  3 +-
 gremlin-test/features/map/Max.feature           | 29 ++++++++++++++++
 gremlin-test/features/map/Mean.feature          | 31 ++++++++++++++++-
 gremlin-test/features/map/Min.feature           | 29 ++++++++++++++++
 gremlin-test/features/map/Order.feature         |  7 ++--
 gremlin-test/features/map/Sum.feature           | 35 ++++++++++++++++++--
 gremlin-test/features/sideEffect/Group.feature  |  4 +--
 .../process/computer/GraphComputerTest.java     | 12 +++----
 .../traversal/step/branch/UnionTest.java        |  2 +-
 .../process/traversal/step/map/OrderTest.java   | 18 ++++------
 .../process/traversal/step/map/SumTest.java     | 18 +++++-----
 .../traversal/step/sideEffect/GroupTest.java    | 11 ++----
 13 files changed, 161 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
----------------------------------------------------------------------
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
index eb0a7e1..580708c 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/GherkinTestRunner.cs
@@ -43,7 +43,15 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
             { "g_V_valueMapXtrue_name_ageX", IgnoreReason.TraversalTDeserializationNotSupported }, // TINKERPOP-1866
             { "g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name", IgnoreReason.NeedsFurtherInvestigation }, // TINKERPOP-1859??
             { "g_VX1X_out_aggregateXxX_out_whereXnotXwithinXaXXX", IgnoreReason.NeedsFurtherInvestigation },    // TINKERPOP-1859??
-            { "g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack", IgnoreReason.NeedsFurtherInvestigation }  // TINKERPOP-1907
+            { "g_withBulkXfalseX_withSackX1_sumX_V_out_barrier_sack", IgnoreReason.NeedsFurtherInvestigation },  // TINKERPOP-1907
+            { "g_V_foo_min", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_fold_minXlocalX", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_max", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_fold_maxXlocalX", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_mean", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_fold_meanXlocalX", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_sum", IgnoreReason.NeedsFurtherInvestigation },
+            { "g_V_foo_fold_sumXlocalX", IgnoreReason.NeedsFurtherInvestigation }
         };
         
         private static class Keywords
@@ -384,4 +392,4 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
             return rootDir.FullName;
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/branch/Union.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/branch/Union.feature b/gremlin-test/features/branch/Union.feature
index 83318f6..8f5297e 100644
--- a/gremlin-test/features/branch/Union.feature
+++ b/gremlin-test/features/branch/Union.feature
@@ -135,7 +135,6 @@ Feature: Step - union()
       | d[3].l   |
       | d[0].l   |
       | d[1.9].d |
-      | d[0].i   |
       | d[0].l   |
       | d[1].l   |
 
@@ -151,4 +150,4 @@ Feature: Step - union()
     Then the result should be unordered
       | result |
       | d[1].l   |
-      | d[1].l   |
\ No newline at end of file
+      | d[1].l   |

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/map/Max.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Max.feature b/gremlin-test/features/map/Max.feature
index ad0a270..7139f65 100644
--- a/gremlin-test/features/map/Max.feature
+++ b/gremlin-test/features/map/Max.feature
@@ -28,6 +28,35 @@ Feature: Step - max()
       | result |
       | d[35].i |
 
+  Scenario: g_V_foo_max
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").max()
+      """
+    When iterated to list
+    Then the result should be empty
+
+  Scenario: g_V_age_fold_maxXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("age").fold().max(Scope.local)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[35].i |
+
+  Scenario: g_V_foo_fold_maxXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").fold().max(Scope.local)
+      """
+    When iterated to list
+    Then the result should be empty
+
   Scenario: g_V_repeatXbothX_timesX5X_age_max
     Given the modern graph
     And the traversal of

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/map/Mean.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Mean.feature b/gremlin-test/features/map/Mean.feature
index b109356..dc28ecb 100644
--- a/gremlin-test/features/map/Mean.feature
+++ b/gremlin-test/features/map/Mean.feature
@@ -28,6 +28,35 @@ Feature: Step - mean()
       | result |
       | d[30.75].d |
 
+  Scenario: g_V_foo_mean
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").mean()
+      """
+    When iterated to list
+    Then the result should be empty
+
+  Scenario: g_V_age_fold_meanXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("age").fold().mean(Scope.local)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[30.75].d |
+
+  Scenario: g_V_foo_fold_meanXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").fold().mean(Scope.local)
+      """
+    When iterated to list
+    Then the result should be empty
+
   Scenario: g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX
     Given the modern graph
     And the traversal of
@@ -37,4 +66,4 @@ Feature: Step - mean()
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"ripple":"d[1.0].d","lop":"d[0.3333333333333333].d"}] |
\ No newline at end of file
+      | m[{"ripple":"d[1.0].d","lop":"d[0.3333333333333333].d"}] |

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/map/Min.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Min.feature b/gremlin-test/features/map/Min.feature
index d77e9f3..6e3fb5d 100644
--- a/gremlin-test/features/map/Min.feature
+++ b/gremlin-test/features/map/Min.feature
@@ -28,6 +28,35 @@ Feature: Step - min()
       | result |
       | d[27].i |
 
+  Scenario: g_V_foo_min
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").min()
+      """
+    When iterated to list
+    Then the result should be empty
+
+  Scenario: g_V_age_fold_minXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("age").fold().min(Scope.local)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[27].i |
+
+  Scenario: g_V_foo_fold_minXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").fold().min(Scope.local)
+      """
+    When iterated to list
+    Then the result should be empty
+
   Scenario: g_V_repeatXbothX_timesX5X_age_min
     Given the modern graph
     And the traversal of

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/map/Order.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Order.feature b/gremlin-test/features/map/Order.feature
index 6dd8ac4..8347ad2 100644
--- a/gremlin-test/features/map/Order.feature
+++ b/gremlin-test/features/map/Order.feature
@@ -192,13 +192,13 @@ Feature: Step - order()
     When iterated to list
     Then the result should be ordered
       | result |
-      | m[{"vadas":"d[0].i","peter":"d[0.2].d","josh":"d[1.4].d","marko":"d[1.9].d"}] |
+      | m[{"peter":"d[0.2].d","josh":"d[1.4].d","marko":"d[1.9].d"}] |
 
-  Scenario: g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX
+  Scenario: g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX
     Given the modern graph
     And the traversal of
       """
-      g.V().local(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local), Order.decr)
+      g.V().map(__.bothE().values("weight").fold()).order().by(__.sum(Scope.local), Order.decr)
       """
     When iterated to list
     Then the result should be ordered
@@ -233,7 +233,6 @@ Feature: Step - order()
       | m[{"marko":"d[1.9].d"}]  |
       | m[{"josh":"d[1.4].d"}]  |
       | m[{"peter":"d[0.2].d"}]  |
-      | m[{"vadas":"d[0].i"}]  |
 
   Scenario: g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_decrX
     Given the modern graph

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/map/Sum.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Sum.feature b/gremlin-test/features/map/Sum.feature
index 2c89946..816fd2b 100644
--- a/gremlin-test/features/map/Sum.feature
+++ b/gremlin-test/features/map/Sum.feature
@@ -17,7 +17,7 @@
 
 Feature: Step - sum()
 
-  Scenario: g_V_valuesXageX_sum
+  Scenario: g_V_age_sum
     Given the modern graph
     And the traversal of
       """
@@ -26,7 +26,36 @@ Feature: Step - sum()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[123].l |
+      | d[123].i |
+
+  Scenario: g_V_foo_sum
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").sum()
+      """
+    When iterated to list
+    Then the result should be empty
+
+  Scenario: g_V_age_fold_sumXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("age").fold().sum(Scope.local)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[123].i |
+
+  Scenario: g_V_foo_fold_sumXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().values("foo").fold().sum(Scope.local)
+      """
+    When iterated to list
+    Then the result should be empty
 
   Scenario: g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX
     Given the modern graph
@@ -37,4 +66,4 @@ Feature: Step - sum()
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"ripple":"d[1.0].d","lop":"d[1.0].d"}] |
\ No newline at end of file
+      | m[{"ripple":"d[1.0].d","lop":"d[1.0].d"}] |

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/features/sideEffect/Group.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/sideEffect/Group.feature b/gremlin-test/features/sideEffect/Group.feature
index 94d2191..2686f09 100644
--- a/gremlin-test/features/sideEffect/Group.feature
+++ b/gremlin-test/features/sideEffect/Group.feature
@@ -101,7 +101,7 @@ Feature: Step - group()
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"software":"d[0].i", "person":"d[3.5].d"}] |
+      | m[{"person":"d[3.5].d"}] |
 
   Scenario: g_V_repeatXbothXfollowedByXX_timesX2X_group_byXsongTypeX_byXcountX
     Given the grateful graph
@@ -207,7 +207,7 @@ Feature: Step - group()
     When iterated to list
     Then the result should be unordered
       | result |
-      | m[{"cover":{"followedBy":"d[777982].l", "sungBy":"d[0].i", "writtenBy":"d[0].i"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l", "sungBy":"d[0].i", "writtenBy":"d[0].i"}}] |
+      | m[{"cover":{"followedBy":"d[777982].l"}, "":{"followedBy":"d[179350].l"}, "original":{"followedBy":"d[2185613].l"}}] |
 
   Scenario: g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX
     Given the modern graph

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
index 2f4f103..228b975 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
@@ -1347,13 +1347,13 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
             assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next());
             assertEquals(Long.valueOf(0l), result.graph().traversal().V().values().count().next());
             assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next());
-            assertEquals(0, result.graph().traversal().V().values("money").sum().next());
+            assertFalse(result.graph().traversal().V().values("money").sum().hasNext());
             ///
             assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
             assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
-            assertEquals(0, graph.traversal().V().values("money").sum().next());
+            assertFalse(graph.traversal().V().values("money").sum().hasNext());
         }
     }
 
@@ -1373,7 +1373,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
             assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
             assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
-            assertEquals(0, graph.traversal().V().values("money").sum().next());
+            assertFalse(graph.traversal().V().values("money").sum().hasNext());
         }
     }
 
@@ -1393,7 +1393,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
             assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
             assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
-            assertEquals(0, graph.traversal().V().values("money").sum().next());
+            assertFalse(graph.traversal().V().values("money").sum().hasNext());
         }
     }
 
@@ -1407,13 +1407,13 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
             assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
             assertEquals(Long.valueOf(12l), result.graph().traversal().V().values().count().next());
             assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
-            assertEquals(0, result.graph().traversal().V().values("money").sum().next());
+            assertFalse(result.graph().traversal().V().values("money").sum().hasNext());
             ///
             assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
             assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
-            assertEquals(0, graph.traversal().V().values("money").sum().next());
+            assertFalse(graph.traversal().V().values("money").sum().hasNext());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
index 1c06943..bbe5eff 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
@@ -135,7 +135,7 @@ public abstract class UnionTest extends AbstractGremlinProcessTest {
     public void g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX() {
         final Traversal<Vertex, Number> traversal = get_g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX(convertToVertexId("marko"), convertToVertexId("vadas"));
         printTraversalForm(traversal);
-        checkResults(Arrays.asList(0l, 0l, 0, 3l, 1l, 1.9d), traversal);
+        checkResults(Arrays.asList(3L, 0L, 1.9, 0L, 1L), traversal);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
index bbf63ef..d5cd6fd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
@@ -76,7 +76,7 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX();
 
-    public abstract Traversal<Vertex, List<Double>> get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX();
+    public abstract Traversal<Vertex, List<Double>> get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX();
 
     public abstract Traversal<Vertex, Map<String, Object>> get_g_V_asXvX_mapXbothE_weight_foldX_sumXlocalX_asXsX_selectXv_sX_order_byXselectXsX_decrX();
 
@@ -244,8 +244,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX() {
-        final Traversal<Vertex, List<Double>> traversal = get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX();
+    public void g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX() {
+        final Traversal<Vertex, List<Double>> traversal = get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX();
         final List<List<Double>> list = traversal.toList();
         assertEquals(list.get(0).size(), 3);
         assertEquals(list.get(1).size(), 3);
@@ -386,12 +386,9 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
         assertTrue(traversal.hasNext());
         final Map<String, Number> m = traversal.next();
         assertFalse(traversal.hasNext());
-        assertEquals(4, m.size());
+        assertEquals(3, m.size());
         final Iterator<Map.Entry<String, Number>> iterator = m.entrySet().iterator();
         Map.Entry<String, Number> entry = iterator.next();
-        assertEquals("vadas", entry.getKey());
-        assertEquals(0.0, entry.getValue().doubleValue(), 0.0001);
-        entry = iterator.next();
         assertEquals("peter", entry.getKey());
         assertEquals(0.2, entry.getValue().doubleValue(), 0.0001);
         entry = iterator.next();
@@ -417,9 +414,6 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
         entry = traversal.next();
         assertEquals("peter", entry.getKey());
         assertEquals(0.2, entry.getValue().doubleValue(), 0.0001);
-        entry = traversal.next();
-        assertEquals("vadas", entry.getKey());
-        assertEquals(0.0, entry.getValue().doubleValue(), 0.0001);
         assertFalse(traversal.hasNext());
     }
 
@@ -485,8 +479,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex, List<Double>> get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX() {
-            return g.V().local(__.bothE().<Double>values("weight").fold()).order().by(__.sum(Scope.local), Order.decr);
+        public Traversal<Vertex, List<Double>> get_g_V_mapXbothE_weight_foldX_order_byXsumXlocalX_decrX() {
+            return g.V().map(__.bothE().<Double>values("weight").fold()).order().by(__.sum(Scope.local), Order.decr);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
index e1bbd0b..f8bfbcb 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
@@ -40,9 +40,9 @@ import static org.junit.Assert.*;
 @RunWith(GremlinProcessRunner.class)
 public abstract class SumTest extends AbstractGremlinProcessTest {
 
-    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_sum();
+    public abstract Traversal<Vertex, Number> get_g_V_age_sum();
 
-    public abstract Traversal<Vertex, Integer> get_g_V_age_fold_sumXlocalX();
+    public abstract Traversal<Vertex, Number> get_g_V_age_fold_sumXlocalX();
 
     public abstract Traversal<Vertex, Number> get_g_V_foo_sum();
 
@@ -52,10 +52,10 @@ public abstract class SumTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_valuesXageX_sum() {
-        final Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_sum();
+    public void g_V_age_sum() {
+        final Traversal<Vertex, Number> traversal = get_g_V_age_sum();
         printTraversalForm(traversal);
-        final Integer sum = traversal.next();
+        final Number sum = traversal.next();
         assertEquals(123, sum.intValue());
         assertFalse(traversal.hasNext());
     }
@@ -63,9 +63,9 @@ public abstract class SumTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_age_fold_sumXlocalX() {
-        final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_sumXlocalX();
+        final Traversal<Vertex, Number> traversal = get_g_V_age_fold_sumXlocalX();
         printTraversalForm(traversal);
-        final Integer sum = traversal.next();
+        final Number sum = traversal.next();
         assertEquals(123, sum.intValue());
         assertFalse(traversal.hasNext());
     }
@@ -102,12 +102,12 @@ public abstract class SumTest extends AbstractGremlinProcessTest {
     public static class Traversals extends SumTest {
 
         @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_sum() {
+        public Traversal<Vertex, Number> get_g_V_age_sum() {
             return g.V().values("age").sum();
         }
 
         @Override
-        public Traversal<Vertex, Integer> get_g_V_age_fold_sumXlocalX() {
+        public Traversal<Vertex, Number> get_g_V_age_fold_sumXlocalX() {
             return g.V().values("age").fold().sum(Scope.local);
         }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6c9ae97c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
index 3e1e53b..6a58aa7 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
@@ -218,8 +218,7 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
         assertTrue(traversal.hasNext());
         final Map<String, Number> map = traversal.next();
         assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(0, map.get("software"));
+        assertEquals(1, map.size());
         assertEquals(3.5d, (double) map.get("person"), 0.01d);
         checkSideEffects(traversal.asAdmin().getSideEffects(), "a", HashMap.class);
     }
@@ -424,16 +423,12 @@ public abstract class GroupTest extends AbstractGremlinProcessTest {
         assertEquals(179350, subMap.get("followedBy").intValue());
         //
         subMap = map.get("original");
-        assertEquals(3, subMap.size());
+        assertEquals(1, subMap.size());
         assertEquals(2185613, subMap.get("followedBy").intValue());
-        assertEquals(0, subMap.get("writtenBy").intValue());
-        assertEquals(0, subMap.get("sungBy").intValue());
         //
         subMap = map.get("cover");
-        assertEquals(3, subMap.size());
+        assertEquals(1, subMap.size());
         assertEquals(777982, subMap.get("followedBy").intValue());
-        assertEquals(0, subMap.get("writtenBy").intValue());
-        assertEquals(0, subMap.get("sungBy").intValue());
     }
 
     @Test


[13/17] tinkerpop git commit: This closes #801

Posted by dk...@apache.org.
This closes #801


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

Branch: refs/heads/TINKERPOP-1777
Commit: 385881822adb0d92111590c104675074e3493ef1
Parents: 32b39d3
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Mar 2 11:43:46 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Fri Mar 2 11:43:46 2018 -0500

----------------------------------------------------------------------

----------------------------------------------------------------------



[07/17] tinkerpop git commit: Merge branch 'tp32' into tp33

Posted by dk...@apache.org.
Merge branch 'tp32' into tp33


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

Branch: refs/heads/TINKERPOP-1777
Commit: e56823b673262ba05267785aa82b45e893a77557
Parents: 92e899f a61dd58
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 13:45:47 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 13:45:47 2018 -0500

----------------------------------------------------------------------
 .../tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java     | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e56823b6/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java
----------------------------------------------------------------------


[08/17] tinkerpop git commit: Merge branch 'tp33'

Posted by dk...@apache.org.
Merge branch 'tp33'


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

Branch: refs/heads/TINKERPOP-1777
Commit: a8bfabd27f51e89cacbca14e61189a4efba69d25
Parents: 4e8d63c e56823b
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 13:45:56 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 13:45:56 2018 -0500

----------------------------------------------------------------------
 .../tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java     | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------



[16/17] tinkerpop git commit: Fixed expected data type in sum() test

Posted by dk...@apache.org.
Fixed expected data type in sum() test


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

Branch: refs/heads/TINKERPOP-1777
Commit: e51c8c86d03f4dece894e24b34175b40482c2e7e
Parents: 6c9ae97
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Fri Mar 2 10:40:15 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Mar 2 10:41:36 2018 -0700

----------------------------------------------------------------------
 gremlin-test/features/map/Sum.feature | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e51c8c86/gremlin-test/features/map/Sum.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/map/Sum.feature b/gremlin-test/features/map/Sum.feature
index 816fd2b..0e20368 100644
--- a/gremlin-test/features/map/Sum.feature
+++ b/gremlin-test/features/map/Sum.feature
@@ -26,7 +26,7 @@ Feature: Step - sum()
     When iterated to list
     Then the result should be unordered
       | result |
-      | d[123].i |
+      | d[123].l |
 
   Scenario: g_V_foo_sum
     Given the modern graph


[12/17] tinkerpop git commit: Merge branch 'tp33'

Posted by dk...@apache.org.
Merge branch 'tp33'


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

Branch: refs/heads/TINKERPOP-1777
Commit: 32b39d3727dc329eaf2acd81a34dbca9cdc170a4
Parents: 18ba893 07df6b3
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 18:42:18 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 18:42:18 2018 -0500

----------------------------------------------------------------------
 docs/src/dev/future/index.asciidoc | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[03/17] tinkerpop git commit: Merge branch 'tp33'

Posted by dk...@apache.org.
Merge branch 'tp33'


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

Branch: refs/heads/TINKERPOP-1777
Commit: 5d36ec116da9976e3e08cb09c03f4aa3823c9c9c
Parents: cef13dd 5ec7774
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 12:49:41 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 12:49:41 2018 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                                       |  1 +
 .../gremlin/structure/io/graphson/GraphSONTokens.java    |  1 +
 .../structure/io/graphson/TraversalSerializersV2d0.java  |  2 ++
 .../structure/io/graphson/TraversalSerializersV3d0.java  |  2 ++
 .../ser/GraphSONMessageSerializerGremlinV2d0Test.java    | 11 +++++++++++
 .../driver/ser/GraphSONMessageSerializerV3d0Test.java    | 11 +++++++++++
 .../gremlin-javascript/test/cucumber/feature-steps.js    |  4 ----
 gremlin-python/src/main/jython/radish/feature_steps.py   |  5 -----
 8 files changed, 28 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5d36ec11/CHANGELOG.asciidoc
----------------------------------------------------------------------


[02/17] tinkerpop git commit: Merge branch 'tp32' into tp33

Posted by dk...@apache.org.
Merge branch 'tp32' into tp33

Conflicts:
	gremlin-python/src/main/jython/radish/feature_steps.py


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

Branch: refs/heads/TINKERPOP-1777
Commit: 5ec7774793f2686a7136cfb9c2fb6ff5805957f4
Parents: 532a5de 2350cbe
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 12:49:24 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 12:49:24 2018 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                                       |  1 +
 docs/preprocessor/preprocess-file.sh                     |  3 +++
 .../gremlin/structure/io/graphson/GraphSONTokens.java    |  1 +
 .../structure/io/graphson/TraversalSerializersV2d0.java  |  2 ++
 .../structure/io/graphson/TraversalSerializersV3d0.java  |  2 ++
 .../ser/GraphSONMessageSerializerGremlinV2d0Test.java    | 11 +++++++++++
 .../driver/ser/GraphSONMessageSerializerV3d0Test.java    | 11 +++++++++++
 .../gremlin-javascript/test/cucumber/feature-steps.js    |  4 ----
 gremlin-python/src/main/jython/radish/feature_steps.py   |  5 -----
 9 files changed, 31 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/CHANGELOG.asciidoc
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
index c629b3f,0000000..fd11f25
mode 100644,000000..100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
@@@ -1,472 -1,0 +1,474 @@@
 +/*
 + *  Licensed to the Apache Software Foundation (ASF) under one
 + *  or more contributor license agreements.  See the NOTICE file
 + *  distributed with this work for additional information
 + *  regarding copyright ownership.  The ASF licenses this file
 + *  to you under the Apache License, Version 2.0 (the
 + *  "License"); you may not use this file except in compliance
 + *  with the License.  You may obtain a copy of the License at
 + *
 + *  http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing,
 + *  software distributed under the License is distributed on an
 + *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + *  KIND, either express or implied.  See the License for the
 + *  specific language governing permissions and limitations
 + *  under the License.
 + */
 +
 +package org.apache.tinkerpop.gremlin.structure.io.graphson;
 +
 +import org.apache.commons.configuration.ConfigurationConverter;
 +import org.apache.commons.configuration.MapConfiguration;
 +import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
 +import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 +import org.apache.tinkerpop.gremlin.process.traversal.P;
 +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 +import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 +import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 +import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
 +import org.apache.tinkerpop.gremlin.util.function.Lambda;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonParser;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonToken;
 +import org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext;
 +import org.apache.tinkerpop.shaded.jackson.databind.JavaType;
 +import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
 +import org.apache.tinkerpop.shaded.jackson.databind.deser.std.StdDeserializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.type.TypeFactory;
 +
 +import java.io.IOException;
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.Collection;
 +import java.util.List;
 +import java.util.Map;
 +
 +/**
 + * @author Marko A. Rodriguez (http://markorodriguez.com)
 + */
 +final class TraversalSerializersV3d0 {
 +
 +    private TraversalSerializersV3d0() {
 +    }
 +
 +    /////////////////
 +    // SERIALIZERS //
 +    ////////////////
 +
 +    final static class TraversalJacksonSerializer extends StdSerializer<Traversal> {
 +
 +        public TraversalJacksonSerializer() {
 +            super(Traversal.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeObject(traversal.asAdmin().getBytecode());
 +        }
 +
 +        @Override
 +        public void serializeWithType(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer)
 +                throws IOException {
 +            serialize(traversal, jsonGenerator, serializerProvider);
 +        }
 +
 +    }
 +
 +    final static class BytecodeJacksonSerializer extends StdScalarSerializer<Bytecode> {
 +
 +        public BytecodeJacksonSerializer() {
 +            super(Bytecode.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Bytecode bytecode, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            if (bytecode.getSourceInstructions().iterator().hasNext()) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.SOURCE);
 +                for (final Bytecode.Instruction instruction : bytecode.getSourceInstructions()) {
 +                    jsonGenerator.writeStartArray();
 +                    jsonGenerator.writeString(instruction.getOperator());
 +                    for (final Object argument : instruction.getArguments()) {
 +                        jsonGenerator.writeObject(argument);
 +                    }
 +                    jsonGenerator.writeEndArray();
 +                }
 +                jsonGenerator.writeEndArray();
 +            }
 +            if (bytecode.getStepInstructions().iterator().hasNext()) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.STEP);
 +                for (final Bytecode.Instruction instruction : bytecode.getStepInstructions()) {
 +                    jsonGenerator.writeStartArray();
 +                    jsonGenerator.writeString(instruction.getOperator());
 +                    for (final Object argument : instruction.getArguments()) {
 +                        jsonGenerator.writeObject(argument);
 +                    }
 +                    jsonGenerator.writeEndArray();
 +                }
 +                jsonGenerator.writeEndArray();
 +            }
 +
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    static class EnumJacksonSerializer extends StdScalarSerializer<Enum> {
 +
 +        public EnumJacksonSerializer() {
 +            super(Enum.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Enum enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeString(enumInstance.name());
 +        }
 +
 +    }
 +
 +    final static class PJacksonSerializer extends StdScalarSerializer<P> {
 +
 +        public PJacksonSerializer() {
 +            super(P.class);
 +        }
 +
 +        @Override
 +        public void serialize(final P p, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.PREDICATE,
 +                    p instanceof ConnectiveP ?
 +                            p instanceof AndP ?
 +                                    GraphSONTokens.AND :
 +                                    GraphSONTokens.OR :
 +                            p.getBiPredicate().toString());
 +            if (p instanceof ConnectiveP) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
 +                for (final P<?> predicate : ((ConnectiveP<?>) p).getPredicates()) {
 +                    jsonGenerator.writeObject(predicate);
 +                }
 +                jsonGenerator.writeEndArray();
 +            } else
 +                jsonGenerator.writeObjectField(GraphSONTokens.VALUE, p.getValue());
 +
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class LambdaJacksonSerializer extends StdScalarSerializer<Lambda> {
 +
 +        public LambdaJacksonSerializer() {
 +            super(Lambda.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Lambda lambda, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.SCRIPT, lambda.getLambdaScript());
 +            jsonGenerator.writeStringField(GraphSONTokens.LANGUAGE, lambda.getLambdaLanguage());
 +            jsonGenerator.writeNumberField(GraphSONTokens.ARGUMENTS, lambda.getLambdaArguments());
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class BindingJacksonSerializer extends StdScalarSerializer<Bytecode.Binding> {
 +
 +        public BindingJacksonSerializer() {
 +            super(Bytecode.Binding.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Bytecode.Binding binding, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.KEY, binding.variable());
 +            jsonGenerator.writeObjectField(GraphSONTokens.VALUE, binding.value());
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class TraverserJacksonSerializer extends StdScalarSerializer<Traverser> {
 +
 +        public TraverserJacksonSerializer() {
 +            super(Traverser.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Traverser traverserInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeObjectField(GraphSONTokens.BULK, traverserInstance.bulk());
 +            jsonGenerator.writeObjectField(GraphSONTokens.VALUE, traverserInstance.get());
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    final static class TraversalStrategyJacksonSerializer extends StdScalarSerializer<TraversalStrategy> {
 +
 +        public TraversalStrategyJacksonSerializer() {
 +            super(TraversalStrategy.class);
 +        }
 +
 +        @Override
 +        public void serialize(final TraversalStrategy traversalStrategy, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            for (final Map.Entry<Object, Object> entry : ConfigurationConverter.getMap(traversalStrategy.getConfiguration()).entrySet()) {
 +                jsonGenerator.writeObjectField((String) entry.getKey(), entry.getValue());
 +            }
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    ///////////////////
 +    // DESERIALIZERS //
 +    //////////////////
 +
 +    final static class BytecodeJacksonDeserializer extends StdDeserializer<Bytecode> {
 +        private static final JavaType listJavaType = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, Object.class);
 +        private static final JavaType listListJavaType = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, listJavaType);
 +
 +        public BytecodeJacksonDeserializer() {
 +            super(Bytecode.class);
 +        }
 +
 +        @Override
 +        public Bytecode deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            final Bytecode bytecode = new Bytecode();
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.SOURCE)) {
 +                    jsonParser.nextToken();
 +                    final List<List<Object>> instructions = deserializationContext.readValue(jsonParser, listListJavaType);
 +                    for (final List<Object> instruction : instructions) {
 +                        bytecode.addSource((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
 +                    }
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.STEP)) {
 +                    jsonParser.nextToken();
 +                    final List<List<Object>> instructions = deserializationContext.readValue(jsonParser, listListJavaType);
 +                    for (final List<Object> instruction : instructions) {
 +                        bytecode.addStep((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
 +                    }
 +                }
 +            }
 +            return bytecode;
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class EnumJacksonDeserializer<A extends Enum> extends StdDeserializer<A> {
 +
 +        public EnumJacksonDeserializer(final Class<A> enumClass) {
 +            super(enumClass);
 +        }
 +
 +        @Override
 +        public A deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            final Class<A> enumClass = (Class<A>) this._valueClass;
 +            final String enumName = jsonParser.getText();
 +            for (final Enum a : enumClass.getEnumConstants()) {
 +                if (a.name().equals(enumName))
 +                    return (A) a;
 +            }
 +            throw new IOException("Unknown enum type: " + enumClass);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class PJacksonDeserializer extends StdDeserializer<P> {
 +
 +        public PJacksonDeserializer() {
 +            super(P.class);
 +        }
 +
 +        @Override
 +        public P deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String predicate = null;
 +            Object value = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.PREDICATE)) {
 +                    jsonParser.nextToken();
 +                    predicate = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    value = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +
 +            if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) {
 +                return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value);
++            } else if (predicate.equals(GraphSONTokens.NOT) && value instanceof P) {
++                return P.not((P<?>) value);
 +            } else {
 +                try {
 +                    if (value instanceof Collection) {
 +                        if (predicate.equals("between"))
 +                            return P.between(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("inside"))
 +                            return P.between(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("outside"))
 +                            return P.outside(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("within"))
 +                            return P.within((Collection) value);
 +                        else if (predicate.equals("without"))
 +                            return P.without((Collection) value);
 +                        else
 +                            return (P) P.class.getMethod(predicate, Collection.class).invoke(null, (Collection) value);
 +                    } else {
 +                        try {
 +                            return (P) P.class.getMethod(predicate, Object.class).invoke(null, value);
 +                        } catch (final NoSuchMethodException e) {
 +                            return (P) P.class.getMethod(predicate, Object[].class).invoke(null, (Object) new Object[]{value});
 +                        }
 +                    }
 +                } catch (final Exception e) {
 +                    throw new IllegalStateException(e.getMessage(), e);
 +                }
 +            }
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class LambdaJacksonDeserializer extends StdDeserializer<Lambda> {
 +
 +        public LambdaJacksonDeserializer() {
 +            super(Lambda.class);
 +        }
 +
 +        @Override
 +        public Lambda deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String script = null;
 +            String language = null;
 +            int arguments = -1;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.SCRIPT)) {
 +                    jsonParser.nextToken();
 +                    script = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.LANGUAGE)) {
 +                    jsonParser.nextToken();
 +                    language = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.ARGUMENTS)) {
 +                    jsonParser.nextToken();
 +                    arguments = jsonParser.getIntValue();
 +                }
 +            }
 +
 +            if (-1 == arguments || arguments > 2)
 +                return new Lambda.UnknownArgLambda(script, language, arguments);
 +            else if (0 == arguments)
 +                return new Lambda.ZeroArgLambda<>(script, language);
 +            else if (1 == arguments)
 +                return new Lambda.OneArgLambda<>(script, language);
 +            else
 +                return new Lambda.TwoArgLambda<>(script, language);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class BindingJacksonDeserializer extends StdDeserializer<Bytecode.Binding> {
 +
 +        public BindingJacksonDeserializer() {
 +            super(Bytecode.Binding.class);
 +        }
 +
 +        @Override
 +        public Bytecode.Binding deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String k = null;
 +            Object v = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.KEY)) {
 +                    jsonParser.nextToken();
 +                    k = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    v = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +            return new Bytecode.Binding<>(k, v);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    static class TraverserJacksonDeserializer extends StdDeserializer<Traverser> {
 +
 +        public TraverserJacksonDeserializer() {
 +            super(Traverser.class);
 +        }
 +
 +        @Override
 +        public Traverser deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            long bulk = 1;
 +            Object v = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.BULK)) {
 +                    jsonParser.nextToken();
 +                    bulk = deserializationContext.readValue(jsonParser, Long.class);
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    v = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +
 +            return new DefaultRemoteTraverser<>(v, bulk);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class TraversalStrategyProxyJacksonDeserializer<T extends TraversalStrategy> extends AbstractObjectDeserializer<TraversalStrategyProxy> {
 +
 +        private final Class<T> clazz;
 +
 +        public TraversalStrategyProxyJacksonDeserializer(final Class<T> clazz) {
 +            super(TraversalStrategyProxy.class);
 +            this.clazz = clazz;
 +        }
 +
 +        @Override
 +        public TraversalStrategyProxy<T> createObject(final Map<String, Object> data) {
 +            return new TraversalStrategyProxy<>(this.clazz, new MapConfiguration(data));
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
----------------------------------------------------------------------
diff --cc gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
index 4bd3f6f,0000000..b6398f5
mode 100644,000000..100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
@@@ -1,340 -1,0 +1,351 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + * http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
 +package org.apache.tinkerpop.gremlin.driver.ser;
 +
 +import io.netty.buffer.ByteBuf;
 +import io.netty.buffer.ByteBufAllocator;
 +import io.netty.buffer.UnpooledByteBufAllocator;
 +import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
++import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 +import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 +import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 +import org.apache.tinkerpop.gremlin.structure.Edge;
 +import org.apache.tinkerpop.gremlin.structure.Graph;
 +import org.apache.tinkerpop.gremlin.structure.Property;
 +import org.apache.tinkerpop.gremlin.structure.Vertex;
 +import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 +import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 +import org.junit.Test;
 +
 +import java.util.ArrayList;
 +import java.util.Date;
 +import java.util.HashMap;
 +import java.util.Iterator;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.UUID;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertNotNull;
 +import static org.junit.Assert.assertNull;
 +import static org.junit.Assert.fail;
 +
 +/**
 + * Serializer tests that cover non-lossy serialization/deserialization methods.
 + *
 + * @author Stephen Mallette (http://stephen.genoprime.com)
 + */
 +public class GraphSONMessageSerializerV3d0Test {
 +
 +    private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
 +    private final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
 +    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
 +
 +    public final MessageSerializer serializer = new GraphSONMessageSerializerV3d0();
 +
 +    @Test
 +    public void shouldSerializeIterable() throws Exception {
 +        final ArrayList<Integer> list = new ArrayList<>();
 +        list.add(1);
 +        list.add(100);
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
 +        assertEquals(2, deserializedFunList.size());
 +        assertEquals(new Integer(1), deserializedFunList.get(0));
 +        assertEquals(new Integer(100), deserializedFunList.get(1));
 +    }
 +
 +    @Test
 +    public void shouldSerializeIterableWithNull() throws Exception {
 +        final ArrayList<Integer> list = new ArrayList<>();
 +        list.add(1);
 +        list.add(null);
 +        list.add(100);
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
 +        assertEquals(3, deserializedFunList.size());
 +        assertEquals(new Integer(1), deserializedFunList.get(0));
 +        assertNull(deserializedFunList.get(1));
 +        assertEquals(new Integer(100), deserializedFunList.get(2));
 +    }
 +
 +    @Test
 +    public void shouldSerializeMap() throws Exception {
 +        final Map<String, Object> map = new HashMap<>();
 +        final Map<String, String> innerMap = new HashMap<>();
 +        innerMap.put("a", "b");
 +
 +        map.put("x", 1);
 +        map.put("y", "some");
 +        map.put("z", innerMap);
 +
 +        final ResponseMessage response = convert(map);
 +        assertCommon(response);
 +
 +        final Map<String, Object> deserializedMap = (Map<String, Object>) response.getResult().getData();
 +        assertEquals(3, deserializedMap.size());
 +        assertEquals(1, deserializedMap.get("x"));
 +        assertEquals("some", deserializedMap.get("y"));
 +
 +        final Map<String, String> deserializedInnerMap = (Map<String, String>) deserializedMap.get("z");
 +        assertEquals(1, deserializedInnerMap.size());
 +        assertEquals("b", deserializedInnerMap.get("a"));
 +    }
 +
 +    @Test
 +    public void shouldSerializeMapEntries() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Date d = new Date();
 +
 +        final Map<Object, Object> map = new HashMap<>();
 +        map.put("x", 1);
 +        map.put(v1, 100);
 +        map.put(d, "test");
 +
 +        final ResponseMessage response = convert(IteratorUtils.asList(map.entrySet()));
 +        assertCommon(response);
 +
 +        final List<Map<Object, Object>> deserializedEntries = (List<Map<Object, Object>>) response.getResult().getData();
 +        assertEquals(3, deserializedEntries.size());
 +        deserializedEntries.forEach(m -> {
 +            final Map.Entry<Object,Object> e = m.entrySet().iterator().next();
 +            if (e.getKey().equals("x"))
 +                assertEquals(1, e.getValue());
 +            else if (e.getKey() instanceof Vertex && e.getKey().equals(v1))
 +                assertEquals(100, e.getValue());
 +            else if (e.getKey() instanceof Date)
 +                assertEquals("test", e.getValue());
 +            else
 +                fail("Map entries contains a key that is not part of what was serialized");
 +        });
 +    }
 +
 +    @Test
 +    public void shouldSerializeEdge() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Vertex v2 = graph.addVertex();
 +        final Edge e = v1.addEdge("test", v2);
 +        e.property("abc", 123);
 +
 +        final Iterable<Edge> iterable = IteratorUtils.list(graph.edges());
 +
 +        final ResponseMessage response = convert(iterable);
 +        assertCommon(response);
 +
 +        final List<Edge> edgeList = (List<Edge>) response.getResult().getData();
 +        assertEquals(1, edgeList.size());
 +
 +        final Edge deserializedEdge = edgeList.get(0);
 +        assertEquals(e.id(), deserializedEdge.id());
 +        assertEquals(v1.id(), deserializedEdge.outVertex().id());
 +        assertEquals(v2.id(), deserializedEdge.inVertex().id());
 +        assertEquals(v1.label(), deserializedEdge.outVertex().label());
 +        assertEquals(v2.label(), deserializedEdge.inVertex().label());
 +        assertEquals(e.label(), deserializedEdge.label());
 +
 +        final List<Property> properties = new ArrayList<>();
 +        deserializedEdge.properties().forEachRemaining(properties::add);
 +        assertEquals(1, properties.size());
 +
 +        assertNotNull(properties);
 +        assertEquals("abc", properties.get(0).key());
 +        assertEquals(123, properties.get(0).value());
 +
 +    }
 +
 +    @Test
 +    public void shouldSerializeEdgeProperty() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Vertex v2 = graph.addVertex();
 +        final Edge e = v1.addEdge("test", v2);
 +        e.property("abc", 123);
 +
 +        final Iterable<Property<Object>> iterable = IteratorUtils.list(e.properties("abc"));
 +        final ResponseMessage response = convert(iterable);
 +        assertCommon(response);
 +
 +        final List<Property> propertyList = (List<Property>) response.getResult().getData();
 +        assertEquals(1, propertyList.size());
 +        assertEquals(123, propertyList.get(0).value());
 +    }
 +
 +    @Test
 +    public void shouldSerializeVertexWithEmbeddedMap() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v = graph.addVertex();
 +        final Map<String, Object> map = new HashMap<>();
 +        map.put("x", 500);
 +        map.put("y", "some");
 +
 +        final ArrayList<Object> friends = new ArrayList<>();
 +        friends.add("x");
 +        friends.add(5);
 +        friends.add(map);
 +
 +        v.property(VertexProperty.Cardinality.single, "friends", friends);
 +
 +        final List list = IteratorUtils.list(graph.vertices());
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Vertex> vertexList = (List<Vertex>) response.getResult().getData();
 +        assertEquals(1, vertexList.size());
 +
 +        final Vertex deserializedVertex = vertexList.get(0);
 +        assertEquals(v.id(), deserializedVertex.id());
 +        assertEquals(Vertex.DEFAULT_LABEL, deserializedVertex.label());
 +
 +        final List<VertexProperty> properties = new ArrayList<>();
 +        deserializedVertex.properties().forEachRemaining(properties::add);
 +        assertEquals(1, properties.size());
 +
 +        final VertexProperty friendsProperty = properties.get(0);
 +        final List<Object> deserializedInnerList = (List<Object>) friendsProperty.value();
 +
 +        assertEquals(3, deserializedInnerList.size());
 +        assertEquals("x", deserializedInnerList.get(0));
 +        assertEquals(5, deserializedInnerList.get(1));
 +
 +        final Map<String, Object> deserializedInnerInnerMap = (Map<String, Object>) deserializedInnerList.get(2);
 +        assertEquals(2, deserializedInnerInnerMap.size());
 +        assertEquals(500, deserializedInnerInnerMap.get("x"));
 +        assertEquals("some", deserializedInnerInnerMap.get("y"));
 +    }
 +
 +    @Test
 +    public void shouldSerializeToJsonMapWithElementForKey() throws Exception {
 +        final TinkerGraph graph = TinkerFactory.createClassic();
 +        final GraphTraversalSource g = graph.traversal();
 +        final Map<Vertex, Integer> map = new HashMap<>();
 +        final Vertex v1 = g.V().has("name", "marko").next();
 +        map.put(v1, 1000);
 +
 +        final ResponseMessage response = convert(map);
 +        assertCommon(response);
 +
 +        final Map<Vertex, Integer> deserializedMap = (Map<Vertex, Integer>) response.getResult().getData();
 +        assertEquals(1, deserializedMap.size());
 +        assertEquals(new Integer(1000), deserializedMap.get(v1));
 +    }
 +
 +    @Test
 +    @org.junit.Ignore
 +    public void shouldSerializeToTreeJson() throws Exception {
 +        final TinkerGraph graph = TinkerFactory.createClassic();
 +        final GraphTraversalSource g = graph.traversal();
 +        final Map t = g.V(1).out().properties("name").tree().next();
 +
 +        final ResponseMessage response = convert(t);
 +        assertCommon(response);
 +
 +        final Tree deserializedTree = (Tree)response.getResult().getData();
 +
 +        //check the first object and its key's properties
 +        assertEquals(1, deserializedTree.size());
 +        final Vertex v = ((Vertex) deserializedTree.keySet().iterator().next());
 +        assertEquals(1, v.id());
 +        assertEquals("marko", v.property("name").value());
 +
 +        final Tree firstTree = (Tree)deserializedTree.get(v);
 +        assertEquals(3, firstTree.size());
 +        Iterator<Vertex> vertexKeys = firstTree.keySet().iterator();
 +
 +        Tree t2 = (Tree)firstTree.get(vertexKeys.next());
 +        VertexProperty vp = (VertexProperty)t2.keySet().iterator().next();
 +        assertEquals(3, vp.id());
 +        assertEquals("vadas", vp.value());
 +
 +        t2 = (Tree) firstTree.get(vertexKeys.next());
 +        vp = (VertexProperty) t2.keySet().iterator().next();
 +        assertEquals(5, vp.id());
 +        assertEquals("lop", vp.value());
 +
 +        t2 = (Tree) firstTree.get(vertexKeys.next());
 +        vp = (VertexProperty) t2.keySet().iterator().next();
 +        assertEquals(7, vp.id());
 +        assertEquals("josh", vp.value());
 +    }
 +
 +    @Test
 +    public void shouldSerializeFullResponseMessage() throws Exception {
 +        final UUID id = UUID.randomUUID();
 +
 +        final Map<String, Object> metaData = new HashMap<>();
 +        metaData.put("test", "this");
 +        metaData.put("one", 1);
 +
 +        final Map<String, Object> attributes = new HashMap<>();
 +        attributes.put("test", "that");
 +        attributes.put("two", 2);
 +
 +        final ResponseMessage response = ResponseMessage.build(id)
 +                .responseMetaData(metaData)
 +                .code(ResponseStatusCode.SUCCESS)
 +                .result("some-result")
 +                .statusAttributes(attributes)
 +                .statusMessage("worked")
 +                .create();
 +
 +        final ByteBuf bb = serializer.serializeResponseAsBinary(response, allocator);
 +        final ResponseMessage deserialized = serializer.deserializeResponse(bb);
 +
 +        assertEquals(id, deserialized.getRequestId());
 +        assertEquals("this", deserialized.getResult().getMeta().get("test"));
 +        assertEquals(1, deserialized.getResult().getMeta().get("one"));
 +        assertEquals("some-result", deserialized.getResult().getData());
 +        assertEquals("that", deserialized.getStatus().getAttributes().get("test"));
 +        assertEquals(2, deserialized.getStatus().getAttributes().get("two"));
 +        assertEquals(ResponseStatusCode.SUCCESS.getValue(), deserialized.getStatus().getCode().getValue());
 +        assertEquals("worked", deserialized.getStatus().getMessage());
 +    }
++
++    @Test
++    public void shouldDeserializeNotPredicate() throws Exception {
++        final String requestMessageWithP = "{\"requestId\":{\"@type\":\"g:UUID\",\"@value\":\"0397b9c0-ffab-470e-a6a8-644fc80c01d6\"},\"op\":\"bytecode\",\"processor\":\"traversal\",\"args\":{\"gremlin\":{\"@type\":\"g:Bytecode\",\"@value\":{\"step\":[[\"V\"],[\"hasLabel\",\"person\"],[\"has\",\"age\",{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"not\",\"value\":{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"lte\",\"value\":{\"@type\":\"g:Int32\",\"@value\":10}}}}}]]}},\"aliases\":{\"g\":\"gmodern\"}}}";
++        final ByteBuf bb = allocator.buffer(requestMessageWithP.length());
++        bb.writeBytes(requestMessageWithP.getBytes());
++        final RequestMessage m = serializer.deserializeRequest(bb);
++        assertEquals("bytecode", m.getOp());
++        assertNotNull(m.getArgs());
++    }
 +    
 +    private void assertCommon(final ResponseMessage response) {
 +        assertEquals(requestId, response.getRequestId());
 +        assertEquals(ResponseStatusCode.SUCCESS, response.getStatus().getCode());
 +    }
 +
 +    private ResponseMessage convert(final Object toSerialize) throws SerializationException {
 +        final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
 +        return serializer.deserializeResponse(bb);
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/5ec77747/gremlin-python/src/main/jython/radish/feature_steps.py
----------------------------------------------------------------------
diff --cc gremlin-python/src/main/jython/radish/feature_steps.py
index e29607d,5cf9059..8261510
--- a/gremlin-python/src/main/jython/radish/feature_steps.py
+++ b/gremlin-python/src/main/jython/radish/feature_steps.py
@@@ -44,14 -44,7 +44,9 @@@ tail = __.tai
  
  ignores = [
      "g.V(v1Id).out().inject(v2).values(\"name\")",  # bug in attachment won't connect v2
-     # TINKERPOP-1859 - for the following...seems to be related to P.not processing
-     "g.V().hasLabel(\"person\").has(\"age\", P.not(P.lte(d10).and(P.not(P.between(d11, d20)))).and(P.lt(d29).or(P.eq(d35)))).values(\"name\")",
-     "g.V(v1Id).out().aggregate(\"x\").out().where(P.not(P.within(\"x\")))",
-     "g.V().as(\"a\").out().as(\"b\").where(__.and(__.as(\"a\").out(\"knows\").as(\"b\"), __.or(__.as(\"b\").out(\"created\").has(\"name\", \"ripple\"), __.as(\"b\").in(\"knows\").count().is(P.not(P.eq(0)))))).select(\"a\", \"b\")",
-     "g.V().as(\"a\").out(\"created\").as(\"b\").in(\"created\").as(\"c\").both(\"knows\").both(\"knows\").as(\"d\").where(\"c\", P.not(P.eq(\"a\").or(P.eq(\"d\")))).select(\"a\", \"b\", \"c\", \"d\")",
 -           ]
 +    # not sure yet
 +    "g.V(v1).hasLabel(\"person\").map(l1).order(Scope.local).by(Column.values, Order.decr).by(Column.keys, Order.incr)"
 +    ]
  
  
  @given("the {graph_name:w} graph")


[15/17] tinkerpop git commit: fixed sum() in Spark

Posted by dk...@apache.org.
fixed sum() in Spark


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

Branch: refs/heads/TINKERPOP-1777
Commit: 912139ee6b38e63138ca45009d8ef019c8b11da4
Parents: e51c8c8
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Fri Mar 2 10:40:39 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Mar 2 10:41:36 2018 -0700

----------------------------------------------------------------------
 .../optimization/interceptor/SparkStarBarrierInterceptor.java    | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/912139ee/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
----------------------------------------------------------------------
diff --git a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
index 3c89c1d..6509928 100644
--- a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
+++ b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
@@ -98,9 +98,9 @@ public final class SparkStarBarrierInterceptor implements SparkVertexProgramInte
         // USE SPARK DSL FOR THE RESPECTIVE END REDUCING BARRIER STEP OF THE TRAVERSAL
         final Object result;
         if (endStep instanceof CountGlobalStep)
-            result = nextRDD.map(Traverser::bulk).fold(0l, (a, b) -> a + b);
+            result = nextRDD.map(Traverser::bulk).fold(0L, (a, b) -> a + b);
         else if (endStep instanceof SumGlobalStep) {
-            result = nextRDD
+            result = nextRDD.isEmpty() ? null : nextRDD
                     .map(traverser -> NumberHelper.mul(traverser.bulk(), (Number) traverser.get()))
                     .fold(0, NumberHelper::add);
         } else if (endStep instanceof MeanGlobalStep) {


[17/17] tinkerpop git commit: Fixed the behavior of `min()`, `max()`, `mean()` and `sum()`. If no input is given, these steps will now throw a `FastNoElementException`.

Posted by dk...@apache.org.
Fixed the behavior of `min()`, `max()`, `mean()` and `sum()`.
If no input is given, these steps will now throw a `FastNoElementException`.


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

Branch: refs/heads/TINKERPOP-1777
Commit: 6f51fbda2e3bec1e35e79dce5df09c2e350283f7
Parents: 3858818
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Tue Feb 27 10:15:07 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Mar 2 10:41:36 2018 -0700

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  2 +
 .../traversal/step/map/ComputerResultStep.java  |  4 +-
 .../process/traversal/step/filter/AndStep.java  |  2 +-
 .../traversal/step/map/MaxGlobalStep.java       |  8 ++-
 .../traversal/step/map/MaxLocalStep.java        |  9 ++-
 .../traversal/step/map/MeanGlobalStep.java      |  6 ++
 .../traversal/step/map/MeanLocalStep.java       |  4 +-
 .../traversal/step/map/MinGlobalStep.java       |  6 ++
 .../traversal/step/map/MinLocalStep.java        |  9 ++-
 .../traversal/step/map/SumGlobalStep.java       |  8 ++-
 .../traversal/step/map/SumLocalStep.java        |  9 ++-
 .../process/traversal/step/map/MaxTest.java     | 48 +++++++++++++++-
 .../process/traversal/step/map/MeanTest.java    | 43 ++++++++++++--
 .../process/traversal/step/map/MinTest.java     | 46 +++++++++++++++
 .../process/traversal/step/map/SumTest.java     | 60 ++++++++++++++++++--
 .../SparkStarBarrierInterceptor.java            | 32 ++++++-----
 .../structure/TinkerGraphPlayTest.java          |  7 +--
 17 files changed, 251 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index a3de12f..0bad01a 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ NEED AND IMAGE
 
 This release also includes changes from <<release-3-3-2, 3.3.2>>.
 
+* Fixed a bug in `ReducingBarrierStep`, that returned the provided seed value despite no elements being available.
+
 
 == TinkerPop 3.3.0 (Gremlin Symphony #40 in G Minor)
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index b5fd8e8..95e572d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -66,7 +66,9 @@ public final class ComputerResultStep<S> extends AbstractStep<ComputerResult, S>
                 return this.currentIterator.next();
             else {
                 final ComputerResult result = this.starts.next().get();
-                this.currentIterator = attach(result.memory().<TraverserSet<S>>get(TraversalVertexProgram.HALTED_TRAVERSERS).iterator(), result.graph());
+                this.currentIterator = attach(result.memory().exists(TraversalVertexProgram.HALTED_TRAVERSERS)
+                        ? result.memory().<TraverserSet<S>>get(TraversalVertexProgram.HALTED_TRAVERSERS).iterator()
+                        : EmptyIterator.instance(), result.graph());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
index 5d9d124..5c20cd8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
@@ -39,4 +39,4 @@ public final class AndStep<S> extends ConnectiveStep<S> {
         }
         return true;
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
index 954dbfe..8cb798c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -41,7 +41,13 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
     }
 
     @Override
-    public S projectTraverser(Traverser.Admin<S> traverser) {
+    public void processAllStarts() {
+        if (this.starts.hasNext())
+            super.processAllStarts();
+    }
+
+    @Override
+    public S projectTraverser(final Traverser.Admin<S> traverser) {
         return traverser.get();
     }
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
index 2baca28..909a4c7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -40,17 +41,15 @@ public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends
 
     @Override
     protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
         final Iterator<E> iterator = traverser.get().iterator();
         if (iterator.hasNext()) {
-            result = iterator.next();
+            Number result = iterator.next();
             while (iterator.hasNext()) {
                 result = max(iterator.next(), result);
             }
-        } else {
-            result = Double.NaN;
+            return (E) result;
         }
-        return (E) result;
+        throw FastNoSuchElementException.instance();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
index 2f1c1dc..5e90336 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -49,6 +49,12 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
     }
 
     @Override
+    public void processAllStarts() {
+        if (this.starts.hasNext())
+            super.processAllStarts();
+    }
+
+    @Override
     public E projectTraverser(final Traverser.Admin<S> traverser) {
         return (E) new MeanNumber(traverser.get(), traverser.bulk());
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
index 99005c9..91447fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.util.NumberHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -48,9 +49,8 @@ public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extend
                 counter++;
             }
             return NumberHelper.div(result, counter, true);
-        } else {
-            return Double.NaN;
         }
+        throw FastNoSuchElementException.instance();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
index 7d0eb56..e476f5c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -41,6 +41,12 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
     }
 
     @Override
+    public void processAllStarts() {
+        if (this.starts.hasNext())
+            super.processAllStarts();
+    }
+
+    @Override
     public S projectTraverser(final Traverser.Admin<S> traverser) {
         return traverser.get();
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
index e7e001c..64c89e3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -40,17 +41,15 @@ public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends
 
     @Override
     protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
         final Iterator<E> iterator = traverser.get().iterator();
         if (iterator.hasNext()) {
-            result = iterator.next();
+            Number result = iterator.next();
             while (iterator.hasNext()) {
                 result = min(iterator.next(), result);
             }
-        } else {
-            result = Double.NaN;
+            return (E) result;
         }
-        return (E) result;
+        throw FastNoSuchElementException.instance();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
index 7942d9b..3711cfe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
@@ -48,6 +48,12 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S
     }
 
     @Override
+    public void processAllStarts() {
+        if (this.starts.hasNext())
+            super.processAllStarts();
+    }
+
+    @Override
     public S projectTraverser(final Traverser.Admin<S> traverser) {
         return (S) mul(traverser.get(), traverser.bulk());
     }
@@ -57,4 +63,4 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S
     public Set<TraverserRequirement> getRequirements() {
         return REQUIREMENTS;
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
index b062a7e..72e6539 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
@@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.util.NumberHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -39,17 +40,15 @@ public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends
 
     @Override
     protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
         final Iterator<E> iterator = traverser.get().iterator();
         if (iterator.hasNext()) {
-            result = iterator.next();
+            Number result = iterator.next();
             while (iterator.hasNext()) {
                 result = NumberHelper.add(result, iterator.next());
             }
-        } else {
-            result = 0;
+            return (E) result;
         }
-        return (E) result;
+        throw FastNoSuchElementException.instance();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
index fae3f92..f13cdb5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -41,6 +42,12 @@ public abstract class MaxTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Integer> get_g_V_age_max();
 
+    public abstract Traversal<Vertex, Integer> get_g_V_age_fold_maxXlocalX();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_max();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_fold_maxXlocalX();
+
     public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max();
 
     public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_maxX();
@@ -55,6 +62,30 @@ public abstract class MaxTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    public void g_V_age_fold_maxXlocalX() {
+        final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_maxXlocalX();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(35), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_max() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_max();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_fold_maxXlocalX() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_maxXlocalX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
     public void g_V_repeatXbothX_timesX5X_age_max() {
         final Traversal<Vertex, Integer> traversal = get_g_V_repeatXbothX_timesX5X_age_max();
         printTraversalForm(traversal);
@@ -82,6 +113,21 @@ public abstract class MaxTest extends AbstractGremlinProcessTest {
         }
 
         @Override
+        public Traversal<Vertex, Integer> get_g_V_age_fold_maxXlocalX() {
+            return g.V().values("age").fold().max(Scope.local);
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_max() {
+            return g.V().values("foo").max();
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_fold_maxXlocalX() {
+            return g.V().values("foo").fold().max(Scope.local);
+        }
+
+        @Override
         public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
             return g.V().repeat(both()).times(5).values("age").max();
         }
@@ -91,4 +137,4 @@ public abstract class MaxTest extends AbstractGremlinProcessTest {
             return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").max());
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
index ab47605..34bef6d 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
@@ -21,11 +21,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.Arrays;
 import java.util.Map;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
@@ -40,16 +42,32 @@ public abstract class MeanTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Double> get_g_V_age_mean();
 
+    public abstract Traversal<Vertex, Double> get_g_V_age_fold_meanXlocalX();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_mean();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_fold_meanXlocalX();
+
     public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX();
 
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_age_mean() {
-        final Traversal<Vertex, Double> traversal = get_g_V_age_mean();
-        printTraversalForm(traversal);
-        final Double mean = traversal.next();
-        assertEquals(30.75, mean, 0.05);
-        assertFalse(traversal.hasNext());
+        for (final Traversal<Vertex, Double> traversal : Arrays.asList(get_g_V_age_mean(), get_g_V_age_fold_meanXlocalX())) {
+            printTraversalForm(traversal);
+            final Double mean = traversal.next();
+            assertEquals(30.75, mean, 0.05);
+            assertFalse(traversal.hasNext());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_mean() {
+        for (final Traversal<Vertex, Number> traversal : Arrays.asList(get_g_V_foo_mean(), get_g_V_foo_fold_meanXlocalX())) {
+            printTraversalForm(traversal);
+            assertFalse(traversal.hasNext());
+        }
     }
 
     @Test
@@ -73,6 +91,21 @@ public abstract class MeanTest extends AbstractGremlinProcessTest {
         }
 
         @Override
+        public Traversal<Vertex, Double> get_g_V_age_fold_meanXlocalX() {
+            return g.V().values("age").fold().mean(Scope.local);
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_mean() {
+            return g.V().values("foo").mean();
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_fold_meanXlocalX() {
+            return g.V().values("foo").fold().mean(Scope.local);
+        }
+
+        @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_meanX() {
             return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").mean());
         }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
index 947137f..10f6bc8 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -43,6 +44,12 @@ public abstract class MinTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Integer> get_g_V_age_min();
 
+    public abstract Traversal<Vertex, Integer> get_g_V_age_fold_minXlocalX();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_min();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_fold_minXlocalX();
+
     public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min();
 
     public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_minX();
@@ -59,6 +66,30 @@ public abstract class MinTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    public void g_V_age_fold_minXlocalX() {
+        final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_minXlocalX();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(27), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_min() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_min();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_fold_minXlocalX() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_minXlocalX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
     public void g_V_repeatXbothX_timesX5X_age_min() {
         final Traversal<Vertex, Integer> traversal = get_g_V_repeatXbothX_timesX5X_age_min();
         printTraversalForm(traversal);
@@ -96,6 +127,21 @@ public abstract class MinTest extends AbstractGremlinProcessTest {
         }
 
         @Override
+        public Traversal<Vertex, Integer> get_g_V_age_fold_minXlocalX() {
+            return g.V().values("age").fold().min(Scope.local);
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_min() {
+            return g.V().values("foo").min();
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_fold_minXlocalX() {
+            return g.V().values("foo").fold().min(Scope.local);
+        }
+
+        @Override
         public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
             return g.V().repeat(both()).times(5).values("age").min();
         }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
index 1183863..e1bbd0b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -39,17 +40,49 @@ import static org.junit.Assert.*;
 @RunWith(GremlinProcessRunner.class)
 public abstract class SumTest extends AbstractGremlinProcessTest {
 
-    public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum();
+    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_sum();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_age_fold_sumXlocalX();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_sum();
+
+    public abstract Traversal<Vertex, Number> get_g_V_foo_fold_sumXlocalX();
 
     public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX();
 
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_valuesXageX_sum() {
-        final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum();
+        final Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_sum();
+        printTraversalForm(traversal);
+        final Integer sum = traversal.next();
+        assertEquals(123, sum.intValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_age_fold_sumXlocalX() {
+        final Traversal<Vertex, Integer> traversal = get_g_V_age_fold_sumXlocalX();
+        printTraversalForm(traversal);
+        final Integer sum = traversal.next();
+        assertEquals(123, sum.intValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_sum() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_sum();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_foo_fold_sumXlocalX() {
+        final Traversal<Vertex, Number> traversal = get_g_V_foo_fold_sumXlocalX();
         printTraversalForm(traversal);
-        final Number sum = traversal.next();
-        assertEquals(123L, sum);
         assertFalse(traversal.hasNext());
     }
 
@@ -69,13 +102,28 @@ public abstract class SumTest extends AbstractGremlinProcessTest {
     public static class Traversals extends SumTest {
 
         @Override
-        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_sum() {
             return g.V().values("age").sum();
         }
 
         @Override
+        public Traversal<Vertex, Integer> get_g_V_age_fold_sumXlocalX() {
+            return g.V().values("age").fold().sum(Scope.local);
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_sum() {
+            return g.V().values("foo").sum();
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_V_foo_fold_sumXlocalX() {
+            return g.V().values("foo").fold().sum(Scope.local);
+        }
+
+        @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_weight_sumX() {
             return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").sum());
         }
     }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
----------------------------------------------------------------------
diff --git a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
index 3c74e5a..3c89c1d 100644
--- a/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
+++ b/spark-gremlin/src/main/java/org/apache/tinkerpop/gremlin/spark/process/computer/traversal/strategy/optimization/interceptor/SparkStarBarrierInterceptor.java
@@ -45,6 +45,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Subgra
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.spark.process.computer.SparkMemory;
 import org.apache.tinkerpop.gremlin.spark.process.computer.traversal.strategy.SparkVertexProgramInterceptor;
@@ -52,6 +53,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.util.NumberHelper;
 import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
+import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.ArrayList;
@@ -97,24 +99,24 @@ public final class SparkStarBarrierInterceptor implements SparkVertexProgramInte
         final Object result;
         if (endStep instanceof CountGlobalStep)
             result = nextRDD.map(Traverser::bulk).fold(0l, (a, b) -> a + b);
-        else if (endStep instanceof SumGlobalStep)
+        else if (endStep instanceof SumGlobalStep) {
             result = nextRDD
                     .map(traverser -> NumberHelper.mul(traverser.bulk(), (Number) traverser.get()))
                     .fold(0, NumberHelper::add);
-        else if (endStep instanceof MeanGlobalStep)
-            result = nextRDD
+        } else if (endStep instanceof MeanGlobalStep) {
+            result = nextRDD.isEmpty() ? null : nextRDD
                     .map(traverser -> new MeanGlobalStep.MeanNumber((Number) traverser.get(), traverser.bulk()))
-                    .fold(new MeanGlobalStep.MeanNumber(), MeanGlobalStep.MeanNumber::add)
+                    .fold(MeanNumberSupplier.instance().get(), MeanGlobalStep.MeanNumber::add)
                     .getFinal();
-        else if (endStep instanceof MinGlobalStep)
-            result = nextRDD
+        } else if (endStep instanceof MinGlobalStep) {
+            result = nextRDD.isEmpty() ? null : nextRDD
                     .map(traverser -> (Number) traverser.get())
-                    .fold(Integer.MAX_VALUE, NumberHelper::min);
-        else if (endStep instanceof MaxGlobalStep)
-            result = nextRDD
+                    .fold(Double.NaN, NumberHelper::min);
+        } else if (endStep instanceof MaxGlobalStep) {
+            result = nextRDD.isEmpty() ? null : nextRDD
                     .map(traverser -> (Number) traverser.get())
-                    .fold(Integer.MIN_VALUE, NumberHelper::max);
-        else if (endStep instanceof FoldStep) {
+                    .fold(Double.NaN, NumberHelper::max);
+        } else if (endStep instanceof FoldStep) {
             final BinaryOperator biOperator = endStep.getBiOperator();
             result = nextRDD.map(traverser -> {
                 if (endStep.getSeedSupplier() instanceof ArrayListSupplier) {
@@ -148,9 +150,11 @@ public final class SparkStarBarrierInterceptor implements SparkVertexProgramInte
         ///////////////////////////////
 
         // generate the HALTED_TRAVERSERS for the memory
-        final TraverserSet<Long> haltedTraversers = new TraverserSet<>();
-        haltedTraversers.add(traversal.getTraverserGenerator().generate(result, endStep, 1l)); // all reducing barrier steps produce a result of bulk 1
-        memory.set(TraversalVertexProgram.HALTED_TRAVERSERS, haltedTraversers);
+        if (result != null) {
+            final TraverserSet<Long> haltedTraversers = new TraverserSet<>();
+            haltedTraversers.add(traversal.getTraverserGenerator().generate(result, endStep, 1l)); // all reducing barrier steps produce a result of bulk 1
+            memory.set(TraversalVertexProgram.HALTED_TRAVERSERS, haltedTraversers);
+        }
         memory.incrIteration(); // any local star graph reduction takes a single iteration
         return inputRDD;
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6f51fbda/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index a13a4ad..eacc3db 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -132,11 +132,8 @@ public class TinkerGraphPlayTest {
     public void testPlayDK() throws Exception {
 
         Graph graph = TinkerGraph.open();
-        GraphTraversalSource g = graph.traversal();
-        graph.io(GraphMLIo.build()).readGraph("/projects/apache/tinkerpop/data/grateful-dead.xml");
-        System.out.println(g.V().filter(outE("sungBy").count().is(0)).explain());
-        System.out.println(g.V().filter(outE("sungBy").count().is(lt(1))).explain());
-        System.out.println(g.V().filter(outE("sungBy").count().is(1)).explain());
+        GraphTraversalSource g = graph.traversal().withComputer();
+        g.V().values("test").max().forEachRemaining(System.out::println);
     }
 
     @Test


[05/17] tinkerpop git commit: Merge branch 'tp33'

Posted by dk...@apache.org.
Merge branch 'tp33'


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

Branch: refs/heads/TINKERPOP-1777
Commit: 4e8d63c4ab4d9d131eb86b362e2cd6df94a8991d
Parents: 5d36ec1 92e899f
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 12:52:36 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 12:52:36 2018 -0500

----------------------------------------------------------------------

----------------------------------------------------------------------



[09/17] tinkerpop git commit: Added TINKERPOP-1417 to the future dev doc CTR

Posted by dk...@apache.org.
Added TINKERPOP-1417 to the future dev doc CTR


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

Branch: refs/heads/TINKERPOP-1777
Commit: fb8facfd35adf5cb18fd761d7610e455a9bbfea3
Parents: e56823b
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 18:24:30 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 18:24:30 2018 -0500

----------------------------------------------------------------------
 docs/src/dev/future/index.asciidoc | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/fb8facfd/docs/src/dev/future/index.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/dev/future/index.asciidoc b/docs/src/dev/future/index.asciidoc
index 63900e8..5e86ecf 100644
--- a/docs/src/dev/future/index.asciidoc
+++ b/docs/src/dev/future/index.asciidoc
@@ -49,7 +49,6 @@ These items include:
 ** The role of Blueprints should be significantly reduced.
 ** The role of Gremlin should be significantly increased.
 
-
 == Hiding Blueprints
 
 Originally from the link:https://lists.apache.org/thread.html/b4d80072ad36849b4e9cd3308f87115660574e3e7a4abb7ee68e959b@%3Cdev.tinkerpop.apache.org%3E[mailing list]:
@@ -118,3 +117,29 @@ now is rooted in the Neo4j approach to transactions and is often more trouble th
 Distributed transactions are a challenge and don't apply to every provider. Transactions are further complicated by
 GLVs. The idea of local subgraphs for mutations and transaction management might be good but that goes against having
 just `ReferenceGraph`.
+
+== Gremlin Language Subset
+
+On link:https://issues.apache.org/jira/browse/TINKERPOP-1417[TINKERPOP-1417], it was suggested that we "Create a
+Gremlin language subset that is easy to implement on any VM". Implementing the Gremlin VM in another language is
+pretty straightforward. However, its a lot of code.. all these steps implementations. One thing we could do to make
+it easy for database providers not on the JVM (e.g. ArangoDB and C) is to create "Gremlito" (Gremlin--). This language
+subset wouldn't support side-effects, sacks, match, etc. Basically, just simple traversal steps and reducing barrier
+terminals.
+
+Thus:
+
+* out, in, both, values, outE, inV, id, label, etc.
+* repeat
+* select, project
+* where, has, limit, range, is, dedup
+* path, simplePath, cyclicPath
+* groupCount, sum, group, count, max, min, etc. (reducing barriers)
+
+=== Comments
+
+This has an interesting potential impact on GLVs because "Little Gremlin" could be implemented within them for
+client-side traversals over remote subgraphs, where the subgraph is like a remote transaction. All graph mutations
+essentially build a subgraph which is merged into the primary graph. That subgraph is effectively the "transaction".
+Build it locally then submit it remotely and have the server sort out the merging. It's perhaps the most natural way
+to load data. With "Gremlinito" you then get the added power of being able to traverse a local subgraph.
\ No newline at end of file


[10/17] tinkerpop git commit: Merge branch 'tp33'

Posted by dk...@apache.org.
Merge branch 'tp33'


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

Branch: refs/heads/TINKERPOP-1777
Commit: 18ba893fb04b96c256370ada38f274094d70adea
Parents: a8bfabd fb8facf
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 18:25:05 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 18:25:05 2018 -0500

----------------------------------------------------------------------
 docs/src/dev/future/index.asciidoc | 27 ++++++++++++++++++++++++++-
 1 file changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------



[11/17] tinkerpop git commit: Added a remark about the test framework for 4.x in future dev docs CTR

Posted by dk...@apache.org.
Added a remark about the test framework for 4.x in future dev docs CTR


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

Branch: refs/heads/TINKERPOP-1777
Commit: 07df6b35eb43d39fd423e7420234de1cd9f80933
Parents: fb8facf
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 18:41:25 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 18:42:03 2018 -0500

----------------------------------------------------------------------
 docs/src/dev/future/index.asciidoc | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/07df6b35/docs/src/dev/future/index.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/dev/future/index.asciidoc b/docs/src/dev/future/index.asciidoc
index 5e86ecf..4a51f57 100644
--- a/docs/src/dev/future/index.asciidoc
+++ b/docs/src/dev/future/index.asciidoc
@@ -142,4 +142,10 @@ This has an interesting potential impact on GLVs because "Little Gremlin" could
 client-side traversals over remote subgraphs, where the subgraph is like a remote transaction. All graph mutations
 essentially build a subgraph which is merged into the primary graph. That subgraph is effectively the "transaction".
 Build it locally then submit it remotely and have the server sort out the merging. It's perhaps the most natural way
-to load data. With "Gremlinito" you then get the added power of being able to traverse a local subgraph.
\ No newline at end of file
+to load data. With "Gremlinito" you then get the added power of being able to traverse a local subgraph.
+
+== Testing Framework
+
+Consider a testing framework based on the Gherkin tests from 3.x and a `gremlin-test` parent module for all the test
+framework modules that will potentially be needed. In 3.x, we found situation where having test modules beyond
+`gremlin-test` would have been helpful, so a parent module that held all those would probably be smart.
\ No newline at end of file


[06/17] tinkerpop git commit: Updated test class for loading "sink" data to spark CTR

Posted by dk...@apache.org.
Updated test class for loading "sink" data to spark CTR


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

Branch: refs/heads/TINKERPOP-1777
Commit: a61dd58eea353637d74086426e4258de5927a8d9
Parents: 2350cbe
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 13:45:22 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 13:45:22 2018 -0500

----------------------------------------------------------------------
 .../tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java     | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/a61dd58e/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java
----------------------------------------------------------------------
diff --git a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java
index 4cd8cea..72b5b9a 100644
--- a/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java
+++ b/spark-gremlin/src/test/java/org/apache/tinkerpop/gremlin/spark/structure/io/ToyGraphInputRDD.java
@@ -55,6 +55,8 @@ public final class ToyGraphInputRDD implements InputRDD {
             vertices = IteratorUtils.list(IteratorUtils.map(TinkerFactory.createClassic().vertices(), VertexWritable::new));
         else if (configuration.getString(Constants.GREMLIN_HADOOP_INPUT_LOCATION).contains("crew"))
             vertices = IteratorUtils.list(IteratorUtils.map(TinkerFactory.createTheCrew().vertices(), VertexWritable::new));
+        else if (configuration.getString(Constants.GREMLIN_HADOOP_INPUT_LOCATION).contains("sink"))
+            vertices = IteratorUtils.list(IteratorUtils.map(TinkerFactory.createKitchenSink().vertices(), VertexWritable::new));
         else if (configuration.getString(Constants.GREMLIN_HADOOP_INPUT_LOCATION).contains("grateful")) {
             try {
                 final Graph graph = TinkerGraph.open();


[04/17] tinkerpop git commit: Merge branch 'tp32' into tp33

Posted by dk...@apache.org.
Merge branch 'tp32' into tp33

Conflicts:
	gremlin-python/src/main/jython/radish/feature_steps.py


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

Branch: refs/heads/TINKERPOP-1777
Commit: 92e899f4ceb6c5aa7e614087bca633d46f2fa61d
Parents: 9eed217 2350cbe
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Mar 1 12:52:27 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Mar 1 12:52:27 2018 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                                       |  1 +
 .../gremlin/structure/io/graphson/GraphSONTokens.java    |  1 +
 .../structure/io/graphson/TraversalSerializersV2d0.java  |  2 ++
 .../structure/io/graphson/TraversalSerializersV3d0.java  |  2 ++
 .../ser/GraphSONMessageSerializerGremlinV2d0Test.java    | 11 +++++++++++
 .../driver/ser/GraphSONMessageSerializerV3d0Test.java    | 11 +++++++++++
 .../gremlin-javascript/test/cucumber/feature-steps.js    |  4 ----
 gremlin-python/src/main/jython/radish/feature_steps.py   |  5 -----
 8 files changed, 28 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/CHANGELOG.asciidoc
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTokens.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
index c629b3f,0000000..fd11f25
mode 100644,000000..100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/TraversalSerializersV3d0.java
@@@ -1,472 -1,0 +1,474 @@@
 +/*
 + *  Licensed to the Apache Software Foundation (ASF) under one
 + *  or more contributor license agreements.  See the NOTICE file
 + *  distributed with this work for additional information
 + *  regarding copyright ownership.  The ASF licenses this file
 + *  to you under the Apache License, Version 2.0 (the
 + *  "License"); you may not use this file except in compliance
 + *  with the License.  You may obtain a copy of the License at
 + *
 + *  http://www.apache.org/licenses/LICENSE-2.0
 + *
 + *  Unless required by applicable law or agreed to in writing,
 + *  software distributed under the License is distributed on an
 + *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + *  KIND, either express or implied.  See the License for the
 + *  specific language governing permissions and limitations
 + *  under the License.
 + */
 +
 +package org.apache.tinkerpop.gremlin.structure.io.graphson;
 +
 +import org.apache.commons.configuration.ConfigurationConverter;
 +import org.apache.commons.configuration.MapConfiguration;
 +import org.apache.tinkerpop.gremlin.process.remote.traversal.DefaultRemoteTraverser;
 +import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 +import org.apache.tinkerpop.gremlin.process.traversal.P;
 +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 +import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 +import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 +import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
 +import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
 +import org.apache.tinkerpop.gremlin.util.function.Lambda;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonGenerator;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonParser;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonProcessingException;
 +import org.apache.tinkerpop.shaded.jackson.core.JsonToken;
 +import org.apache.tinkerpop.shaded.jackson.databind.DeserializationContext;
 +import org.apache.tinkerpop.shaded.jackson.databind.JavaType;
 +import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider;
 +import org.apache.tinkerpop.shaded.jackson.databind.deser.std.StdDeserializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.jsontype.TypeSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdScalarSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.ser.std.StdSerializer;
 +import org.apache.tinkerpop.shaded.jackson.databind.type.TypeFactory;
 +
 +import java.io.IOException;
 +import java.util.ArrayList;
 +import java.util.Arrays;
 +import java.util.Collection;
 +import java.util.List;
 +import java.util.Map;
 +
 +/**
 + * @author Marko A. Rodriguez (http://markorodriguez.com)
 + */
 +final class TraversalSerializersV3d0 {
 +
 +    private TraversalSerializersV3d0() {
 +    }
 +
 +    /////////////////
 +    // SERIALIZERS //
 +    ////////////////
 +
 +    final static class TraversalJacksonSerializer extends StdSerializer<Traversal> {
 +
 +        public TraversalJacksonSerializer() {
 +            super(Traversal.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeObject(traversal.asAdmin().getBytecode());
 +        }
 +
 +        @Override
 +        public void serializeWithType(final Traversal traversal, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider, final TypeSerializer typeSerializer)
 +                throws IOException {
 +            serialize(traversal, jsonGenerator, serializerProvider);
 +        }
 +
 +    }
 +
 +    final static class BytecodeJacksonSerializer extends StdScalarSerializer<Bytecode> {
 +
 +        public BytecodeJacksonSerializer() {
 +            super(Bytecode.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Bytecode bytecode, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            if (bytecode.getSourceInstructions().iterator().hasNext()) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.SOURCE);
 +                for (final Bytecode.Instruction instruction : bytecode.getSourceInstructions()) {
 +                    jsonGenerator.writeStartArray();
 +                    jsonGenerator.writeString(instruction.getOperator());
 +                    for (final Object argument : instruction.getArguments()) {
 +                        jsonGenerator.writeObject(argument);
 +                    }
 +                    jsonGenerator.writeEndArray();
 +                }
 +                jsonGenerator.writeEndArray();
 +            }
 +            if (bytecode.getStepInstructions().iterator().hasNext()) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.STEP);
 +                for (final Bytecode.Instruction instruction : bytecode.getStepInstructions()) {
 +                    jsonGenerator.writeStartArray();
 +                    jsonGenerator.writeString(instruction.getOperator());
 +                    for (final Object argument : instruction.getArguments()) {
 +                        jsonGenerator.writeObject(argument);
 +                    }
 +                    jsonGenerator.writeEndArray();
 +                }
 +                jsonGenerator.writeEndArray();
 +            }
 +
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    static class EnumJacksonSerializer extends StdScalarSerializer<Enum> {
 +
 +        public EnumJacksonSerializer() {
 +            super(Enum.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Enum enumInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeString(enumInstance.name());
 +        }
 +
 +    }
 +
 +    final static class PJacksonSerializer extends StdScalarSerializer<P> {
 +
 +        public PJacksonSerializer() {
 +            super(P.class);
 +        }
 +
 +        @Override
 +        public void serialize(final P p, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.PREDICATE,
 +                    p instanceof ConnectiveP ?
 +                            p instanceof AndP ?
 +                                    GraphSONTokens.AND :
 +                                    GraphSONTokens.OR :
 +                            p.getBiPredicate().toString());
 +            if (p instanceof ConnectiveP) {
 +                jsonGenerator.writeArrayFieldStart(GraphSONTokens.VALUE);
 +                for (final P<?> predicate : ((ConnectiveP<?>) p).getPredicates()) {
 +                    jsonGenerator.writeObject(predicate);
 +                }
 +                jsonGenerator.writeEndArray();
 +            } else
 +                jsonGenerator.writeObjectField(GraphSONTokens.VALUE, p.getValue());
 +
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class LambdaJacksonSerializer extends StdScalarSerializer<Lambda> {
 +
 +        public LambdaJacksonSerializer() {
 +            super(Lambda.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Lambda lambda, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.SCRIPT, lambda.getLambdaScript());
 +            jsonGenerator.writeStringField(GraphSONTokens.LANGUAGE, lambda.getLambdaLanguage());
 +            jsonGenerator.writeNumberField(GraphSONTokens.ARGUMENTS, lambda.getLambdaArguments());
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class BindingJacksonSerializer extends StdScalarSerializer<Bytecode.Binding> {
 +
 +        public BindingJacksonSerializer() {
 +            super(Bytecode.Binding.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Bytecode.Binding binding, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeStringField(GraphSONTokens.KEY, binding.variable());
 +            jsonGenerator.writeObjectField(GraphSONTokens.VALUE, binding.value());
 +            jsonGenerator.writeEndObject();
 +        }
 +
 +    }
 +
 +    final static class TraverserJacksonSerializer extends StdScalarSerializer<Traverser> {
 +
 +        public TraverserJacksonSerializer() {
 +            super(Traverser.class);
 +        }
 +
 +        @Override
 +        public void serialize(final Traverser traverserInstance, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            jsonGenerator.writeObjectField(GraphSONTokens.BULK, traverserInstance.bulk());
 +            jsonGenerator.writeObjectField(GraphSONTokens.VALUE, traverserInstance.get());
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    final static class TraversalStrategyJacksonSerializer extends StdScalarSerializer<TraversalStrategy> {
 +
 +        public TraversalStrategyJacksonSerializer() {
 +            super(TraversalStrategy.class);
 +        }
 +
 +        @Override
 +        public void serialize(final TraversalStrategy traversalStrategy, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider)
 +                throws IOException {
 +            jsonGenerator.writeStartObject();
 +            for (final Map.Entry<Object, Object> entry : ConfigurationConverter.getMap(traversalStrategy.getConfiguration()).entrySet()) {
 +                jsonGenerator.writeObjectField((String) entry.getKey(), entry.getValue());
 +            }
 +            jsonGenerator.writeEndObject();
 +        }
 +    }
 +
 +    ///////////////////
 +    // DESERIALIZERS //
 +    //////////////////
 +
 +    final static class BytecodeJacksonDeserializer extends StdDeserializer<Bytecode> {
 +        private static final JavaType listJavaType = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, Object.class);
 +        private static final JavaType listListJavaType = TypeFactory.defaultInstance().constructCollectionType(ArrayList.class, listJavaType);
 +
 +        public BytecodeJacksonDeserializer() {
 +            super(Bytecode.class);
 +        }
 +
 +        @Override
 +        public Bytecode deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            final Bytecode bytecode = new Bytecode();
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.SOURCE)) {
 +                    jsonParser.nextToken();
 +                    final List<List<Object>> instructions = deserializationContext.readValue(jsonParser, listListJavaType);
 +                    for (final List<Object> instruction : instructions) {
 +                        bytecode.addSource((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
 +                    }
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.STEP)) {
 +                    jsonParser.nextToken();
 +                    final List<List<Object>> instructions = deserializationContext.readValue(jsonParser, listListJavaType);
 +                    for (final List<Object> instruction : instructions) {
 +                        bytecode.addStep((String) instruction.get(0), Arrays.copyOfRange(instruction.toArray(), 1, instruction.size()));
 +                    }
 +                }
 +            }
 +            return bytecode;
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class EnumJacksonDeserializer<A extends Enum> extends StdDeserializer<A> {
 +
 +        public EnumJacksonDeserializer(final Class<A> enumClass) {
 +            super(enumClass);
 +        }
 +
 +        @Override
 +        public A deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            final Class<A> enumClass = (Class<A>) this._valueClass;
 +            final String enumName = jsonParser.getText();
 +            for (final Enum a : enumClass.getEnumConstants()) {
 +                if (a.name().equals(enumName))
 +                    return (A) a;
 +            }
 +            throw new IOException("Unknown enum type: " + enumClass);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class PJacksonDeserializer extends StdDeserializer<P> {
 +
 +        public PJacksonDeserializer() {
 +            super(P.class);
 +        }
 +
 +        @Override
 +        public P deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String predicate = null;
 +            Object value = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.PREDICATE)) {
 +                    jsonParser.nextToken();
 +                    predicate = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    value = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +
 +            if (predicate.equals(GraphSONTokens.AND) || predicate.equals(GraphSONTokens.OR)) {
 +                return predicate.equals(GraphSONTokens.AND) ? new AndP((List<P>) value) : new OrP((List<P>) value);
++            } else if (predicate.equals(GraphSONTokens.NOT) && value instanceof P) {
++                return P.not((P<?>) value);
 +            } else {
 +                try {
 +                    if (value instanceof Collection) {
 +                        if (predicate.equals("between"))
 +                            return P.between(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("inside"))
 +                            return P.between(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("outside"))
 +                            return P.outside(((List) value).get(0), ((List) value).get(1));
 +                        else if (predicate.equals("within"))
 +                            return P.within((Collection) value);
 +                        else if (predicate.equals("without"))
 +                            return P.without((Collection) value);
 +                        else
 +                            return (P) P.class.getMethod(predicate, Collection.class).invoke(null, (Collection) value);
 +                    } else {
 +                        try {
 +                            return (P) P.class.getMethod(predicate, Object.class).invoke(null, value);
 +                        } catch (final NoSuchMethodException e) {
 +                            return (P) P.class.getMethod(predicate, Object[].class).invoke(null, (Object) new Object[]{value});
 +                        }
 +                    }
 +                } catch (final Exception e) {
 +                    throw new IllegalStateException(e.getMessage(), e);
 +                }
 +            }
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class LambdaJacksonDeserializer extends StdDeserializer<Lambda> {
 +
 +        public LambdaJacksonDeserializer() {
 +            super(Lambda.class);
 +        }
 +
 +        @Override
 +        public Lambda deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String script = null;
 +            String language = null;
 +            int arguments = -1;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.SCRIPT)) {
 +                    jsonParser.nextToken();
 +                    script = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.LANGUAGE)) {
 +                    jsonParser.nextToken();
 +                    language = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.ARGUMENTS)) {
 +                    jsonParser.nextToken();
 +                    arguments = jsonParser.getIntValue();
 +                }
 +            }
 +
 +            if (-1 == arguments || arguments > 2)
 +                return new Lambda.UnknownArgLambda(script, language, arguments);
 +            else if (0 == arguments)
 +                return new Lambda.ZeroArgLambda<>(script, language);
 +            else if (1 == arguments)
 +                return new Lambda.OneArgLambda<>(script, language);
 +            else
 +                return new Lambda.TwoArgLambda<>(script, language);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class BindingJacksonDeserializer extends StdDeserializer<Bytecode.Binding> {
 +
 +        public BindingJacksonDeserializer() {
 +            super(Bytecode.Binding.class);
 +        }
 +
 +        @Override
 +        public Bytecode.Binding deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            String k = null;
 +            Object v = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.KEY)) {
 +                    jsonParser.nextToken();
 +                    k = jsonParser.getText();
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    v = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +            return new Bytecode.Binding<>(k, v);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    static class TraverserJacksonDeserializer extends StdDeserializer<Traverser> {
 +
 +        public TraverserJacksonDeserializer() {
 +            super(Traverser.class);
 +        }
 +
 +        @Override
 +        public Traverser deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
 +            long bulk = 1;
 +            Object v = null;
 +
 +            while (jsonParser.nextToken() != JsonToken.END_OBJECT) {
 +                if (jsonParser.getCurrentName().equals(GraphSONTokens.BULK)) {
 +                    jsonParser.nextToken();
 +                    bulk = deserializationContext.readValue(jsonParser, Long.class);
 +                } else if (jsonParser.getCurrentName().equals(GraphSONTokens.VALUE)) {
 +                    jsonParser.nextToken();
 +                    v = deserializationContext.readValue(jsonParser, Object.class);
 +                }
 +            }
 +
 +            return new DefaultRemoteTraverser<>(v, bulk);
 +        }
 +
 +        @Override
 +        public boolean isCachable() {
 +            return true;
 +        }
 +    }
 +
 +    final static class TraversalStrategyProxyJacksonDeserializer<T extends TraversalStrategy> extends AbstractObjectDeserializer<TraversalStrategyProxy> {
 +
 +        private final Class<T> clazz;
 +
 +        public TraversalStrategyProxyJacksonDeserializer(final Class<T> clazz) {
 +            super(TraversalStrategyProxy.class);
 +            this.clazz = clazz;
 +        }
 +
 +        @Override
 +        public TraversalStrategyProxy<T> createObject(final Map<String, Object> data) {
 +            return new TraversalStrategyProxy<>(this.clazz, new MapConfiguration(data));
 +        }
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
----------------------------------------------------------------------
diff --cc gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
index 4bd3f6f,0000000..b6398f5
mode 100644,000000..100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GraphSONMessageSerializerV3d0Test.java
@@@ -1,340 -1,0 +1,351 @@@
 +/*
 + * Licensed to the Apache Software Foundation (ASF) under one
 + * or more contributor license agreements.  See the NOTICE file
 + * distributed with this work for additional information
 + * regarding copyright ownership.  The ASF licenses this file
 + * to you under the Apache License, Version 2.0 (the
 + * "License"); you may not use this file except in compliance
 + * with the License.  You may obtain a copy of the License at
 + *
 + * http://www.apache.org/licenses/LICENSE-2.0
 + *
 + * Unless required by applicable law or agreed to in writing,
 + * software distributed under the License is distributed on an
 + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 + * KIND, either express or implied.  See the License for the
 + * specific language governing permissions and limitations
 + * under the License.
 + */
 +package org.apache.tinkerpop.gremlin.driver.ser;
 +
 +import io.netty.buffer.ByteBuf;
 +import io.netty.buffer.ByteBufAllocator;
 +import io.netty.buffer.UnpooledByteBufAllocator;
 +import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
++import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 +import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 +import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 +import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 +import org.apache.tinkerpop.gremlin.structure.Edge;
 +import org.apache.tinkerpop.gremlin.structure.Graph;
 +import org.apache.tinkerpop.gremlin.structure.Property;
 +import org.apache.tinkerpop.gremlin.structure.Vertex;
 +import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 +import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 +import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 +import org.junit.Test;
 +
 +import java.util.ArrayList;
 +import java.util.Date;
 +import java.util.HashMap;
 +import java.util.Iterator;
 +import java.util.List;
 +import java.util.Map;
 +import java.util.UUID;
 +
 +import static org.junit.Assert.assertEquals;
 +import static org.junit.Assert.assertNotNull;
 +import static org.junit.Assert.assertNull;
 +import static org.junit.Assert.fail;
 +
 +/**
 + * Serializer tests that cover non-lossy serialization/deserialization methods.
 + *
 + * @author Stephen Mallette (http://stephen.genoprime.com)
 + */
 +public class GraphSONMessageSerializerV3d0Test {
 +
 +    private final UUID requestId = UUID.fromString("6457272A-4018-4538-B9AE-08DD5DDC0AA1");
 +    private final ResponseMessage.Builder responseMessageBuilder = ResponseMessage.build(requestId);
 +    private final static ByteBufAllocator allocator = UnpooledByteBufAllocator.DEFAULT;
 +
 +    public final MessageSerializer serializer = new GraphSONMessageSerializerV3d0();
 +
 +    @Test
 +    public void shouldSerializeIterable() throws Exception {
 +        final ArrayList<Integer> list = new ArrayList<>();
 +        list.add(1);
 +        list.add(100);
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
 +        assertEquals(2, deserializedFunList.size());
 +        assertEquals(new Integer(1), deserializedFunList.get(0));
 +        assertEquals(new Integer(100), deserializedFunList.get(1));
 +    }
 +
 +    @Test
 +    public void shouldSerializeIterableWithNull() throws Exception {
 +        final ArrayList<Integer> list = new ArrayList<>();
 +        list.add(1);
 +        list.add(null);
 +        list.add(100);
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Integer> deserializedFunList = (List<Integer>) response.getResult().getData();
 +        assertEquals(3, deserializedFunList.size());
 +        assertEquals(new Integer(1), deserializedFunList.get(0));
 +        assertNull(deserializedFunList.get(1));
 +        assertEquals(new Integer(100), deserializedFunList.get(2));
 +    }
 +
 +    @Test
 +    public void shouldSerializeMap() throws Exception {
 +        final Map<String, Object> map = new HashMap<>();
 +        final Map<String, String> innerMap = new HashMap<>();
 +        innerMap.put("a", "b");
 +
 +        map.put("x", 1);
 +        map.put("y", "some");
 +        map.put("z", innerMap);
 +
 +        final ResponseMessage response = convert(map);
 +        assertCommon(response);
 +
 +        final Map<String, Object> deserializedMap = (Map<String, Object>) response.getResult().getData();
 +        assertEquals(3, deserializedMap.size());
 +        assertEquals(1, deserializedMap.get("x"));
 +        assertEquals("some", deserializedMap.get("y"));
 +
 +        final Map<String, String> deserializedInnerMap = (Map<String, String>) deserializedMap.get("z");
 +        assertEquals(1, deserializedInnerMap.size());
 +        assertEquals("b", deserializedInnerMap.get("a"));
 +    }
 +
 +    @Test
 +    public void shouldSerializeMapEntries() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Date d = new Date();
 +
 +        final Map<Object, Object> map = new HashMap<>();
 +        map.put("x", 1);
 +        map.put(v1, 100);
 +        map.put(d, "test");
 +
 +        final ResponseMessage response = convert(IteratorUtils.asList(map.entrySet()));
 +        assertCommon(response);
 +
 +        final List<Map<Object, Object>> deserializedEntries = (List<Map<Object, Object>>) response.getResult().getData();
 +        assertEquals(3, deserializedEntries.size());
 +        deserializedEntries.forEach(m -> {
 +            final Map.Entry<Object,Object> e = m.entrySet().iterator().next();
 +            if (e.getKey().equals("x"))
 +                assertEquals(1, e.getValue());
 +            else if (e.getKey() instanceof Vertex && e.getKey().equals(v1))
 +                assertEquals(100, e.getValue());
 +            else if (e.getKey() instanceof Date)
 +                assertEquals("test", e.getValue());
 +            else
 +                fail("Map entries contains a key that is not part of what was serialized");
 +        });
 +    }
 +
 +    @Test
 +    public void shouldSerializeEdge() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Vertex v2 = graph.addVertex();
 +        final Edge e = v1.addEdge("test", v2);
 +        e.property("abc", 123);
 +
 +        final Iterable<Edge> iterable = IteratorUtils.list(graph.edges());
 +
 +        final ResponseMessage response = convert(iterable);
 +        assertCommon(response);
 +
 +        final List<Edge> edgeList = (List<Edge>) response.getResult().getData();
 +        assertEquals(1, edgeList.size());
 +
 +        final Edge deserializedEdge = edgeList.get(0);
 +        assertEquals(e.id(), deserializedEdge.id());
 +        assertEquals(v1.id(), deserializedEdge.outVertex().id());
 +        assertEquals(v2.id(), deserializedEdge.inVertex().id());
 +        assertEquals(v1.label(), deserializedEdge.outVertex().label());
 +        assertEquals(v2.label(), deserializedEdge.inVertex().label());
 +        assertEquals(e.label(), deserializedEdge.label());
 +
 +        final List<Property> properties = new ArrayList<>();
 +        deserializedEdge.properties().forEachRemaining(properties::add);
 +        assertEquals(1, properties.size());
 +
 +        assertNotNull(properties);
 +        assertEquals("abc", properties.get(0).key());
 +        assertEquals(123, properties.get(0).value());
 +
 +    }
 +
 +    @Test
 +    public void shouldSerializeEdgeProperty() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v1 = graph.addVertex();
 +        final Vertex v2 = graph.addVertex();
 +        final Edge e = v1.addEdge("test", v2);
 +        e.property("abc", 123);
 +
 +        final Iterable<Property<Object>> iterable = IteratorUtils.list(e.properties("abc"));
 +        final ResponseMessage response = convert(iterable);
 +        assertCommon(response);
 +
 +        final List<Property> propertyList = (List<Property>) response.getResult().getData();
 +        assertEquals(1, propertyList.size());
 +        assertEquals(123, propertyList.get(0).value());
 +    }
 +
 +    @Test
 +    public void shouldSerializeVertexWithEmbeddedMap() throws Exception {
 +        final Graph graph = TinkerGraph.open();
 +        final Vertex v = graph.addVertex();
 +        final Map<String, Object> map = new HashMap<>();
 +        map.put("x", 500);
 +        map.put("y", "some");
 +
 +        final ArrayList<Object> friends = new ArrayList<>();
 +        friends.add("x");
 +        friends.add(5);
 +        friends.add(map);
 +
 +        v.property(VertexProperty.Cardinality.single, "friends", friends);
 +
 +        final List list = IteratorUtils.list(graph.vertices());
 +
 +        final ResponseMessage response = convert(list);
 +        assertCommon(response);
 +
 +        final List<Vertex> vertexList = (List<Vertex>) response.getResult().getData();
 +        assertEquals(1, vertexList.size());
 +
 +        final Vertex deserializedVertex = vertexList.get(0);
 +        assertEquals(v.id(), deserializedVertex.id());
 +        assertEquals(Vertex.DEFAULT_LABEL, deserializedVertex.label());
 +
 +        final List<VertexProperty> properties = new ArrayList<>();
 +        deserializedVertex.properties().forEachRemaining(properties::add);
 +        assertEquals(1, properties.size());
 +
 +        final VertexProperty friendsProperty = properties.get(0);
 +        final List<Object> deserializedInnerList = (List<Object>) friendsProperty.value();
 +
 +        assertEquals(3, deserializedInnerList.size());
 +        assertEquals("x", deserializedInnerList.get(0));
 +        assertEquals(5, deserializedInnerList.get(1));
 +
 +        final Map<String, Object> deserializedInnerInnerMap = (Map<String, Object>) deserializedInnerList.get(2);
 +        assertEquals(2, deserializedInnerInnerMap.size());
 +        assertEquals(500, deserializedInnerInnerMap.get("x"));
 +        assertEquals("some", deserializedInnerInnerMap.get("y"));
 +    }
 +
 +    @Test
 +    public void shouldSerializeToJsonMapWithElementForKey() throws Exception {
 +        final TinkerGraph graph = TinkerFactory.createClassic();
 +        final GraphTraversalSource g = graph.traversal();
 +        final Map<Vertex, Integer> map = new HashMap<>();
 +        final Vertex v1 = g.V().has("name", "marko").next();
 +        map.put(v1, 1000);
 +
 +        final ResponseMessage response = convert(map);
 +        assertCommon(response);
 +
 +        final Map<Vertex, Integer> deserializedMap = (Map<Vertex, Integer>) response.getResult().getData();
 +        assertEquals(1, deserializedMap.size());
 +        assertEquals(new Integer(1000), deserializedMap.get(v1));
 +    }
 +
 +    @Test
 +    @org.junit.Ignore
 +    public void shouldSerializeToTreeJson() throws Exception {
 +        final TinkerGraph graph = TinkerFactory.createClassic();
 +        final GraphTraversalSource g = graph.traversal();
 +        final Map t = g.V(1).out().properties("name").tree().next();
 +
 +        final ResponseMessage response = convert(t);
 +        assertCommon(response);
 +
 +        final Tree deserializedTree = (Tree)response.getResult().getData();
 +
 +        //check the first object and its key's properties
 +        assertEquals(1, deserializedTree.size());
 +        final Vertex v = ((Vertex) deserializedTree.keySet().iterator().next());
 +        assertEquals(1, v.id());
 +        assertEquals("marko", v.property("name").value());
 +
 +        final Tree firstTree = (Tree)deserializedTree.get(v);
 +        assertEquals(3, firstTree.size());
 +        Iterator<Vertex> vertexKeys = firstTree.keySet().iterator();
 +
 +        Tree t2 = (Tree)firstTree.get(vertexKeys.next());
 +        VertexProperty vp = (VertexProperty)t2.keySet().iterator().next();
 +        assertEquals(3, vp.id());
 +        assertEquals("vadas", vp.value());
 +
 +        t2 = (Tree) firstTree.get(vertexKeys.next());
 +        vp = (VertexProperty) t2.keySet().iterator().next();
 +        assertEquals(5, vp.id());
 +        assertEquals("lop", vp.value());
 +
 +        t2 = (Tree) firstTree.get(vertexKeys.next());
 +        vp = (VertexProperty) t2.keySet().iterator().next();
 +        assertEquals(7, vp.id());
 +        assertEquals("josh", vp.value());
 +    }
 +
 +    @Test
 +    public void shouldSerializeFullResponseMessage() throws Exception {
 +        final UUID id = UUID.randomUUID();
 +
 +        final Map<String, Object> metaData = new HashMap<>();
 +        metaData.put("test", "this");
 +        metaData.put("one", 1);
 +
 +        final Map<String, Object> attributes = new HashMap<>();
 +        attributes.put("test", "that");
 +        attributes.put("two", 2);
 +
 +        final ResponseMessage response = ResponseMessage.build(id)
 +                .responseMetaData(metaData)
 +                .code(ResponseStatusCode.SUCCESS)
 +                .result("some-result")
 +                .statusAttributes(attributes)
 +                .statusMessage("worked")
 +                .create();
 +
 +        final ByteBuf bb = serializer.serializeResponseAsBinary(response, allocator);
 +        final ResponseMessage deserialized = serializer.deserializeResponse(bb);
 +
 +        assertEquals(id, deserialized.getRequestId());
 +        assertEquals("this", deserialized.getResult().getMeta().get("test"));
 +        assertEquals(1, deserialized.getResult().getMeta().get("one"));
 +        assertEquals("some-result", deserialized.getResult().getData());
 +        assertEquals("that", deserialized.getStatus().getAttributes().get("test"));
 +        assertEquals(2, deserialized.getStatus().getAttributes().get("two"));
 +        assertEquals(ResponseStatusCode.SUCCESS.getValue(), deserialized.getStatus().getCode().getValue());
 +        assertEquals("worked", deserialized.getStatus().getMessage());
 +    }
++
++    @Test
++    public void shouldDeserializeNotPredicate() throws Exception {
++        final String requestMessageWithP = "{\"requestId\":{\"@type\":\"g:UUID\",\"@value\":\"0397b9c0-ffab-470e-a6a8-644fc80c01d6\"},\"op\":\"bytecode\",\"processor\":\"traversal\",\"args\":{\"gremlin\":{\"@type\":\"g:Bytecode\",\"@value\":{\"step\":[[\"V\"],[\"hasLabel\",\"person\"],[\"has\",\"age\",{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"not\",\"value\":{\"@type\":\"g:P\",\"@value\":{\"predicate\":\"lte\",\"value\":{\"@type\":\"g:Int32\",\"@value\":10}}}}}]]}},\"aliases\":{\"g\":\"gmodern\"}}}";
++        final ByteBuf bb = allocator.buffer(requestMessageWithP.length());
++        bb.writeBytes(requestMessageWithP.getBytes());
++        final RequestMessage m = serializer.deserializeRequest(bb);
++        assertEquals("bytecode", m.getOp());
++        assertNotNull(m.getArgs());
++    }
 +    
 +    private void assertCommon(final ResponseMessage response) {
 +        assertEquals(requestId, response.getRequestId());
 +        assertEquals(ResponseStatusCode.SUCCESS, response.getStatus().getCode());
 +    }
 +
 +    private ResponseMessage convert(final Object toSerialize) throws SerializationException {
 +        final ByteBuf bb = serializer.serializeResponseAsBinary(responseMessageBuilder.result(toSerialize).create(), allocator);
 +        return serializer.deserializeResponse(bb);
 +    }
 +}

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/92e899f4/gremlin-python/src/main/jython/radish/feature_steps.py
----------------------------------------------------------------------
diff --cc gremlin-python/src/main/jython/radish/feature_steps.py
index e29607d,5cf9059..8261510
--- a/gremlin-python/src/main/jython/radish/feature_steps.py
+++ b/gremlin-python/src/main/jython/radish/feature_steps.py
@@@ -44,14 -44,7 +44,9 @@@ tail = __.tai
  
  ignores = [
      "g.V(v1Id).out().inject(v2).values(\"name\")",  # bug in attachment won't connect v2
-     # TINKERPOP-1859 - for the following...seems to be related to P.not processing
-     "g.V().hasLabel(\"person\").has(\"age\", P.not(P.lte(d10).and(P.not(P.between(d11, d20)))).and(P.lt(d29).or(P.eq(d35)))).values(\"name\")",
-     "g.V(v1Id).out().aggregate(\"x\").out().where(P.not(P.within(\"x\")))",
-     "g.V().as(\"a\").out().as(\"b\").where(__.and(__.as(\"a\").out(\"knows\").as(\"b\"), __.or(__.as(\"b\").out(\"created\").has(\"name\", \"ripple\"), __.as(\"b\").in(\"knows\").count().is(P.not(P.eq(0)))))).select(\"a\", \"b\")",
-     "g.V().as(\"a\").out(\"created\").as(\"b\").in(\"created\").as(\"c\").both(\"knows\").both(\"knows\").as(\"d\").where(\"c\", P.not(P.eq(\"a\").or(P.eq(\"d\")))).select(\"a\", \"b\", \"c\", \"d\")",
 -           ]
 +    # not sure yet
 +    "g.V(v1).hasLabel(\"person\").map(l1).order(Scope.local).by(Column.values, Order.decr).by(Column.keys, Order.incr)"
 +    ]
  
  
  @given("the {graph_name:w} graph")