From fa8dae8b7aed18e73f01a6b13cdf01adbcbe4461 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 9 Jan 2018 18:40:48 -0700 Subject: [PATCH 1/2] Implemented `reset()` in `ComputerAwareStep` to reset the `previousIterator` and reset the `finalStep` in `DefaultTraversal`. This fixes TINKERPOP-1867, a falsy behavior, mainly seen in reducing barrier steps. --- .../step/util/ComputerAwareStep.java | 6 +++++ .../traversal/util/DefaultTraversal.java | 1 + .../step/branch/GroovyUnionTest.groovy | 6 +++++ .../traversal/step/branch/UnionTest.java | 23 +++++++++++++------ 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java index 7fda097e478..d02565740b9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java @@ -59,6 +59,12 @@ public ComputerAwareStep clone() { return clone; } + @Override + public void reset() { + super.reset(); + this.previousIterator = EmptyIterator.instance(); + } + protected abstract Iterator> standardAlgorithm() throws NoSuchElementException; protected abstract Iterator> computerAlgorithm() throws NoSuchElementException; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java index b2c9a3521b8..585a82b9d1e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java @@ -208,6 +208,7 @@ public E next() { @Override public void reset() { this.steps.forEach(Step::reset); + this.finalEndStep.reset(); this.lastTraverser = EmptyTraverser.instance(); } diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy index 5627cdce7dc..50d590e5662 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy @@ -73,5 +73,11 @@ public abstract class GroovyUnionTest { final Object v1Id, final Object v2Id) { new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id, v2Id).local(union(outE().count, inE().count, outE().weight.sum))", "v1Id", v1Id, "v2Id", v2Id); } + + @Override + public Traversal get_g_VX1_2X_localXunionXcountXX( + final Object v1Id, final Object v2Id) { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id, v2Id).local(union(count()))", "v1Id", v1Id, "v2Id", v2Id); + } } } 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 df52f9bdb09..03abc03a5c8 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 @@ -31,13 +31,7 @@ import java.util.Map; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.label; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.repeat; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.union; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -61,6 +55,8 @@ public abstract class UnionTest extends AbstractGremlinProcessTest { public abstract Traversal get_g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX(final Object v1Id, final Object v2Id); + public abstract Traversal get_g_VX1_2X_localXunionXcountXX(final Object v1Id, final Object v2Id); + @Test @LoadGraphWith(MODERN) public void g_V_unionXout__inX_name() { @@ -142,6 +138,14 @@ public void g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX() { checkResults(Arrays.asList(0l, 0l, 0, 3l, 1l, 1.9d), traversal); } + @Test + @LoadGraphWith(MODERN) + public void g_VX1_2X_localXunionXcountXX() { + final Traversal traversal = get_g_VX1_2X_localXunionXcountXX(convertToVertexId("marko"), convertToVertexId("vadas")); + printTraversalForm(traversal); + checkResults(Arrays.asList(1L, 1L), traversal); + } + @Test @LoadGraphWith(MODERN) public void g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX() { @@ -192,5 +196,10 @@ public Traversal get_g_VX1_2X_unionXoutE_count__inE_count__outE_ public Traversal get_g_VX1_2X_localXunionXoutE_count__inE_count__outE_weight_sumXX(final Object v1Id, final Object v2Id) { return g.V(v1Id, v2Id).local(union(outE().count(), inE().count(), (Traversal) outE().values("weight").sum())); } + + @Override + public Traversal get_g_VX1_2X_localXunionXcountXX(final Object v1Id, final Object v2Id) { + return g.V(v1Id, v2Id).local(union((Traversal) count())); + } } } From dd83c7809253bc6e75affaff140bf363f481c2ed Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 16 Jan 2018 14:37:44 -0700 Subject: [PATCH 2/2] Updated CHANGELOG --- CHANGELOG.asciidoc | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index c388425fde2..42574d36037 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima * Delayed setting of the request identifier until `RequestMessage` construction by the builder. * Removed hardcoded expectation in metrics serialization test suite as different providers may have different outputs. +* Fixed a bug in `ComputerAwareStep` that didn't handle `reset()` properly and thus occasionally produced some extra traversers. [[release-3-2-7]] === TinkerPop 3.2.7 (Release Date: December 17, 2017)