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 2016/03/15 21:18:51 UTC
incubator-tinkerpop git commit: added more test cases. Fixed a old
equality issue in OrderGlobalStepTest and OrderLocalStepTest cc/ @dkuppitz.
Added more test cases to ensure OrderLimitStrategy is behaving correctly.
OrderBiOperator now uses JavaSerializ
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1209 a67567e0c -> dc0348717
added more test cases. Fixed a old equality issue in OrderGlobalStepTest and OrderLocalStepTest cc/ @dkuppitz. Added more test cases to ensure OrderLimitStrategy is behaving correctly. OrderBiOperator now uses JavaSerializer so Giraph and Spark are happy. I think this is good to go. Perhaps one more test case using GratefulDead graph would be good.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/dc034871
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/dc034871
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/dc034871
Branch: refs/heads/TINKERPOP-1209
Commit: dc0348717115a3572b5b70ef1d8f969c505c2bbf
Parents: a67567e
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 15 14:18:43 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 15 14:18:43 2016 -0600
----------------------------------------------------------------------
.../traversal/step/map/OrderGlobalStep.java | 16 +++--
.../traversal/step/map/OrderLocalStep.java | 4 +-
.../gremlin/structure/io/gryo/GryoMapper.java | 4 +-
.../traversal/step/map/OrderGlobalStepTest.java | 7 +-
.../traversal/step/map/OrderLocalStepTest.java | 6 +-
.../optimization/OrderLimitStrategyTest.java | 72 ++++++++++++++++++++
.../traversal/step/map/GroovyOrderTest.groovy | 7 +-
.../process/traversal/step/map/OrderTest.java | 32 +++++++--
8 files changed, 122 insertions(+), 26 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
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 19a7ea5..cfec540 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
@@ -70,6 +70,10 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
this.limit = limit;
}
+ public long getLimit() {
+ return this.limit;
+ }
+
@Override
public void addComparator(final Traversal.Admin<S, C> traversal, final Comparator<C> comparator) {
this.comparators.add(new Pair<>(this.integrateChild(traversal), comparator));
@@ -98,8 +102,8 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
@Override
public int hashCode() {
int result = super.hashCode();
- for (final Pair comparator : this.comparators) {
- result ^= comparator.hashCode();
+ for (int i = 0; i < this.comparators.size(); i++) {
+ result ^= this.comparators.get(i).hashCode() * (i+1);
}
return result;
}
@@ -157,11 +161,11 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
@Override
public TraverserSet apply(final TraverserSet setA, final TraverserSet setB) {
setA.addAll(setB);
- if (this.chainedComparator.isShuffle())
- setA.shuffle();
- else
- setA.sort(this.chainedComparator);
if (Long.MAX_VALUE != this.limit && setA.bulkSize() > this.limit) {
+ if (this.chainedComparator.isShuffle())
+ setA.shuffle();
+ else
+ setA.sort(this.chainedComparator);
long counter = 0l;
final Iterator<Traverser.Admin> traversers = setA.iterator();
while (traversers.hasNext()) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
index a1c24e7..56f3404 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
@@ -93,8 +93,8 @@ public final class OrderLocalStep<S, C extends Comparable> extends MapStep<S, S>
@Override
public int hashCode() {
int result = super.hashCode();
- for (final Pair comparator : this.comparators) {
- result ^= comparator.hashCode();
+ for (int i = 0; i < this.comparators.size(); i++) {
+ result ^= this.comparators.get(i).hashCode() * (i + 1);
}
return result;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 091d1f3..784bcf0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -327,13 +327,13 @@ public final class GryoMapper implements Mapper<Kryo> {
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Operator.class, null, 107));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(FoldStep.FoldBiOperator.class, null, 108));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupCountStep.GroupCountBiOperator.class, null, 109));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, null, 116));
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, kryo -> new JavaSerializer(), 117));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanGlobalBiOperator.class, null, 110));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanNumber.class, null, 111));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TreeStep.TreeBiOperator.class, null, 112));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStepV3d0.GroupBiOperatorV3d0.class, null, 113));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(RangeGlobalStep.RangeBiOperator.class, null, 114));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, null, 116)); // ***LAST ID***
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, kryo -> new JavaSerializer(), 118)); // ***LAST ID***
}};
private final List<IoRegistry> registries = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStepTest.java
index 5613bd8..82acad3 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStepTest.java
@@ -22,7 +22,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest;
-import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayList;
@@ -33,15 +32,11 @@ import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
/**
* @author Daniel Kuppitz (http://gremlin.guru)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class OrderGlobalStepTest extends StepTest {
@Override
- @Ignore("hashCode() doesn't work properly for .order().by()")
- public void testEquality() {
- }
-
- @Override
protected List<Traversal> getTraversals() {
return Arrays.asList(
__.order(),
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStepTest.java
index 30b96b0..8cc2e7e 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStepTest.java
@@ -34,15 +34,11 @@ import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
/**
* @author Daniel Kuppitz (http://gremlin.guru)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public class OrderLocalStepTest extends StepTest {
@Override
- @Ignore("hashCode() doesn't work properly for .order(local).by()")
- public void testEquality() {
- }
-
- @Override
protected List<Traversal> getTraversals() {
return Arrays.asList(
__.order(Scope.local),
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/OrderLimitStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/OrderLimitStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/OrderLimitStrategyTest.java
new file mode 100644
index 0000000..8cb8342
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/OrderLimitStrategyTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@RunWith(Parameterized.class)
+public class OrderLimitStrategyTest {
+
+ @Parameterized.Parameter(value = 0)
+ public Traversal traversal;
+
+ @Parameterized.Parameter(value = 1)
+ public long limit;
+
+ void applyOrderLimitStrategyStrategy(final Traversal traversal) {
+ final TraversalStrategies strategies = new DefaultTraversalStrategies();
+ strategies.addStrategies(OrderLimitStrategy.instance());
+ traversal.asAdmin().setStrategies(strategies);
+ traversal.asAdmin().applyStrategies();
+ }
+
+ @Test
+ public void doTest() {
+ traversal.asAdmin().setParent(new TraversalVertexProgramStep(EmptyTraversal.instance(), EmptyTraversal.instance())); // trick it
+ applyOrderLimitStrategyStrategy(traversal);
+ assertEquals(limit, TraversalHelper.getFirstStepOfAssignableClass(OrderGlobalStep.class, traversal.asAdmin()).get().getLimit());
+ }
+
+ @Parameterized.Parameters(name = "{0}")
+ public static Iterable<Object> generateTestParameters() {
+ return Arrays.asList(new Object[][]{
+ {__.order().limit(1), 1l},
+ {__.out().order().range(7, 15), 15l},
+ {__.order().select("a").limit(7), 7l},
+ {__.order().out().limit(10), Long.MAX_VALUE}});
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
index 04bbd9f..56dac31 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
@@ -83,7 +83,7 @@ public abstract class GroovyOrderTest {
}
@Override
- public Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXnameX_byXorderXlocalX_byXdecrXX() {
+ public Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX() {
new ScriptTraversal<>(g, "gremlin-groovy", "g.V.group.by(label).by(values('name').order().by(decr).fold())")
}
@@ -126,5 +126,10 @@ public abstract class GroovyOrderTest {
public Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_limitX5X_name() {
new ScriptTraversal<>(g, "gremlin-groovy", "g.V.both.hasLabel('person').order.by('age',decr).limit(5).name")
}
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_name() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V.both.hasLabel('person').order.by('age',decr).name")
+ }
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/dc034871/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
index cf08b44..30bc24a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
@@ -21,10 +21,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
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.__;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -71,7 +74,7 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
- public abstract Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXnameX_byXorderXlocalX_byXdecrXX();
+ public abstract Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX();
public abstract Traversal<Vertex, List<Double>> get_g_V_localXbothE_weight_foldX_order_byXsumXlocalX_decrX();
@@ -89,6 +92,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_limitX5X_name();
+ public abstract Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_name();
+
@Test
@LoadGraphWith(MODERN)
public void g_V_name_order() {
@@ -246,8 +251,8 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- public void g_V_group_byXlabelX_byXnameX_byXorderXlocalX_byXdecrXX() {
- final Traversal<Vertex, Map<String, List<Vertex>>> traversal = get_g_V_group_byXlabelX_byXnameX_byXorderXlocalX_byXdecrXX();
+ public void g_V_group_byXlabelX_byXname_order_byXdecrX_foldX() {
+ final Traversal<Vertex, Map<String, List<Vertex>>> traversal = get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX();
printTraversalForm(traversal);
final Map<String, List<Vertex>> map = traversal.next();
assertFalse(traversal.hasNext());
@@ -394,6 +399,20 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
assertEquals("marko", results.get(4));
}
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.STANDARD) // validating the internal sort/limit works in GraphComputer
+ @LoadGraphWith(MODERN)
+ public void g_V_both_hasLabelXpersonX_order_byXage_decrX_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_both_hasLabelXpersonX_order_byXage_decrX_name();
+ if (!TraversalHelper.getFirstStepOfAssignableClass(OrderGlobalStep.class, traversal.asAdmin()).isPresent())
+ return; // total hack to avoid providers that don't compile to OrderGlobalStep
+ TraversalHelper.getFirstStepOfAssignableClass(OrderGlobalStep.class, traversal.asAdmin()).get().setLimit(1);
+ printTraversalForm(traversal);
+ final List<String> results = traversal.toList();
+ assertTrue(results.size() < 8);
+ assertFalse(traversal.hasNext());
+ }
+
public static class Traversals extends OrderTest {
@Override
@@ -451,7 +470,7 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
}
@Override
- public Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXnameX_byXorderXlocalX_byXdecrXX() {
+ public Traversal<Vertex, Map<String, List<Vertex>>> get_g_V_group_byXlabelX_byXname_order_byXdecrX_foldX() {
return g.V().<String, List<Vertex>>group().by(T.label).by(__.values("name").order().by(Order.decr).fold());
}
@@ -494,5 +513,10 @@ public abstract class OrderTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_limitX5X_name() {
return g.V().both().hasLabel("person").order().by("age", Order.decr).limit(5).values("name");
}
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_hasLabelXpersonX_order_byXage_decrX_name() {
+ return g.V().both().hasLabel("person").order().by("age", Order.decr).values("name");
+ }
}
}