You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/10/11 12:36:43 UTC

tinkerpop git commit: removed stream()-usage and unneeded method recurssions in TraversalHelper.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1469 [created] 9ce3fe869


removed stream()-usage and unneeded method recurssions in TraversalHelper.


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

Branch: refs/heads/TINKERPOP-1469
Commit: 9ce3fe86979a5f3452bfcb82ed8642fa1ea291c6
Parents: 193db1c
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Oct 11 06:36:39 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Oct 11 06:36:39 2016 -0600

----------------------------------------------------------------------
 .../process/traversal/util/TraversalHelper.java | 104 ++++++++++++-------
 .../process/util/TraversalHelperTest.java       |  49 +++++++++
 2 files changed, 113 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9ce3fe86/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 87d3479..f4dd829 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
@@ -43,6 +43,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
@@ -55,7 +56,6 @@ import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -68,21 +68,20 @@ public final class TraversalHelper {
 
     public static boolean isLocalProperties(final Traversal.Admin<?, ?> traversal) {
         for (final Step step : traversal.getSteps()) {
-            if (step instanceof RepeatStep &&
-                    ((RepeatStep<?>) step).getGlobalChildren().stream()
-                            .flatMap(t -> t.getSteps().stream())
-                            .filter(s -> s instanceof VertexStep)
-                            .findAny()
-                            .isPresent())  // TODO: is this sufficient?
-                return false;
-            else if (step instanceof VertexStep) {
+            if (step instanceof RepeatStep) {
+                for (final Traversal.Admin<?, ?> global : ((RepeatStep<?>) step).getGlobalChildren()) {
+                    if (TraversalHelper.hasStepOfAssignableClass(VertexStep.class, global))
+                        return false;
+                }
+            } else if (step instanceof VertexStep) {
                 return false;
             } else if (step instanceof EdgeVertexStep) {
                 return false;
             } else if (step instanceof TraversalParent) {
-                if (((TraversalParent) step).getLocalChildren().stream()
-                        .filter(t -> !isLocalProperties(t.asAdmin()))
-                        .findAny().isPresent()) return false;
+                for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
+                    if (!TraversalHelper.isLocalProperties(local))
+                        return false;
+                }
             }
         }
         return true;
@@ -106,28 +105,31 @@ public final class TraversalHelper {
             } else if (step instanceof EdgeVertexStep) {
                 state = 'u';
             } else if (step instanceof HasContainerHolder && state == 'u') {
-                if (((HasContainerHolder) step).getHasContainers().stream()
-                        .filter(c -> !c.getKey().equals(T.id.getAccessor()))
-                        .findAny().isPresent()) return 'x';
+                for (final HasContainer hasContainer : ((HasContainerHolder) step).getHasContainers()) {
+                    if (!hasContainer.getKey().equals(T.id.getAccessor()))
+                        return 'x';
+                }
             } else if (step instanceof TraversalParent) {
                 final char currState = state;
-                Set<Character> states = ((TraversalParent) step).getLocalChildren().stream()
-                        .map(t -> isLocalStarGraph(t.asAdmin(), currState))
-                        .collect(Collectors.toSet());
-                if (states.contains('x'))
-                    return 'x';
-                else if (!(step instanceof ByModulating)) {
+                Set<Character> states = new HashSet<>();
+                for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
+                    final char s = isLocalStarGraph(local, currState);
+                    if ('x' == s) return 'x';
+                    states.add(s);
+                }
+                if (!(step instanceof ByModulating)) {
                     if (states.contains('u'))
                         state = 'u';
                     else if (states.contains('e'))
                         state = 'e';
                 }
-                states = ((TraversalParent) step).getGlobalChildren().stream()
-                        .map(t -> isLocalStarGraph(t.asAdmin(), currState))
-                        .collect(Collectors.toSet());
-                if (states.contains('x'))
-                    return 'x';
-                else if (states.contains('u'))
+                states.clear();
+                for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getGlobalChildren()) {
+                    final char s = isLocalStarGraph(local, currState);
+                    if ('x' == s) return 'x';
+                    states.add(s);
+                }
+                if (states.contains('u'))
                     state = 'u';
                 else if (states.contains('e'))
                     state = 'e';
@@ -223,17 +225,21 @@ public final class TraversalHelper {
     }
 
     public static <S> List<S> getStepsOfClass(final Class<S> stepClass, final Traversal.Admin<?, ?> traversal) {
-        List<S> steps = new ArrayList<>();
-        for (Step step : traversal.getSteps()) {
-            if (step.getClass().equals(stepClass)) {
+        final List<S> steps = new ArrayList<>();
+        for (final Step step : traversal.getSteps()) {
+            if (step.getClass().equals(stepClass))
                 steps.add((S) step);
-            }
         }
         return steps;
     }
 
     public static <S> List<S> getStepsOfAssignableClass(final Class<S> stepClass, final Traversal.Admin<?, ?> traversal) {
-        return (List) traversal.getSteps().stream().filter(step -> stepClass.isAssignableFrom(step.getClass())).collect(Collectors.toList());
+        final List<S> steps = new ArrayList<>();
+        for (final Step step : traversal.getSteps()) {
+            if (stepClass.isAssignableFrom(step.getClass()))
+                steps.add((S) step);
+        }
+        return steps;
     }
 
     public static <S> Optional<S> getLastStepOfAssignableClass(final Class<S> stepClass, final Traversal.Admin<?, ?> traversal) {
@@ -242,7 +248,11 @@ public final class TraversalHelper {
     }
 
     public static <S> Optional<S> getFirstStepOfAssignableClass(final Class<S> stepClass, final Traversal.Admin<?, ?> traversal) {
-        return (Optional<S>) traversal.getSteps().stream().filter(step -> stepClass.isAssignableFrom(step.getClass())).findFirst();
+        for (final Step step : traversal.getSteps()) {
+            if (stepClass.isAssignableFrom(step.getClass()))
+                return Optional.of((S) step);
+        }
+        return Optional.empty();
     }
 
     public static <S> List<S> getStepsOfAssignableClassRecursively(final Class<S> stepClass, final Traversal.Admin<?, ?> traversal) {
@@ -447,6 +457,10 @@ public final class TraversalHelper {
         }
     }
 
+    /**
+     * @deprecated Since 3.2.3. Only used by {@link org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0}.
+     */
+    @Deprecated
     public static <S> void addToCollectionUnrollIterator(final Collection<S> collection, final S s, final long bulk) {
         if (s instanceof Iterator) {
             ((Iterator<S>) s).forEachRemaining(r -> addToCollection(collection, r, bulk));
@@ -521,8 +535,12 @@ public final class TraversalHelper {
         for (final Step<?, ?> step : traversal.getSteps()) {
             labels.addAll(step.getLabels());
             if (step instanceof TraversalParent) {
-                ((TraversalParent) step).getLocalChildren().forEach(child -> getLabels(labels, child));
-                ((TraversalParent) step).getGlobalChildren().forEach(child -> getLabels(labels, child));
+                for (final Traversal.Admin<?, ?> local : ((TraversalParent) step).getLocalChildren()) {
+                    TraversalHelper.getLabels(labels, local);
+                }
+                for (final Traversal.Admin<?, ?> global : ((TraversalParent) step).getGlobalChildren()) {
+                    TraversalHelper.getLabels(labels, global);
+                }
             }
         }
         return labels;
@@ -547,9 +565,14 @@ public final class TraversalHelper {
             if (((MatchStep.MatchStartStep) startStep).getSelectKey().isPresent())
                 variables.add(Scoping.Variable.START);
         } else if (startStep instanceof MatchStep) {
-            ((MatchStep<?, ?>) startStep).getGlobalChildren().forEach(child -> TraversalHelper.getVariableLocations(variables, child));
-        } else if (startStep instanceof ConnectiveStep || startStep instanceof NotStep || startStep instanceof WhereTraversalStep)
-            ((TraversalParent) startStep).getLocalChildren().forEach(child -> TraversalHelper.getVariableLocations(variables, child));
+            for (final Traversal.Admin<?, ?> global : ((MatchStep<?, ?>) startStep).getGlobalChildren()) {
+                TraversalHelper.getVariableLocations(variables, global);
+            }
+        } else if (startStep instanceof ConnectiveStep || startStep instanceof NotStep || startStep instanceof WhereTraversalStep) {
+            for (final Traversal.Admin<?, ?> local : ((TraversalParent) startStep).getLocalChildren()) {
+                TraversalHelper.getVariableLocations(variables, local);
+            }
+        }
         ///
         final Step<?, ?> endStep = traversal.getEndStep();
         if (endStep instanceof WherePredicateStep) {
@@ -569,7 +592,7 @@ public final class TraversalHelper {
 
     public static boolean onGraphComputer(Traversal.Admin<?, ?> traversal) {
         while (!(traversal.getParent() instanceof EmptyStep)) {
-            if (traversal.getParent().asStep() instanceof TraversalVertexProgramStep)
+            if (traversal.getParent() instanceof TraversalVertexProgramStep)
                 return true;
             traversal = traversal.getParent().asStep().getTraversal();
         }
@@ -577,7 +600,8 @@ public final class TraversalHelper {
     }
 
     public static void removeAllSteps(final Traversal.Admin<?, ?> traversal) {
-        while (!traversal.getSteps().isEmpty()) {
+        final int size = traversal.getSteps().size();
+        for (int i = 0; i < size; i++) {
             traversal.removeStep(0);
         }
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9ce3fe86/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 8505215..dbba314 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
@@ -31,9 +31,11 @@ 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.filter.WhereTraversalStep;
+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;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
@@ -44,6 +46,9 @@ import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.junit.Test;
 import org.mockito.Mockito;
 
+import java.util.Set;
+import java.util.stream.Collectors;
+
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
@@ -326,4 +331,48 @@ public class TraversalHelperTest {
         assertFalse(TraversalHelper.isLocalStarGraph(__.coalesce(out("likes"), out("knows"), out("created")).groupCount().by("name").asAdmin()));
         assertFalse(TraversalHelper.isLocalStarGraph(__.local(__.out()).groupCount().by("name").asAdmin()));
     }
+
+    @Test
+    public void shouldGetStepsByClass() {
+        Set<String> labels = (Set) TraversalHelper.getStepsOfClass(VertexStep.class, __.out().as("a").values("name").as("b").in().as("c").groupCount().as("d").asAdmin())
+                .stream()
+                .flatMap(s -> s.getLabels().stream())
+                .collect(Collectors.toSet());
+        assertEquals(2, labels.size());
+        assertTrue(labels.contains("a"));
+        assertTrue(labels.contains("c"));
+        //
+        labels = (Set) TraversalHelper.getStepsOfAssignableClass(VertexStep.class, __.out().as("a").values("name").as("b").in().as("c").groupCount().as("d").asAdmin())
+                .stream()
+                .flatMap(s -> s.getLabels().stream())
+                .collect(Collectors.toSet());
+        assertEquals(2, labels.size());
+        assertTrue(labels.contains("a"));
+        assertTrue(labels.contains("c"));
+        //
+        labels = (Set) TraversalHelper.getStepsOfAssignableClass(FlatMapStep.class, __.out().as("a").values("name").as("b").in().as("c").groupCount().as("d").asAdmin())
+                .stream()
+                .flatMap(s -> s.getLabels().stream())
+                .collect(Collectors.toSet());
+        assertEquals(3, labels.size());
+        assertTrue(labels.contains("a"));
+        assertTrue(labels.contains("b"));
+        assertTrue(labels.contains("c"));
+        //
+        labels = (Set) TraversalHelper.getStepsOfClass(Step.class, __.out().as("a").values("name").as("b").in().as("c").groupCount().as("d").asAdmin())
+                .stream()
+                .flatMap(s -> s.getLabels().stream())
+                .collect(Collectors.toSet());
+        assertEquals(0, labels.size());
+        //
+        labels = (Set) TraversalHelper.getStepsOfAssignableClass(Step.class, __.out().as("a").values("name").as("b").in().as("c").groupCount().as("d").asAdmin())
+                .stream()
+                .flatMap(s -> s.getLabels().stream())
+                .collect(Collectors.toSet());
+        assertEquals(4, labels.size());
+        assertTrue(labels.contains("a"));
+        assertTrue(labels.contains("b"));
+        assertTrue(labels.contains("c"));
+        assertTrue(labels.contains("d"));
+    }
 }