Reusing the Expression on each map() as recommended by @twilmes. Also, added a new test project()-based test case that demonstrates that math() works for map key scopes.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/73b712d2 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/73b712d2 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/73b712d2 Branch: refs/heads/TINKERPOP-1799 Commit: 73b712d20b9cd63dd46245a42d88e0e120ed790c Parents: e966422 Author: Marko A. Rodriguez <[email protected]> Authored: Thu Oct 5 13:06:03 2017 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Thu Oct 5 13:06:03 2017 -0600 ---------------------------------------------------------------------- .../process/traversal/step/map/MathStep.java | 15 ++++++++------- .../process/traversal/step/map/MathTest.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/73b712d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java index a10ec5e..b34c3ca 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java @@ -48,6 +48,7 @@ public final class MathStep<S> extends MapStep<S, Double> implements ByModulatin private static final String CURRENT = "_"; private final String equation; private final Set<String> variables; + private final Expression expression; private TraversalRing<S, Number> traversalRing = new TraversalRing<>(); private Set<String> keepLabels; @@ -55,7 +56,10 @@ public final class MathStep<S> extends MapStep<S, Double> implements ByModulatin super(traversal); this.equation = equation; this.variables = MathStep.getVariables(this.equation); - + this.expression = new ExpressionBuilder(this.equation) + .variables(this.variables) + .implicitMultiplication(false) + .build(); } @Override @@ -65,18 +69,15 @@ public final class MathStep<S> extends MapStep<S, Double> implements ByModulatin @Override protected Double map(final Traverser.Admin<S> traverser) { - final Expression expression = new ExpressionBuilder(this.equation) - .variables(this.variables) - .implicitMultiplication(false) - .build(); + final Expression localExpression = new Expression(this.expression); for (final String var : this.variables) { - expression.setVariable(var, + localExpression.setVariable(var, var.equals(CURRENT) ? TraversalUtil.applyNullable(traverser, this.traversalRing.next()).doubleValue() : TraversalUtil.applyNullable((S) this.getNullableScopeValue(Pop.last, var, traverser), this.traversalRing.next()).doubleValue()); } this.traversalRing.reset(); - return expression.evaluate(); + return localExpression.evaluate(); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/73b712d2/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathTest.java index 9858d28..20d8392 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathTest.java @@ -33,7 +33,10 @@ import java.util.function.BiFunction; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; import static org.apache.tinkerpop.gremlin.process.traversal.Operator.sum; +import static org.apache.tinkerpop.gremlin.process.traversal.Order.decr; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.math; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sack; import static org.junit.Assert.assertEquals; @@ -51,6 +54,8 @@ public abstract class MathTest extends AbstractGremlinProcessTest { public abstract Traversal<Integer, Double> get_g_withSackX1X_injectX1X_repeatXsackXsumX_byXconstantX1XXX_timesX5X_emit_mathXsin__X_byXsackX(); + public abstract Traversal<Vertex, String> get_g_V_projectXa_b_cX_byXbothE_weight_sumX_byXbothE_countX_byXnameX_order_byXmathXa_div_bX_decrX_selectXcX(); + @Test @LoadGraphWith(MODERN) public void g_V_asXaX_outXknowsX_asXbX_mathXa_plus_bX_byXageX() { @@ -87,6 +92,14 @@ public abstract class MathTest extends AbstractGremlinProcessTest { assertEquals(-0.27941549819892586d, traversal.next(), 0.01d); } + @Test + @LoadGraphWith(MODERN) + public void g_V_projectXa_b_cX_byXbothE_weight_sumX_byXbothE_countX_byXnameX_order_byXmathXa_div_bX_decrX_selectXcX() { + final Traversal<Vertex, String> traversal = get_g_V_projectXa_b_cX_byXbothE_weight_sumX_byXbothE_countX_byXnameX_order_byXmathXa_div_bX_decrX_selectXcX(); + printTraversalForm(traversal); + checkResults(Arrays.asList("ripple", "josh", "marko", "vadas", "lop", "peter"), traversal); + } + public static class Traversals extends MathTest { @Override @@ -108,5 +121,10 @@ public abstract class MathTest extends AbstractGremlinProcessTest { public Traversal<Integer, Double> get_g_withSackX1X_injectX1X_repeatXsackXsumX_byXconstantX1XXX_timesX5X_emit_mathXsin__X_byXsackX() { return g.withSack(1).inject(1).repeat(__.sack((BiFunction) sum).by(__.constant(1))).times(10).emit().math("sin _").by(sack()); } + + @Override + public Traversal<Vertex, String> get_g_V_projectXa_b_cX_byXbothE_weight_sumX_byXbothE_countX_byXnameX_order_byXmathXa_div_bX_decrX_selectXcX() { + return g.V().project("a", "b", "c").by(bothE().values("weight").sum()).by(bothE().count()).by("name").order().by(math("a / b"), decr).select("c"); + } } } \ No newline at end of file
