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