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);
}