You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/08/26 23:01:46 UTC

incubator-tinkerpop git commit: TINKERPOP3-802 #close --- Operator.assign now exists to allow for hard sets of sack.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master d848ab70d -> b7000b22f


TINKERPOP3-802 #close --- Operator.assign now exists to allow for hard sets of sack.


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

Branch: refs/heads/master
Commit: b7000b22f5320b2114e939dbfb07d7b819d22c2e
Parents: d848ab7
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Aug 26 15:01:34 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Aug 26 15:01:34 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  2 +
 .../gremlin/process/traversal/Operator.java     | 79 +++++++++++---------
 .../step/sideEffect/GroovySackTest.groovy       |  5 ++
 .../traversal/step/sideEffect/SackTest.java     | 25 ++++++-
 4 files changed, 71 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b7000b22/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 51d2740..4c4944d 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,8 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
 TinkerPop 3.1.0 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Added `Operator.assign` to allow setting a direct value.
+* `Operator` is now a `BinaryOperator<Object>` with appropriate typecasting for respective number operators.
 * Simplified `SackValueStep` so it now supports both `sack(function)` and sack(function).by()`. Deprecated `sack(function,string)`.
 * Added `Parameters` object to allow for the parameters of a step to be retrieved at runtime via a traversal.
 * Redesigned (though backwards compatible) `AddEdgeStep`, `AddVertexStep`, and `AddPropertyStep` (and respective `GraphTraversal` API).

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b7000b22/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Operator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Operator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Operator.java
index 93ebb36..56a6bd0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Operator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Operator.java
@@ -23,103 +23,108 @@ import java.util.function.BinaryOperator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public enum Operator implements BinaryOperator<Number> {
+public enum Operator implements BinaryOperator<Object> {
 
 
     sum {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return a.intValue() + b.intValue();
+                return ((Number)a).intValue() + ((Number)b).intValue();
             } else if (numberClass.equals(Long.class)) {
-                return a.longValue() + b.longValue();
+                return ((Number)a).longValue() + ((Number)b).longValue();
             } else if (numberClass.equals(Float.class)) {
-                return a.floatValue() + b.floatValue();
+                return ((Number)a).floatValue() + ((Number)b).floatValue();
             } else if (numberClass.equals(Double.class)) {
-                return a.doubleValue() + b.doubleValue();
+                return ((Number)a).doubleValue() + ((Number)b).doubleValue();
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
     },
     minus {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, final Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return a.intValue() - b.intValue();
+                return ((Number)a).intValue() - ((Number)b).intValue();
             } else if (numberClass.equals(Long.class)) {
-                return a.longValue() - b.longValue();
+                return ((Number)a).longValue() - ((Number)b).longValue();
             } else if (numberClass.equals(Float.class)) {
-                return a.floatValue() - b.floatValue();
+                return ((Number)a).floatValue() - ((Number)b).floatValue();
             } else if (numberClass.equals(Double.class)) {
-                return a.doubleValue() - b.doubleValue();
+                return ((Number)a).doubleValue() - ((Number)b).doubleValue();
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
     },
     mult {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, final Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return a.intValue() * b.intValue();
+                return ((Number)a).intValue() * ((Number)b).intValue();
             } else if (numberClass.equals(Long.class)) {
-                return a.longValue() * b.longValue();
+                return ((Number)a).longValue() * ((Number)b).longValue();
             } else if (numberClass.equals(Float.class)) {
-                return a.floatValue() * b.floatValue();
+                return ((Number)a).floatValue() * ((Number)b).floatValue();
             } else if (numberClass.equals(Double.class)) {
-                return a.doubleValue() * b.doubleValue();
+                return ((Number)a).doubleValue() * ((Number)b).doubleValue();
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
     },
     div {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, final Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return a.intValue() / b.intValue();
+                return ((Number)a).intValue() / ((Number)b).intValue();
             } else if (numberClass.equals(Long.class)) {
-                return a.longValue() / b.longValue();
+                return ((Number)a).longValue() / ((Number)b).longValue();
             } else if (numberClass.equals(Float.class)) {
-                return a.floatValue() / b.floatValue();
+                return ((Number)a).floatValue() / ((Number)b).floatValue();
             } else if (numberClass.equals(Double.class)) {
-                return a.doubleValue() / b.doubleValue();
+                return ((Number)a).doubleValue() / ((Number)b).doubleValue();
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
     },
     min {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, final Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return Math.min(a.intValue(), b.intValue());
+                return Math.min(((Number)a).intValue(), ((Number)b).intValue());
             } else if (numberClass.equals(Long.class)) {
-                return Math.min(a.longValue(), b.longValue());
+                return Math.min(((Number)a).longValue(), ((Number)b).longValue());
             } else if (numberClass.equals(Float.class)) {
-                return Math.min(a.floatValue(), b.floatValue());
+                return Math.min(((Number)a).floatValue(), ((Number)b).floatValue());
             } else if (numberClass.equals(Double.class)) {
-                return Math.min(a.doubleValue(), b.doubleValue());
+                return Math.min(((Number)a).doubleValue(), ((Number)b).doubleValue());
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
     },
     max {
-        public Number apply(final Number a, final Number b) {
-            final Class<? extends Number> numberClass = a.getClass();
+        public Object apply(final Object a, final Object b) {
+            final Class numberClass = a.getClass();
             if (numberClass.equals(Integer.class)) {
-                return Math.max(a.intValue(), b.intValue());
+                return Math.max(((Number)a).intValue(), ((Number)b).intValue());
             } else if (numberClass.equals(Long.class)) {
-                return Math.max(a.longValue(), b.longValue());
+                return Math.max(((Number)a).longValue(), ((Number)b).longValue());
             } else if (numberClass.equals(Float.class)) {
-                return Math.max(a.floatValue(), b.floatValue());
+                return Math.max(((Number)a).floatValue(), ((Number)b).floatValue());
             } else if (numberClass.equals(Double.class)) {
-                return Math.max(a.doubleValue(), b.doubleValue());
+                return Math.max(((Number)a).doubleValue(), ((Number)b).doubleValue());
             } else {
                 throw new IllegalArgumentException("This operator only supports int, long, float, or double: " + numberClass);
             }
         }
+    },
+    assign {
+        public Object apply(final Object a, final Object b) {
+            return b;
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b7000b22/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
index 70aaeec..5739513 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
@@ -30,6 +30,11 @@ public abstract class GroovySackTest {
     public static class Traversals extends SackTest {
 
         @Override
+        public Traversal<Vertex, String> get_g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack() {
+            TraversalScriptHelper.compute("g.withSack('hello').V.outE.sack(assign).by(label).inV.sack", g)
+        }
+
+        @Override
         public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() {
             TraversalScriptHelper.compute("g.withSack(0.0f).V.outE.sack(sum).by('weight').inV.sack.sum()", g)
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b7000b22/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
index 96bd5ea..0db1b35 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -41,6 +42,8 @@ import static org.junit.Assert.*;
 @RunWith(GremlinProcessRunner.class)
 public abstract class SackTest extends AbstractGremlinProcessTest {
 
+    public abstract Traversal<Vertex, String> get_g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack();
+
     public abstract Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum();
 
     public abstract Traversal<Vertex, Float> get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack();
@@ -56,9 +59,17 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+        final Traversal<Vertex, String> traversal = get_g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack();
+        checkResults(Arrays.asList("knows", "knows", "created", "created", "created", "created"), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() {
         Arrays.asList(
                 get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum(),
                 get_g_withSackX0X_V_outE_sackXsum_weightX_inV_sack_sum()).forEach(traversal -> {
+            printTraversalForm(traversal);
             assertEquals(3.5d, traversal.next(), 0.00001d);
             assertFalse(traversal.hasNext());
         });
@@ -67,18 +78,20 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+    public void g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack() {
         Arrays.asList(
                 get_g_withSackX0X_V_repeatXoutE_sackXsumX_byXweightX_inVX_timesX2X_sack(),
                 get_g_withSackX0X_V_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack()).forEach(traversal -> {
+            printTraversalForm(traversal);
             checkResults(Arrays.asList(2.0f, 1.4f), traversal);
         });
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+    public void g_withSackXmap__map_cloneX_V_out_out_sackXmap_a_nameX_sack() {
         final Traversal<Vertex, Map> traversal = get_g_withSackXmap__map_cloneX_V_out_out_sackXmap_a_nameX_sack();
+        printTraversalForm(traversal);
         int counter = 0;
         while (traversal.hasNext()) {
             final Map map = traversal.next();
@@ -91,6 +104,12 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
     }
 
     public static class Traversals extends SackTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_withSackXhellowX_V_outE_sackXassignX_byXlabelX_inV_sack() {
+            return g.withSack("hello").V().outE().sack(Operator.assign).by(T.label).inV().sack();
+        }
+
         @Override
         public Traversal<Vertex, Double> get_g_withSackX0X_V_outE_sackXsumX_byXweightX_inV_sack_sum() {
             return g.withSack(0.0f).V().outE().sack(Operator.sum).by("weight").inV().sack().sum();
@@ -113,7 +132,7 @@ public abstract class SackTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map> get_g_withSackXmap__map_cloneX_V_out_out_sackXmap_a_nameX_sack() {
-            return g.<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).V().out().out().<Map,Vertex>sack((map, vertex) -> {
+            return g.<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).V().out().out().<Map, Vertex>sack((map, vertex) -> {
                 map.put("a", vertex.value("name"));
                 return map;
             }).sack();