From 8bc4b36f52d12e37b7d8f37f7d2240caa233106f Mon Sep 17 00:00:00 2001 From: pieter Date: Wed, 22 Nov 2017 10:56:43 +0200 Subject: [PATCH] TINKERPOP-1832 - Fix bug where TraversalHelper.replaceStep sets the steps' previousStep incorrectly. It needs to remove the replaced step before inserting the new step. --- .../traversal/util/TraversalHelper.java | 5 +++-- .../process/util/TraversalHelperTest.java | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java index fd803e4ae6b..eda836a562e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java @@ -173,8 +173,9 @@ public static void insertAfterStep(final Step insertStep, final Ste * @param traversal the traversal on which the action will occur */ public static void replaceStep(final Step removeStep, final Step insertStep, final Traversal.Admin traversal) { - traversal.addStep(stepIndex(removeStep, traversal), insertStep); - traversal.removeStep(removeStep); + final int i; + traversal.removeStep(i = stepIndex(removeStep, traversal)); + traversal.addStep(i, insertStep); } public static Step insertTraversal(final Step previousStep, final Traversal.Admin insertTraversal, final Traversal.Admin traversal) { diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java index 23eaa39eeb6..df22cd2f51f 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java @@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalFlatMapStep; @@ -47,6 +48,8 @@ import org.junit.Test; import org.mockito.Mockito; +import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -65,6 +68,22 @@ */ public class TraversalHelperTest { + @Test + public void shouldSetPreviousStepToEmptyStep() { + final Traversal.Admin traversal = __.V().out().asAdmin(); + //transform the traversal to __.V().not(out()) + //the VertexStep's previousStep should be the EmptyStep + Optional vertexStepOpt = TraversalHelper.getFirstStepOfAssignableClass(VertexStep.class, traversal); + assertTrue(vertexStepOpt.isPresent()); + Traversal.Admin inner = __.start().asAdmin(); + inner.addStep(0, vertexStepOpt.get()); + TraversalHelper.replaceStep(vertexStepOpt.get(), new NotStep<>(__.identity().asAdmin(), inner), traversal); + List vertexSteps = TraversalHelper.getStepsOfAssignableClassRecursively(VertexStep.class, traversal); + assertEquals(1, vertexSteps.size()); + VertexStep vertexStep = vertexSteps.get(0); + assertTrue("Expected the previousStep to be an EmptyStep, found instead " + vertexStep.getPreviousStep().toString(),vertexStep.getPreviousStep() == EmptyStep.instance()); + } + @Test public void shouldIdentifyLocalChildren() { final Traversal.Admin localChild = __.as("x").select("a", "b").by("name").asAdmin();