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/02/11 03:50:08 UTC

[1/5] incubator-tinkerpop git commit: added FilterByCountOptimizerStrategy

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master a348e6b51 -> c2553ebea


added FilterByCountOptimizerStrategy


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

Branch: refs/heads/master
Commit: 0adb140fb98134534995f839ff31538de14cb878
Parents: 712b114
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Tue Feb 10 18:00:44 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Tue Feb 10 18:00:44 2015 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 .../gremlin/process/TraversalStrategies.java    |  14 +--
 .../graph/traversal/step/filter/IsStep.java     |   8 ++
 .../FilterByCountOptimizerStrategy.java         | 101 +++++++++++++++++++
 4 files changed, 112 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0adb140f/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 1c5eb33..5a64125 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -9,6 +9,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Added `FilterByCountOptimizerStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
 * Added `CoalesceStep` / `.coalesce()` that emits the first traversal which emits at least one element.
 * Added more syntactic sugar tricks to the Gremlin sugar plugin -- `&`, `|`, `select from`, `gt`, etc.
 * `Traversal.Admin` is consistent internal to steps, traversals, strategies, etc. For the user, `Traversal` is all they see.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0adb140f/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
index 7984c26..18c9eb9 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -19,18 +19,7 @@
 package com.tinkerpop.gremlin.process;
 
 import com.tinkerpop.gremlin.process.graph.traversal.__;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ComparatorHolderRemovalStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ConjunctionStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.DedupOptimizerStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.EngineDependentStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.IdentityRemovalStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.LabeledEndStepStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.MatchWhereStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ProfileStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.ReducingStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.SideEffectCapStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.SideEffectRegistrationStrategy;
-import com.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategy;
+import com.tinkerpop.gremlin.process.graph.traversal.strategy.*;
 import com.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
 import com.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
 import com.tinkerpop.gremlin.structure.Edge;
@@ -166,6 +155,7 @@ public interface TraversalStrategies extends Cloneable {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
             coreStrategies.addStrategies(
                     DedupOptimizerStrategy.instance(),
+                    FilterByCountOptimizerStrategy.instance(),
                     IdentityRemovalStrategy.instance(),
                     SideEffectCapStrategy.instance(),
                     MatchWhereStrategy.instance(),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0adb140f/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
index 463e591..991037a 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
@@ -51,4 +51,12 @@ public final class IsStep<S> extends FilterStep<S> implements Reversible {
     public Set<TraverserRequirement> getRequirements() {
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public BiPredicate<S, Object> getPredicate() {
+        return predicate;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0adb140f/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
new file mode 100644
index 0000000..293c6cc
--- /dev/null
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
@@ -0,0 +1,101 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.graph.traversal.strategy;
+
+import com.tinkerpop.gremlin.process.Step;
+import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.TraversalEngine;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.map.CountStep;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.structure.Compare;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public class FilterByCountOptimizerStrategy extends AbstractTraversalStrategy {
+
+    private static final FilterByCountOptimizerStrategy INSTANCE = new FilterByCountOptimizerStrategy();
+
+    private FilterByCountOptimizerStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
+        final int size = traversal.getSteps().size();
+        Step prev = null;
+        for (int i = 0; i < size; i++) {
+            final Step curr = traversal.getSteps().get(i);
+            if (curr instanceof CountStep && i < size - 1) {
+                final Step next = traversal.getSteps().get(i + 1);
+                if (next instanceof IsStep && !(prev instanceof RangeStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
+                    final IsStep isStep = (IsStep) next;
+                    final Object value = isStep.getValue();
+                    final BiPredicate predicate = isStep.getPredicate();
+                    if (value instanceof Number) {
+                        final long highRangeOffset;
+                        final boolean replaceIsStep;
+                        if (predicate.equals(Compare.eq) || predicate.equals(Compare.lte) || predicate.equals(Compare.neq)) {
+                            highRangeOffset = 1L;
+                            replaceIsStep = false;
+                        } else if (predicate.equals(Compare.lt)) {
+                            highRangeOffset = 0L;
+                            replaceIsStep = false;
+                        } else if (predicate.equals(Compare.gt)) {
+                            highRangeOffset = 1L;
+                            replaceIsStep = true;
+                        } else if (predicate.equals(Compare.gte)) {
+                            highRangeOffset = 0L;
+                            replaceIsStep = true;
+                        } else continue;
+
+                        final long highRange = ((Number) value).longValue() + highRangeOffset;
+                        TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                        if (replaceIsStep) {
+                            TraversalHelper.replaceStep(isStep, new IsStep<>(traversal, Compare.eq, highRange), traversal);
+                        }
+                    }
+                    if (value instanceof Collection && (predicate.equals(Compare.inside) || predicate.equals(Compare.outside))) {
+                        final Iterator iterator = ((Collection) value).iterator();
+                        if (iterator.hasNext()) iterator.next();
+                        else continue;
+                        if (iterator.hasNext()) {
+                            final Object high = iterator.next();
+                            if (high instanceof Number && !iterator.hasNext()) {
+                                final long highRangeOffset = predicate.equals(Compare.inside) ? 0L : 1L;
+                                final long highRange = ((Number) high).longValue() + highRangeOffset;
+                                TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                            }
+                        }
+                    }
+                }
+            }
+            prev = curr;
+        }
+    }
+
+    public static FilterByCountOptimizerStrategy instance() {
+        return INSTANCE;
+    }
+}


[4/5] incubator-tinkerpop git commit: Merge branch 'master' into optimize-count-filter

Posted by ok...@apache.org.
Merge branch 'master' into optimize-count-filter

Resolved Conflicts:
	CHANGELOG.asciidoc
	gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java


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

Branch: refs/heads/master
Commit: 6086a5968d458ed0a27845b306cd497b6ce4d581
Parents: f8bfafc a348e6b
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Wed Feb 11 03:40:35 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Wed Feb 11 03:40:35 2015 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 CLA.txt                                         | 138 -------------------
 CONTRIBUTING.asciidoc                           |   5 +-
 .../tinkerpop/gremlin/process/Traversal.java    |   2 +-
 .../process/computer/ComputerResult.java        |  32 ++---
 .../gremlin/process/computer/GraphComputer.java |   2 +-
 .../gremlin/process/computer/MapReduce.java     |   2 +-
 .../peerpressure/PeerPressureVertexProgram.java |  18 ++-
 .../ranking/pagerank/PageRankVertexProgram.java |   7 +-
 .../traversal/step/map/ComputerResultStep.java  |   2 +-
 .../computer/util/DefaultComputerResult.java    |  60 ++++++++
 .../computer/util/GraphComputerHelper.java      |   5 +-
 .../process/computer/util/MemoryHelper.java     |   5 +-
 .../computer/util/VertexProgramHelper.java      |   7 +-
 .../traversal/step/filter/ConjunctionStep.java  |  84 +++++++++++
 .../FilterByCountOptimizerStrategy.java         | 101 ++++++++++++++
 .../process/traversal/DefaultTraversal.java     |   7 +-
 .../com/tinkerpop/gremlin/structure/Vertex.java |  22 ++-
 .../gremlin/structure/VertexProperty.java       |   4 +
 .../gremlin/structure/util/ElementHelper.java   |   7 +-
 .../gremlin/structure/util/StringFactory.java   |  10 +-
 .../structure/util/batch/BatchGraph.java        |   5 -
 .../groovy/loaders/SugarLoaderTest.groovy       |   2 +-
 .../computer/GroovyGraphComputerTest.groovy     |  10 +-
 .../jsr223/GremlinGroovyScriptEngineTest.java   |   4 +-
 .../gremlin/groovy/loaders/SugarLoader.groovy   |   2 +-
 .../AbstractImportCustomizerProvider.java       |   4 +-
 .../groovy/engine/GroovyTraversalScript.java    |   2 +-
 .../process/computer/GraphComputerTest.java     |   5 +-
 .../ranking/PageRankVertexProgramTest.java      |   1 +
 .../structure/StructureStandardSuite.java       |   4 +-
 .../gremlin/structure/TransactionTest.java      |   8 +-
 .../gremlin/structure/VertexPropertyTest.java   |  72 +++++++++-
 .../tinkerpop/gremlin/structure/VertexTest.java |   4 +-
 .../process/graph/step/util/TreeTest.java       |  97 -------------
 .../step/filter/ConjunctionStepTest.java        |  68 +++++++++
 .../gremlin/process/graph/util/TreeTest.java    |  96 +++++++++++++
 .../groovy/plugin/HadoopRemoteAcceptor.java     |   2 +-
 .../computer/giraph/GiraphComputeVertex.java    |   3 +-
 .../computer/giraph/GiraphGraphComputer.java    |   3 +-
 .../process/computer/util/MapReduceHelper.java  |   5 +-
 .../hadoop/structure/util/HadoopHelper.java     |   5 +-
 .../gremlin/neo4j/structure/Neo4jGraph.java     |  27 ++--
 .../gremlin/neo4j/structure/Neo4jHelper.java    |   5 +-
 .../gremlin/neo4j/structure/Neo4jVertex.java    |  32 -----
 .../gremlin/neo4j/structure/Neo4jGraphTest.java |   8 +-
 .../process/computer/TinkerComputerResult.java  |  39 ++++++
 .../process/computer/TinkerGraphComputer.java   |   2 +-
 .../tinkergraph/structure/TinkerGraph.java      |  21 ++-
 .../tinkergraph/structure/TinkerHelper.java     |   9 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |   2 +-
 51 files changed, 686 insertions(+), 382 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6086a596/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --cc CHANGELOG.asciidoc
index 5ef1b4b,fd2138d..4c7fccd
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@@ -9,7 -9,8 +9,8 @@@ image::http://www.tinkerpop.com/docs/cu
  TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
+ * Added `VertexProperty.Cardinality` with `list`, `set`, and `single`. No more `Vertex.singleProperty()` method.
 -* Added `FilterByCountOptimizerStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
 +* Added `RangeByIsCountStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
  * Added `CoalesceStep` / `.coalesce()` that emits the first traversal which emits at least one element.
  * Added more syntactic sugar tricks to the Gremlin sugar plugin -- `&`, `|`, `select from`, `gt`, etc.
  * `Traversal.Admin` is consistent internal to steps, traversals, strategies, etc. For the user, `Traversal` is all they see.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6086a596/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6086a596/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------


[3/5] incubator-tinkerpop git commit: fixed ComputerTest for RangeByIsCountStrategy

Posted by ok...@apache.org.
fixed ComputerTest for RangeByIsCountStrategy


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

Branch: refs/heads/master
Commit: f8bfafc569fb147bcb6b711469743774f1e172c0
Parents: a71fdbd
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Wed Feb 11 02:56:20 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Wed Feb 11 02:56:20 2015 +0100

----------------------------------------------------------------------
 .../traversal/step/map/ComputerResultStep.java  |  4 +++
 .../strategy/RangeByIsCountStrategyTest.java    | 29 +++++++++++++-------
 2 files changed, 23 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f8bfafc5/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index 54b119e..39e3de4 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -92,4 +92,8 @@ public final class ComputerResultStep<S> extends AbstractStep<S, S> {
     public Set<TraverserRequirement> getRequirements() {
         return this.computerTraversal.getTraverserRequirements();
     }
+
+    public Traversal.Admin<?, ?> getComputerTraversal() {
+        return this.computerTraversal;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f8bfafc5/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
index ea1662d..d840fa7 100644
--- a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
+++ b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
@@ -22,15 +22,18 @@ package com.tinkerpop.gremlin.process.graph.traversal.strategy;
 import com.tinkerpop.gremlin.LoadGraphWith;
 import com.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import com.tinkerpop.gremlin.process.graph.traversal.__;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTraversalStep;
 import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
 import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import com.tinkerpop.gremlin.structure.Compare;
+import org.junit.Ignore;
 import org.junit.Test;
 
 import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiPredicate;
-import java.util.stream.Stream;
 
 import static com.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 import static org.junit.Assert.assertEquals;
@@ -40,15 +43,11 @@ import static org.junit.Assert.assertEquals;
  */
 public abstract class RangeByIsCountStrategyTest extends AbstractGremlinProcessTest {
 
-    final Traversal generateTraversal(final BiPredicate predicate, final Object value) {
-        return g.V().count().is(predicate, value);
-    }
-
     public static class StandardTest extends RangeByIsCountStrategyTest {
 
         private void runTest(final BiPredicate predicate, final Object value, final long expectedHighRange) {
             final AtomicInteger counter = new AtomicInteger(0);
-            Traversal traversal = generateTraversal(predicate, value);
+            Traversal traversal = g.V().count().is(predicate, value);
             traversal.iterate();
             TraversalHelper.getStepsOfClass(RangeStep.class, traversal.asAdmin()).stream().forEach(step -> {
                 assertEquals(0, step.getLowRange());
@@ -109,11 +108,21 @@ public abstract class RangeByIsCountStrategyTest extends AbstractGremlinProcessT
 
     public static class ComputerTest extends RangeByIsCountStrategyTest {
         @Test
+        @Ignore // TODO: include when #558 is solved
         @LoadGraphWith(MODERN)
-        public void shouldNotModifyTheTraversal() {
-            final Traversal traversal = generateTraversal(Compare.eq, 0l).submit(g.compute()).iterate();
-            final Stream<RangeStep> rangeSteps = TraversalHelper.getStepsOfClass(RangeStep.class, traversal.asAdmin()).stream();
-            assertEquals(0, rangeSteps.count());
+        public void nestedCountEqualsNullShouldLimitToOne() {
+            final AtomicInteger counter = new AtomicInteger(0);
+            final Traversal traversal = g.V().has(__.outE("created").count().is(0)).submit(g.compute()).iterate();
+            final ComputerResultStep crs = (ComputerResultStep) traversal.asAdmin().getSteps().iterator().next();
+            final Traversal ct = crs.getComputerTraversal();
+            final HasTraversalStep hasStep = TraversalHelper.getStepsOfClass(HasTraversalStep.class, ct.asAdmin()).stream().findFirst().get();
+            final Traversal nestedTraversal = (Traversal) hasStep.getLocalChildren().get(0);
+            TraversalHelper.getStepsOfClass(RangeStep.class, nestedTraversal.asAdmin()).stream().forEach(step -> {
+                assertEquals(0, step.getLowRange());
+                assertEquals(1, step.getHighRange());
+                counter.incrementAndGet();
+            });
+            assertEquals(1, counter.get());
         }
     }
 }


[2/5] incubator-tinkerpop git commit: Worked on RangeByIsCountStrategy

Posted by ok...@apache.org.
Worked on RangeByIsCountStrategy

* renamed FilterByCountOptimizerStrategy to RangeByIsCountStrategy as proposed by @okram
* optimized the strategy code (no need to modify the comparators in IsStep)
* added unit tests for all cases


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

Branch: refs/heads/master
Commit: a71fdbd15ebd9554f8bf13fff22b2e2b4ab771e5
Parents: 0adb140
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Wed Feb 11 01:05:53 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Wed Feb 11 01:05:53 2015 +0100

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   2 +-
 .../gremlin/process/TraversalStrategies.java    |   2 +-
 .../FilterByCountOptimizerStrategy.java         | 101 ----------------
 .../strategy/RangeByIsCountStrategy.java        |  89 ++++++++++++++
 .../gremlin/process/ProcessComputerSuite.java   |   7 +-
 .../gremlin/process/ProcessStandardSuite.java   |  11 +-
 .../strategy/RangeByIsCountStrategyTest.java    | 119 +++++++++++++++++++
 .../tinkergraph/structure/TinkerGraphTest.java  |  38 ++++++
 8 files changed, 260 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 5a64125..5ef1b4b 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -9,7 +9,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-* Added `FilterByCountOptimizerStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
+* Added `RangeByIsCountStrategy` that adds a `RangeStep` in front of `.count().is(<predicate>, <value>)` to minimize the amount of fetched elements.
 * Added `CoalesceStep` / `.coalesce()` that emits the first traversal which emits at least one element.
 * Added more syntactic sugar tricks to the Gremlin sugar plugin -- `&`, `|`, `select from`, `gt`, etc.
 * `Traversal.Admin` is consistent internal to steps, traversals, strategies, etc. For the user, `Traversal` is all they see.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
index 18c9eb9..a9c7381 100644
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -155,7 +155,7 @@ public interface TraversalStrategies extends Cloneable {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
             coreStrategies.addStrategies(
                     DedupOptimizerStrategy.instance(),
-                    FilterByCountOptimizerStrategy.instance(),
+                    RangeByIsCountStrategy.instance(),
                     IdentityRemovalStrategy.instance(),
                     SideEffectCapStrategy.instance(),
                     MatchWhereStrategy.instance(),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
deleted file mode 100644
index 293c6cc..0000000
--- a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/FilterByCountOptimizerStrategy.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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 com.tinkerpop.gremlin.process.graph.traversal.strategy;
-
-import com.tinkerpop.gremlin.process.Step;
-import com.tinkerpop.gremlin.process.Traversal;
-import com.tinkerpop.gremlin.process.TraversalEngine;
-import com.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
-import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
-import com.tinkerpop.gremlin.process.graph.traversal.step.map.CountStep;
-import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import com.tinkerpop.gremlin.structure.Compare;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.function.BiPredicate;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public class FilterByCountOptimizerStrategy extends AbstractTraversalStrategy {
-
-    private static final FilterByCountOptimizerStrategy INSTANCE = new FilterByCountOptimizerStrategy();
-
-    private FilterByCountOptimizerStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
-        final int size = traversal.getSteps().size();
-        Step prev = null;
-        for (int i = 0; i < size; i++) {
-            final Step curr = traversal.getSteps().get(i);
-            if (curr instanceof CountStep && i < size - 1) {
-                final Step next = traversal.getSteps().get(i + 1);
-                if (next instanceof IsStep && !(prev instanceof RangeStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
-                    final IsStep isStep = (IsStep) next;
-                    final Object value = isStep.getValue();
-                    final BiPredicate predicate = isStep.getPredicate();
-                    if (value instanceof Number) {
-                        final long highRangeOffset;
-                        final boolean replaceIsStep;
-                        if (predicate.equals(Compare.eq) || predicate.equals(Compare.lte) || predicate.equals(Compare.neq)) {
-                            highRangeOffset = 1L;
-                            replaceIsStep = false;
-                        } else if (predicate.equals(Compare.lt)) {
-                            highRangeOffset = 0L;
-                            replaceIsStep = false;
-                        } else if (predicate.equals(Compare.gt)) {
-                            highRangeOffset = 1L;
-                            replaceIsStep = true;
-                        } else if (predicate.equals(Compare.gte)) {
-                            highRangeOffset = 0L;
-                            replaceIsStep = true;
-                        } else continue;
-
-                        final long highRange = ((Number) value).longValue() + highRangeOffset;
-                        TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
-                        if (replaceIsStep) {
-                            TraversalHelper.replaceStep(isStep, new IsStep<>(traversal, Compare.eq, highRange), traversal);
-                        }
-                    }
-                    if (value instanceof Collection && (predicate.equals(Compare.inside) || predicate.equals(Compare.outside))) {
-                        final Iterator iterator = ((Collection) value).iterator();
-                        if (iterator.hasNext()) iterator.next();
-                        else continue;
-                        if (iterator.hasNext()) {
-                            final Object high = iterator.next();
-                            if (high instanceof Number && !iterator.hasNext()) {
-                                final long highRangeOffset = predicate.equals(Compare.inside) ? 0L : 1L;
-                                final long highRange = ((Number) high).longValue() + highRangeOffset;
-                                TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
-                            }
-                        }
-                    }
-                }
-            }
-            prev = curr;
-        }
-    }
-
-    public static FilterByCountOptimizerStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
new file mode 100644
index 0000000..181d6ab
--- /dev/null
+++ b/gremlin-core/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
@@ -0,0 +1,89 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.graph.traversal.strategy;
+
+import com.tinkerpop.gremlin.process.Step;
+import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.TraversalEngine;
+import com.tinkerpop.gremlin.process.TraversalStrategy;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
+import com.tinkerpop.gremlin.process.graph.traversal.step.map.CountStep;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.structure.Compare;
+
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+    private static final Set<Compare> RANGE_PREDICATES = EnumSet.of(Compare.inside, Compare.outside);
+    private static final Set<Compare> INCREASED_OFFSET_PREDICATES =
+            EnumSet.of(Compare.eq, Compare.neq, Compare.lte, Compare.gt, Compare.outside);
+
+    private static final RangeByIsCountStrategy INSTANCE = new RangeByIsCountStrategy();
+
+    private RangeByIsCountStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal, final TraversalEngine engine) {
+        final int size = traversal.getSteps().size();
+        Step prev = null;
+        for (int i = 0; i < size; i++) {
+            final Step curr = traversal.getSteps().get(i);
+            if (curr instanceof CountStep && i < size - 1) {
+                final Step next = traversal.getSteps().get(i + 1);
+                if (next instanceof IsStep && !(prev instanceof RangeStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
+                    final IsStep isStep = (IsStep) next;
+                    final Object value = isStep.getValue();
+                    final BiPredicate predicate = isStep.getPredicate();
+                    final long highRangeOffset = INCREASED_OFFSET_PREDICATES.contains(predicate) ? 1L : 0L;
+                    if (value instanceof Number) {
+                        final long highRange = ((Number) value).longValue() + highRangeOffset;
+                        TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                    }
+                    if (value instanceof Collection && RANGE_PREDICATES.contains(predicate)) {
+                        final Iterator iterator = ((Collection) value).iterator();
+                        if (iterator.hasNext()) iterator.next();
+                        else continue;
+                        if (iterator.hasNext()) {
+                            final Object high = iterator.next();
+                            if (high instanceof Number && !iterator.hasNext()) {
+                                final long highRange = ((Number) high).longValue() + highRangeOffset;
+                                TraversalHelper.insertBeforeStep(new RangeStep<>(traversal, 0L, highRange), curr, traversal);
+                            }
+                        }
+                    }
+                }
+            }
+            prev = curr;
+        }
+    }
+
+    public static RangeByIsCountStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessComputerSuite.java
index 3d81643..667bada 100644
--- a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -27,6 +27,7 @@ import com.tinkerpop.gremlin.process.graph.traversal.step.filter.*;
 import com.tinkerpop.gremlin.process.graph.traversal.step.map.*;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.*;
 import com.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
+import com.tinkerpop.gremlin.process.graph.traversal.strategy.RangeByIsCountStrategyTest;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.RunnerBuilder;
 
@@ -134,7 +135,8 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             ComputerDataStrategyTest.class,
 
             // strategy
-            TraversalVerificationStrategyTest.ComputerTest.class
+            TraversalVerificationStrategyTest.ComputerTest.class,
+            RangeByIsCountStrategyTest.ComputerTest.class
     };
 
     /**
@@ -208,7 +210,8 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
 
             // strategy
             ComputerDataStrategyTest.class,
-            TraversalVerificationStrategyTest.class
+            TraversalVerificationStrategyTest.class,
+            RangeByIsCountStrategyTest.class
     };
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 96c4d34..6e5536f 100644
--- a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -24,6 +24,7 @@ import com.tinkerpop.gremlin.process.graph.traversal.step.filter.*;
 import com.tinkerpop.gremlin.process.graph.traversal.step.map.*;
 import com.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.*;
 import com.tinkerpop.gremlin.process.graph.traversal.step.util.TraversalSideEffectsTest;
+import com.tinkerpop.gremlin.process.graph.traversal.strategy.RangeByIsCountStrategyTest;
 import com.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
 import com.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
 import com.tinkerpop.gremlin.process.util.PathTest;
@@ -47,6 +48,8 @@ import java.util.stream.Stream;
  * separate class file):
  * <p/>
  * <code>
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
  * @RunWith(ProcessStandardSuite.class)
  * @ProcessStandardSuite.GraphProviderClass(TinkerGraphProcessStandardTest.class) public class TinkerGraphProcessStandardTest implements GraphProvider {
  * }
@@ -57,8 +60,6 @@ import java.util.stream.Stream;
  * into tests in the suite.  The ProcessStandardSuite will utilized
  * {@link com.tinkerpop.gremlin.structure.Graph.Features} defined in the suite to determine which tests will be executed.
  * <br/>
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
  */
 public class ProcessStandardSuite extends AbstractGremlinSuite {
 
@@ -131,7 +132,8 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             PathTest.class,
 
             // strategy
-            TraversalVerificationStrategyTest.StandardTest.class
+            TraversalVerificationStrategyTest.StandardTest.class,
+            RangeByIsCountStrategyTest.StandardTest.class
 
             // algorithms
             // PageRankVertexProgramTest.class
@@ -207,7 +209,8 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             // PageRankVertexProgramTest.class
 
             // strategy
-            TraversalVerificationStrategyTest.class
+            TraversalVerificationStrategyTest.class,
+            RangeByIsCountStrategyTest.class
     };
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
new file mode 100644
index 0000000..ea1662d
--- /dev/null
+++ b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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 com.tinkerpop.gremlin.process.graph.traversal.strategy;
+
+import com.tinkerpop.gremlin.LoadGraphWith;
+import com.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import com.tinkerpop.gremlin.process.Traversal;
+import com.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeStep;
+import com.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import com.tinkerpop.gremlin.structure.Compare;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiPredicate;
+import java.util.stream.Stream;
+
+import static com.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class RangeByIsCountStrategyTest extends AbstractGremlinProcessTest {
+
+    final Traversal generateTraversal(final BiPredicate predicate, final Object value) {
+        return g.V().count().is(predicate, value);
+    }
+
+    public static class StandardTest extends RangeByIsCountStrategyTest {
+
+        private void runTest(final BiPredicate predicate, final Object value, final long expectedHighRange) {
+            final AtomicInteger counter = new AtomicInteger(0);
+            Traversal traversal = generateTraversal(predicate, value);
+            traversal.iterate();
+            TraversalHelper.getStepsOfClass(RangeStep.class, traversal.asAdmin()).stream().forEach(step -> {
+                assertEquals(0, step.getLowRange());
+                assertEquals(expectedHighRange, step.getHighRange());
+                counter.incrementAndGet();
+            });
+            assertEquals(1, counter.get());
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countEqualsNullShouldLimitToOne() {
+            runTest(Compare.eq, 0l, 1l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countNotEqualsFourShouldLimitToFive() {
+            runTest(Compare.neq, 4l, 5l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countLessThanOrEqualThreeShouldLimitToFour() {
+            runTest(Compare.lte, 3l, 4l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countLessThanThreeShouldLimitToThree() {
+            runTest(Compare.lt, 3l, 3l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countGreaterThanTwoShouldLimitToThree() {
+            runTest(Compare.gt, 2l, 3l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countGreaterThanOrEqualTwoShouldLimitToTwo() {
+            runTest(Compare.gte, 2l, 2l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countInsideTwoAndFourShouldLimitToFour() {
+            runTest(Compare.inside, Arrays.asList(2l, 4l), 4l);
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void countOutsideTwoAndFourShouldLimitToFive() {
+            runTest(Compare.outside, Arrays.asList(2l, 4l), 5l);
+        }
+    }
+
+    public static class ComputerTest extends RangeByIsCountStrategyTest {
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldNotModifyTheTraversal() {
+            final Traversal traversal = generateTraversal(Compare.eq, 0l).submit(g.compute()).iterate();
+            final Stream<RangeStep> rangeSteps = TraversalHelper.getStepsOfClass(RangeStep.class, traversal.asAdmin()).stream();
+            assertEquals(0, rangeSteps.count());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a71fdbd1/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 9c66e80..2f83bab 100644
--- a/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/com/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -169,6 +169,44 @@ public class TinkerGraphTest {
         });
     }
 
+    @Test
+    @Ignore
+    public void testPlayDK() throws Exception {
+
+        Graph g = TinkerFactory.createModern();
+        Traversal t;
+
+        System.out.println("g.V().has(out(\"created\").count().is(0l))");
+        t = g.V().has(out("created").count().is(0l));
+        System.out.println(t.toString());
+        t.forEachRemaining(System.out::println);
+        System.out.println(t.toString() + "\n");
+
+        System.out.println("g.V().has(out(\"created\").count().is(lt, 2l))");
+        t = g.V().has(out("created").count().is(Compare.lt, 2l));
+        System.out.println(t.toString());
+        t.forEachRemaining(System.out::println);
+        System.out.println(t.toString() + "\n");
+
+        System.out.println("g.V().has(out(\"created\").count().is(gt, 1l))");
+        t = g.V().has(out("created").count().is(Compare.gt, 1l));
+        System.out.println(t.toString());
+        t.forEachRemaining(System.out::println);
+        System.out.println(t.toString() + "\n");
+
+        System.out.println("g.V().has(out(\"created\").count().is(inside, [1l,4l]))");
+        t = g.V().has(out("created").count().is(Compare.inside, Arrays.asList(1l, 4l)));
+        System.out.println(t.toString());
+        t.forEachRemaining(System.out::println);
+        System.out.println(t.toString() + "\n");
+
+        System.out.println("g.V().has(out(\"created\").count().is(outside, [1l,4l]))");
+        t = g.V().has(out("created").count().is(Compare.outside, Arrays.asList(1l, 4l)));
+        System.out.println(t.toString());
+        t.forEachRemaining(System.out::println);
+        System.out.println(t.toString() + "\n");
+    }
+
     /**
      * No assertions.  Just write out the graph for convenience.
      */


[5/5] incubator-tinkerpop git commit: included ComputerTest for RangeByIsCountStrategy

Posted by ok...@apache.org.
included ComputerTest for RangeByIsCountStrategy


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

Branch: refs/heads/master
Commit: c2553ebea5a4c2bff725531a3123bb0b084e34d0
Parents: 6086a59
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Wed Feb 11 03:41:15 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Wed Feb 11 03:41:15 2015 +0100

----------------------------------------------------------------------
 .../graph/traversal/strategy/RangeByIsCountStrategyTest.java        | 1 -
 1 file changed, 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c2553ebe/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
index d840fa7..b506167 100644
--- a/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
+++ b/gremlin-test/src/main/java/com/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
@@ -108,7 +108,6 @@ public abstract class RangeByIsCountStrategyTest extends AbstractGremlinProcessT
 
     public static class ComputerTest extends RangeByIsCountStrategyTest {
         @Test
-        @Ignore // TODO: include when #558 is solved
         @LoadGraphWith(MODERN)
         public void nestedCountEqualsNullShouldLimitToOne() {
             final AtomicInteger counter = new AtomicInteger(0);