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

incubator-tinkerpop git commit: where(out('knows')) is compiled as filter(out('knows')). Will simplify MatchStep code and filter() is much more efficient than where() which has lots of overhead due to variable binding.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 349dc20b5 -> 88a93ae89


where(out('knows')) is compiled as filter(out('knows')). Will simplify MatchStep code and filter() is much more efficient than where() which has lots of overhead due to variable binding.


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

Branch: refs/heads/master
Commit: 88a93ae897259ceef5b22c426c860b9c3de69e93
Parents: 349dc20
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Jun 22 08:26:17 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Jun 22 08:26:17 2015 -0600

----------------------------------------------------------------------
 .../traversal/dsl/graph/GraphTraversal.java     |  5 +++-
 .../AdjacentToIncidentStrategy.java             | 16 ++++++------
 .../process/traversal/util/TraversalHelper.java | 26 +++++++++++++++++++-
 .../AdjacentToIncidentStrategyTest.java         |  4 +--
 .../RangeByIsCountStrategyTest.java             |  5 ++--
 .../traversal/step/filter/WhereTest.java        |  1 +
 6 files changed, 44 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index b20c864..c6c7768 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
@@ -123,6 +123,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.NoOpBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.TraversalComparator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
@@ -666,7 +667,9 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> where(final Scope scope, final Traversal<?, ?> whereTraversal) {
-        return this.asAdmin().addStep(new WhereStep(this.asAdmin(), scope, whereTraversal));
+        return TraversalHelper.getVariableLocations(whereTraversal.asAdmin()).isEmpty() ?
+                this.filter(whereTraversal) :
+                this.asAdmin().addStep(new WhereStep(this.asAdmin(), scope, whereTraversal));
     }
 
     public default GraphTraversal<S, E> where(final String startKey, final P<?> predicate) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
index 5241ec0..109f30c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategy.java
@@ -23,7 +23,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
@@ -46,12 +48,12 @@ import java.util.Set;
  *
  * @author Daniel Kuppitz (http://gremlin.guru)
  * @example <pre>
- * __.out().count()          // is replaced by __.outE().count()
- * __.in().limit(3).count()  // is replaced by __.inE().limit(3).count()
- * __.values("name").count() // is replaced by __.properties("name").count()
- * __.has(__.out())          // is replaced by __.has(__.outE())
- * __.has(__.values())       // is replaced by __.has(__.properties())
- * __.and(__.in(), __.out()) // is replaced by __.and(__.inE(), __.outE())
+ * __.out().count()            // is replaced by __.outE().count()
+ * __.in().limit(3).count()    // is replaced by __.inE().limit(3).count()
+ * __.values("name").count()   // is replaced by __.properties("name").count()
+ * __.where(__.out())          // is replaced by __.where(__.outE())
+ * __.where(__.values())       // is replaced by __.where(__.properties())
+ * __.and(__.in(), __.out())   // is replaced by __.and(__.inE(), __.outE())
  * </pre>
  */
 public final class AdjacentToIncidentStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy>
@@ -72,7 +74,7 @@ public final class AdjacentToIncidentStrategy extends AbstractTraversalStrategy<
             final Step curr = steps.get(i);
             if (i == size && isOptimizable(curr)) {
                 final TraversalParent parent = curr.getTraversal().getParent();
-                if (parent instanceof WhereStep || parent instanceof ConjunctionStep) {
+                if (parent instanceof NotStep || parent instanceof TraversalFilterStep || parent instanceof WhereStep || parent instanceof ConjunctionStep) {
                     optimizeStep(traversal, curr);
                 }
             } else if (isOptimizable(prev)) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index af9db5e..4c6dcb8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -21,11 +21,15 @@ package org.apache.tinkerpop.gremlin.process.traversal.util;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.structure.T;
@@ -312,7 +316,7 @@ public final class TraversalHelper {
     }
 
     public static Set<String> getLabels(final Traversal.Admin<?, ?> traversal) {
-        return getLabels(new HashSet<>(), traversal);
+        return TraversalHelper.getLabels(new HashSet<>(), traversal);
     }
 
     private static Set<String> getLabels(final Set<String> labels, final Traversal.Admin<?, ?> traversal) {
@@ -325,4 +329,24 @@ public final class TraversalHelper {
         }
         return labels;
     }
+
+    public static Set<Scoping.Variable> getVariableLocations(final Traversal.Admin<?, ?> traversal) {
+        return TraversalHelper.getVariableLocations(new HashSet<>(), traversal);
+    }
+
+    private static Set<Scoping.Variable> getVariableLocations(final Set<Scoping.Variable> variables, final Traversal.Admin<?, ?> traversal) {
+        if (variables.size() == 2) return variables;
+        final Step<?, ?> startStep = traversal.getStartStep();
+        if (startStep instanceof StartStep && !startStep.getLabels().isEmpty())
+            variables.add(Scoping.Variable.START);
+        else if (startStep instanceof ConjunctionStep || startStep instanceof NotStep)
+            ((TraversalParent) startStep).getLocalChildren().forEach(child -> TraversalHelper.getVariableLocations(variables, child));
+        ///
+        final Step<?, ?> endStep = traversal.getEndStep();
+        if (!endStep.getLabels().isEmpty())
+            variables.add(Scoping.Variable.END);
+        ///
+        return variables;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategyTest.java
index cc39117..cb3051a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/AdjacentToIncidentStrategyTest.java
@@ -119,8 +119,8 @@ public class AdjacentToIncidentStrategyTest {
                     {__.both().count(), __.bothE().count()},
                     {__.out("knows").count(), __.outE("knows").count()},
                     {__.out("knows", "likes").count(), __.outE("knows", "likes").count()},
-                    {__.where(__.out()), __.where(__.outE())},
-                    //{__.hasNot(__.out()), __.hasNot(__.outE())},
+                    {__.filter(__.out()), __.filter(__.outE())},
+                    {__.where(__.not(__.out())), __.where(__.not(__.outE()))},
                     {__.where(__.out("knows")), __.where(__.outE("knows"))},
                     {__.values().count(), __.properties().count()},
                     {__.values("name").count(), __.properties("name").count()},

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
index 5e2200e..4bc3866 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 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.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -120,8 +121,8 @@ public class RangeByIsCountStrategyTest {
             final Traversal traversal = __.out().where(__.outE("created").count().is(0));
             applyRangeByIsCountStrategy(traversal);
 
-            final WhereStep whereStep = TraversalHelper.getStepsOfClass(WhereStep.class, traversal.asAdmin()).stream().findFirst().get();
-            final Traversal nestedTraversal = (Traversal) whereStep.getLocalChildren().get(0);
+            final TraversalFilterStep filterStep = TraversalHelper.getStepsOfClass(TraversalFilterStep.class, traversal.asAdmin()).stream().findFirst().get();
+            final Traversal nestedTraversal = (Traversal) filterStep.getLocalChildren().get(0);
             TraversalHelper.getStepsOfClass(RangeGlobalStep.class, nestedTraversal.asAdmin()).stream().forEach(step -> {
                 assertEquals(0, step.getLowRange());
                 assertEquals(1, step.getHighRange());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/88a93ae8/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
index 7f4afab..77e753c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
@@ -264,6 +264,7 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void g_V_whereXnotXoutXcreatedXXX_name() {
         final Traversal<Vertex, String> traversal = get_g_V_whereXnotXoutXcreatedXXX_name();
+        printTraversalForm(traversal);
         checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
     }