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

colegreer pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.8-dev by this push:
     new ca14991983 Consolidate interfaces into step contracts (#3214)
ca14991983 is described below

commit ca14991983b2b9cf80f1d44b2177f606e1c5de0f
Author: Cole Greer <[email protected]>
AuthorDate: Thu Sep 25 10:44:36 2025 -0700

    Consolidate interfaces into step contracts (#3214)
    
    Also make Placeholder steps extend from same base classes as concrete steps.
    
    Migrates all of a steps interfaces (Mutating, Bypassing, 
FilteringBarrier...) to the step contract and ensure that placeholder and 
concrete steps share
    common base classes (ScalarMapStep, FilterStep...). This ensures that all 
of a steps methods are now accessible from the StepContract type, without any
    need to cast to concrete types. This also enforces complete alignment 
between the placeholder and concrete steps. After this change, steps with 
contract
    interfaces should only implement the single contract interface. Any 
additional interfaces must be added to the contract itself. The only exception
    currently is Configuring, which has been ommited from 
AddVertexStepContract, AddEdgeStepContract, AddPropertyStepContract, 
VertexStepContract, and
    GraphStepContract. These are all steps which don't make use of 
with()-modulation in the reference implementations, and I'm reluctant to 
introduce
    configuring into these placeholders unnecessarily due to the complexity of 
keeping GValues properly isolated inside Parameters. I consider a revisit of
    Configuring as a followup task to be addressed separately from this change.
    
    One additional change of note is the loss of the abstract 
RangeStepPlaceholder class. The shared class structure is unfortunately no 
longer feasible as
    RangeGlobal and RangeLocal extend from distinct base classes and Java does 
not allow for multiple inheritance.
---
 .../traversal/dsl/graph/GraphTraversal.java        |   4 +-
 .../traversal/step/filter/IsStepPlaceholder.java   |   6 +-
 .../traversal/step/filter/RangeGlobalStep.java     |  30 +-----
 .../step/filter/RangeGlobalStepContract.java       |  32 +++++-
 ...holder.java => RangeGlobalStepPlaceholder.java} | 116 +++++++--------------
 .../step/filter/RangeLocalStepContract.java        |   3 +-
 ...eholder.java => RangeLocalStepPlaceholder.java} | 104 +++++-------------
 .../traversal/step/filter/TailGlobalStep.java      |  36 +------
 .../step/filter/TailGlobalStepContract.java        |  37 ++++++-
 .../step/filter/TailGlobalStepPlaceholder.java     |  25 +++++
 .../step/filter/TailLocalStepPlaceholder.java      |   8 +-
 .../map/AbstractAddElementStepPlaceholder.java     |   5 +-
 .../map/AbstractMergeElementStepPlaceholder.java   |   7 +-
 .../traversal/step/map/AddEdgeStepContract.java    |   4 +-
 .../traversal/step/map/AddVertexStartStep.java     |   3 +-
 .../process/traversal/step/map/AddVertexStep.java  |   6 +-
 .../process/traversal/step/map/CallStep.java       |   2 +-
 .../traversal/step/map/CallStepPlaceholder.java    |   1 +
 .../process/traversal/step/map/GraphStep.java      |   3 +-
 .../traversal/step/map/GraphStepContract.java      |   2 +-
 .../traversal/step/map/GraphStepPlaceholder.java   |   4 +
 .../process/traversal/step/map/RangeLocalStep.java |   1 -
 .../process/traversal/step/map/VertexStep.java     |   2 +-
 .../traversal/step/map/VertexStepContract.java     |   2 +-
 .../traversal/step/map/VertexStepPlaceholder.java  |   5 +
 .../traversal/step/sideEffect/AddPropertyStep.java |   4 +-
 .../sideEffect/AddPropertyStepPlaceholder.java     |   4 +-
 .../traversal/step/filter/RangeGlobalStepTest.java |  12 +--
 .../traversal/step/map/RangeLocalStepTest.java     |  14 +--
 .../traversal/strategy/GValueManagerVerifier.java  |   2 +-
 30 files changed, 208 insertions(+), 276 deletions(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index e775c4fa9a..a6f63953aa 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -50,8 +50,8 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStepPlaceholder;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeStepPlaceholder.RangeGlobalStepPlaceholder;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeStepPlaceholder.RangeLocalStepPlaceholder;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStepPlaceholder;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeLocalStepPlaceholder;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStepPlaceholder;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailLocalStepPlaceholder;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStepPlaceholder;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
index 348d66ed94..903f9eb34c 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStepPlaceholder.java
@@ -23,16 +23,14 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.NoSuchElementException;
 import java.util.Set;
 
-public final class IsStepPlaceholder<S> extends AbstractStep<S,S> implements 
GValueHolder<S, S>, IsStepContract<S> {
+public final class IsStepPlaceholder<S> extends FilterStep<S> implements 
GValueHolder<S, S>, IsStepContract<S> {
 
     private P<S> predicate;
 
@@ -43,7 +41,7 @@ public final class IsStepPlaceholder<S> extends 
AbstractStep<S,S> implements GVa
     }
 
     @Override
-    protected Traverser.Admin<S> processNextStart() throws 
NoSuchElementException {
+    protected boolean filter(Traverser.Admin<S> traverser) {
         throw new IllegalStateException("IsStepPlaceholder is not executable");
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index c246dc9948..9df56e91df 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -18,12 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
-import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.FilteringBarrier;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
@@ -41,7 +37,7 @@ import java.util.function.BinaryOperator;
  * @author Bob Briody (http://bobbriody.com)
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class RangeGlobalStep<S> extends FilterStep<S> implements 
Ranging, Bypassing, RangeGlobalStepContract<S> {
+public final class RangeGlobalStep<S> extends FilterStep<S> implements 
RangeGlobalStepContract<S> {
 
     private long low;
     private long high;
@@ -148,30 +144,6 @@ public final class RangeGlobalStep<S> extends 
FilterStep<S> implements Ranging,
 
     }
 
-    @Override
-    public boolean hasNextBarrier() {
-        return this.starts.hasNext();
-    }
-
-    @Override
-    public TraverserSet<S> nextBarrier() throws NoSuchElementException {
-        if(!this.starts.hasNext())
-            throw FastNoSuchElementException.instance();
-        final TraverserSet<S> barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
-        while (this.starts.hasNext()) {
-            barrier.add(this.starts.next());
-        }
-        return barrier;
-    }
-
-    @Override
-    public void addBarrier(final TraverserSet<S> barrier) {
-        
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
-            traverser.setSideEffects(this.getTraversal().getSideEffects());
-            this.addStart(traverser);
-        });
-    }
-
     ////////////////
 
     public static final class RangeBiOperator<S> implements 
BinaryOperator<TraverserSet<S>>, Serializable {
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
index 285f576690..cf75b0324a 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepContract.java
@@ -20,14 +20,21 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
 import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.FilteringBarrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.NoSuchElementException;
 
 /**
  * Defines the contract for {@code range} related steps.
  */
-public interface RangeGlobalStepContract<S> extends Step<S, S>, 
FilteringBarrier<TraverserSet<S>> {
+public interface RangeGlobalStepContract<S> extends Step<S, S>, 
FilteringBarrier<TraverserSet<S>>, Ranging, Bypassing {
 
     /**
      * Retrieves the lower bound of the range.
@@ -72,4 +79,27 @@ public interface RangeGlobalStepContract<S> extends Step<S, 
S>, FilteringBarrier
     default TraverserSet<S> getEmptyBarrier() {
         return new TraverserSet<>();
     }
+
+    ExpandableStepIterator<S> getStarts();
+
+    default boolean hasNextBarrier() {
+        return this.getStarts().hasNext();
+    }
+
+    default TraverserSet<S> nextBarrier() throws NoSuchElementException {
+        if(!this.getStarts().hasNext())
+            throw FastNoSuchElementException.instance();
+        final TraverserSet<S> barrier = (TraverserSet<S>) 
this.getTraversal().getTraverserSetSupplier().get();
+        while (this.getStarts().hasNext()) {
+            barrier.add(this.getStarts().next());
+        }
+        return barrier;
+    }
+
+    default void addBarrier(final TraverserSet<S> barrier) {
+        
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
+            traverser.setSideEffects(this.getTraversal().getSideEffects());
+            this.addStart(traverser);
+        });
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
similarity index 58%
copy from 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
copy to 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
index 96299b80bb..0b910c7464 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java
@@ -18,13 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
-import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -36,13 +33,17 @@ import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Set;
 
-public abstract class RangeStepPlaceholder<S> extends AbstractStep<S,S> 
implements GValueHolder<S, S> {
-
+public class RangeGlobalStepPlaceholder<S> extends FilterStep<S> implements 
RangeGlobalStepContract<S>, GValueHolder<S,S> {
     protected GValue<Long> low;
     protected GValue<Long> high;
 
-    public RangeStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> low, final GValue<Long> high) {
+    private boolean bypass = false;
+
+    public RangeGlobalStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> low, final GValue<Long> high) {
         super(traversal);
+        if (null == low || null == high) {
+            throw new IllegalArgumentException("RangeGlobalStepPlaceholder 
requires both low and high values to be non-null");
+        }
         this.low = low;
         this.high = high;
         traversal.getGValueManager().register(low);
@@ -72,9 +73,6 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     public Long getLowRange() {
-        if (low == null) {
-            return null;
-        }
         if (low.isVariable()) {
             this.traversal.getGValueManager().pinVariable(low.getName());
         }
@@ -82,9 +80,6 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     public Long getHighRange() {
-        if (high == null) {
-            return null;
-        }
         if (high.isVariable()) {
             this.traversal.getGValueManager().pinVariable(high.getName());
         }
@@ -96,7 +91,7 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         if (!super.equals(o)) return false;
-        RangeStepPlaceholder<?> that = (RangeStepPlaceholder<?>) o;
+        RangeGlobalStepPlaceholder<?> that = (RangeGlobalStepPlaceholder<?>) o;
         return Objects.equals(low, that.low) && Objects.equals(high, 
that.high);
     }
 
@@ -126,8 +121,18 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     @Override
-    protected Traverser.Admin<S> processNextStart() throws 
NoSuchElementException {
-        throw new IllegalStateException("RangeGlobalGValueContract is not 
executable");
+    protected boolean filter(Traverser.Admin<S> traverser) {
+        throw new IllegalStateException("RangeGlobalStepPlaceholder is not 
executable");
+    }
+
+    @Override
+    public void setBypass(final boolean bypass) {
+        this.bypass = bypass;
+    }
+
+    @Override
+    public void processAllStarts() {
+        throw new IllegalStateException("RangeGlobalStepPlaceholder is not 
executable");
     }
 
     @Override
@@ -142,70 +147,25 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
         return gValues;
     }
 
-    public static class RangeGlobalStepPlaceholder<S> extends 
RangeStepPlaceholder<S> implements RangeGlobalStepContract<S> {
-
-        public RangeGlobalStepPlaceholder(final Traversal.Admin traversal, 
final GValue<Long> low, final GValue<Long> high) {
-            super(traversal, low, high);
-        }
-
-        @Override
-        public RangeGlobalStep<S> asConcreteStep() {
-            RangeGlobalStep<S> step = new RangeGlobalStep<>(traversal, 
low.get(), high.get());
-            TraversalHelper.copyLabels(this, step, false);
-            return step;
-        }
-
-        @Override
-        public RangeGlobalStepPlaceholder<S> clone() {
-            return new RangeGlobalStepPlaceholder<>(traversal, low, high);
-        }
-
-        @Override
-        public void processAllStarts() {
-
-        }
-
-        @Override
-        public boolean hasNextBarrier() {
-            return this.starts.hasNext();
-        }
-
-        @Override
-        public TraverserSet<S> nextBarrier() throws NoSuchElementException {
-            if(!this.starts.hasNext())
-                throw FastNoSuchElementException.instance();
-            final TraverserSet<S> barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
-            while (this.starts.hasNext()) {
-                barrier.add(this.starts.next());
-            }
-            return barrier;
-        }
-
-        @Override
-        public void addBarrier(final TraverserSet<S> barrier) {
-            
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
-                traverser.setSideEffects(this.getTraversal().getSideEffects());
-                this.addStart(traverser);
-            });
-        }
+    @Override
+    public RangeGlobalStep<S> asConcreteStep() {
+        RangeGlobalStep<S> step = new RangeGlobalStep<>(traversal, low.get(), 
high.get());
+        TraversalHelper.copyLabels(this, step, false);
+        step.setBypass(bypass);
+        return step;
     }
 
-    public static class RangeLocalStepPlaceholder<S> extends 
RangeStepPlaceholder<S> implements RangeLocalStepContract<S> {
-
-        public RangeLocalStepPlaceholder(final Traversal.Admin traversal, 
final GValue<Long> low, final GValue<Long> high) {
-            super(traversal, low, high);
-        }
-
-        @Override
-        public RangeLocalStep<S> asConcreteStep() {
-            RangeLocalStep<S> step = new RangeLocalStep<>(traversal, 
low.get(), high.get());
-            TraversalHelper.copyLabels(this, step, false);
-            return step;
-        }
-
-        @Override
-        public RangeLocalStepPlaceholder<S> clone() {
-            return new RangeLocalStepPlaceholder<>(traversal, low, high);
-        }
+    @Override
+    public RangeGlobalStepPlaceholder<S> clone() {
+        RangeGlobalStepPlaceholder<S> clone = (RangeGlobalStepPlaceholder<S>) 
super.clone();
+        clone.bypass = this.bypass;
+        try {
+            clone.low = this.low.clone(); //TODO:: cleanup unnecessary 
try-catch
+            clone.high = this.high.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException(e);
+        }
+        return clone;
     }
+
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
index e45203881e..b58f31950a 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepContract.java
@@ -20,11 +20,12 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
 
 /**
  * Defines the contract for {@code range} related steps.
  */
-public interface RangeLocalStepContract<S> extends Step<S, S> {
+public interface RangeLocalStepContract<S> extends Step<S, S>, Ranging {
 
     /**
      * Retrieves the lower bound of the range.
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
similarity index 56%
rename from 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
rename to 
gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
index 96299b80bb..cc345ea566 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java
@@ -18,31 +18,29 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
-import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ScalarMapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Set;
 
-public abstract class RangeStepPlaceholder<S> extends AbstractStep<S,S> 
implements GValueHolder<S, S> {
+public class RangeLocalStepPlaceholder<S> extends ScalarMapStep<S,S> 
implements RangeLocalStepContract<S>, GValueHolder<S, S> {
 
     protected GValue<Long> low;
     protected GValue<Long> high;
 
-    public RangeStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> low, final GValue<Long> high) {
+    public RangeLocalStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> low, final GValue<Long> high) {
         super(traversal);
+        if (null == low || null == high) {
+            throw new IllegalArgumentException("RangeLocalStepPlaceholder 
requires both low and high values to be non-null");
+        }
         this.low = low;
         this.high = high;
         traversal.getGValueManager().register(low);
@@ -72,9 +70,6 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     public Long getLowRange() {
-        if (low == null) {
-            return null;
-        }
         if (low.isVariable()) {
             this.traversal.getGValueManager().pinVariable(low.getName());
         }
@@ -82,9 +77,6 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     public Long getHighRange() {
-        if (high == null) {
-            return null;
-        }
         if (high.isVariable()) {
             this.traversal.getGValueManager().pinVariable(high.getName());
         }
@@ -96,7 +88,7 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         if (!super.equals(o)) return false;
-        RangeStepPlaceholder<?> that = (RangeStepPlaceholder<?>) o;
+        RangeLocalStepPlaceholder<?> that = (RangeLocalStepPlaceholder<?>) o;
         return Objects.equals(low, that.low) && Objects.equals(high, 
that.high);
     }
 
@@ -126,8 +118,8 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
     }
 
     @Override
-    protected Traverser.Admin<S> processNextStart() throws 
NoSuchElementException {
-        throw new IllegalStateException("RangeGlobalGValueContract is not 
executable");
+    protected S map(Traverser.Admin<S> traverser) {
+        throw new IllegalStateException("RangeLocalStepPlaceholder is not 
executable");
     }
 
     @Override
@@ -142,70 +134,22 @@ public abstract class RangeStepPlaceholder<S> extends 
AbstractStep<S,S> implemen
         return gValues;
     }
 
-    public static class RangeGlobalStepPlaceholder<S> extends 
RangeStepPlaceholder<S> implements RangeGlobalStepContract<S> {
-
-        public RangeGlobalStepPlaceholder(final Traversal.Admin traversal, 
final GValue<Long> low, final GValue<Long> high) {
-            super(traversal, low, high);
-        }
-
-        @Override
-        public RangeGlobalStep<S> asConcreteStep() {
-            RangeGlobalStep<S> step = new RangeGlobalStep<>(traversal, 
low.get(), high.get());
-            TraversalHelper.copyLabels(this, step, false);
-            return step;
-        }
-
-        @Override
-        public RangeGlobalStepPlaceholder<S> clone() {
-            return new RangeGlobalStepPlaceholder<>(traversal, low, high);
-        }
-
-        @Override
-        public void processAllStarts() {
-
-        }
-
-        @Override
-        public boolean hasNextBarrier() {
-            return this.starts.hasNext();
-        }
-
-        @Override
-        public TraverserSet<S> nextBarrier() throws NoSuchElementException {
-            if(!this.starts.hasNext())
-                throw FastNoSuchElementException.instance();
-            final TraverserSet<S> barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
-            while (this.starts.hasNext()) {
-                barrier.add(this.starts.next());
-            }
-            return barrier;
-        }
-
-        @Override
-        public void addBarrier(final TraverserSet<S> barrier) {
-            
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
-                traverser.setSideEffects(this.getTraversal().getSideEffects());
-                this.addStart(traverser);
-            });
-        }
+    @Override
+    public RangeLocalStep<S> asConcreteStep() {
+        RangeLocalStep<S> step = new RangeLocalStep<>(traversal, low.get(), 
high.get());
+        TraversalHelper.copyLabels(this, step, false);
+        return step;
     }
 
-    public static class RangeLocalStepPlaceholder<S> extends 
RangeStepPlaceholder<S> implements RangeLocalStepContract<S> {
-
-        public RangeLocalStepPlaceholder(final Traversal.Admin traversal, 
final GValue<Long> low, final GValue<Long> high) {
-            super(traversal, low, high);
-        }
-
-        @Override
-        public RangeLocalStep<S> asConcreteStep() {
-            RangeLocalStep<S> step = new RangeLocalStep<>(traversal, 
low.get(), high.get());
-            TraversalHelper.copyLabels(this, step, false);
-            return step;
-        }
-
-        @Override
-        public RangeLocalStepPlaceholder<S> clone() {
-            return new RangeLocalStepPlaceholder<>(traversal, low, high);
-        }
+    @Override
+    public RangeLocalStepPlaceholder<S> clone() {
+        RangeLocalStepPlaceholder<S> clone = (RangeLocalStepPlaceholder<S>) 
super.clone();
+        try {
+            clone.low = this.low.clone(); //TODO:: cleanup unnecessary 
try-catch
+            clone.high = this.high.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeException(e);
+        }
+        return clone;
     }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
index 6a443e2de6..420e3f02d4 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
@@ -21,25 +21,20 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.FilteringBarrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.ArrayDeque;
 import java.util.Collections;
 import java.util.Deque;
-import java.util.NoSuchElementException;
 import java.util.Set;
 
 /**
  * @author Matt Frantz (http://github.com/mhfrantz)
  */
-public final class TailGlobalStep<S> extends AbstractStep<S, S> implements 
Bypassing, FilteringBarrier<TraverserSet<S>>, TailGlobalStepContract<S> {
+public final class TailGlobalStep<S> extends AbstractStep<S, S> implements 
TailGlobalStepContract<S> {
 
     private final long limit;
     private Deque<Traverser.Admin<S>> tail;
@@ -138,35 +133,6 @@ public final class TailGlobalStep<S> extends 
AbstractStep<S, S> implements Bypas
 
     }
 
-    @Override
-    public TraverserSet<S> getEmptyBarrier() {
-        return new TraverserSet<>();
-    }
-
-    @Override
-    public boolean hasNextBarrier() {
-        return this.starts.hasNext();
-    }
-
-    @Override
-    public TraverserSet<S> nextBarrier() throws NoSuchElementException {
-        if (!this.starts.hasNext())
-            throw FastNoSuchElementException.instance();
-        final TraverserSet<S> barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
-        while (this.starts.hasNext()) {
-            barrier.add(this.starts.next());
-        }
-        return barrier;
-    }
-
-    @Override
-    public void addBarrier(final TraverserSet<S> barrier) {
-        
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
-            traverser.setSideEffects(this.getTraversal().getSideEffects());
-            this.addStart(traverser);
-        });
-    }
-
     @Override
     public Long getLimit() {
         return limit;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
index f2198548b0..e4f04bdcd9 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepContract.java
@@ -19,12 +19,47 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.FilteringBarrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
-public interface TailGlobalStepContract<S> extends Step<S, S> {
+import java.util.NoSuchElementException;
+
+public interface TailGlobalStepContract<S> extends Step<S, S>, Bypassing, 
FilteringBarrier<TraverserSet<S>> {
     Long getLimit();
 
     default GValue<Long> getLimitAsGValue() {
         return GValue.of(getLimit());
     }
+
+    ExpandableStepIterator<S> getStarts();
+
+    default TraverserSet<S> getEmptyBarrier() {
+        return new TraverserSet<>();
+    }
+
+    default boolean hasNextBarrier() {
+        return this.getStarts().hasNext();
+    }
+
+    default TraverserSet<S> nextBarrier() throws NoSuchElementException {
+        if (!this.getStarts().hasNext())
+            throw FastNoSuchElementException.instance();
+        final TraverserSet<S> barrier = (TraverserSet<S>) 
this.getTraversal().getTraverserSetSupplier().get();
+        while (this.getStarts().hasNext()) {
+            barrier.add(this.getStarts().next());
+        }
+        return barrier;
+    }
+
+    default void addBarrier(final TraverserSet<S> barrier) {
+        
IteratorUtils.removeOnNext(barrier.iterator()).forEachRemaining(traverser -> {
+            traverser.setSideEffects(this.getTraversal().getSideEffects());
+            this.addStart(traverser);
+        });
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
index e6d57ccdcc..6aac6e6f0b 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java
@@ -18,16 +18,21 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
 
+import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.NoSuchElementException;
 import java.util.Objects;
 
 /**
@@ -36,9 +41,13 @@ import java.util.Objects;
 public final class TailGlobalStepPlaceholder<S> extends AbstractStep<S, S> 
implements TailGlobalStepContract<S>, GValueHolder<S, S> {
 
     private GValue<Long> limit;
+    private boolean bypass = false;
 
     public TailGlobalStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> limit) {
         super(traversal);
+        if (null == limit) {
+            throw new IllegalArgumentException("TailGlobalStepPlaceholder 
requires limit to be non-null");
+        }
         this.limit = limit;
         if (this.limit.isVariable()) {
             traversal.getGValueManager().register(limit);
@@ -50,6 +59,11 @@ public final class TailGlobalStepPlaceholder<S> extends 
AbstractStep<S, S> imple
         throw new IllegalStateException("GValueHolder is not executable");
     }
 
+    @Override
+    public void setBypass(final boolean bypass) {
+        this.bypass = bypass;
+    }
+
     @Override
     public TailGlobalStepPlaceholder<S> clone() {
         final TailGlobalStepPlaceholder<S> clone = 
(TailGlobalStepPlaceholder<S>) super.clone();
@@ -74,10 +88,21 @@ public final class TailGlobalStepPlaceholder<S> extends 
AbstractStep<S, S> imple
         return limit;
     }
 
+    @Override
+    public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
+        return MemoryComputeKey.of(this.getId(), new 
RangeGlobalStep.RangeBiOperator<>(this.limit.get()), false, true);
+    }
+
+    @Override
+    public void processAllStarts() {
+        throw new IllegalStateException("TailGlobalStepPlaceholder is not 
executable");
+    }
+
     @Override
     public Step<S, S> asConcreteStep() {
         TailGlobalStep<S> step = new TailGlobalStep<>(traversal, limit.get());
         TraversalHelper.copyLabels(this, step, false);
+        step.setBypass(bypass);
         return step;
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
index 85f81658a8..d4f62ef597 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java
@@ -22,6 +22,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ScalarMapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.TailLocalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -30,12 +31,15 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Objects;
 
-public final class TailLocalStepPlaceholder<S> extends AbstractStep<S, S> 
implements TailLocalStepContract<S>, GValueHolder<S, S> {
+public final class TailLocalStepPlaceholder<S> extends ScalarMapStep<S, S> 
implements TailLocalStepContract<S>, GValueHolder<S, S> {
 
     private GValue<Long> limit;
 
     public TailLocalStepPlaceholder(final Traversal.Admin traversal, final 
GValue<Long> limit) {
         super(traversal);
+        if (null == limit) {
+            throw new IllegalArgumentException("TailLocalStepPlaceholder 
requires limit to be non-null");
+        }
         this.limit = limit;
         if (this.limit.isVariable()) {
             traversal.getGValueManager().register(limit);
@@ -43,7 +47,7 @@ public final class TailLocalStepPlaceholder<S> extends 
AbstractStep<S, S> implem
     }
 
     @Override
-    public Traverser.Admin<S> processNextStart() {
+    protected S map(Traverser.Admin<S> traverser) {
         throw new IllegalStateException("GValueHolder is not executable");
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
index ee753fb9e5..dbd391023b 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java
@@ -26,7 +26,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.GValueHelper;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -47,7 +46,7 @@ import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Set;
 
-public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, 
X extends Event> extends AbstractStep<S, E>
+public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, 
X extends Event> extends ScalarMapStep<S, E>
         implements AddElementStepContract<S, E>, GValueHolder<S, E>, 
Writing<X> {
 
     protected Traversal.Admin<S, String> label;
@@ -119,7 +118,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, 
E extends Element, X
     }
 
     @Override
-    protected Traverser.Admin<E> processNextStart() throws 
NoSuchElementException {
+    protected E map(Traverser.Admin<S> traverser) {
         throw new IllegalStateException("GValuePlaceholder step is not 
executable");
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
index 2ca0f5c667..135c5fcee4 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java
@@ -24,7 +24,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import 
org.apache.tinkerpop.gremlin.process.traversal.lambda.GValueConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.GValueHelper;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -36,13 +35,13 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Set;
 
-public abstract class AbstractMergeElementStepPlaceholder<S, E> extends 
AbstractStep<S, E> implements MergeStepContract<S, E, Map>, GValueHolder<S, E> {
+public abstract class AbstractMergeElementStepPlaceholder<S, E> extends 
FlatMapStep<S, E> implements MergeStepContract<S, E, Map>, GValueHolder<S, E> {
     protected final boolean isStart;
     protected Map<Object, List<Object>> properties = new HashMap<>();
     protected Traversal.Admin<?, Map<Object, Object>> mergeTraversal;
@@ -57,7 +56,7 @@ public abstract class AbstractMergeElementStepPlaceholder<S, 
E> extends Abstract
     }
 
     @Override
-    protected Traverser.Admin<E> processNextStart() throws 
NoSuchElementException {
+    protected Iterator<E> flatMap(Traverser.Admin<S> traverser) {
         throw new IllegalStateException("GValuePlaceholder step is not 
executable");
     }
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
index b6fc0ff412..446747379d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStepContract.java
@@ -28,8 +28,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.FromToModulating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -37,7 +35,7 @@ import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
 
-public interface AddEdgeStepContract<S> extends TraversalParent, Scoping, 
FromToModulating, AddElementStepContract<S, Edge>, 
Writing<Event.EdgeAddedEvent> {
+public interface AddEdgeStepContract<S> extends AddElementStepContract<S, 
Edge>, FromToModulating, Writing<Event.EdgeAddedEvent> {
 
     /**
      * Concrete implementations of this contract that can be referenced as 
TinkerPop implementations.
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
index fd91c769af..053b9ff911 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
@@ -46,8 +46,7 @@ import 
org.apache.tinkerpop.gremlin.structure.util.StringFactory;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class AddVertexStartStep extends AbstractStep<Vertex, Vertex>
-        implements TraversalParent, Scoping, AddVertexStepContract<Vertex>, 
Configuring {
+public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> 
implements AddVertexStepContract<Vertex>, Configuring {
 
     private Parameters parameters = new Parameters();
     private boolean first = true;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
index b3baa8b729..baead68ac1 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
@@ -22,9 +22,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.event.CallbackRegistry;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
@@ -44,8 +41,7 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class AddVertexStep<S> extends ScalarMapStep<S, Vertex>
-        implements Writing<Event.VertexAddedEvent>, TraversalParent, Scoping, 
AddVertexStepContract<S>, Configuring {
+public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> implements 
AddVertexStepContract<S>, Configuring {
 
     private Parameters parameters = new Parameters();
     private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
index ad1cf5a5fd..270d15f80d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStep.java
@@ -52,7 +52,7 @@ import static 
org.apache.tinkerpop.gremlin.structure.service.Service.ServiceCall
  *
  * @author Mike Personick (http://github.com/mikepersonick)
  */
-public final class CallStep<S, E> extends AbstractStep<S, E> implements 
AutoCloseable, CallStepContract<S, E> {
+public final class CallStep<S, E> extends AbstractStep<S, E> implements 
CallStepContract<S, E> {
 
     private final boolean isStart;
     private boolean first = true;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
index a4b5df72f8..3e96bed777 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java
@@ -39,6 +39,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.service.Service;
 import org.apache.tinkerpop.gremlin.structure.service.ServiceRegistry;
+import org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 /**
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
index 0d4db215fa..bfbcfb8170 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
@@ -26,7 +26,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
@@ -50,7 +49,7 @@ import java.util.function.Supplier;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Pieter Martin
  */
-public class GraphStep<S, E extends Element> extends AbstractStep<S, E> 
implements GraphComputing, AutoCloseable, Configuring, GraphStepContract<S, E> {
+public class GraphStep<S, E extends Element> extends AbstractStep<S, E> 
implements Configuring, GraphStepContract<S, E> {
 
     protected Parameters parameters = new Parameters();
     protected final Class<E> returnClass;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
index 0baf85d062..83db0ca377 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepContract.java
@@ -27,7 +27,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-public interface GraphStepContract<S, E extends Element> extends Step<S, E>, 
GraphComputing {
+public interface GraphStepContract<S, E extends Element> extends Step<S, E>, 
GraphComputing, AutoCloseable {
 
     /**
      * Concrete implementations of this contract that can be referenced as 
TinkerPop implementations.
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
index effd074d3c..91997e4254 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java
@@ -27,6 +27,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.CloseableIterator;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 import java.util.Arrays;
@@ -59,6 +60,9 @@ public class GraphStepPlaceholder<S, E extends Element> 
extends AbstractStep<S,
         return StringFactory.stepString(this, 
this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids));
     }
 
+    @Override
+    public void close() {} // Nothing to close
+
     @Override
     public Class<E> getReturnClass() {
         return this.returnClass;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
index fa2a9c46f2..d3d12bcf15 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
@@ -23,7 +23,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeLocalStepContract;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
index f4d2743f24..bc348e4c40 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
@@ -44,7 +44,7 @@ import java.util.stream.Collectors;
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> 
implements AutoCloseable, Configuring, VertexStepContract<E> {
+public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> 
implements Configuring, VertexStepContract<E> {
 
     protected Parameters parameters = new Parameters();
     private final String[] edgeLabels;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
index 9beff28853..b7c86f2f09 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepContract.java
@@ -28,7 +28,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import java.util.Arrays;
 import java.util.Set;
 
-public interface VertexStepContract<E extends Element> extends Step<Vertex, E> 
{
+public interface VertexStepContract<E extends Element> extends Step<Vertex, 
E>, AutoCloseable {
     Direction getDirection();
 
     String[] getEdgeLabels();
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
index ab37d3d5c3..63b85c2f3d 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java
@@ -180,4 +180,9 @@ public class VertexStepPlaceholder<E extends Element> 
extends FlatMapStep<Vertex
     public Collection<GValue<?>> getGValues() {
         return Arrays.asList(edgeLabels);
     }
+
+    @Override
+    public void close() throws Exception {
+        closeIterator();
+    }
 }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
index be73f3581a..d7022622b7 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -22,8 +22,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Deleting;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Writing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.*;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
@@ -49,7 +47,7 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class AddPropertyStep<S extends Element> extends SideEffectStep<S>
-        implements AddPropertyStepContract<S>, 
Writing<Event.ElementPropertyChangedEvent>, 
Deleting<Event.ElementPropertyChangedEvent>, Configuring {
+        implements AddPropertyStepContract<S>, Configuring {
 
     private Parameters parameters = new Parameters();
     private final VertexProperty.Cardinality cardinality;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
index 9278f274f8..ca0efef7a0 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java
@@ -43,7 +43,7 @@ import java.util.NoSuchElementException;
 import java.util.Objects;
 import java.util.Set;
 
-public class AddPropertyStepPlaceholder<S extends Element> extends 
AbstractStep<S, S>
+public class AddPropertyStepPlaceholder<S extends Element> extends 
SideEffectStep<S>
         implements AddPropertyStepContract<S>, GValueHolder<S, S> {
 
     /**
@@ -128,7 +128,7 @@ public class AddPropertyStepPlaceholder<S extends Element> 
extends AbstractStep<
     }
 
     @Override
-    protected Traverser.Admin<S> processNextStart() throws 
NoSuchElementException {
+    protected void sideEffect(Traverser.Admin<S> traverser) {
         throw new IllegalStateException("AddPropertyStepPlaceholder is not 
executable");
     }
 
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
index 75f854ca99..25bd73a3d5 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
@@ -73,29 +73,29 @@ public class RangeGlobalStepTest extends GValueStepTest {
     @Test
     public void getLowHighRangeAsGValueShouldNotPinVariables() {
         GraphTraversal.Admin<Object, Object> traversal = 
__.range(GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, 
HIGH_VALUE)).asAdmin();
-        assertEquals(GValue.of(LOW_NAME, LOW_VALUE), 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRangeAsGValue());
-        assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRangeAsGValue());
+        assertEquals(GValue.of(LOW_NAME, LOW_VALUE), 
((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRangeAsGValue());
+        assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), 
((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRangeAsGValue());
         verifyVariables(traversal, Set.of(), Set.of(LOW_NAME, HIGH_NAME));
     }
 
     @Test
     public void getLowShouldPinVariable() {
         GraphTraversal.Admin<Object, Object> traversal = 
__.range(GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, 
HIGH_VALUE)).asAdmin();
-        assertEquals((Long) LOW_VALUE, 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRange());
+        assertEquals((Long) LOW_VALUE, ((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRange());
         verifyVariables(traversal, Set.of(LOW_NAME), Set.of(HIGH_NAME));
     }
 
     @Test
     public void getHighShouldPinVariable() {
         GraphTraversal.Admin<Object, Object> traversal = 
__.range(GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, 
HIGH_VALUE)).asAdmin();
-        assertEquals((Long) HIGH_VALUE, 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRange());
+        assertEquals((Long) HIGH_VALUE, ((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRange());
         verifyVariables(traversal, Set.of(HIGH_NAME), Set.of(LOW_NAME));
     }
 
     @Test
     public void getLowHighRangeGValueFromConcreteStep() {
         GraphTraversal.Admin<Object, Object> traversal = 
__.range(GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, 
HIGH_VALUE)).asAdmin();
-        assertEquals((Long) LOW_VALUE, 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getLowRange());
-        assertEquals((Long) HIGH_VALUE, 
((RangeStepPlaceholder.RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getHighRange());
+        assertEquals((Long) LOW_VALUE, ((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getLowRange());
+        assertEquals((Long) HIGH_VALUE, ((RangeGlobalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getHighRange());
     }
 }
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
index 7ce53e1709..ffe3e804b7 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStepTest.java
@@ -31,7 +31,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueStepTest;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeStepPlaceholder;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeLocalStepPlaceholder;
 import org.junit.Test;
 
 import static 
org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep.applyRange;
@@ -81,30 +81,30 @@ public class RangeLocalStepTest extends GValueStepTest {
     @Test
     public void getLowHighRangeAsGValueShouldNotPinVariables() {
         GraphTraversal.Admin<Object, Object> traversal = __.range(Scope.local, 
GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
-        assertEquals(GValue.of(LOW_NAME, LOW_VALUE), 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRangeAsGValue());
-        assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRangeAsGValue());
+        assertEquals(GValue.of(LOW_NAME, LOW_VALUE), 
((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRangeAsGValue());
+        assertEquals(GValue.of(HIGH_NAME, HIGH_VALUE), 
((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRangeAsGValue());
         verifyVariables(traversal, Set.of(), Set.of(LOW_NAME, HIGH_NAME));
     }
 
     @Test
     public void getLowShouldPinVariable() {
         GraphTraversal.Admin<Object, Object> traversal = __.range(Scope.local, 
GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
-        assertEquals((Long) LOW_VALUE, 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRange());
+        assertEquals((Long) LOW_VALUE, ((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getLowRange());
         verifyVariables(traversal, Set.of(LOW_NAME), Set.of(HIGH_NAME));
     }
 
     @Test
     public void getHighShouldPinVariable() {
         GraphTraversal.Admin<Object, Object> traversal = __.range(Scope.local, 
GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
-        assertEquals((Long) HIGH_VALUE, 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRange());
+        assertEquals((Long) HIGH_VALUE, ((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).getHighRange());
         verifyVariables(traversal, Set.of(HIGH_NAME), Set.of(LOW_NAME));
     }
 
     @Test
     public void getLowHighRangeGValueFromConcreteStep() {
         GraphTraversal.Admin<Object, Object> traversal = __.range(Scope.local, 
GValue.of(LOW_NAME, LOW_VALUE), GValue.of(HIGH_NAME, HIGH_VALUE)).asAdmin();
-        assertEquals((Long) LOW_VALUE, 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getLowRange());
-        assertEquals((Long) HIGH_VALUE, 
((RangeStepPlaceholder.RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getHighRange());
+        assertEquals((Long) LOW_VALUE, ((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getLowRange());
+        assertEquals((Long) HIGH_VALUE, ((RangeLocalStepPlaceholder) 
traversal.getSteps().get(0)).asConcreteStep().getHighRange());
     }
 
     @Test
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
index e7a5fc6745..3832326eb5 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/GValueManagerVerifier.java
@@ -27,7 +27,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValue;
 import org.apache.tinkerpop.gremlin.process.traversal.step.GValueHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeStepPlaceholder.RangeGlobalStepPlaceholder;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStepPlaceholder;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStepPlaceholder;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;

Reply via email to