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

Reply via email to