From 3d0aa6e37e1ff40481cc8cde7e01862d66220c00 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 10 Jan 2017 10:48:27 +0100 Subject: [PATCH 1/5] 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). --- CHANGELOG.asciidoc | 1 + .../traversal/dsl/graph/GraphTraversal.java | 13 +++++++ .../process/traversal/dsl/graph/__.java | 14 +++++++ .../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(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 12bc44e27ea..5ce9e7c3084 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` 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) ------------------------------------ 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 7ffee40dcd8..ecd3cea1cff 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 default GraphTraversal limit(final Scope scope, final long li : new RangeLocalStep<>(this.asAdmin(), 0, limit)); } + public default GraphTraversal skip(final long n) { + this.asAdmin().getBytecode().addStep(Symbols.skip, n); + return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), n, -1)); + } + + public default GraphTraversal 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 tail() { this.asAdmin().getBytecode().addStep(Symbols.tail); return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), 1)); @@ -1671,6 +1683,7 @@ private Symbols() { 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"; 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 2ec0d0adf0e..33fe2deacc5 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 @@ -809,6 +809,20 @@ public static GraphTraversal limit(final Scope scope, final long limit return __.start().limit(scope, limit); } + /** + * @see GraphTraversal#skip(long) + */ + public static GraphTraversal skip(final long n) { + return __.start().skip(n); + } + + /** + * @see GraphTraversal#skip(Scope, long) + */ + public static GraphTraversal skip(final Scope scope, final long n) { + return __.start().skip(scope, n); + } + /** * @see GraphTraversal#tail() */ 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 9458ca99ee9..9700870c8bf 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.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 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; @@ -127,6 +124,15 @@ public int hashCode() { return super.hashCode() ^ Long.hashCode(this.low) ^ Long.hashCode(this.high); } + @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 getRequirements() { return Collections.singleton(TraverserRequirement.BULK); @@ -178,8 +184,8 @@ public static final class RangeBiOperator implements BinaryOperator apply(final TraverserSet mutatingSeed, final TraverserSet set) { - if (mutatingSeed.size() < this.highRange) + if (this.highRange == -1 || mutatingSeed.size() < this.highRange) mutatingSeed.addAll(set); return mutatingSeed; } 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 3e1798ee518..cfdb08b8c05 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 void testEquality() { 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()); 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 45f51380622..cbbe0a140ec 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 getTraversals() { return Arrays.asList( __.limit(10L), + __.skip(10L), __.range(1L, 10L) ); } 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 7ab4e6ef13b..53f475c9dbb 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> 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 get_g_V_skipX2X_count() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.skip(2).count()") + } + + @Override + public Traversal> get_g_V_fold_skipXlocal_2X() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.fold.skip(local, 2)") + } } } 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 c07853afa2d..df61495b52c 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 @@ def sideEffect(self, *args): 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 @@ def sideEffect(*args): 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) 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 5ae86f93877..3307e4c4674 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.__.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> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X(); + public abstract Traversal get_g_V_skipX2X_count(); + + public abstract Traversal> get_g_V_fold_skipXlocal_2X(); + @Test @LoadGraphWith(MODERN) public void g_VX1X_out_limitX2X() { @@ -314,6 +319,28 @@ public void g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2 assertEquals(expected, actual); } + @Test + @LoadGraphWith(MODERN) + public void g_V_skipX2X_count() { + final Traversal 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> traversal = get_g_V_fold_skipXlocal_2X(); + printTraversalForm(traversal); + assertTrue(traversal.hasNext()); + final List list = traversal.next(); + assertFalse(traversal.hasNext()); + assertEquals(4, list.size()); + } + public static class Traversals extends RangeTest { @Override public Traversal get_g_VX1X_out_limitX2X(final Object v1Id) { @@ -394,5 +421,15 @@ public Traversal> get_g_V_asXaX_out_asXbX_out_asXcX_ public Traversal> 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").>select("a", "b", "c").by("name").range(local, 1, 2); } + + @Override + public Traversal get_g_V_skipX2X_count() { + return g.V().skip(2).count(); + } + + @Override + public Traversal> get_g_V_fold_skipXlocal_2X() { + return g.V().fold().skip(local, 2); + } } } From 71de237d32b687d2ee70ccecd2e7bf8d86a64b24 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 10 Jan 2017 11:26:53 +0100 Subject: [PATCH 2/5] Added `skip()` in the reference docs. --- docs/src/reference/the-traversal.asciidoc | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc index b468e4817f2..0dafd22ed49 100644 --- a/docs/src/reference/the-traversal.asciidoc +++ b/docs/src/reference/the-traversal.asciidoc @@ -1916,6 +1916,35 @@ g.V(1).both().both().simplePath() g.V(1).both().both().simplePath().path() ---- +[[skip-step]] +Skip Step +~~~~~~~~~ + +The `skip()`-step is analogous to <> save that the higher end range is set to -1. + +[gremlin-groovy,modern] +---- +g.V().skip(2) +g.V().range(2, -1) +g.V().skip(2).toString() +---- + +The `skip()`-step can also be applied with `Scope.local`, in which case it operates on the incoming collection. + +[gremlin-groovy,modern] +---- +g.V().hasLabel('person').filter(outE('created')).as('p'). <1> + map(out('created').values('name').fold()). + project('person','primary','other'). + by(select('p').by('name')). + by(limit(local, 1)). <2> + by(skip(local, 1)) <3> +---- + +<1> For each person who created something... +<2> ...select the first project (random order) as `primary` and... +<3> ...select all other projects as `other`. + [[store-step]] Store Step ~~~~~~~~~~ From bfbd7d549a19e9b4b2beeff723b0cd821d3ea457 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 10 Jan 2017 15:00:57 +0100 Subject: [PATCH 3/5] Implemented changes suggested by @okram. --- docs/src/reference/the-traversal.asciidoc | 7 +++-- .../traversal/dsl/graph/GraphTraversal.java | 14 +++++----- .../process/traversal/dsl/graph/__.java | 8 +++--- .../step/filter/GroovyRangeTest.groovy | 8 +++--- .../traversal/step/filter/RangeTest.java | 27 +++++++++---------- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc index 0dafd22ed49..0bdff70d197 100644 --- a/docs/src/reference/the-traversal.asciidoc +++ b/docs/src/reference/the-traversal.asciidoc @@ -865,7 +865,6 @@ The `limit()`-step is analogous to <> save that the l ---- g.V().limit(2) g.V().range(0, 2) -g.V().limit(2).toString() ---- The `limit()`-step can also be applied with `Scope.local`, in which case it operates on the incoming collection. @@ -1924,9 +1923,9 @@ The `skip()`-step is analogous to <> save that the hi [gremlin-groovy,modern] ---- -g.V().skip(2) -g.V().range(2, -1) -g.V().skip(2).toString() +g.V().values('age').order() +g.V().values('age').order().skip(2) +g.V().values('age').order().range(2, -1) ---- The `skip()`-step can also be applied with `Scope.local`, in which case it operates on the incoming collection. 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 ecd3cea1cff..9eb28726a04 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,16 +1135,16 @@ public default GraphTraversal limit(final Scope scope, final long li : new RangeLocalStep<>(this.asAdmin(), 0, limit)); } - public default GraphTraversal skip(final long n) { - this.asAdmin().getBytecode().addStep(Symbols.skip, n); - return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), n, -1)); + public default GraphTraversal skip(final long skip) { + this.asAdmin().getBytecode().addStep(Symbols.skip, skip); + return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), skip, -1)); } - public default GraphTraversal skip(final Scope scope, final long n) { - this.asAdmin().getBytecode().addStep(Symbols.skip, scope, n); + public default GraphTraversal skip(final Scope scope, final long skip) { + this.asAdmin().getBytecode().addStep(Symbols.skip, scope, skip); return this.asAdmin().addStep(scope.equals(Scope.global) - ? new RangeGlobalStep<>(this.asAdmin(), n, -1) - : new RangeLocalStep<>(this.asAdmin(), n, -1)); + ? new RangeGlobalStep<>(this.asAdmin(), skip, -1) + : new RangeLocalStep<>(this.asAdmin(), skip, -1)); } public default GraphTraversal tail() { 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 33fe2deacc5..d01f49aeb95 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 @@ -812,15 +812,15 @@ public static GraphTraversal limit(final Scope scope, final long limit /** * @see GraphTraversal#skip(long) */ - public static GraphTraversal skip(final long n) { - return __.start().skip(n); + public static GraphTraversal skip(final long skip) { + return __.start().skip(skip); } /** * @see GraphTraversal#skip(Scope, long) */ - public static GraphTraversal skip(final Scope scope, final long n) { - return __.start().skip(scope, n); + public static GraphTraversal skip(final Scope scope, final long skip) { + return __.start().skip(scope, skip); } /** 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 53f475c9dbb..56cb19de2cf 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 @@ -110,13 +110,13 @@ public abstract class GroovyRangeTest { } @Override - public Traversal get_g_V_skipX2X_count() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.skip(2).count()") + public Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').order.by('age').skip(1).values('name')") } @Override - public Traversal> get_g_V_fold_skipXlocal_2X() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.fold.skip(local, 2)") + public Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.outE.values('weight').fold.order(local).skip(local, 2)") } } } 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 3307e4c4674..b04c3fabd04 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 @@ -81,9 +81,9 @@ public abstract class RangeTest extends AbstractGremlinProcessTest { public abstract Traversal> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X(); - public abstract Traversal get_g_V_skipX2X_count(); + public abstract Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX(); - public abstract Traversal> get_g_V_fold_skipXlocal_2X(); + public abstract Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X(); @Test @LoadGraphWith(MODERN) @@ -321,24 +321,21 @@ public void g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2 @Test @LoadGraphWith(MODERN) - public void g_V_skipX2X_count() { - final Traversal traversal = get_g_V_skipX2X_count(); + public void g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { + final Traversal traversal = get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX(); printTraversalForm(traversal); assertTrue(traversal.hasNext()); - final Long count = traversal.next(); - assertFalse(traversal.hasNext()); - assertEquals(4, count.longValue()); + assertEquals(Arrays.asList("marko", "josh", "peter"), traversal.toList()); } @Test @LoadGraphWith(MODERN) - public void g_V_fold_skipXlocal_2X() { - final Traversal> traversal = get_g_V_fold_skipXlocal_2X(); + public void g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { + final Traversal> traversal = get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X(); printTraversalForm(traversal); assertTrue(traversal.hasNext()); - final List list = traversal.next(); + assertEquals(Arrays.asList(0.4, 0.5, 1.0, 1.0), traversal.next()); assertFalse(traversal.hasNext()); - assertEquals(4, list.size()); } public static class Traversals extends RangeTest { @@ -423,13 +420,13 @@ public Traversal> get_g_V_asXaX_out_asXbX_out_asXcX_ } @Override - public Traversal get_g_V_skipX2X_count() { - return g.V().skip(2).count(); + public Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { + return g.V().hasLabel("person").order().by("age").skip(1).values("name"); } @Override - public Traversal> get_g_V_fold_skipXlocal_2X() { - return g.V().fold().skip(local, 2); + public Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { + return g.V().outE().values("weight").fold().order(local).skip(local, 2); } } } From ba6186a6e8b2d4569a3c4ebc8a30d26524006068 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 10 Jan 2017 16:07:12 +0100 Subject: [PATCH 4/5] made skip test OLAP friendly --- .../traversal/step/filter/GroovyRangeTest.groovy | 4 ++-- .../process/traversal/step/filter/RangeTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) 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 56cb19de2cf..4f7b0d44679 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 @@ -110,8 +110,8 @@ public abstract class GroovyRangeTest { } @Override - public Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').order.by('age').skip(1).values('name')") + public Traversal get_g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').order.by('age').values('name').skip(1)") } @Override 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 b04c3fabd04..0abaf70d0c5 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 @@ -81,7 +81,7 @@ public abstract class RangeTest extends AbstractGremlinProcessTest { public abstract Traversal> get_g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2X(); - public abstract Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX(); + public abstract Traversal get_g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X(); public abstract Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X(); @@ -321,8 +321,8 @@ public void g_V_asXaX_out_asXbX_out_asXcX_selectXa_b_cX_byXnameX_rangeXlocal_1_2 @Test @LoadGraphWith(MODERN) - public void g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { - final Traversal traversal = get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX(); + public void g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X() { + final Traversal traversal = get_g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X(); printTraversalForm(traversal); assertTrue(traversal.hasNext()); assertEquals(Arrays.asList("marko", "josh", "peter"), traversal.toList()); @@ -420,8 +420,8 @@ public Traversal> get_g_V_asXaX_out_asXbX_out_asXcX_ } @Override - public Traversal get_g_V_hasLabelXpersonX_order_byXageXskipX1X_valuesXnameX() { - return g.V().hasLabel("person").order().by("age").skip(1).values("name"); + public Traversal get_g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X() { + return g.V().hasLabel("person").order().by("age").values("name").skip(1); } @Override From 41f1288072bb06837c1c663143c33fbcbbfa9a91 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Tue, 10 Jan 2017 16:48:09 +0100 Subject: [PATCH 5/5] Fixed a bug in `OrderGlobalStep` and added the previously removed `RangeTest` test back. --- .../traversal/step/map/OrderGlobalStep.java | 2 +- .../traversal/step/filter/GroovyRangeTest.groovy | 5 +++++ .../process/traversal/step/filter/RangeTest.java | 16 ++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java index a7d21b2cb66..806dbf0f5f9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java @@ -172,7 +172,7 @@ public OrderBiOperator clone() { @Override public TraverserSet apply(final TraverserSet setA, final TraverserSet setB) { setA.addAll(setB); - if (Long.MAX_VALUE != this.limit && setA.bulkSize() > this.limit) { + if (this.limit != -1 && setA.bulkSize() > this.limit) { if (this.chainedComparator.isShuffle()) setA.shuffle(); else 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 4f7b0d44679..14d7282ac63 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 @@ -114,6 +114,11 @@ public abstract class GroovyRangeTest { new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').order.by('age').values('name').skip(1)") } + @Override + public Traversal get_g_V_hasLabelXpersonX_order_byXageX_skipX1X_valuesXnameX() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').order.by('age').skip(1).values('name')") + } + @Override public Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { new ScriptTraversal<>(g, "gremlin-groovy", "g.V.outE.values('weight').fold.order(local).skip(local, 2)") 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 0abaf70d0c5..3a565be420a 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 @@ -83,6 +83,8 @@ public abstract class RangeTest extends AbstractGremlinProcessTest { public abstract Traversal get_g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X(); + public abstract Traversal get_g_V_hasLabelXpersonX_order_byXageX_skipX1X_valuesXnameX(); + public abstract Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X(); @Test @@ -328,6 +330,15 @@ public void g_V_hasLabelXpersonX_order_byXageX_valuesXnameX_skipX1X() { assertEquals(Arrays.asList("marko", "josh", "peter"), traversal.toList()); } + @Test + @LoadGraphWith(MODERN) + public void g_V_hasLabelXpersonX_order_byXageX_skipX1X_valuesXnameX() { + final Traversal traversal = get_g_V_hasLabelXpersonX_order_byXageX_skipX1X_valuesXnameX(); + printTraversalForm(traversal); + assertTrue(traversal.hasNext()); + assertEquals(Arrays.asList("marko", "josh", "peter"), traversal.toList()); + } + @Test @LoadGraphWith(MODERN) public void g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { @@ -424,6 +435,11 @@ public Traversal get_g_V_hasLabelXpersonX_order_byXageX_valuesXn return g.V().hasLabel("person").order().by("age").values("name").skip(1); } + @Override + public Traversal get_g_V_hasLabelXpersonX_order_byXageX_skipX1X_valuesXnameX() { + return g.V().hasLabel("person").order().by("age").skip(1).values("name"); + } + @Override public Traversal> get_g_V_outE_valuesXweightX_fold_orderXlocalX_skipXlocal_2X() { return g.V().outE().values("weight").fold().order(local).skip(local, 2);