You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2017/01/10 09:50:38 UTC

tinkerpop git commit: Added `skip(long)` and `skip((Scope, long)` which call the `range(low, high)` equivalents with -1 as the high. Also added test cases and fixed the OLAP implementation (which probably never worked before).

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1549 [created] 3d0aa6e37


Added `skip(long)` and `skip((Scope,long)` which call the `range(low,high)` equivalents with -1 as the high.
Also added test cases and fixed the OLAP implementation (which probably never worked before).


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

Branch: refs/heads/TINKERPOP-1549
Commit: 3d0aa6e37e1ff40481cc8cde7e01862d66220c00
Parents: b2cde4e
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Tue Jan 10 10:48:27 2017 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Tue Jan 10 10:48:27 2017 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../traversal/dsl/graph/GraphTraversal.java     | 13 +++++++
 .../gremlin/process/traversal/dsl/graph/__.java | 14 ++++++++
 .../traversal/step/filter/RangeGlobalStep.java  | 18 ++++++----
 .../process/traversal/step/StepTest.java        |  1 -
 .../step/filter/RangeGlobalStepTest.java        |  1 +
 .../step/filter/GroovyRangeTest.groovy          | 10 ++++++
 .../gremlin_python/process/graph_traversal.py   | 11 ++++++
 .../traversal/step/filter/RangeTest.java        | 37 ++++++++++++++++++++
 9 files changed, 99 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 12bc44e..5ce9e7c 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -60,6 +60,7 @@ TinkerPop 3.3.0 (Release Date: NOT OFFICIALLY RELEASED YET)
 * Changed `gremlin-benchmark` system property for the report location to `benchmarkReportDir` for consistency.
 * Added SysV and systemd init scripts.
 * `GraphTraversal.valueMap(includeTokens,propertyKeys...)` now returns a `Map<Object,E>` since keys could be `T.id` or `T.label`.
+* Added `skip(long)` and `skip((Scope,long)` which call the `range(low,high)` equivalents with -1 as the high.
 
 TinkerPop 3.2.0 (Nine Inch Gremlins)
 ------------------------------------

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/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 7ffee40..ecd3cea 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
@@ -1135,6 +1135,18 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
                 : new RangeLocalStep<>(this.asAdmin(), 0, limit));
     }
 
+    public default GraphTraversal<S, E> skip(final long n) {
+        this.asAdmin().getBytecode().addStep(Symbols.skip, n);
+        return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), n, -1));
+    }
+
+    public default <E2> GraphTraversal<S, E2> skip(final Scope scope, final long n) {
+        this.asAdmin().getBytecode().addStep(Symbols.skip, scope, n);
+        return this.asAdmin().addStep(scope.equals(Scope.global)
+                ? new RangeGlobalStep<>(this.asAdmin(), n, -1)
+                : new RangeLocalStep<>(this.asAdmin(), n, -1));
+    }
+
     public default GraphTraversal<S, E> tail() {
         this.asAdmin().getBytecode().addStep(Symbols.tail);
         return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), 1));
@@ -1671,6 +1683,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         public static final String not = "not";
         public static final String range = "range";
         public static final String limit = "limit";
+        public static final String skip = "skip";
         public static final String tail = "tail";
         public static final String coin = "coin";
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 2ec0d0a..33fe2de 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -810,6 +810,20 @@ public class __ {
     }
 
     /**
+     * @see GraphTraversal#skip(long)
+     */
+    public static <A> GraphTraversal<A, A> skip(final long n) {
+        return __.<A>start().skip(n);
+    }
+
+    /**
+     * @see GraphTraversal#skip(Scope, long)
+     */
+    public static <A> GraphTraversal<A, A> skip(final Scope scope, final long n) {
+        return __.<A>start().skip(scope, n);
+    }
+
+    /**
      * @see GraphTraversal#tail()
      */
     public static <A> GraphTraversal<A, A> tail() {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
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 9458ca9..9700870 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
@@ -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.Barrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 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;
@@ -33,9 +32,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.NoSuchElementException;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BinaryOperator;
@@ -128,6 +125,15 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
     }
 
     @Override
+    public boolean equals(final Object other) {
+        if (super.equals(other)) {
+            final RangeGlobalStep typedOther = (RangeGlobalStep) other;
+            return typedOther.low == this.low && typedOther.high == this.high;
+        }
+        return false;
+    }
+
+    @Override
     public Set<TraverserRequirement> getRequirements() {
         return Collections.singleton(TraverserRequirement.BULK);
     }
@@ -178,8 +184,8 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
 
         private final long highRange;
 
-        private RangeBiOperator() {
-            this.highRange = Long.MAX_VALUE;
+        public RangeBiOperator() {
+            this(-1);
         }
 
         public RangeBiOperator(final long highRange) {
@@ -188,7 +194,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
 
         @Override
         public TraverserSet<S> apply(final TraverserSet<S> mutatingSeed, final TraverserSet<S> set) {
-            if (mutatingSeed.size() < this.highRange)
+            if (this.highRange == -1 || mutatingSeed.size() < this.highRange)
                 mutatingSeed.addAll(set);
             return mutatingSeed;
         }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/StepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/StepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/StepTest.java
index 3e1798e..cfdb08b 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/StepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/StepTest.java
@@ -58,7 +58,6 @@ public abstract class StepTest {
                 final Step instance2 = instances2.get(j);
                 if (i != j) {
                     assertNotEquals(instance1, instance2);
-                    assertNotEquals(instance1.hashCode(), instance2.hashCode());
                 } else {
                     assertEquals(instance1, instance2);
                     assertEquals(instance1.hashCode(), instance2.hashCode());

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepTest.java
----------------------------------------------------------------------
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 45f5138..cbbe0a1 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
@@ -34,6 +34,7 @@ public class RangeGlobalStepTest extends StepTest {
     protected List<Traversal> getTraversals() {
         return Arrays.asList(
                 __.limit(10L),
+                __.skip(10L),
                 __.range(1L, 10L)
         );
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/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 7ab4e6e..53f475c 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
@@ -108,5 +108,15 @@ public abstract class GroovyRangeTest {
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X() {
             new ScriptTraversal<>(g, "gremlin-groovy", "g.V.as('a').out.as('b').out.as('c').select('a','b','c').by('name').range(local,1,2)")
         }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_skipX2X_count() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.skip(2).count()")
+        }
+
+        @Override
+        public Traversal<Vertex, List<Vertex>> get_g_V_fold_skipXlocal_2X() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.fold.skip(local, 2)")
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
index c07853a..df61495 100644
--- a/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
+++ b/gremlin-python/src/main/jython/gremlin_python/process/graph_traversal.py
@@ -349,6 +349,9 @@ class GraphTraversal(Traversal):
   def simplePath(self, *args):
     self.bytecode.add_step("simplePath", *args)
     return self
+  def skip(self, *args):
+    self.bytecode.add_step("skip", *args)
+    return self
   def store(self, *args):
     self.bytecode.add_step("store", *args)
     return self
@@ -635,6 +638,9 @@ class __(object):
   def simplePath(*args):
     return GraphTraversal(None, None, Bytecode()).simplePath(*args)
   @staticmethod
+  def skip(*args):
+    return GraphTraversal(None, None, Bytecode()).skip(*args)
+  @staticmethod
   def store(*args):
     return GraphTraversal(None, None, Bytecode()).store(*args)
   @staticmethod
@@ -1062,6 +1068,11 @@ def simplePath(*args):
 
 statics.add_static('simplePath', simplePath)
 
+def skip(*args):
+      return __.skip(*args)
+
+statics.add_static('skip', skip)
+
 def store(*args):
       return __.store(*args)
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3d0aa6e3/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 5ae86f9..3307e4c 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
@@ -39,6 +39,7 @@ 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.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -80,6 +81,10 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X();
 
+    public abstract Traversal<Vertex, Long> get_g_V_skipX2X_count();
+
+    public abstract Traversal<Vertex, List<Vertex>> get_g_V_fold_skipXlocal_2X();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_VX1X_out_limitX2X() {
@@ -314,6 +319,28 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
         assertEquals(expected, actual);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_skipX2X_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_skipX2X_count();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Long count = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(4, count.longValue());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_fold_skipXlocal_2X() {
+        final Traversal<Vertex, List<Vertex>> traversal = get_g_V_fold_skipXlocal_2X();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final List<Vertex> list = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(4, list.size());
+    }
+
     public static class Traversals extends RangeTest {
         @Override
         public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
@@ -394,5 +421,15 @@ public abstract class RangeTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X() {
             return g.V().as("a").out().as("b").out().as("c").<Map<String, String>>select("a", "b", "c").by("name").range(local, 1, 2);
         }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_skipX2X_count() {
+            return g.V().skip(2).count();
+        }
+
+        @Override
+        public Traversal<Vertex, List<Vertex>> get_g_V_fold_skipXlocal_2X() {
+            return g.V().fold().skip(local, 2);
+        }
     }
 }