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();