You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/06/04 22:38:05 UTC

[1/4] incubator-tinkerpop git commit: Refactor RangeLocalStep.applyRange for readability

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master f4a44a63f -> b1dc60125


Refactor RangeLocalStep.applyRange for readability


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

Branch: refs/heads/master
Commit: c26b87ce8c763f5d9cdcb735078b685a0af85b82
Parents: 25ed1fb
Author: mhfrantz <mf...@redsealnetworks.com>
Authored: Thu Jun 4 12:02:31 2015 -0700
Committer: mhfrantz <mf...@redsealnetworks.com>
Committed: Thu Jun 4 12:02:31 2015 -0700

----------------------------------------------------------------------
 .../traversal/step/map/RangeLocalStep.java      | 62 +++++++++++---------
 1 file changed, 35 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c26b87ce/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
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 3e5b752..33673b8 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
@@ -64,39 +64,47 @@ public final class RangeLocalStep<S> extends MapStep<S, S> {
      * </li>
      * </ul>
      */
-    static <S> S applyRange(S start, long low, long high) {
+    static <S> S applyRange(final S start, final long low, final long high) {
         if (start instanceof Map) {
-            final Map map = (Map) start;
-            final long capacity = (high != -1 ? high : map.size()) - low;
-            final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
-            long c = 0L;
-            for (final Object obj : map.entrySet()) {
-                final Map.Entry entry = (Map.Entry) obj;
-                if (c >= low) {
-                    if (c < high || high == -1) {
-                        result.put(entry.getKey(), entry.getValue());
-                    } else break;
-                }
-                c++;
-            }
-            return (S) result;
+            return (S) applyRangeMap((Map) start, low, high);
         } else if (start instanceof Collection) {
-            final Collection collection = (Collection) start;
-            final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
-            long c = 0L;
-            for (final Object item : collection) {
-                if (c >= low) {
-                    if (c < high || high == -1) {
-                        result.add(item);
-                    } else break;
-                }
-                c++;
-            }
-            return (S) result;
+            return (S) applyRangeCollection((Collection) start, low, high);
         }
         return start;
     }
 
+    /** Extracts specified range of elements from a Map. */
+    private static Map applyRangeMap(final Map map, final long low, final long high) {
+        final long capacity = (high != -1 ? high : map.size()) - low;
+        final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
+        long c = 0L;
+        for (final Object obj : map.entrySet()) {
+            final Map.Entry entry = (Map.Entry) obj;
+            if (c >= low) {
+                if (c < high || high == -1) {
+                    result.put(entry.getKey(), entry.getValue());
+                } else break;
+            }
+            c++;
+        }
+        return result;
+    }
+
+    /** Extracts specified range of elements from a Collection. */
+    private static Collection applyRangeCollection(final Collection collection, final long low, final long high) {
+        final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+        long c = 0L;
+        for (final Object item : collection) {
+            if (c >= low) {
+                if (c < high || high == -1) {
+                    result.add(item);
+                } else break;
+            }
+            c++;
+        }
+        return result;
+    }
+
     @Override
     public String toString() {
         return StringFactory.stepString(this, this.low, this.high);


[4/4] incubator-tinkerpop git commit: fixed a ) bug in GroovyRangeTest.

Posted by ok...@apache.org.
fixed a ) bug in GroovyRangeTest.


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

Branch: refs/heads/master
Commit: b1dc601257f52adbfa865a797c020b3da97a4f06
Parents: 2d7af58
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 4 14:37:49 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 4 14:37:49 2015 -0600

----------------------------------------------------------------------
 .../step/filter/GroovyRangeTest.groovy          | 23 +++++++++-----------
 .../traversal/step/filter/RangeTest.java        | 18 +++++++--------
 2 files changed, 19 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b1dc6012/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
index 0a1da2f..7342245 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
@@ -18,13 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.filter
 
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
-import java.util.List;
-import java.util.Map;
-
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -69,47 +66,47 @@ public abstract class GroovyRangeTest {
 
         @Override
         public Traversal<Vertex, List<String>> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X() {
-            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold().limit(local, 2)", g)
+            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold).limit(local,2)", g)
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X() {
-            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold().limit(local, 1)", g)
+            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold).limit(local,1)", g)
         }
 
         @Override
         public Traversal<Vertex, List<String>> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X() {
-            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 1, 3)", g)
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold).range(local,1,3)", g)
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X() {
-            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 1, 2)", g)
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold).range(local,1,2)", g)
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X() {
-            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 4, 5)", g)
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold).range(local,4,5)", g)
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X() {
-            TraversalScriptHelper.compute("g.V().as('a').in().as('b').in().as('c').select().by('name').limit(local, 2)", g)
+            TraversalScriptHelper.compute("g.V.as('a').in.as('b').in.as('c').select.by('name').limit(local,2)", g)
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X() {
-            TraversalScriptHelper.compute("g.V().as('a').in().as('b').in().as('c').select().by('name').limit(local, 1)", g)
+            TraversalScriptHelper.compute("g.V.as('a').in.as('b').in.as('c').select.by('name').limit(local,1)", g)
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X() {
-            TraversalScriptHelper.compute("g.V().as('a').out().as('b').out().as('c').select().by('name').range(local, 1, 3)", g)
+            TraversalScriptHelper.compute("g.V.as('a').out.as('b').out.as('c').select.by('name').range(local,1,3)", g)
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X() {
-            TraversalScriptHelper.compute("g.V().as('a').out().as('b').out().as('c').select().by('name').range(local, 1, 2)", g)
+            TraversalScriptHelper.compute("g.V.as('a').out.as('b').out.as('c').select.by('name').range(local,1,2)", g)
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b1dc6012/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
index 0859838..95be378 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
@@ -335,47 +335,47 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, List<String>> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X() {
-            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<List<String>>limit(local, 2);
+            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).limit(local, 2);
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X() {
-            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>limit(local, 1);
+            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).limit(local, 1);
         }
 
         @Override
         public Traversal<Vertex, List<String>> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X() {
-            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<List<String>>range(local, 1, 3);
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).range(local, 1, 3);
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X() {
-            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>range(local, 1, 2);
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).range(local, 1, 2);
         }
 
         @Override
         public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X() {
-            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>range(local, 4, 5);
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).range(local, 4, 5);
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X() {
-            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").<Map<String, String>>limit(local, 2);
+            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").limit(local, 2);
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X() {
-            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").<Map<String, String>>limit(local, 1);
+            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").limit(local, 1);
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X() {
-            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").<Map<String, String>>range(local, 1, 3);
+            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").range(local, 1, 3);
         }
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X() {
-            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").<Map<String, String>>range(local, 1, 2);
+            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").range(local, 1, 2);
         }
     }
 }


[3/4] incubator-tinkerpop git commit: Merge branch 'chore/TP3-limit-local-1-should-emit-element_96105186' of https://github.com/RedSeal-co/incubator-tinkerpop

Posted by ok...@apache.org.
Merge branch 'chore/TP3-limit-local-1-should-emit-element_96105186' of https://github.com/RedSeal-co/incubator-tinkerpop


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

Branch: refs/heads/master
Commit: 2d7af5823563fef3848078eaa3b90f21c8917dd8
Parents: f4a44a6 fd3a6c9
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 4 14:08:28 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 4 14:08:28 2015 -0600

----------------------------------------------------------------------
 .../traversal/dsl/graph/GraphTraversal.java     |  14 +-
 .../traversal/step/map/RangeLocalStep.java      |  79 +++++---
 .../traversal/step/map/TailLocalStep.java       |  15 +-
 .../step/filter/GroovyRangeTest.groovy          |  48 +++++
 .../traversal/step/filter/RangeTest.java        | 195 ++++++++++++++++++-
 5 files changed, 302 insertions(+), 49 deletions(-)
----------------------------------------------------------------------



[2/4] incubator-tinkerpop git commit: TINKERPOP3-673: limit/range local single element eschews List

Posted by ok...@apache.org.
TINKERPOP3-673: limit/range local single element eschews List


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

Branch: refs/heads/master
Commit: fd3a6c9f42106b666d65688ec52281a29f2bfc46
Parents: c26b87c
Author: mhfrantz <mf...@redsealnetworks.com>
Authored: Thu Jun 4 12:19:09 2015 -0700
Committer: mhfrantz <mf...@redsealnetworks.com>
Committed: Thu Jun 4 12:19:09 2015 -0700

----------------------------------------------------------------------
 .../traversal/dsl/graph/GraphTraversal.java     |  14 +-
 .../traversal/step/map/RangeLocalStep.java      |  23 ++-
 .../traversal/step/map/TailLocalStep.java       |  15 +-
 .../step/filter/GroovyRangeTest.groovy          |  48 +++++
 .../traversal/step/filter/RangeTest.java        | 195 ++++++++++++++++++-
 5 files changed, 270 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/fd3a6c9f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
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 5a035b7..c41c44c 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
@@ -509,20 +509,20 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> range(final long low, final long high) {
-        return this.range(Scope.global, low, high);
+        return this.<E>range(Scope.global, low, high);
     }
 
-    public default GraphTraversal<S, E> range(final Scope scope, final long low, final long high) {
+    public default <E2> GraphTraversal<S, E2> range(final Scope scope, final long low, final long high) {
         return this.asAdmin().addStep(scope.equals(Scope.global)
                 ? new RangeGlobalStep<>(this.asAdmin(), low, high)
                 : new RangeLocalStep<>(this.asAdmin(), low, high));
     }
 
     public default GraphTraversal<S, E> limit(final long limit) {
-        return this.range(Scope.global, 0, limit);
+        return this.<E>range(Scope.global, 0, limit);
     }
 
-    public default GraphTraversal<S, E> limit(final Scope scope, final long limit) {
+    public default <E2> GraphTraversal<S, E2> limit(final Scope scope, final long limit) {
         return this.range(scope, 0, limit);
     }
 
@@ -534,11 +534,11 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.tail(Scope.global, limit);
     }
 
-    public default GraphTraversal<S, E> tail(final Scope scope) {
-        return this.tail(scope, 1);
+    public default <E2> GraphTraversal<S, E2> tail(final Scope scope) {
+        return this.<E2>tail(scope, 1);
     }
 
-    public default GraphTraversal<S, E> tail(final Scope scope, final long limit) {
+    public default <E2> GraphTraversal<S, E2> tail(final Scope scope, final long limit) {
         return this.asAdmin().addStep(scope.equals(Scope.global)
                 ? new TailGlobalStep<>(this.asAdmin(), limit)
                 : new TailLocalStep<>(this.asAdmin(), limit));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/fd3a6c9f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
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 33673b8..773a48b 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
@@ -22,6 +22,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 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 java.util.*;
@@ -91,17 +92,33 @@ public final class RangeLocalStep<S> extends MapStep<S, S> {
     }
 
     /** Extracts specified range of elements from a Collection. */
-    private static Collection applyRangeCollection(final Collection collection, final long low, final long high) {
-        final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+    private static Object applyRangeCollection(final Collection collection, final long low, final long high) {
+        // See if we only want a single item.  It is also possible that we will allow more than one item, but that the
+        // incoming container is only capable of producing a single item.  In that case, we will still emit a
+        // container.  This allows the result type to be predictable based on the step arguments.  It also allows us to
+        // avoid creating the result container for the single case.
+        boolean single = high != -1 ? (high - low == 1) : false;
+
+        final Collection resultCollection =
+            single ? null : (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+        Object result = single ? null : resultCollection;
         long c = 0L;
         for (final Object item : collection) {
             if (c >= low) {
                 if (c < high || high == -1) {
-                    result.add(item);
+                    if (single) {
+                        result = item;
+                        break;
+                    } else {
+                        resultCollection.add(item);
+                    }
                 } else break;
             }
             c++;
         }
+        if (null == result)
+            // We have nothing to emit, so stop traversal.
+            throw FastNoSuchElementException.instance();
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/fd3a6c9f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
index 3075529..43f6d9d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TailLocalStep.java
@@ -22,7 +22,6 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 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 java.util.Collection;
@@ -54,19 +53,7 @@ public final class TailLocalStep<S> extends MapStep<S, S> {
                                 this.limit;
         final long low = high - this.limit;
         final S result = RangeLocalStep.applyRange(start, low, high);
-
-        // If we are limiting a collection to a single item, then emit only that item.
-        if (1 == this.limit && result instanceof Collection) {
-            final Collection c = (Collection) result;
-            if (c.isEmpty()) {
-                // We have nothing to emit, so stop traversal.
-                throw FastNoSuchElementException.instance();
-            } else {
-                return (S) c.iterator().next();
-            }
-        } else {
-            return result;
-        }
+        return result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/fd3a6c9f/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
index f1be1d4..0a1da2f 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
@@ -22,6 +22,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -63,5 +66,50 @@ public abstract class GroovyRangeTest {
         public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
             TraversalScriptHelper.compute("g.V().repeat(__.both).times(3)[5..11]", g)
         }
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X() {
+            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold().limit(local, 2)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X() {
+            TraversalScriptHelper.compute("g.V().as('a').in().as('a').in().as('a').select('a').by(unfold().values('name').fold().limit(local, 1)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X() {
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 1, 3)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X() {
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 1, 2)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X() {
+            TraversalScriptHelper.compute("g.V().as('a').out().as('a').out().as('a').select('a').by(unfold().values('name').fold().range(local, 4, 5)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X() {
+            TraversalScriptHelper.compute("g.V().as('a').in().as('b').in().as('c').select().by('name').limit(local, 2)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X() {
+            TraversalScriptHelper.compute("g.V().as('a').in().as('b').in().as('c').select().by('name').limit(local, 1)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X() {
+            TraversalScriptHelper.compute("g.V().as('a').out().as('b').out().as('c').select().by('name').range(local, 1, 3)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X() {
+            TraversalScriptHelper.compute("g.V().as('a').out().as('b').out().as('c').select().by('name').range(local, 1, 2)", g)
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/fd3a6c9f/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
index 68a6e83..0859838 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -30,9 +31,17 @@ import org.junit.runner.RunWith;
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.unfold;
+import static org.apache.tinkerpop.gremlin.process.traversal.Scope.local;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -54,6 +63,24 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
 
+    public abstract Traversal<Vertex, List<String>> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X();
+
+    public abstract Traversal<Vertex, String> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X();
+
+    public abstract Traversal<Vertex, List<String>> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X();
+
+    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X();
+
+    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_VX1X_out_limitX2X() {
@@ -149,6 +176,127 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
         assertEquals(6, counter);
     }
 
+    /** Scenario: limit step, Scope.local, >1 item requested, List<String> input, List<String> output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X() {
+        final Traversal<Vertex, List<String>> traversal = get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X();
+        printTraversalForm(traversal);
+        final Set<List<String>> expected =
+            new HashSet(Arrays.asList(
+                            Arrays.asList("ripple", "josh"),
+                            Arrays.asList("lop", "josh")));
+        final Set<List<String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: limit step, Scope.local, 1 item requested, List input, String output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X() {
+        final Traversal<Vertex, String> traversal = get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X();
+        printTraversalForm(traversal);
+        final Set<String> expected = new HashSet(Arrays.asList("ripple", "lop"));
+        final Set<List<String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: range step, Scope.local, >1 item requested, List<String> input, List<String> output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X() {
+        final Traversal<Vertex, List<String>> traversal = get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X();
+        printTraversalForm(traversal);
+        final Set<List<String>> expected =
+            new HashSet(Arrays.asList(
+                            Arrays.asList("josh", "ripple"),
+                            Arrays.asList("josh", "lop")));
+        final Set<List<String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: range step, Scope.local, 1 item requested, List input, String output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X() {
+        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final String s = traversal.next();
+            assertEquals("josh", s);
+            counter++;
+        }
+        assertEquals(2, counter);
+    }
+
+    /** Scenario: range step, Scope.local, 1 item requested, List input, no items selected, stop traversal */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X() {
+        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X();
+        printTraversalForm(traversal);
+        assertEquals(Arrays.asList(), traversal.toList());
+    }
+
+    /** Scenario: limit step, Scope.local, >1 item requested, Map input, Map output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X();
+        printTraversalForm(traversal);
+        final Set<Map<String, String>> expected = new HashSet(makeMapList(2,
+                "a", "ripple", "b", "josh",
+                "a", "lop", "b", "josh"));
+        final Set<Map<String, String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: limit step, Scope.local, 1 item requested, Map input, Map output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X();
+        printTraversalForm(traversal);
+        final Set<Map<String, String>> expected = new HashSet(makeMapList(1,
+                 "a", "ripple",
+                 "a", "lop"));
+        final Set<Map<String, String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: range step, Scope.local, >1 item requested, Map input, Map output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X();
+        printTraversalForm(traversal);
+        final Set<Map<String, String>> expected = new HashSet(makeMapList(2,
+                 "b", "josh", "c", "ripple",
+                 "b", "josh", "c", "lop"));
+        final Set<Map<String, String>> actual = new HashSet(traversal.toList());
+        assertEquals(expected, actual);
+    }
+
+    /** Scenario: range step, Scope.local, 1 item requested, Map input, Map output */
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X();
+        printTraversalForm(traversal);
+        // Since both of the tuples are identical, we count them.
+        final Set<Map<String, String>> expected = new HashSet(makeMapList(1, "b", "josh"));
+        final Set<Map<String, String>> actual = new HashSet();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final Map<String, String> map = traversal.next();
+            actual.add(map);
+            counter++;
+        }
+        assertEquals(2, counter);
+        assertEquals(expected, actual);
+    }
+
     public static class Traversals extends RangeTest {
         @Override
         public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
@@ -184,5 +332,50 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
             return g.V().repeat(both()).times(3).range(5, 11);
         }
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_2X() {
+            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<List<String>>limit(local, 2);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_in_asXaX_in_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_limitXlocal_1X() {
+            return g.V().as("a").in().as("a").in().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>limit(local, 1);
+        }
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_3X() {
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<List<String>>range(local, 1, 3);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_1_2X() {
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>range(local, 1, 2);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_asXaX_out_asXaX_selectXaX_byXunfold_valuesXnameX_foldX_rangeXlocal_4_5X() {
+            return g.V().as("a").out().as("a").out().as("a").<List<String>>select("a").by(unfold().values("name").fold()).<String>range(local, 4, 5);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_2X() {
+            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").<Map<String, String>>limit(local, 2);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_in_asXbX_in_asXcX_select_byXnameX_limitXlocal_1X() {
+            return g.V().as("a").in().as("b").in().as("c").<Map<String, String>>select().by("name").<Map<String, String>>limit(local, 1);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_3X() {
+            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").<Map<String, String>>range(local, 1, 3);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_select_byXnameX_rangeXlocal_1_2X() {
+            return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select().by("name").<Map<String, String>>range(local, 1, 2);
+        }
     }
-}
\ No newline at end of file
+}