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/23 13:20:30 UTC

[tinkerpop] branch TINKERPOP-1568 updated: TINKERPOP-1568 Added Traversal.isRoot()

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


The following commit(s) were added to refs/heads/TINKERPOP-1568 by this push:
     new 81e8d1b  TINKERPOP-1568 Added Traversal.isRoot()
81e8d1b is described below

commit 81e8d1b6d767004e80031fa0d9f4830fa79d98b9
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Wed Oct 23 09:11:57 2019 -0400

    TINKERPOP-1568 Added Traversal.isRoot()
    
    Added isRoot() to get rid of all the checks for EmptyStep on the Traversal.getParent(). Just seemed like an obvious refactoring option to more centralize that simple check.
---
 .../strategy/decoration/VertexProgramStrategy.java |  2 +-
 .../strategy/decoration/RemoteStrategy.java        |  2 +-
 .../gremlin/process/traversal/Traversal.java       | 25 +++++++++++++++------
 .../strategy/decoration/RequirementsStrategy.java  |  2 +-
 .../strategy/decoration/SackStrategy.java          |  2 +-
 .../strategy/decoration/SideEffectStrategy.java    |  2 +-
 .../strategy/finalization/ProfileStrategy.java     |  2 +-
 .../optimization/IncidentToAdjacentStrategy.java   |  2 +-
 .../optimization/InlineFilterStrategy.java         |  2 +-
 .../optimization/PathRetractionStrategy.java       |  2 +-
 .../process/traversal/util/DefaultTraversal.java   | 26 ++++++++++++++--------
 .../process/traversal/util/TraversalHelper.java    |  4 ++--
 .../strategy/decoration/TranslationStrategy.java   |  2 +-
 .../process/traversal/strategy/SparqlStrategy.java |  2 +-
 .../optimization/TinkerGraphCountStrategy.java     |  2 +-
 15 files changed, 49 insertions(+), 30 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
index 5499fa2..2d63510 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
@@ -71,7 +71,7 @@ public final class VertexProgramStrategy extends AbstractTraversalStrategy<Trave
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
         // VertexPrograms can only execute at the root level of a Traversal and should not be applied locally prior to RemoteStrategy
-        if (!(traversal.getParent() instanceof EmptyStep)
+        if (!(traversal.isRoot())
                 || traversal instanceof AbstractLambdaTraversal
                 || traversal.getStrategies().getStrategy(RemoteStrategy.class).isPresent())
             return;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
index 79855d0..fcd514e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
@@ -82,7 +82,7 @@ public final class RemoteStrategy extends AbstractTraversalStrategy<TraversalStr
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!(traversal.getParent() instanceof EmptyStep))
+        if (!(traversal.isRoot()))
             return;
 
         // remote step wraps the traversal and emits the results from the remote connection.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index b27acaa..393c1d2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -149,7 +149,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
     /**
      * Starts a promise to execute a function on the current {@code Traversal} that will be completed in the future.
      * Note that this method can only be used if the {@code Traversal} is constructed using
-     * {@link TraversalSource#withRemote(Configuration)}. Calling this method otherwise will yield an
+     * {@link AnonymousTraversalSource#withRemote(Configuration)}. Calling this method otherwise will yield an
      * {@code IllegalStateException}.
      */
     public default <T> CompletableFuture<T> promise(final Function<Traversal<S, E>, T> traversalFunction) {
@@ -413,7 +413,8 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
         /**
          * Apply the registered {@link TraversalStrategies} to the traversal.
          * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
-         * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
+         * The order of operations for strategy applications should be: globally id steps, apply each strategy in turn
+         * to root traversal, then recursively to nested traversals.
          *
          * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
          */
@@ -421,7 +422,8 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
 
         /**
          * Get the {@link TraverserGenerator} associated with this traversal.
-         * The traversal generator creates {@link Traverser} instances that are respective of the traversal's {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement}.
+         * The traversal generator creates {@link Traverser} instances that are respective of the traversal's
+         * {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement}.
          *
          * @return the generator of traversers
          */
@@ -476,22 +478,31 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A
         public TraversalStrategies getStrategies();
 
         /**
-         * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
-         * Traversals can be nested and this is the means by which the traversal tree is connected.
+         * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is
+         * the parent of this traversal. Traversals can be nested and this is the means by which the traversal tree is
+         * connected.
          *
          * @param step the traversal holder parent step
          */
         public void setParent(final TraversalParent step);
 
         /**
-         * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
-         * Traversals can be nested and this is the means by which the traversal tree is walked.
+         * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is
+         * the parent of this traversal. Traversals can be nested and this is the means by which the traversal tree is
+         * walked.
          *
          * @return the traversal holder parent step
          */
         public TraversalParent getParent();
 
         /**
+         * Determines if the traversal is at the root level.
+         */
+        public default boolean isRoot() {
+            return null == getParent() || getParent() instanceof EmptyStep;
+        }
+
+        /**
          * Cloning is used to duplicate the traversal typically in OLAP environments.
          *
          * @return The cloned traversal
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
index 78c48b8..09d1806 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
@@ -44,7 +44,7 @@ public final class RequirementsStrategy extends AbstractTraversalStrategy<Traver
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getParent() instanceof EmptyStep && !this.requirements.isEmpty())
+        if (traversal.isRoot() && !this.requirements.isEmpty())
             traversal.addStep(new RequirementsStep<>(traversal, this.requirements));
     }
 
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SackStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SackStrategy.java
index 0598d17..e321f8c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SackStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SackStrategy.java
@@ -47,7 +47,7 @@ public final class SackStrategy extends AbstractTraversalStrategy<TraversalStrat
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getParent() instanceof EmptyStep)
+        if (traversal.isRoot())
             traversal.getSideEffects().setSack(this.initialValue, this.splitOperator, this.mergeOperator);
     }
 
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java
index 5c99b5f..f3f5d4b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java
@@ -44,7 +44,7 @@ public final class SideEffectStrategy extends AbstractTraversalStrategy<Traversa
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getParent() instanceof EmptyStep) {
+        if (traversal.isRoot()) {
             this.sideEffects.forEach(triplet -> traversal.getSideEffects().register(triplet.getValue0(), triplet.getValue1(), triplet.getValue2()));
         }
     }
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index ccce49b..dedd567 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -46,7 +46,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
         if (!traversal.getEndStep().getLabels().contains(MARKER) &&
-                (traversal.getParent() instanceof EmptyStep || traversal.getParent() instanceof VertexProgramStep) &&
+                (traversal.isRoot() || traversal.getParent() instanceof VertexProgramStep) &&
                 TraversalHelper.hasStepOfAssignableClassRecursively(ProfileSideEffectStep.class, traversal))
             TraversalHelper.applyTraversalRecursively(t -> t.getEndStep().addLabel(MARKER), traversal);
 
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
index e70e54a..75d55ad 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IncidentToAdjacentStrategy.java
@@ -125,7 +125,7 @@ public final class IncidentToAdjacentStrategy extends AbstractTraversalStrategy<
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
         // using a hidden label marker to denote whether the traversal should not be processed by this strategy
-        if ((traversal.getParent() instanceof EmptyStep || traversal.getParent() instanceof VertexProgramStep) &&
+        if ((traversal.isRoot() || traversal.getParent() instanceof VertexProgramStep) &&
                 TraversalHelper.hasStepOfAssignableClassRecursively(INVALIDATING_STEP_CLASSES, traversal))
             TraversalHelper.applyTraversalRecursively(t -> t.getStartStep().addLabel(MARKER), traversal);
         if (traversal.getStartStep().getLabels().contains(MARKER)) {
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
index f5f980f..bec170d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
@@ -96,7 +96,7 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
                         step instanceof OrStep && InlineFilterStrategy.processOrStep((OrStep) step, traversal) ||
                         step instanceof AndStep && InlineFilterStrategy.processAndStep((AndStep) step, traversal);
             }
-            if (!changed && traversal.getParent() instanceof EmptyStep) {
+            if (!changed && traversal.isRoot()) {
                 final Iterator<MatchStep> matchStepIterator = TraversalHelper.getStepsOfClass(MatchStep.class, traversal).iterator();
                 while (!changed && matchStepIterator.hasNext()) {
                     if (InlineFilterStrategy.processMatchStep(matchStepIterator.next(), traversal))
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
index d370c38..62ade2b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java
@@ -79,7 +79,7 @@ public final class PathRetractionStrategy extends AbstractTraversalStrategy<Trav
         // do not apply this strategy if there are lambdas as you can't introspect to know what path information the lambdas are using
         // do not apply this strategy if a PATH requirement step is being used (in the future, we can do PATH requirement lookhead to be more intelligent about its usage)
         // do not apply this strategy if a VertexProgramStep is present with LABELED_PATH requirements
-        if (traversal.getParent() instanceof EmptyStep &&
+        if (traversal.isRoot() &&
                 TraversalHelper.anyStepRecursively(step -> step instanceof LambdaHolder ||
                         step.getRequirements().contains(TraverserRequirement.PATH) ||
                         (step instanceof VertexProgramStep &&
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 0800d2c..a9d605a 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
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
@@ -31,7 +30,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.EmptyTraverser;
@@ -93,8 +91,6 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         steps.addAll(traversal.getSteps());
     }
 
-    // TODO: clean up unused or redundant constructors
-
     public DefaultTraversal() {
         this(EmptyGraph.instance(), TraversalStrategies.GlobalCache.getStrategies(EmptyGraph.class), new Bytecode());
     }
@@ -127,7 +123,14 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         TraversalHelper.reIdSteps(this.stepPosition, this);
         final boolean hasGraph = null != this.graph;
 
-        if (this.getParent() instanceof EmptyStep || this.getParent() instanceof VertexProgramStep) {
+        // we only want to apply strategies on the top-level step or if we got some graphcomputer stuff going on.
+        // seems like in that case, the "top-level" of the traversal is really held by the VertexProgramStep which
+        // needs to have strategies applied on "pure" copies of the traversal it is holding (i think). it further
+        // seems that we need three recursions over the traversal hierarchy to ensure everything "works", where
+        // strategy application requires top-level strategies and side-effects pushed into each child and then after
+        // application of the strategies we need to call applyStrategies() on all the children to ensure that their
+        // steps get reId'd and traverser requirements are set.
+        if (isRoot() || this.getParent() instanceof VertexProgramStep) {
             TraversalHelper.applyTraversalRecursively(t -> {
                 t.setStrategies(this.strategies);
                 t.setSideEffects(this.sideEffects);
@@ -142,7 +145,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
             // 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()) {
+                if(!(t.isRoot()) && t != this && !t.isLocked()) {
                     t.setStrategies(new DefaultTraversalStrategies());
                     t.applyStrategies();
                 }
@@ -150,14 +153,19 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         }
         
         this.finalEndStep = this.getEndStep();
+
         // finalize requirements
-        if (this.getParent() instanceof EmptyStep) {
-            this.requirements = null;
-            this.getTraverserRequirements();
+        if (this.isRoot()) {
+            resetTraverserRequirements();
         }
         this.locked = true;
     }
 
+    private void resetTraverserRequirements() {
+        this.requirements = null;
+        this.getTraverserRequirements();
+    }
+
     @Override
     public Set<TraverserRequirement> getTraverserRequirements() {
         if (null == this.requirements) {
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 55e04f8..687f31d 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
@@ -290,7 +290,7 @@ public final class TraversalHelper {
     }
 
     public static boolean isGlobalChild(Traversal.Admin<?, ?> traversal) {
-        while (!(traversal.getParent() instanceof EmptyStep)) {
+        while (!(traversal.isRoot())) {
             if (traversal.getParent().getLocalChildren().contains(traversal))
                 return false;
             traversal = traversal.getParent().asStep().getTraversal();
@@ -631,7 +631,7 @@ public final class TraversalHelper {
     }
 
     public static boolean onGraphComputer(Traversal.Admin<?, ?> traversal) {
-        while (!(traversal.getParent() instanceof EmptyStep)) {
+        while (!(traversal.isRoot())) {
             if (traversal.getParent() instanceof TraversalVertexProgramStep)
                 return true;
             traversal = traversal.getParent().asStep().getTraversal();
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java
index 7022c1e..d2d63b2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/TranslationStrategy.java
@@ -73,7 +73,7 @@ public final class TranslationStrategy extends AbstractTraversalStrategy<Travers
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!(traversal.getParent() instanceof EmptyStep) || traversal.getBytecode().isEmpty())
+        if (!(traversal.isRoot()) || traversal.getBytecode().isEmpty())
             return;
 
         final Traversal.Admin<?, ?> translatedTraversal;
diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
index 7a62e31..a4a95cc 100644
--- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
+++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/strategy/SparqlStrategy.java
@@ -65,7 +65,7 @@ public class SparqlStrategy extends AbstractTraversalStrategy<TraversalStrategy.
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!(traversal.getParent() instanceof EmptyStep))
+        if (!(traversal.isRoot()))
             return;
 
         // assumes that the traversal starts with the single inject step that holds the sparql query
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphCountStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphCountStrategy.java
index e8b39ab..53b3eca 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphCountStrategy.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphCountStrategy.java
@@ -60,7 +60,7 @@ public final class TinkerGraphCountStrategy extends AbstractTraversalStrategy<Tr
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!(traversal.getParent() instanceof EmptyStep) || TraversalHelper.onGraphComputer(traversal))
+        if (!(traversal.isRoot()) || TraversalHelper.onGraphComputer(traversal))
             return;
         final List<Step> steps = traversal.getSteps();
         if (steps.size() < 2 ||