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/17 23:21:43 UTC

[09/11] incubator-tinkerpop git commit: recussive Where-P bindings implemented and tested. WhereStep is nearly 'done done' with all the functionality one would want.

recussive Where-P bindings implemented and tested. WhereStep is nearly 'done done' with all the functionality one would want.


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

Branch: refs/heads/master
Commit: 72ce7df984c190f54ca808d5e514e2f48c8359ce
Parents: a3e89f5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 17 10:55:01 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 17 15:21:18 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  6 ++
 .../traversal/dsl/graph/GraphTraversal.java     |  3 +-
 .../process/traversal/step/filter/NotStep.java  | 71 ++++++++++++++++
 .../step/filter/TraversalFilterStep.java        | 14 +---
 .../traversal/step/filter/WhereStep.java        | 66 ++++++++-------
 .../step/filter/GroovyWhereTest.groovy          | 12 +--
 .../AbstractImportCustomizerProvider.java       |  2 +
 .../traversal/step/filter/WhereTest.java        | 87 +++++++++++---------
 .../tinkergraph/structure/TinkerGraphTest.java  | 45 +++++-----
 9 files changed, 205 insertions(+), 101 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 8f3af08..6ec3543 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -28,6 +28,7 @@ TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
 <<<<<<< HEAD
 <<<<<<< HEAD
 <<<<<<< HEAD
+<<<<<<< HEAD
 * Renamed `Graphs` in Gremlin Server to `GraphManager`.
 * Arrow keys for cycling through command history now work in Gremlin Console when being used on Windows.
 =======
@@ -38,6 +39,11 @@ TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
 * Removed `TraversalP`. Traversals and `P`-predicates are completely separate concepts.
 * `has(key,traversal)` is now an alias for `filter(__.values(key).traversal)`.
 >>>>>>> TraversalP dead. P and Traversal are now completely distinct concepts. HasStep and IsStep just work with P-predicates. has(key,traversal) is now an alias for filter(__.values(key).traversal). has(key) is now filter(values(key)) -- as TraversalFilterStep is much simpler and more efficient than WhereStep. P.getTraversals() no longer exists. ConjuctionP can only conjoin P-predicates, not a hybrid of traversals and P-predicates. Good stuff. Phew.
+=======
+* Added `NotStep` and `not(traversal)` for not'ing a traversal (integrates like `ConjunctionStep`).
+* Removed `TraversalP`. Traversals and `P`-predicates are completely separate concepts.
+* `has(key,traversal)` is now an alias for `filter(__.values(key).traversal)` using `TraversalFilterStep`.
+>>>>>>> recussive Where-P bindings implemented and tested. WhereStep is nearly 'done done' with all the functionality one would want.
 * Simplified `SubgraphStrategy` by using `TraversalFilterStep` instead of the more complex `WhereStep`.
 * Added `TraversalMapStep`, `TraversalFlatMapStep`, `TraversalFilterStep`, and `TraversalSideEffectStep` which all leverage an internal traversal.
 >>>>>>> greatly reduced the complexity of WhereStep -- learned alot about variable binding from XMatchStep. WhereStep is looking really really good.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/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 8c561a5..4a4837c 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
@@ -49,6 +49,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
 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.SampleGlobalStep;
@@ -745,7 +746,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> not(final Traversal<E, ?> notTraversal) {
-        return this.asAdmin().addStep(new TraversalFilterStep<E>(this.asAdmin(), true, notTraversal));
+        return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), notTraversal));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
new file mode 100644
index 0000000..e106416
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java
@@ -0,0 +1,71 @@
+/*
+ *
+ *  * Licensed to the Apache Software Foundation (ASF) under one
+ *  * or more contributor license agreements.  See the NOTICE file
+ *  * distributed with this work for additional information
+ *  * regarding copyright ownership.  The ASF licenses this file
+ *  * to you under the Apache License, Version 2.0 (the
+ *  * "License"); you may not use this file except in compliance
+ *  * with the License.  You may obtain a copy of the License at
+ *  *
+ *  * http://www.apache.org/licenses/LICENSE-2.0
+ *  *
+ *  * Unless required by applicable law or agreed to in writing,
+ *  * software distributed under the License is distributed on an
+ *  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  * KIND, either express or implied.  See the License for the
+ *  * specific language governing permissions and limitations
+ *  * under the License.
+ *
+ */
+
+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.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class NotStep<S> extends FilterStep<S> implements TraversalParent {
+
+    private Traversal.Admin<S, ?> notTraversal;
+
+    public NotStep(final Traversal.Admin traversal, final Traversal<S, ?> notTraversal) {
+        super(traversal);
+        this.notTraversal = this.integrateChild(notTraversal.asAdmin());
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return !TraversalUtil.test(traverser, this.notTraversal);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, ?>> getLocalChildren() {
+        return Collections.singletonList(this.notTraversal);
+    }
+
+    @Override
+    public NotStep<S> clone() {
+        final NotStep<S> clone = (NotStep<S>) super.clone();
+        clone.notTraversal = clone.integrateChild(this.notTraversal.clone());
+        return clone;
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.stepString(this, "!" + this.notTraversal);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() ^ this.notTraversal.hashCode();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
index 800134f..b3036cd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TraversalFilterStep.java
@@ -36,21 +36,15 @@ import java.util.List;
 public final class TraversalFilterStep<S> extends FilterStep<S> implements TraversalParent {
 
     private Traversal.Admin<S, ?> filterTraversal;
-    private final boolean not;
 
-    public TraversalFilterStep(final Traversal.Admin traversal, final boolean not, final Traversal<S, ?> filterTraversal) {
+    public TraversalFilterStep(final Traversal.Admin traversal, final Traversal<S, ?> filterTraversal) {
         super(traversal);
         this.filterTraversal = this.integrateChild(filterTraversal.asAdmin());
-        this.not = not;
-    }
-
-    public TraversalFilterStep(final Traversal.Admin traversal, final Traversal<S, ?> filterTraversal) {
-        this(traversal, false, filterTraversal);
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<S> traverser) {
-        return this.not == !TraversalUtil.test(traverser, this.filterTraversal);
+        return TraversalUtil.test(traverser, this.filterTraversal);
     }
 
     @Override
@@ -67,11 +61,11 @@ public final class TraversalFilterStep<S> extends FilterStep<S> implements Trave
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.not ? "!" + this.filterTraversal : this.filterTraversal);
+        return StringFactory.stepString(this, this.filterTraversal);
     }
 
     @Override
     public int hashCode() {
-        return super.hashCode() ^ this.filterTraversal.hashCode() ^ Boolean.valueOf(this.not).hashCode();
+        return super.hashCode() ^ this.filterTraversal.hashCode();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index ef2ea0f..062862e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -30,13 +30,16 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.ConjunctionP;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -47,43 +50,46 @@ import java.util.Set;
 public final class WhereStep<S> extends FilterStep<S> implements TraversalParent, Scoping {
 
     protected String startKey;
-    protected String selectKey;
+    protected List<String> selectKeys;
     protected P<Object> predicate;
     protected Traversal.Admin<?, ?> traversal;
     protected Scope scope;
+    protected final Set<String> scopeKeys = new HashSet<>();
 
     public WhereStep(final Traversal.Admin traversal, final Scope scope, final Optional<String> startKey, final P<?> predicate) {
         super(traversal);
         this.scope = scope;
         this.startKey = startKey.orElse(null);
-        this.selectKey = (String) (predicate.getValue() instanceof Collection ? ((Collection) predicate.getValue()).iterator().next() : predicate.getValue()); // hack for within("x")
         this.predicate = (P) predicate;
+        this.selectKeys = new ArrayList<>();
         this.traversal = null;
+        this.configurePredicates(this.predicate);
     }
 
     public WhereStep(final Traversal.Admin traversal, final Scope scope, final Traversal<?, ?> whereTraversal) {
         super(traversal);
         this.scope = scope;
         this.startKey = null;
-        this.selectKey = null;
         this.predicate = null;
+        this.selectKeys = null;
         this.traversal = whereTraversal.asAdmin();
         this.configureStartAndEndSteps(this.traversal);
         this.traversal = this.integrateChild(this.traversal);
-
     }
 
     private void configureStartAndEndSteps(final Traversal.Admin<?, ?> whereTraversal) {
         ConjunctionStrategy.instance().apply(whereTraversal);
         //// START STEP to WhereStartStep
         final Step<?, ?> startStep = whereTraversal.getStartStep();
-        if (startStep instanceof TraversalParent) {
+        if (startStep instanceof ConjunctionStep || startStep instanceof NotStep) {       // for conjunction and not steps
             ((TraversalParent) startStep).getLocalChildren().forEach(this::configureStartAndEndSteps);
-        } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {
+        } else if (startStep instanceof StartStep && !startStep.getLabels().isEmpty()) {  // as("a").out()... traversals
             if (startStep.getLabels().size() > 1)
                 throw new IllegalArgumentException("The start step of a where()-traversal can only have one label: " + startStep);
-            TraversalHelper.replaceStep(startStep, (Step) new WhereStartStep(whereTraversal, startStep.getLabels().iterator().next()), whereTraversal);
-        } else {
+            final String label = startStep.getLabels().iterator().next();
+            this.scopeKeys.add(label);
+            TraversalHelper.replaceStep(startStep, (Step) new WhereStartStep(whereTraversal, label), whereTraversal);
+        } else {                                                                          // out()... traversals
             TraversalHelper.insertBeforeStep(new WhereStartStep(whereTraversal, null), (Step) startStep, whereTraversal);
         }
         //// END STEP to WhereEndStep
@@ -92,17 +98,35 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
             if (endStep.getLabels().size() > 1)
                 throw new IllegalArgumentException("The end step of a where()-traversal can only have one label: " + endStep);
             final String label = endStep.getLabels().iterator().next();
+            this.scopeKeys.add(label);
             endStep.removeLabel(label);
             whereTraversal.addStep(new WhereEndStep(whereTraversal, label));
         }
     }
 
+    private void configurePredicates(final P<Object> predicate) {
+        if (predicate instanceof ConjunctionP)
+            ((ConjunctionP<Object>) predicate).getPredicates().forEach(this::configurePredicates);
+        else {
+            final String selectKey = (String) (predicate.getValue() instanceof Collection ? ((Collection) predicate.getValue()).iterator().next() : predicate.getValue()); // hack for within("x"))
+            this.selectKeys.add(selectKey);
+            this.scopeKeys.add(selectKey);
+        }
+    }
+
+    private void setPredicateValues(final P<Object> predicate, final Traverser.Admin<S> traverser, final Iterator<String> selectKeysIterator) {
+        if (predicate instanceof ConjunctionP)
+            ((ConjunctionP<Object>) predicate).getPredicates().forEach(p -> this.setPredicateValues(p, traverser, selectKeysIterator));
+        else
+            predicate.setValue(this.getScopeValueByKey(Pop.last, selectKeysIterator.next(), traverser));
+    }
+
     @Override
     protected boolean filter(final Traverser.Admin<S> traverser) {
         if (null != this.traversal)
             return TraversalUtil.test((Traverser.Admin) traverser, this.traversal);
         else {
-            this.predicate.setValue(this.getScopeValueByKey(Pop.last, this.selectKey, traverser));
+            this.setPredicateValues(this.predicate, traverser, this.selectKeys.iterator());
             return this.predicate.test(null == this.startKey ? traverser.get() : this.getScopeValueByKey(Pop.last, this.startKey, traverser));
         }
     }
@@ -114,36 +138,22 @@ public final class WhereStep<S> extends FilterStep<S> implements TraversalParent
 
     @Override
     public String toString() {
+        // TODO: revert the predicates to their string form?
         return StringFactory.stepString(this, this.scope, this.startKey, this.predicate, this.traversal);
     }
 
     @Override
     public Set<String> getScopeKeys() {
-        final Set<String> keys = new HashSet<>();
-        if (null != this.traversal) {
-            final Step<?, ?> startStep = traversal.getStartStep();
-            final Step<?, ?> endStep = traversal.getEndStep();
-            if (startStep instanceof WhereStep.WhereStartStep && ((WhereStartStep) startStep).selectKey != null)
-                keys.add(((WhereStartStep) startStep).selectKey);
-            if (endStep instanceof WhereStep.WhereEndStep && ((WhereEndStep) endStep).matchKey != null)
-                keys.add(((WhereEndStep) endStep).matchKey);
-            // TODO: recurse through conjunctions
-        } else {
-            if (this.startKey != null) keys.add(this.startKey);
-            keys.add(this.selectKey);
-        }
-        return keys;
+        return this.scopeKeys;
     }
 
     @Override
     public WhereStep<S> clone() {
         final WhereStep<S> clone = (WhereStep<S>) super.clone();
-        if (null != this.predicate) {
+        if (null != this.predicate)
             clone.predicate = this.predicate.clone();
-        } else {
-            clone.traversal = this.traversal.clone();
-            clone.integrateChild(clone.traversal);
-        }
+        else
+            clone.integrateChild(clone.traversal = this.traversal.clone());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
index 9b06699..9ad9e26 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
@@ -108,7 +108,7 @@ public abstract class GroovyWhereTest {
 
         @Override
         public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
-            TraversalScriptHelper.compute("g.V.as('a').out.as('b').where(and(__.as('a').out('knows').as('b'),or(__.as('b').out('created').has('name','ripple'),__.as('b').in('knows').count.is(not(eq(0)))))).select.by('name')", g)
+            TraversalScriptHelper.compute("g.V.as('a').out.as('b').where(and(__.as('a').out('knows').as('b'),or(__.as('b').out('created').has('name','ripple'),__.as('b').in('knows').count.is(P.not(eq(0)))))).select.by('name')", g)
         }
 
         @Override
@@ -121,9 +121,11 @@ public abstract class GroovyWhereTest {
             TraversalScriptHelper.compute("g.V.as('a').out('created').as('b').where(and(__.as('b').in,not(__.as('a').out('created').has('name','ripple')))).select.by('name')", g)
         }
 
-        /*@Override
-        public Traversal<Vertex, String> get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
-            TraversalScriptHelper.compute("g.V.as('a').out('knows').as('b').where(__.as('a', 'b').out('created').has('name', 'ripple')).name", g)
-        }*/
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+            TraversalScriptHelper.compute("g.V.as('a').out('created').as('b').in('created').as('c').both('knows').both('knows').as('d').where('c',P.not(eq('a').or(eq('d')))).select.by('name')", g)
+        }
+
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 2e4c626..2efb555 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -99,9 +99,11 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
 
         imports.add(Event.class.getPackage().getName() + DOT_STAR);                   // eventing
         staticImports.add(__.class.getCanonicalName() + DOT_STAR);
+        //staticImports.add(__.class.getCanonicalName() + ".not"); // necessary as not() is both in P and __
         staticImports.add(TraversalOptionParent.Pick.class.getCanonicalName() + DOT_STAR);
         staticImports.add(GraphTraversalSource.class.getCanonicalName() + DOT_STAR);
         staticImports.add(P.class.getCanonicalName() + DOT_STAR);
+        //staticImports.add(P.class.getCanonicalName() + ".not"); // necessary as not() is both in P and __
         staticImports.add(Order.class.getCanonicalName() + DOT_STAR);
         staticImports.add(Operator.class.getCanonicalName() + DOT_STAR);
         staticImports.add(Scope.class.getCanonicalName() + DOT_STAR);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/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 7a717ac..294010e 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
@@ -22,10 +22,10 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
 import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -38,7 +38,9 @@ import java.util.Set;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 import static org.apache.tinkerpop.gremlin.process.traversal.P.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.P.not;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.not;
 import static org.junit.Assert.*;
 
 /**
@@ -81,11 +83,13 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
 
     // complex and/or functionality
 
-    public abstract Traversal<Vertex,Map<String,String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
 
-    public abstract Traversal<Vertex,String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
+    public abstract Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
 
-    public abstract Traversal<Vertex,Map<String,String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX();
 
     // multi-labels
 
@@ -269,52 +273,61 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
-        Traversal<Vertex,Map<String,String>> traversal = get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
+        Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX();
         printTraversalForm(traversal);
         int counter = 0;
-        while(traversal.hasNext()) {
-            final Map<String,String> map = traversal.next();
-            assertEquals(2,map.size());
-            assertEquals("marko",map.get("a"));
+        while (traversal.hasNext()) {
+            final Map<String, String> map = traversal.next();
+            assertEquals(2, map.size());
+            assertEquals("marko", map.get("a"));
             assertTrue(map.get("b").equals("josh") || map.get("b").equals("vadas"));
             counter++;
         }
-        assertEquals(2,counter);
+        assertEquals(2, counter);
     }
 
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_selectXaX_byXnameX() {
-        Traversal<Vertex,String> traversal = get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
+        Traversal<Vertex, String> traversal = get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX();
         printTraversalForm(traversal);
-        checkResults(Arrays.asList("marko","josh"),traversal);
+        checkResults(Arrays.asList("marko", "josh"), traversal);
     }
 
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
-        Traversal<Vertex,Map<String,String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
+        Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX();
         printTraversalForm(traversal);
         int counter = 0;
-        while(traversal.hasNext()) {
-            final Map<String,String> map = traversal.next();
-            assertEquals(2,map.size());
+        while (traversal.hasNext()) {
+            final Map<String, String> map = traversal.next();
+            assertEquals(2, map.size());
             assertTrue(map.get("a").equals("marko") || map.get("a").equals("peter"));
             assertEquals("lop", map.get("b"));
             counter++;
         }
-        assertEquals(2,counter);
+        assertEquals(2, counter);
     }
 
-
-    // multi-labels
-   /* @Test
+    @Test
     @LoadGraphWith(MODERN)
-    public void g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name();
-        checkResults(Arrays.asList("josh"), traversal);
-    } */
+    public void g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+        Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Map<String, String> map = traversal.next();
+            assertEquals(4, map.size());
+            assertTrue(map.get("a").equals("marko") || map.get("a").equals("peter"));
+            assertEquals("lop", map.get("b"));
+            assertEquals("josh", map.get("c"));
+            assertEquals("vadas", map.get("d"));
 
+        }
+        assertEquals(2, counter);
+    }
 
     public static class Traversals extends WhereTest {
 
@@ -349,7 +362,7 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Object> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_asXbX_whereXasXbX_outXcreatedX_hasXname_rippleXX_valuesXage_nameX(final Object v1Id) {
-            return g.V(v1Id).as("a").out("created").in("created").as("b").where(__.as("b").out("created").has("name", "ripple")).values("age", "name");
+            return g.V(v1Id).as("a").out("created").in("created").as("b").where(as("b").out("created").has("name", "ripple")).values("age", "name");
         }
 
         // except/retain functionality
@@ -376,38 +389,36 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_whereXwithoutXeXX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
-            return g.V(v1Id).repeat(__.bothE("created").where(without("e")).aggregate("e").otherV()).emit().path();
+            return g.V(v1Id).repeat(bothE("created").where(without("e")).aggregate("e").otherV()).emit().path();
         }
 
         // hasNot functionality
 
         @Override
         public Traversal<Vertex, String> get_g_V_whereXnotXoutXcreatedXXX_name() {
-            return g.V().where(not(__.out("created"))).values("name");
+            return g.V().where(not(out("created"))).values("name");
         }
 
         // complex and/or functionality
 
         @Override
-        public Traversal<Vertex,Map<String,String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
-              return g.V().as("a").out().as("b").where(and(as("a").out("knows").as("b"),or(as("b").out("created").has("name","ripple"),as("b").in("knows").count().is(not(eq(0)))))).<String>select().by("name");
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_whereXandXasXaX_outXknowsX_asXbX__orXasXbX_outXcreatedX_hasXname_rippleX__asXbX_inXknowsX_count_isXnotXeqX0XXXXX_select_byXnameX() {
+            return g.V().as("a").out().as("b").where(and(as("a").out("knows").as("b"), or(as("b").out("created").has("name", "ripple"), as("b").in("knows").count().is(not(eq(0)))))).<String>select().by("name");
         }
 
         @Override
-        public Traversal<Vertex,String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX() {
+        public Traversal<Vertex, String> get_g_V_whereXoutXcreatedX_and_outXknowsX_or_inXknowsXX_valuesXnameX() {
             return g.V().where(out("created").and().out("knows").or().in("knows")).values("name");
         }
 
         @Override
-        public Traversal<Vertex,Map<String,String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
-            return g.V().as("a").out("created").as("b").where(and(as("b").in(),not(as("a").out("created").has("name","ripple")))).<String>select().by("name");
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_whereXandXasXbX_in__notXasXaX_outXcreatedX_hasXname_rippleXXX_select_byXnameX() {
+            return g.V().as("a").out("created").as("b").where(and(as("b").in(), not(as("a").out("created").has("name", "ripple")))).<String>select().by("name");
         }
 
-        // multi-labels
-
-       /* @Override
-        public Traversal<Vertex, String> get_g_V_asXaX_outXknowsX_asXbX_whereXasXa__bX_outXcreatedX_hasXname__rippleX_name() {
-            return g.V().as("a").out("knows").as("b").where(as("a", "b").out("created").has("name", "ripple")).values("name");
-        }*/
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXcreatedX_asXbX_inXcreatedX_asXcX_bothXknowsX_bothXknowsX_asXdX_whereXc__notXeqXaX_orXeqXdXXXX_select_byXnameX() {
+            return g.V().as("a").out("created").as("b").in("created").as("c").both("knows").both("knows").as("d").where("c", P.not(P.eq("a").or(P.eq("d")))).<String>select().by("name");
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/72ce7df9/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index 59d3f05..78abca5 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -162,35 +162,42 @@ public class TinkerGraphTest {
         graph.io(GraphMLIo.build()).readGraph("/Users/marko/software/tinkerpop/tinkerpop3/data/grateful-dead.xml");
         GraphTraversalSource g = graph.traversal(GraphTraversalSource.standard());
         //System.out.println(g.E().label().groupCount().next());
-        final Supplier<Traversal<?, ?>> traversal = () ->
-                /*g.V().match("a",
+        final List<Supplier<Traversal<?,?>>> traversals = Arrays.asList(
+                () -> g.V().xmatch("a",
                         as("a").in("sungBy").as("b"),
-                        as("a").in("writtenBy").as("b")).select().by("name");*/
-                /*g.V().xmatch("a",
+                        as("a").in("writtenBy").as("b")).select().by("name"),
+                /*() -> g.V().xmatch("a",
+                        as("a").in("sungBy").as("b"),
+                        not(as("a").in("writtenBy").as("b"))).select().by("name"),*/
+                () -> g.V().xmatch("a",
                         as("a").out("followedBy").as("b"),
-                        as("b").out("followedBy").as("a")).select().by("name");*/
-                /*g.V().xmatch("a",
+                        as("b").out("followedBy").as("a")).select().by("name"),
+                () -> g.V().xmatch("a",
                         as("a").in("followedBy").as("b"),
                         as("a").out("sungBy").as("c"),
-                        as("a").out("writtenBy").as("d")).select().by("name");*/
-                /*g.V().match("a",
+                        as("a").out("writtenBy").as("d")).select().by("name"),
+                () -> g.V().xmatch("a",
                         as("a").in("followedBy").as("b"),
                         as("a").out("sungBy").as("c"),
                         as("a").out("writtenBy").as("d")).
-                        where("c", P.neq("d")).select().by("name");*/
-                /*g.V().xmatch("a",
+                        where("c", P.neq("d")).select().by("name"),
+                () -> g.V().xmatch("a",
                         as("a").in("sungBy").as("b"),
                         as("a").in("writtenBy").as("b"),
                         as("b").out("followedBy").as("c"),
                         as("c").out("sungBy").as("a"),
-                        as("c").out("writtenBy").as("a")).select().by("name");*/
-                g.V().xmatch("a",
+                        as("c").out("writtenBy").as("a")).select().by("name"),
+                () -> g.V().xmatch("a",
                         as("a").has("name","Garcia"),
                         as("a").in("writtenBy").as("b"),
                         as("b").out("followedBy").as("c"),
-                        as("c").out("writtenBy").has("name",P.neq("Garcia")).as("d")).select().by("name");
+                        as("c").out("writtenBy").has("name",P.neq("Garcia")).as("d")).select().by("name"));
 
-        System.out.println(TimeUtil.clockWithResult(100, () -> traversal.get().toList().size()));
+        traversals.forEach(traversal -> {
+            System.out.println("pre-strategy:  " + traversal.get());
+            System.out.println("post-strategy: " + traversal.get().iterate());
+            System.out.println(TimeUtil.clockWithResult(10, () -> traversal.get().toList().size()));
+        });
     }
 
     @Test
@@ -230,13 +237,13 @@ public class TinkerGraphTest {
                         as("a").out("knows").as("c"),
                         as("c").out("created").count().as("b")).select("a","b","c").by("name").by().by("name");*/
 
-       final Supplier<Traversal<?,?>> traversal = () ->
+       /*final Supplier<Traversal<?,?>> traversal = () ->
                 g.V().as("a").out().as("b").where(
-                        in("created").as("a")
-                ).select().by("name");
+                        not(in("knows").as("a")).and().as("b").in().count().is(P.gt(1))
+                ).select().by("name"); */
 
-       /* final Supplier<Traversal<?,?>> traversal = () ->
-                g.V().as("a").out().as("b").in().as("c").where(P.neq("a")).select().by("name"); */
+        final Supplier<Traversal<?,?>> traversal = () ->
+                g.V().as("a").out("created").as("b").in("created").as("c").both("knows").both("knows").as("d").where("c",P.not(P.eq("a").or(P.eq("d")))).select().by("name");
 
         System.out.println(traversal.get());
         System.out.println(traversal.get().iterate());