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 2019/10/22 18:54:27 UTC

[tinkerpop] 02/02: TINKERPOP-1568 Refactored strategy application a bit.

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch TINKERPOP-1568
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 64eb2a75ccfeb3f8596b67905f3a6153728330fe
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Oct 22 14:43:09 2019 -0400

    TINKERPOP-1568 Refactored strategy application a bit.
    
    Removed TraversalStrategies.applyStrategies() as its completely unused. Strategies get applied by way of the Traversal not independently from the TraversalStrategies. I think that's a holdover from the early days of 3.x. Provided a way to get an Iterator of strategies to avoid immutable List creation.
---
 .../gremlin/process/traversal/TraversalStrategies.java   | 16 +++++++---------
 .../gremlin/process/traversal/util/DefaultTraversal.java | 12 ++++++------
 .../traversal/util/DefaultTraversalStrategies.java       | 14 ++++++--------
 .../process/traversal/util/EmptyTraversalStrategies.java | 10 ++++------
 4 files changed, 23 insertions(+), 29 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index 6ee9cff..0689bc8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -49,6 +49,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -69,11 +70,16 @@ public interface TraversalStrategies extends Serializable, Cloneable {
     static List<Class<? extends TraversalStrategy>> STRATEGY_CATEGORIES = Collections.unmodifiableList(Arrays.asList(TraversalStrategy.DecorationStrategy.class, TraversalStrategy.OptimizationStrategy.class, TraversalStrategy.ProviderOptimizationStrategy.class, TraversalStrategy.FinalizationStrategy.class, TraversalStrategy.VerificationStrategy.class));
 
     /**
-     * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
+     * Return all the {@link TraversalStrategy} instances associated with this {@link TraversalStrategies}.
      */
     public List<TraversalStrategy<?>> toList();
 
     /**
+     * Return all the {@link TraversalStrategy} instances associated with this {@link TraversalStrategies}.
+     */
+    public Iterator<TraversalStrategy<?>> toIterator();
+
+    /**
      * Return the {@link TraversalStrategy} instance associated with the provided class.
      *
      * @param traversalStrategyClass the class of the strategy to get
@@ -85,14 +91,6 @@ public interface TraversalStrategies extends Serializable, Cloneable {
     }
 
     /**
-     * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal}. This method must ensure that the
-     * strategies are sorted prior to application.
-     *
-     * @param traversal the traversal to apply the strategies to
-     */
-    public void applyStrategies(final Traversal.Admin<?, ?> traversal);
-
-    /**
      * Add all the provided {@link TraversalStrategy} instances to the current collection.
      * When all the provided strategies have been added, the collection is resorted.
      *
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 faa80e8..0800d2c 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
@@ -125,7 +125,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     public void applyStrategies() throws IllegalStateException {
         if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
         TraversalHelper.reIdSteps(this.stepPosition, this);
-        boolean hasGraph = null != this.graph;
+        final boolean hasGraph = null != this.graph;
 
         if (this.getParent() instanceof EmptyStep || this.getParent() instanceof VertexProgramStep) {
             TraversalHelper.applyTraversalRecursively(t -> {
@@ -133,15 +133,15 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
                 t.setSideEffects(this.sideEffects);
             }, this);
 
-            for (final TraversalStrategy strategy : this.strategies.toList()) {
-                TraversalHelper.applyTraversalRecursively(t -> {
-                    if (hasGraph) t.setGraph(this.graph);
-                    strategy.apply(t);
-                }, this);
+            final Iterator<TraversalStrategy<?>> strategyIterator = this.strategies.toIterator();
+            while (strategyIterator.hasNext()) {
+                final TraversalStrategy<?> strategy = strategyIterator.next();
+                TraversalHelper.applyTraversalRecursively(strategy::apply, this);
             }
 
             // don't need to re-apply strategies to "this" - leads to endless recursion in GraphComputer.
             TraversalHelper.applyTraversalRecursively(t -> {
+                if (hasGraph) t.setGraph(this.graph);
                 if(!(t.getParent() instanceof EmptyStep) && t != this && !t.isLocked()) {
                     t.setStrategies(new DefaultTraversalStrategies());
                     t.applyStrategies();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
index 4a7d527..e41762a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Optional;
@@ -70,6 +70,11 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
+    public Iterator<TraversalStrategy<?>> toIterator() {
+        return this.traversalStrategies.iterator();
+    }
+
+    @Override
     public <T extends TraversalStrategy> Optional<T> getStrategy(final Class<T> traversalStrategyClass) {
         for (final TraversalStrategy<?> traversalStrategy : this.traversalStrategies) {
             if (traversalStrategyClass.isAssignableFrom(traversalStrategy.getClass()))
@@ -79,13 +84,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
-    public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
-        for (final TraversalStrategy<?> traversalStrategy : this.traversalStrategies) {
-            traversalStrategy.apply(traversal);
-        }
-    }
-
-    @Override
     public DefaultTraversalStrategies clone() {
         try {
             final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
index 127df4d..f9e1e62 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
@@ -18,14 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Translator;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
 
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -43,9 +40,10 @@ public final class EmptyTraversalStrategies implements TraversalStrategies {
         return Collections.emptyList();
     }
 
-    @Override
-    public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
 
+    @Override
+    public Iterator<TraversalStrategy<?>> toIterator() {
+        return toList().iterator();
     }
 
     @Override