Repository: tinkerpop Updated Branches: refs/heads/master 1fabe15fb -> 944ce315f
Finishing up some final touches on the InlineFilterStrategy work. outE().hasLabel().inV() is now turned to outE(label).inV(). Likewise for more complicated nested predicates. Did a minor optimization to the TraversalStrategies.addStrategies() system. HasContinerHolder.removeHasContainer() added with default UnsupportedOperationException implementation. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/944ce315 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/944ce315 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/944ce315 Branch: refs/heads/master Commit: 944ce315fc634ba00f7acbba0cd1108b852317a5 Parents: 1fabe15 Author: Marko A. Rodriguez <[email protected]> Authored: Fri Oct 7 17:09:18 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Fri Oct 7 17:09:28 2016 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 3 +- .../process/traversal/TraversalStrategies.java | 3 +- .../traversal/step/HasContainerHolder.java | 4 ++ .../process/traversal/step/filter/HasStep.java | 11 ++-- .../optimization/InlineFilterStrategy.java | 66 ++++++++++++++++++-- .../util/DefaultTraversalStrategies.java | 11 ++-- .../optimization/InlineFilterStrategyTest.java | 22 +++++-- .../MatchPredicateStrategyTest.java | 4 +- 8 files changed, 98 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index cf48c24..746d38c 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.3 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Added `HasContainerHolder.removeHasContainer()`-method with default `UnsupportedOperationException` implementation. * `TraversalSource.withComputer()` is simplified to add a `VertexProgramStrategy`. Easier for language variants. * Fixed a `Set`, `List`, `Map` bug in the various `Translators` where such collections were not being internally translated. * Fixed a `Bytecode` bug where nested structures (map, list, set) were not being analyzed for bindings and bytecode conversions. @@ -45,7 +46,7 @@ TinkerPop 3.2.3 (Release Date: NOT OFFICIALLY RELEASED YET) * Added `TraversalHelper.copyLabels()` for copying (or moving) labels form one step to another. * Added `TraversalHelper.applySingleLevelStrategies()` which will apply a subset of strategies but not walk the child tree. * Added the concept that hidden labels using during traversal compilation are removed at the end during `StandardVerificationStrategy`. (*breaking*) -* Added `InlineFilterStrategy` which will determine if a `TraversalFilterStep`, `AndStep`, `OrStep`, `MatchStep` children are filters and if so, inline them. +* Added `InlineFilterStrategy` which will determine if various `TraversalParent` children are filters and if so, inline them. * Removed `IdentityRemovalStrategy` from the default listing as its not worth the clock cycles. * Removed the "!" symbol in `NotStep.toString()` as it is confusing and the `NotStep`-name is sufficient. * Fixed a bug in `TraversalVertexProgram` (OLAP) around ordering and connectives (i.e. `and()` and `or()`). http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java index 407d16e..c271a37 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java @@ -203,9 +203,9 @@ public interface TraversalStrategies extends Serializable, Cloneable { final TraversalStrategies graphStrategies = new DefaultTraversalStrategies(); graphStrategies.addStrategies( ConnectiveStrategy.instance(), + InlineFilterStrategy.instance(), IncidentToAdjacentStrategy.instance(), AdjacentToIncidentStrategy.instance(), - InlineFilterStrategy.instance(), FilterRankingStrategy.instance(), MatchPredicateStrategy.instance(), RepeatUnrollStrategy.instance(), @@ -214,7 +214,6 @@ public interface TraversalStrategies extends Serializable, Cloneable { LazyBarrierStrategy.instance(), ProfileStrategy.instance(), StandardVerificationStrategy.instance()); - GRAPH_CACHE.put(Graph.class, graphStrategies); GRAPH_CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies()); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java index cd7f493..67c3d1e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java @@ -30,4 +30,8 @@ public interface HasContainerHolder { public List<HasContainer> getHasContainers(); public void addHasContainer(final HasContainer hasContainer); + + public default void removeHasContainer(final HasContainer hasContainer) { + throw new UnsupportedOperationException("The holder does not support container removal: " + this.getClass().getCanonicalName()); + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java index de2d9d5..a7957ec 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java @@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.filter; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder; -import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.structure.Element; @@ -32,7 +31,6 @@ import java.util.Collections; import java.util.EnumSet; import java.util.List; import java.util.Set; -import java.util.stream.Collectors; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -44,9 +42,7 @@ public class HasStep<S extends Element> extends FilterStep<S> implements HasCont public HasStep(final Traversal.Admin traversal, final HasContainer... hasContainers) { super(traversal); this.hasContainers = new ArrayList<>(); - for (final HasContainer hasContainer : hasContainers) { - this.addHasContainer(hasContainer); - } + Collections.addAll(this.hasContainers, hasContainers); } @Override @@ -65,6 +61,11 @@ public class HasStep<S extends Element> extends FilterStep<S> implements HasCont } @Override + public void removeHasContainer(final HasContainer hasContainer) { + this.hasContainers.remove(hasContainer); + } + + @Override public void addHasContainer(final HasContainer hasContainer) { this.hasContainers.add(hasContainer); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/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 8072ca0..7a4c2ae 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 @@ -20,6 +20,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.Compare; +import org.apache.tinkerpop.gremlin.process.traversal.Contains; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; @@ -34,13 +36,19 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep; 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.map.MatchStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer; import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; +import org.apache.tinkerpop.gremlin.structure.Edge; +import org.apache.tinkerpop.gremlin.structure.T; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -54,6 +62,7 @@ import java.util.Set; * * @author Marko A. Rodriguez (http://markorodriguez.com) * @example <pre> + * __.outE().hasLabel(eq("knows").or(eq("created"))).inV() // is replaced by __.outE("knows", "created) * __.filter(has("name","marko")) // is replaced by __.has("name","marko") * __.and(has("name"),has("age")) // is replaced by __.has("name").has("age") * __.and(filter(has("name","marko").has("age")),hasNot("blah")) // is replaced by __.has("name","marko").has("age").hasNot("blah") @@ -66,7 +75,9 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver private static final Set<Class<? extends OptimizationStrategy>> POSTS = new HashSet<>(Arrays.asList( MatchPredicateStrategy.class, FilterRankingStrategy.class, - GraphFilterStrategy.class)); + GraphFilterStrategy.class, + AdjacentToIncidentStrategy.class)); + private static final Set<Class<? extends OptimizationStrategy>> PRIORS = Collections.singleton(IdentityRemovalStrategy.class); private InlineFilterStrategy() { } @@ -106,8 +117,49 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver TraversalHelper.copyLabels(step, previousStep, false); traversal.removeStep(step); return true; - } - return false; + } else if (step.getPreviousStep() instanceof VertexStep && ((VertexStep) step.getPreviousStep()).returnsEdge()) { + final VertexStep<Edge> previousStep = (VertexStep<Edge>) step.getPreviousStep(); + final List<String> edgeLabels = new ArrayList<>(); + for (final HasContainer hasContainer : new ArrayList<>(step.getHasContainers())) { + if (hasContainer.getKey().equals(T.label.getAccessor())) { + if (hasContainer.getBiPredicate() == Compare.eq && hasContainer.getValue() instanceof String) { + edgeLabels.add((String) hasContainer.getValue()); + step.removeHasContainer(hasContainer); + } else if (hasContainer.getBiPredicate() == Contains.within && hasContainer.getValue() instanceof Collection) { + edgeLabels.addAll((Collection<String>) hasContainer.getValue()); + step.removeHasContainer(hasContainer); + } else if (hasContainer.getPredicate() instanceof OrP) { + boolean removeContainer = true; + final List<P<?>> orps = ((OrP) hasContainer.getPredicate()).getPredicates(); + final List<String> newEdges = new ArrayList<>(); + for (int i = 0; i < orps.size(); i++) { + if (orps.get(i).getBiPredicate() == Compare.eq && orps.get(i).getValue() instanceof String) + newEdges.add((String) orps.get(i).getValue()); + else { + removeContainer = false; + break; + } + } + if (removeContainer) { + edgeLabels.addAll(newEdges); + step.removeHasContainer(hasContainer); + } + } + } + } + if (!edgeLabels.isEmpty()) { + final VertexStep<Edge> newVertexStep = new VertexStep<>(traversal, Edge.class, previousStep.getDirection(), edgeLabels.toArray(new String[edgeLabels.size()])); + TraversalHelper.replaceStep(previousStep, newVertexStep, traversal); + TraversalHelper.copyLabels(previousStep, newVertexStep, false); + if (step.getHasContainers().isEmpty()) { + TraversalHelper.copyLabels(step, newVertexStep, false); + traversal.removeStep(step); + } + return true; + } + return false; + } else + return false; } private static final boolean processTraversalFilterStep(final TraversalFilterStep<?> step, final Traversal.Admin<?, ?> traversal) { @@ -218,8 +270,7 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver matchTraversal.removeStep(matchTraversal.getSteps().size() - 1); // remove MatchEndStep TraversalHelper.applySingleLevelStrategies(traversal, matchTraversal, InlineFilterStrategy.class); step.removeGlobalChild(matchTraversal); - step.getPreviousStep().addLabel(startLabel); - // TODO: matchTraversal.getEndStep().addLabel(startLabel); (perhaps insert an identity so filter rank can push has()-left) + matchTraversal.getEndStep().addLabel(startLabel); if (null != endLabel) matchTraversal.getEndStep().addLabel(endLabel); TraversalHelper.insertTraversal((Step) step.getPreviousStep(), matchTraversal, traversal); } @@ -234,6 +285,11 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver return POSTS; } + @Override + public Set<Class<? extends OptimizationStrategy>> applyPrior() { + return PRIORS; + } + public static InlineFilterStrategy instance() { return INSTANCE; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java index 4f4f66c..74e84e2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java @@ -38,16 +38,13 @@ public class DefaultTraversalStrategies implements TraversalStrategies { @Override @SuppressWarnings({"unchecked", "varargs"}) public TraversalStrategies addStrategies(final TraversalStrategy<?>... strategies) { - final List<TraversalStrategy<?>> toRemove = new ArrayList<>(strategies.length); + final List<TraversalStrategy<?>> concurrent = new ArrayList<>(this.traversalStrategies); for (final TraversalStrategy<?> addStrategy : strategies) { - for (final TraversalStrategy<?> currentStrategy : this.traversalStrategies) { - if (addStrategy.getClass().equals(currentStrategy.getClass())) { - toRemove.add(currentStrategy); - break; - } + for (final TraversalStrategy<?> currentStrategy : concurrent) { + if (addStrategy.getClass().equals(currentStrategy.getClass())) + this.traversalStrategies.remove(currentStrategy); } } - this.traversalStrategies.removeAll(toRemove); Collections.addAll(this.traversalStrategies, strategies); this.traversalStrategies = TraversalStrategies.sortStrategies(this.traversalStrategies); return this; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/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 abf1f00..c2dbcc4 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 @@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer; import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies; +import org.apache.tinkerpop.gremlin.structure.T; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -43,10 +44,12 @@ 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.__.hasLabel; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.limit; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.match; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.or; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE; import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.tail; import static org.junit.Assert.assertEquals; @@ -77,7 +80,7 @@ public class InlineFilterStrategyTest { public static Iterable<Object[]> generateTestParameters() { return Arrays.asList(new Traversal[][]{ - {has("age", 10).as("a").has("name", "marko").as("b").coin(0.5).as("c"), addHas(__.start(), "age", eq(10), "name", eq("marko")).as("a","b").coin(0.5).as("c")}, + {has("age", 10).as("a").has("name", "marko").as("b").coin(0.5).as("c"), addHas(__.start(), "age", eq(10), "name", eq("marko")).as("a", "b").coin(0.5).as("c")}, // {filter(out("knows")), filter(out("knows"))}, {filter(has("age", gt(10))).as("a"), has("age", gt(10)).as("a")}, @@ -100,17 +103,28 @@ public class InlineFilterStrategyTest { {and(has("age", gt(10)), and(out("knows"), has("name", "marko"))), has("age", gt(10)).and(out("knows"), has("name", "marko"))}, {and(has("age", gt(20)), or(has("age", lt(10)), has("age", gt(100)))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100)))}, {and(has("age", gt(20)).as("a"), or(has("age", lt(10)), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b")}, + {and(has("age", gt(20)).as("a"), or(has("age", lt(10)).as("c"), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b", "c")}, // - {V().match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), V().as("a").has("age", 10).match(as("a").has("name").as("b"))}, + {V().match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a").match(as("a").has("name").as("b"))}, {match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), match(as("a").has("age", 10), as("a").has("name").as("b"))}, + {match(as("a").has("age", 10).both().as("b"), as("b").out().as("c")), match(as("a").has("age", 10).both().as("b"), as("b").out().as("c"))}, {__.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"))}, + {V().match(as("a").has("age", 10)), V().has("age", 10).as("a")}, + {V().match(as("a").has("age", 10).as("b"), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a","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"))}, + // + {outE().hasLabel("knows").inV(), outE("knows").inV()}, + {outE().hasLabel("knows").hasLabel("created").inV(), outE("created").inV()}, + {outE().or(hasLabel("knows"),hasLabel("created")).inV(), outE("knows", "created").inV()}, + {outE().or(hasLabel("knows").as("a"),hasLabel("created").as("b")).as("c").inV(), outE("knows", "created").as("a","b","c").inV()}, + {outE().hasLabel(P.eq("knows").or(P.gt("created"))).has("weight", gt(1.0)).inV(), addHas(outE(), T.label.getAccessor(), P.eq("knows").or(P.gt("created")), "weight", gt(1.0)).inV()}, + {outE().hasLabel(P.eq("knows").or(P.eq("created"))).has("weight", gt(1.0)).inV(), outE("knows", "created").has("weight", gt(1.0)).inV()}, + // {outE().or(has(T.label,P.within("knows","likes")).hasLabel("created")).inV(), outE("knows", "likes", "created").inV()}, + {outE().hasLabel(P.within("knows", "created")).inV(), outE("knows", "created").inV()}, }); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/944ce315/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategyTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategyTest.java index 8037bd6..ed248ff 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategyTest.java @@ -68,8 +68,8 @@ public class MatchPredicateStrategyTest { public static Iterable<Object[]> generateTestParameters() { return Arrays.asList(new Object[][]{ - {__.out().match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().as("a").has("name", "marko").match(as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())}, // has() pull out - {__.out().as("a").match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().as("a").has("name", "marko").match(as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())}, // has() pull out + {__.out().match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().has("name", "marko").as("a").match(as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())}, // has() pull out + {__.out().as("a").match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().as("a").has("name", "marko").as("a").match(as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())}, // has() pull out {__.out().as("a").out().match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().as("a").out().match(as("a").has("name", "marko"), as("a").out().as("b")), Collections.emptyList()}, // no has() pull out {__.map(__.match(as("a").has("name", "marko"), as("a").out().as("b"))), __.map(__.match(as("a").has("name", "marko"), as("a").out().as("b"))), Collections.emptyList()}, // no has() pull out {__.out().as("c").match(as("a").has("name", "marko"), as("a").out().as("b")), __.out().as("c").match(as("a").has("name", "marko"), as("a").out().as("b")), Collections.emptyList()}, // no has() pull out
