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/05/15 22:07:48 UTC

incubator-tinkerpop git commit: No more P[]. Now there is AndP which is a P. This makes the method signatures of has() and is() much simpler. Moreover, IsStep is extremely simple.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master ef198085a -> d72666766


No more P[]. Now there is AndP which is a P. This makes the method signatures of has() and is() much simpler. Moreover, IsStep is extremely simple.


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

Branch: refs/heads/master
Commit: d72666766dc689e9cfef201b25eb3b87d37c901c
Parents: ef19808
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri May 15 14:07:28 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri May 15 14:07:41 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../traversal/dsl/graph/GraphTraversal.java     | 32 +++-----
 .../gremlin/process/traversal/dsl/graph/__.java | 20 ++---
 .../process/traversal/step/filter/HasStep.java  |  2 +-
 .../process/traversal/step/filter/IsStep.java   | 25 ++----
 .../traversal/step/util/HasContainer.java       | 17 ++--
 .../optimization/RangeByIsCountStrategy.java    | 10 ++-
 .../apache/tinkerpop/gremlin/structure/P.java   | 39 ++++------
 .../tinkerpop/gremlin/structure/util/AndP.java  | 82 ++++++++++++++++++++
 .../RangeByIsCountStrategyTest.java             | 10 +--
 .../step/filter/GroovyHasNotTest.groovy         | 41 ----------
 .../process/GroovyProcessComputerSuite.java     | 50 ++++++++++--
 .../process/GroovyProcessStandardSuite.java     |  2 -
 .../gremlin/process/ProcessComputerSuite.java   | 51 ++++++++++--
 .../gremlin/process/ProcessStandardSuite.java   |  6 --
 .../traversal/step/filter/HasNotTest.java       | 79 -------------------
 16 files changed, 235 insertions(+), 232 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 5285672..7a38c36 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M9 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Added `AndP` which allows for the `and()`-ing of `P` predicates.
 * `Order.opposite()` is now `reversed()` as that is a `Comparator` interface method with the same semantics.
 * `Compare/Contains/P.opposite()` are now `negate()` as that is a `BiPredicate` interface method with the same semantics.
 * `has(traversal)` is replaced by `where(traversal)` and `has(key,traversal)`. `HasXXX` is always with respects to an element property.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/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 6414e7f..9139263 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
@@ -474,28 +474,24 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(new HasTraversalStep(this.asAdmin(), key, hasNotNextTraversal.asAdmin(), true));
     }
 
-    public default GraphTraversal<S, E> has(final String key, final P<?> predicate, final P<?>... predicates) {
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(key, predicate, predicates)));
+    public default GraphTraversal<S, E> has(final String key, final P<?> predicate) {
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(key, predicate)));
     }
 
-    public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate, final P<?>... predicates) {
-        return this.has(accessor.getAccessor(), predicate, predicates);
+    public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
+        return this.has(accessor.getAccessor(), predicate);
     }
 
     public default GraphTraversal<S, E> has(final String key, final Object value) {
-        if (value instanceof P[]) {
-            final Pair<P, P[]> split = P.splitForAPI((P[]) value);
-            return this.has(key, split.getValue0(), split.getValue1());
-        } else
-            return this.has(key, value instanceof P ? (P) value : P.eq(value), new P[0]);
+       return this.has(key, value instanceof P ? (P) value : P.eq(value));
     }
 
     public default GraphTraversal<S, E> has(final T accessor, final Object value) {
         return this.has(accessor.getAccessor(), value);
     }
 
-    public default GraphTraversal<S, E> has(final String label, final String key, final P<?> predicate, final P<?>... predicates) {
-        return this.has(T.label, label).has(key, predicate, predicates);
+    public default GraphTraversal<S, E> has(final String label, final String key, final P<?> predicate) {
+        return this.has(T.label, label).has(key, predicate);
     }
 
     public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
@@ -506,10 +502,6 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.has(key, P.within());
     }
 
-    public default GraphTraversal<S, E> hasNot(final String key) {
-        return this.has(key, P.without());
-    }
-
     public default GraphTraversal<S, E> hasLabel(final String... labels) {
         return labels.length == 1 ? this.has(T.label, labels[0]) : this.has(T.label, P.within(labels));
     }
@@ -526,16 +518,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return values.length == 1 ? this.has(T.value, values[0]) : this.has(T.value, P.within(values));
     }
 
-    public default GraphTraversal<S, E> is(final P<E> predicate, final P<E>... predicates) {
-        return this.asAdmin().addStep(new IsStep<>(this.asAdmin(), predicate, predicates));
+    public default GraphTraversal<S, E> is(final P<E> predicate) {
+        return this.asAdmin().addStep(new IsStep<>(this.asAdmin(), predicate));
     }
 
     public default GraphTraversal<S, E> is(final Object value) {
-        if (value instanceof P[]) {
-            final Pair<P, P[]> split = P.splitForAPI((P[]) value);
-            return this.is(split.getValue0(), split.getValue1());
-        } else
-            return this.is(value instanceof P ? (P<E>) value : P.eq((E) value), new P[0]);
+        return this.is(value instanceof P ? (P<E>) value : P.eq((E) value));
     }
 
     public default GraphTraversal<S, E> coin(final double probability) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 5658be3..da5c07d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -310,12 +310,12 @@ public class __ {
         return __.<A>start().hasNot(key, hasNotNextTraversal);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String key, final P<?> predicate, final P<?>... predicates) {
-        return __.<A>start().has(key, predicate, predicates);
+    public static <A> GraphTraversal<A, A> has(final String key, final P<?> predicate) {
+        return __.<A>start().has(key, predicate);
     }
 
-    public static <A> GraphTraversal<A, A> has(final T accessor, final P<?> predicate, final P<?>... predicates) {
-        return __.<A>start().has(accessor, predicate, predicates);
+    public static <A> GraphTraversal<A, A> has(final T accessor, final P<?> predicate) {
+        return __.<A>start().has(accessor, predicate);
     }
 
     public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
@@ -330,18 +330,14 @@ public class __ {
         return __.<A>start().has(label, key, value);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String label, final String key, final P<?> predicate, final P<?>... predicates) {
-        return __.<A>start().has(label, key, predicate, predicates);
+    public static <A> GraphTraversal<A, A> has(final String label, final String key, final P<?> predicate) {
+        return __.<A>start().has(label, key, predicate);
     }
 
     public static <A> GraphTraversal<A, A> has(final String key) {
         return __.<A>start().has(key);
     }
 
-    public static <A> GraphTraversal<A, A> hasNot(final String key) {
-        return __.<A>start().hasNot(key);
-    }
-
     public static <A> GraphTraversal<A, A> hasLabel(final String... labels) {
         return __.<A>start().hasLabel(labels);
     }
@@ -382,8 +378,8 @@ public class __ {
         return __.<A>start().where(whereTraversal);
     }
 
-    public static <A> GraphTraversal<A, A> is(final P<A> predicate, final P<A>... predicates) {
-        return __.<A>start().is(predicate, predicates);
+    public static <A> GraphTraversal<A, A> is(final P<A> predicate) {
+        return __.<A>start().is(predicate);
     }
 
     public static <A> GraphTraversal<A, A> is(final Object value) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/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 c45ba04..184384b 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
@@ -34,7 +34,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder {   // TODO: make final when graph strategies are fixed up
+public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder {
 
     private final List<HasContainer> hasContainers;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
index 46223cc..4f7da24 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
@@ -24,10 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.P;
 
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.List;
 import java.util.Set;
 
 /**
@@ -35,29 +32,21 @@ import java.util.Set;
  */
 public final class IsStep<S> extends FilterStep<S> {
 
-    private final List<P<S>> predicates = new ArrayList<>();
-    // todo: boolean isSizeOne for optimization
+    private final P<S> predicate;
 
-    public IsStep(final Traversal.Admin traversal, final P<S> predicate, final P<S>... predicates) {
+    public IsStep(final Traversal.Admin traversal, final P<S> predicate) {
         super(traversal);
-        this.predicates.add(predicate);
-        if (predicates.length > 0)
-            this.predicates.addAll(Arrays.asList(predicates));
+        this.predicate = predicate;
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<S> traverser) {
-        final S s = traverser.get();
-        for (final P<S> predicate : this.predicates) {
-            if (!predicate.test(s))
-                return false;
-        }
-        return true;
+        return this.predicate.test(traverser.get());
     }
 
     @Override
     public String toString() {
-        return TraversalHelper.makeStepString(this, this.predicates);
+        return TraversalHelper.makeStepString(this, this.predicate);
     }
 
     @Override
@@ -65,7 +54,7 @@ public final class IsStep<S> extends FilterStep<S> {
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
 
-    public List<P<S>> getPredicates() {
-        return this.predicates;
+    public P<S> getPredicate() {
+        return this.predicate;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
index c95e776..0b47001 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.AndP;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
@@ -118,14 +119,16 @@ public final class HasContainer implements Serializable {
         }
     }
 
-    public static HasContainer[] makeHasContainers(final String key, final P<?> predicate, final P<?>... predicates) {
-        final HasContainer[] hasContainers = new HasContainer[predicates.length + 1];
-        hasContainers[0] = new HasContainer(key, predicate.getBiPredicate(), predicate.getValue());
-        if (predicates.length > 0) {
-            for (int i = 1; i < predicates.length + 1; i++) {
-                hasContainers[i] = new HasContainer(key, predicates[i-1].getBiPredicate(), predicates[i-1].getValue());
+    public static HasContainer[] makeHasContainers(final String key, final P<?> predicate) {
+        if (predicate instanceof AndP) {
+            final List<P<?>> predicates = ((AndP) predicate).getPredicates();
+            final HasContainer[] hasContainers = new HasContainer[predicates.size()];
+            for (int i = 0; i < predicates.size(); i++) {
+                hasContainers[i] = new HasContainer(key, predicates.get(i).getBiPredicate(), predicates.get(i).getValue());
             }
+            return hasContainers;
+        } else {
+            return new HasContainer[]{new HasContainer(key, predicate.getBiPredicate(), predicate.getValue())};
         }
-        return hasContainers;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
index 8e0adf4..5b59d25 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
@@ -29,8 +29,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.P;
+import org.apache.tinkerpop.gremlin.structure.util.AndP;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 import java.util.function.BiPredicate;
 
 /**
@@ -71,7 +77,7 @@ public final class RangeByIsCountStrategy extends AbstractTraversalStrategy<Trav
                 if (next instanceof IsStep && !(prev instanceof RangeGlobalStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
                     final IsStep isStep = (IsStep) next;
                     Long highRange = null;
-                    for (P p : (Iterable<P>) isStep.getPredicates()) {
+                    for (P p : isStep.getPredicate() instanceof AndP ? ((AndP<?>) isStep.getPredicate()).getPredicates() : Collections.singletonList(isStep.getPredicate())) {
                         final Object value = p.getValue();
                         final BiPredicate predicate = p.getBiPredicate();
                         if (value instanceof Number) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/P.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/P.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/P.java
index 6dd3fc9..f793159 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/P.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/P.java
@@ -23,7 +23,7 @@ package org.apache.tinkerpop.gremlin.structure;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.TraversalBiPredicate;
-import org.javatuples.Pair;
+import org.apache.tinkerpop.gremlin.structure.util.AndP;
 
 import java.io.Serializable;
 import java.util.Arrays;
@@ -79,6 +79,13 @@ public class P<V> implements Predicate<V>, Serializable {
         return new P<>(this.biPredicate.negate(), this.value);
     }
 
+    @Override
+    public P<V> and(final Predicate<? super V> predicate) {
+        if (!(predicate instanceof P))
+            throw new IllegalArgumentException("Only P predicates can be and'd together");
+        return new AndP<>(this, (P<V>) predicate);
+    }
+
     //////////////// statics
 
     public static <V> P<V> eq(final V value) {
@@ -105,16 +112,16 @@ public class P<V> implements Predicate<V>, Serializable {
         return new P(Compare.gte, value);
     }
 
-    public static <V> P<V>[] inside(final V first, final V second) {
-        return new P[]{new P(Compare.gt, first), new P(Compare.lt, second)};
+    public static <V> P<V> inside(final V first, final V second) {
+        return new AndP<>(new P(Compare.gt, first), new P(Compare.lt, second));
     }
 
-    public static <V> P<V>[] outside(final V first, final V second) {
-        return new P[]{new P(Compare.lt, first), new P(Compare.gt, second)};
+    public static <V> P<V> outside(final V first, final V second) {
+        return new AndP<>(new P(Compare.lt, first), new P(Compare.gt, second));
     }
 
-    public static <V> P<V>[] between(final V first, final V second) {
-        return new P[]{new P(Compare.gte, first), new P(Compare.lt, second)};
+    public static <V> P<V> between(final V first, final V second) {
+        return new AndP<>(new P(Compare.gte, first), new P(Compare.lt, second));
     }
 
     public static <V> P<V> within(final V... values) {
@@ -145,21 +152,7 @@ public class P<V> implements Predicate<V>, Serializable {
         return new P(biPredicate, value);
     }
 
-    public static <V> P<V>[] not(final P<V> predicate, final P<V>... predicates) {
-        final P[] temp = new P[predicates.length + 1];
-        temp[0] = predicate.negate();
-        for (int i = 1; i < predicates.length; i++) {
-            temp[i] = predicates[i - 1].negate();
-        }
-        return temp;
-    }
-
-    public static Pair<P, P[]> splitForAPI(final P[] pArray) {
-        if (pArray.length == 0)
-            throw new IllegalArgumentException("The P[] is not splittable because its length is 0: " + pArray);
-        else if (pArray.length == 1)
-            return new Pair<>(pArray[0], new P[0]);
-        else
-            return new Pair<>(pArray[0], Arrays.copyOfRange(pArray, 1, pArray.length));
+    public static <V> P<V> not(final P<V> predicate) {
+        return predicate.negate();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AndP.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AndP.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AndP.java
new file mode 100644
index 0000000..b096621
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/AndP.java
@@ -0,0 +1,82 @@
+/*
+ *
+ *  * 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.structure.util;
+
+import org.apache.tinkerpop.gremlin.structure.P;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AndP<V> extends P<V> {
+
+    private List<P<V>> predicates;
+
+    public AndP(final P<V> predicate, final P<V>... predicates) {
+        super(null, null);
+        this.predicates = new ArrayList<>();
+        this.predicates.add(predicate);
+        for (final P<V> p : predicates) {
+            this.predicates.add(p);
+        }
+    }
+
+    public List<P<V>> getPredicates() {
+        return Collections.unmodifiableList(this.predicates);
+    }
+
+    public void addPredicate(final P<V> predicate) {
+        this.predicates.add(predicate);
+    }
+
+    @Override
+    public boolean test(final V v) {
+        for (final P<V> predicate : this.predicates) {
+            if (!predicate.test(v))
+                return false;
+        }
+        return true;
+    }
+
+    @Override
+    public P<V> and(final Predicate<? super V> predicate) {
+        if (!(predicate instanceof P))
+            throw new IllegalArgumentException("Only P predicates can be and'd together");
+        this.predicates.add((P<V>) predicate);
+        return this;
+    }
+
+    @Override
+    public P<V> negate() {
+        final List<P<V>> negated = new ArrayList<>();
+        for (final P<V> predicate : this.predicates) {
+            negated.add(predicate.negate());
+        }
+        this.predicates = negated;
+        return this;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
index 5d47d6d..a18b622 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategyTest.java
@@ -22,12 +22,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTraversalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.P;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.experimental.runners.Enclosed;
@@ -148,12 +146,8 @@ public class RangeByIsCountStrategyTest {
 
         public void doTest(final Object predicate, final long expectedHighRange) {
             final AtomicInteger counter = new AtomicInteger(0);
-            final Traversal traversal;
-            if (predicate instanceof P[]) {
-                traversal = __.out().count().is(((P[])predicate)[0],(P[])predicate);
-            } else {
-                traversal = __.out().count().is(predicate);
-            }
+            final Traversal traversal = __.out().count().is(predicate);
+
             applyRangeByIsCountStrategy(traversal);
 
             final List<RangeGlobalStep> steps = TraversalHelper.getStepsOfClass(RangeGlobalStep.class, traversal.asAdmin());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
deleted file mode 100644
index 345a2df..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.util.TraversalScriptHelper
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class GroovyHasNotTest {
-
-    public static class Traversals extends HasNotTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
-            TraversalScriptHelper.compute("g.V(v1Id).hasNot('${propertyKey}')", g, "v1Id", v1Id);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
-            TraversalScriptHelper.compute("g.V.hasNot('${propertyKey}')", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index 5e3df10..a4ee9e7 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@ -24,10 +24,51 @@ import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
 import org.apache.tinkerpop.gremlin.groovy.util.SugarTestHelper;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.*;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyBranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyLocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyRepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyUnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyAndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyWhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyFoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyUnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyAggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyStoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyTreeTest;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.StructureStandardSuite;
 import org.junit.runners.model.InitializationError;
@@ -65,7 +106,6 @@ public class GroovyProcessComputerSuite extends ProcessComputerSuite {
             GroovyCyclicPathTest.Traversals.class,
             GroovyDedupTest.Traversals.class,
             GroovyFilterTest.Traversals.class,
-            GroovyHasNotTest.Traversals.class,
             GroovyHasTest.Traversals.class,
             GroovyIsTest.Traversals.class,
             GroovyOrTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
index b67d6e1..a12ee68 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
@@ -35,7 +35,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPa
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDropTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasNotTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
@@ -106,7 +105,6 @@ public class GroovyProcessStandardSuite extends ProcessStandardSuite {
             GroovyDedupTest.Traversals.class,
             GroovyDropTest.Traversals.class,
             GroovyFilterTest.Traversals.class,
-            GroovyHasNotTest.Traversals.class,
             GroovyHasTest.Traversals.class,
             GroovyIsTest.Traversals.class,
             GroovyOrTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index 64b8c4d..85a92d4 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -23,10 +23,51 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputerTest;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.*;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategyProcessTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategyProcessTest;
@@ -69,7 +110,6 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             CyclicPathTest.Traversals.class,
             DedupTest.Traversals.class,
             FilterTest.Traversals.class,
-            HasNotTest.Traversals.class,
             HasTest.Traversals.class,
             IsTest.Traversals.class,
             OrTest.Traversals.class,
@@ -138,7 +178,6 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             CyclicPathTest.class,
             DedupTest.class,
             FilterTest.class,
-            HasNotTest.class,
             HasTest.class,
             IsTest.class,
             OrTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 763a4bc..4fa12c1 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -19,7 +19,6 @@
 package org.apache.tinkerpop.gremlin.process;
 
 import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsTest;
@@ -34,7 +33,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasNotTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
@@ -81,8 +79,6 @@ import org.apache.tinkerpop.gremlin.structure.StructureStandardSuite;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.RunnerBuilder;
 
-import java.util.stream.Stream;
-
 /**
  * The {@code ProcessStandardSuite} is a JUnit test runner that executes the Gremlin Test Suite over a
  * {@link Graph} implementation.  This test suite covers traversal operations and should be implemented by vendors
@@ -112,7 +108,6 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             DedupTest.Traversals.class,
             DropTest.Traversals.class,
             FilterTest.Traversals.class,
-            HasNotTest.Traversals.class,
             HasTest.Traversals.class,
             IsTest.Traversals.class,
             OrTest.Traversals.class,
@@ -193,7 +188,6 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             DedupTest.class,
             DropTest.class,
             FilterTest.class,
-            HasNotTest.class,
             HasTest.class,
             IsTest.class,
             OrTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d7266676/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
deleted file mode 100644
index ff87ce4..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-@RunWith(GremlinProcessRunner.class)
-public abstract class HasNotTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_hasNotXprop() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "circumference");
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-        traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "name");
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasNotXprop() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasNotXprop("circumference");
-        printTraversalForm(traversal);
-        final List<Vertex> list = traversal.toList();
-        assertEquals(6, list.size());
-    }
-
-
-    public static class Traversals extends HasNotTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
-            return g.V(v1Id).hasNot(propertyKey);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
-            return g.V().hasNot(propertyKey);
-        }
-    }
-}
\ No newline at end of file