You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2016/09/28 17:38:09 UTC
[09/41] tinkerpop git commit: more test cases for
InlineFilterStrategy and added a constraint to make it less likely to happen
for and() and filter().
more test cases for InlineFilterStrategy and added a constraint to make it less likely to happen for and() and filter().
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/ab70dca9
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/ab70dca9
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/ab70dca9
Branch: refs/heads/TINKERPOP-790
Commit: ab70dca9d7193320a115148fdc2ca9c54394235c
Parents: e237d9c
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 27 10:40:03 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 27 12:45:49 2016 -0600
----------------------------------------------------------------------
.../optimization/InlineFilterStrategy.java | 31 ++++++++++++++++++--
.../process/traversal/util/TraversalHelper.java | 12 +++++++-
.../optimization/InlineFilterStrategyTest.java | 13 ++++++--
3 files changed, 50 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ab70dca9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
index cbc7748..c3f913e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
@@ -23,9 +23,14 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimiza
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
@@ -71,7 +76,13 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
// filter(x.y) --> x.y
for (final TraversalFilterStep<?> step : TraversalHelper.getStepsOfClass(TraversalFilterStep.class, traversal)) {
final Traversal.Admin<?, ?> childTraversal = step.getLocalChildren().get(0);
- if (TraversalHelper.allStepsInstanceOf(childTraversal, FilterStep.class)) {
+ if (TraversalHelper.hasAllStepsOfClass(childTraversal, FilterStep.class) &&
+ !TraversalHelper.hasStepOfClass(childTraversal,
+ DropStep.class,
+ RangeGlobalStep.class,
+ TailGlobalStep.class,
+ DedupGlobalStep.class,
+ LambdaHolder.class)) {
changed = true;
TraversalHelper.applySingleLevelStrategies(traversal, childTraversal, InlineFilterStrategy.class);
final Step<?, ?> finalStep = childTraversal.getEndStep();
@@ -82,7 +93,20 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
}
// and(x,y) --> x.y
for (final AndStep<?> step : TraversalHelper.getStepsOfClass(AndStep.class, traversal)) {
- if (!step.getLocalChildren().stream().filter(t -> !TraversalHelper.allStepsInstanceOf(t, FilterStep.class)).findAny().isPresent()) {
+ boolean process = true;
+ for (final Traversal.Admin<?, ?> childTraversal : step.getLocalChildren()) {
+ if (!TraversalHelper.hasAllStepsOfClass(childTraversal, FilterStep.class) ||
+ TraversalHelper.hasStepOfClass(childTraversal,
+ DropStep.class,
+ RangeGlobalStep.class,
+ TailGlobalStep.class,
+ DedupGlobalStep.class,
+ LambdaHolder.class)) {
+ process = false;
+ break;
+ }
+ }
+ if (process) {
changed = true;
final List<Traversal.Admin<?, ?>> childTraversals = (List) step.getLocalChildren();
Step<?, ?> finalStep = null;
@@ -105,7 +129,7 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
if (null != startLabel) {
for (final Traversal.Admin<?, ?> matchTraversal : new ArrayList<>(step.getGlobalChildren())) {
if (!(step.getPreviousStep() instanceof EmptyStep) &&
- TraversalHelper.allStepsInstanceOf(matchTraversal,
+ TraversalHelper.hasAllStepsOfClass(matchTraversal,
HasStep.class,
MatchStep.MatchStartStep.class,
MatchStep.MatchEndStep.class) &&
@@ -128,6 +152,7 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
}
}
}
+
}
private static final String determineStartLabelForHasPullOut(final MatchStep<?, ?> matchStep) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ab70dca9/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 d38ac6e..2192666 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
@@ -579,7 +579,7 @@ public final class TraversalHelper {
}
}
- public static boolean allStepsInstanceOf(final Traversal.Admin<?, ?> traversal, final Class<?>... classesToCheck) {
+ public static boolean hasAllStepsOfClass(final Traversal.Admin<?, ?> traversal, final Class<?>... classesToCheck) {
for (final Step step : traversal.getSteps()) {
boolean foundInstance = false;
for (final Class<?> classToCheck : classesToCheck) {
@@ -594,6 +594,16 @@ public final class TraversalHelper {
return true;
}
+ public static boolean hasStepOfClass(final Traversal.Admin<?, ?> traversal, final Class<?>... classesToCheck) {
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ for (final Class<?> classToCheck : classesToCheck) {
+ if (classToCheck.isInstance(step))
+ return true;
+ }
+ }
+ return false;
+ }
+
public static void applySingleLevelStrategies(final Traversal.Admin<?, ?> parentTraversal, final Traversal.Admin<?, ?> childTraversal, final Class<? extends TraversalStrategy> stopAfterStrategy) {
childTraversal.setStrategies(parentTraversal.getStrategies());
childTraversal.setSideEffects(parentTraversal.getSideEffects());
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ab70dca9/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
index e9e605a..aeae593 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
@@ -32,11 +32,15 @@ import java.util.Arrays;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.V;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.and;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.dedup;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.drop;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.filter;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.limit;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.map;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.match;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.tail;
import static org.junit.Assert.assertEquals;
/**
@@ -67,8 +71,8 @@ public class InlineFilterStrategyTest {
{filter(out("knows")), filter(out("knows"))},
{filter(has("age", P.gt(10))).as("a"), has("age", P.gt(10)).as("a")},
{filter(has("age", P.gt(10)).as("b")).as("a"), has("age", P.gt(10)).as("b", "a")},
- {filter(has("age", P.gt(10))), has("age", P.gt(10))},
- {filter(and(has("age", P.gt(10)), has("name", "marko"))), has("age", P.gt(10)).has("name", "marko")},
+ {filter(has("age", P.gt(10)).as("a")), has("age", P.gt(10)).as("a")},
+ {filter(and(has("age", P.gt(10)).as("a"), has("name", "marko"))), has("age", P.gt(10)).as("a").has("name", "marko")},
//
{and(has("age", P.gt(10)), filter(has("age", 22))), has("age", P.gt(10)).has("age", 22)},
{and(has("age", P.gt(10)).as("a"), and(filter(has("age", 22).as("b")).as("c"), has("name", "marko").as("d"))), has("age", P.gt(10)).as("a").has("age", 22).as("b", "c").has("name", "marko").as("d")},
@@ -79,6 +83,11 @@ public class InlineFilterStrategyTest {
{map(match(as("a").has("age", 10), as("a").filter(has("name")).as("b"))), map(match(as("a").has("age", 10), as("a").has("name").as("b")))},
{V().match(as("a").has("age", 10)), V().as("a").has("age", 10)},
{V().match(as("a").has("age", 10).as("b"), as("a").filter(has("name")).as("b")), V().as("a").has("age", 10).as("b").match(as("a").has("name").as("b"))},
+ //
+ {filter(dedup()), filter(dedup())},
+ {filter(filter(drop())), filter(drop())},
+ {and(has("name"), limit(10).has("age")), and(has("name"), limit(10).has("age"))},
+ {filter(tail(10).as("a")), filter(tail(10).as("a"))},
});
}
}