You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2015/09/10 17:06:47 UTC

[3/4] incubator-tinkerpop git commit: Add some javadoc and tests around TraversalHelper.

Add some javadoc and tests around TraversalHelper.


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

Branch: refs/heads/master
Commit: 1f6bfcf58998cc300131dcbe310d7d1c2d311257
Parents: f3f6d8a
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Thu Sep 10 11:06:03 2015 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Thu Sep 10 11:06:03 2015 -0400

----------------------------------------------------------------------
 .../process/traversal/util/TraversalHelper.java | 122 +++++++++++++------
 .../process/util/TraversalHelperTest.java       | 119 +++++++++++++++++-
 2 files changed, 203 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1f6bfcf5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
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 e503a7f..e89eaf0 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
@@ -44,6 +44,7 @@ import java.util.stream.Collectors;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public final class TraversalHelper {
 
@@ -88,6 +89,44 @@ public final class TraversalHelper {
         return true;
     }
 
+    /**
+     * Insert a step before a specified step instance.
+     *
+     * @param insertStep the step to insert
+     * @param afterStep the step to insert the new step after
+     * @param traversal the traversal on which the action should occur
+     */
+    public static <S, E> void insertBeforeStep(final Step<S, E> insertStep, final Step<E, ?> afterStep, final Traversal.Admin<?, ?> traversal) {
+        traversal.addStep(stepIndex(afterStep, traversal), insertStep);
+    }
+
+    /**
+     * Insert a step after a specified step instance.
+     *
+     * @param insertStep the step to insert
+     * @param beforeStep the step to insert the new step after
+     * @param traversal the traversal on which the action should occur
+     */
+    public static <S, E> void insertAfterStep(final Step<S, E> insertStep, final Step<?, S> beforeStep, final Traversal.Admin<?, ?> traversal) {
+        traversal.addStep(stepIndex(beforeStep, traversal) + 1, insertStep);
+    }
+
+    /**
+     * Replace a step with a new step.
+     *
+     * @param removeStep the step to remove
+     * @param insertStep the step to insert
+     * @param traversal the traversal on which the action will occur
+     */
+    public static <S, E> void replaceStep(final Step<S, E> removeStep, final Step<S, E> insertStep, final Traversal.Admin<?, ?> traversal) {
+        traversal.addStep(stepIndex(removeStep, traversal), insertStep);
+        traversal.removeStep(removeStep);
+    }
+
+    public static <S, E> Step<?, E> insertTraversal(final Step<?, S> previousStep, final Traversal.Admin<S, E> insertTraversal, final Traversal.Admin<?, ?> traversal) {
+        return TraversalHelper.insertTraversal(stepIndex(previousStep, traversal), insertTraversal, traversal);
+    }
+
     public static <S, E> Step<?, E> insertTraversal(final int insertIndex, final Traversal.Admin<S, E> insertTraversal, final Traversal.Admin<?, ?> traversal) {
         if (0 == traversal.getSteps().size()) {
             Step currentStep = EmptyStep.instance();
@@ -106,23 +145,6 @@ public final class TraversalHelper {
         }
     }
 
-    public static <S, E> Step<?, E> insertTraversal(final Step<?, S> previousStep, final Traversal.Admin<S, E> insertTraversal, final Traversal.Admin<?, ?> traversal) {
-        return TraversalHelper.insertTraversal(stepIndex(previousStep, traversal), insertTraversal, traversal);
-    }
-
-    public static <S, E> void insertBeforeStep(final Step<S, E> insertStep, final Step<E, ?> afterStep, final Traversal.Admin<?, ?> traversal) {
-        traversal.addStep(stepIndex(afterStep, traversal), insertStep);
-    }
-
-    public static <S, E> void insertAfterStep(final Step<S, E> insertStep, final Step<?, S> beforeStep, final Traversal.Admin<?, ?> traversal) {
-        traversal.addStep(stepIndex(beforeStep, traversal) + 1, insertStep);
-    }
-
-    public static <S, E> void replaceStep(final Step<S, E> removeStep, final Step<S, E> insertStep, final Traversal.Admin<?, ?> traversal) {
-        traversal.addStep(stepIndex(removeStep, traversal), insertStep);
-        traversal.removeStep(removeStep);
-    }
-
     public static <S, E> void removeToTraversal(final Step<S, ?> startStep, final Step<?, E> endStep, final Traversal.Admin<S, E> newTraversal) {
         final Traversal.Admin<?, ?> originalTraversal = startStep.getTraversal();
         Step<?, ?> currentStep = startStep;
@@ -134,6 +156,13 @@ public final class TraversalHelper {
         }
     }
 
+    /**
+     * Gets the index of a particular step in the {@link Traversal}.
+     *
+     * @param step the step to retrieve the index for
+     * @param traversal the traversal to perform the action on
+     * @return the index of the step or -1 if the step is not present
+     */
     public static <S, E> int stepIndex(final Step<S, E> step, final Traversal.Admin<?, ?> traversal) {
         int i = 0;
         for (final Step s : traversal.getSteps()) {
@@ -171,6 +200,13 @@ public final class TraversalHelper {
         return list;
     }
 
+    /**
+     * Determine if the traversal has a step of a particular class.
+     *
+     * @param stepClass the step class to look for
+     * @param traversal the traversal to perform the action on
+     * @return {@code true} if the class is found and {@code false} otherwise
+     */
     public static boolean hasStepOfClass(final Class stepClass, final Traversal.Admin<?, ?> traversal) {
         for (final Step<?, ?> step : traversal.getSteps()) {
             if (step.getClass().equals(stepClass)) {
@@ -180,6 +216,13 @@ public final class TraversalHelper {
         return false;
     }
 
+    /**
+     * Determine if the traversal has a step of an assignable class.
+     *
+     * @param superClass the step super class to look for
+     * @param traversal the traversal to perform the action on
+     * @return {@code true} if the class is found and {@code false} otherwise
+     */
     public static boolean hasStepOfAssignableClass(final Class superClass, final Traversal.Admin<?, ?> traversal) {
         for (final Step<?, ?> step : traversal.getSteps()) {
             if (superClass.isAssignableFrom(step.getClass())) {
@@ -190,6 +233,9 @@ public final class TraversalHelper {
     }
 
     /**
+     * Determine if the traversal has a step of an assignable class in the current {@link Traversal} and its
+     * child traversals.
+     *
      * @param stepClass the step class to look for
      * @param traversal the traversal in which to look for the given step class
      * @return <code>true</code> if any step in the given traversal (and its child traversals) is an instance of the
@@ -202,25 +248,32 @@ public final class TraversalHelper {
             }
             if (step instanceof TraversalParent) {
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    if (hasStepOfAssignableClassRecursively(stepClass, globalChild)) {
-                        return true;
-                    }
+                    if (hasStepOfAssignableClassRecursively(stepClass, globalChild)) return true;
                 }
             }
         }
         return false;
     }
 
-    public static boolean anyStepRecursively(final Predicate<Step> predicate, final Traversal.Admin<?, ?> traversal) {
+    /**
+     * Determine if the traversal has any of the supplied steps of an assignable class in the current {@link Traversal}
+     * and its child traversals.
+     *
+     * @param stepClasses the step classes to look for
+     * @param traversal   the traversal in which to look for the given step classes
+     * @return <code>true</code> if any step in the given traversal (and its child traversals) is an instance of a class
+     * provided in <code>stepClasses</code>, otherwise <code>false</code>.
+     */
+    public static boolean hasStepOfAssignableClassRecursively(final Collection<Class> stepClasses, final Traversal.Admin<?, ?> traversal) {
+        if (stepClasses.size() == 1)
+            return hasStepOfAssignableClassRecursively(stepClasses.iterator().next(), traversal);
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if (predicate.test(step)) {
+            if (IteratorUtils.anyMatch(stepClasses.iterator(), stepClass -> stepClass.isAssignableFrom(step.getClass()))) {
                 return true;
             }
             if (step instanceof TraversalParent) {
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    if (anyStepRecursively(predicate, globalChild)) {
-                        return true;
-                    }
+                    if (hasStepOfAssignableClassRecursively(stepClasses, globalChild)) return true;
                 }
             }
         }
@@ -228,23 +281,20 @@ public final class TraversalHelper {
     }
 
     /**
-     * @param stepClasses the step classes to look for
-     * @param traversal   the traversal in which to look for the given step classes
-     * @return <code>true</code> if any step in the given traversal (and its child traversals) is an instance of a class
-     * provided in <code>stepClasses</code>, otherwise <code>false</code>.
+     * Determine if any step in {@link Traversal} or its children match the step given the provided {@link Predicate}.
+     *
+     * @param predicate the match function
+     * @param traversal th traversal to perform the action on
+     * @return {@code true} if there is a match and {@code false} otherwise
      */
-    public static boolean hasStepOfAssignableClassRecursively(final Collection<Class> stepClasses, final Traversal.Admin<?, ?> traversal) {
-        if (stepClasses.size() == 1)
-            return hasStepOfAssignableClassRecursively(stepClasses.iterator().next(), traversal);
+    public static boolean anyStepRecursively(final Predicate<Step> predicate, final Traversal.Admin<?, ?> traversal) {
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if (IteratorUtils.anyMatch(stepClasses.iterator(), stepClass -> stepClass.isAssignableFrom(step.getClass()))) {
+            if (predicate.test(step)) {
                 return true;
             }
             if (step instanceof TraversalParent) {
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    if (hasStepOfAssignableClassRecursively(stepClasses, globalChild)) {
-                        return true;
-                    }
+                    if (anyStepRecursively(predicate, globalChild))  return true;
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1f6bfcf5/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
----------------------------------------------------------------------
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 31c3c54..f0fc45a 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
@@ -20,8 +20,14 @@ package org.apache.tinkerpop.gremlin.process.util;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
@@ -32,16 +38,125 @@ import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.*;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class TraversalHelperTest {
 
     @Test
+    public void shouldNotFindStepOfClassInTraversal() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertThat(TraversalHelper.hasStepOfClass(FilterStep.class, traversal), is(false));
+    }
+
+    @Test
+    public void shouldFindStepOfClassInTraversal() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new IdentityStep<>(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertThat(TraversalHelper.hasStepOfClass(IdentityStep.class, traversal), is(true));
+    }
+
+    @Test
+    public void shouldNotFindStepOfAssignableClassInTraversal() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertThat(TraversalHelper.hasStepOfAssignableClass(IdentityStep.class, traversal), is(false));
+    }
+
+    @Test
+    public void shouldFindStepOfAssignableClassInTraversal() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertThat(TraversalHelper.hasStepOfAssignableClass(FilterStep.class, traversal), is(true));
+    }
+
+    @Test
+    public void shouldGetTheStepIndex() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final HasStep hasStep = new HasStep(traversal);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, hasStep);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertEquals(1, TraversalHelper.stepIndex(hasStep, traversal));
+    }
+
+    @Test
+    public void shouldNotFindTheStepIndex() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final IdentityStep identityStep = new IdentityStep(traversal);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        assertEquals(-1, TraversalHelper.stepIndex(identityStep, traversal));
+    }
+
+    @Test
+    public void shouldInsertBeforeStep() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final HasStep hasStep = new HasStep(traversal);
+        final IdentityStep identityStep = new IdentityStep(traversal);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, hasStep);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        TraversalHelper.insertBeforeStep(identityStep, hasStep, traversal);
+
+        assertEquals(traversal.asAdmin().getSteps().get(1), identityStep);
+        assertEquals(4, traversal.asAdmin().getSteps().size());
+    }
+
+    @Test
+    public void shouldInsertAfterStep() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final HasStep hasStep = new HasStep(traversal);
+        final IdentityStep identityStep = new IdentityStep(traversal);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, hasStep);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        TraversalHelper.insertAfterStep(identityStep, hasStep, traversal);
+
+        assertEquals(traversal.asAdmin().getSteps().get(2), identityStep);
+        assertEquals(4, traversal.asAdmin().getSteps().size());
+    }
+
+    @Test
+    public void shouldReplaceStep() {
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final HasStep hasStep = new HasStep(traversal);
+        final IdentityStep identityStep = new IdentityStep(traversal);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+        traversal.asAdmin().addStep(0, hasStep);
+        traversal.asAdmin().addStep(0, new HasStep(traversal));
+
+        TraversalHelper.replaceStep(hasStep, identityStep, traversal);
+
+        assertEquals(traversal.asAdmin().getSteps().get(1), identityStep);
+        assertEquals(3, traversal.asAdmin().getSteps().size());
+    }
+
+    @Test
     public void shouldChainTogetherStepsWithNextPreviousInALinkedListStructure() {
-        Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(new IdentityStep(traversal));
         traversal.asAdmin().addStep(new HasStep(traversal));
         traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));
@@ -65,7 +180,7 @@ public class TraversalHelperTest {
 
     @Test
     public void shouldRemoveStepsCorrectly() {
-        Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
+        final Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(new IdentityStep(traversal));
         traversal.asAdmin().addStep(new HasStep(traversal));
         traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));