fixed up the hasXXX() methods to account of P and Object differently. Will go 
through and create a TraversalHelper.addHasContainer() method which will left 
append or right append depending on Traversal state. this will simplify methods 
signficiantly.


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

Branch: refs/heads/tp32
Commit: 05bfb029c20fd21cba468b4bf25cbab322526807
Parents: 8c1391c
Author: Marko A. Rodriguez <okramma...@gmail.com>
Authored: Mon Nov 14 13:46:00 2016 -0700
Committer: Marko A. Rodriguez <okramma...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700

----------------------------------------------------------------------
 .../traversal/dsl/graph/GraphTraversal.java     | 114 +++++++++++++++----
 .../gremlin/process/traversal/dsl/graph/__.java |  43 +++++--
 .../traversal/step/filter/HasStepTest.java      |  12 +-
 3 files changed, 128 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/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 e875513..7543c32 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
@@ -147,8 +147,10 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
@@ -994,38 +996,106 @@ public interface GraphTraversal<S, E> extends 
Traversal<S, E> {
         return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), 
__.values(propertyKey)));
     }
 
-    public default GraphTraversal<S, E> has(final T accessor, final Object 
value, final Object... values) {
-        if (value instanceof Object[]) {
-            final Object[] arr = (Object[]) value;
-            if (values.length == 0) {
-                if (arr.length == 1) {
-                    return has(accessor, P.eq(arr[0]));
+    public default GraphTraversal<S, E> hasLabel(final String label, final 
String... otherLabels) {
+        final String[] labels = new String[otherLabels.length + 1];
+        labels[0] = label;
+        System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
+        this.asAdmin().getBytecode().addStep(Symbols.hasLabel, labels);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : 
P.within(labels)));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : 
P.within(labels))));
+    }
+
+    public default GraphTraversal<S, E> hasLabel(final P<String> predicate) {
+        this.asAdmin().getBytecode().addStep(Symbols.hasLabel, predicate);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.label.getAccessor(), predicate));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.label.getAccessor(), predicate)));
+    }
+
+    public default GraphTraversal<S, E> hasId(final Object id, final Object... 
otherIds) {
+        if (id instanceof P)
+            return this.hasId((P) id);
+        else {
+            final List<Object> ids = new ArrayList<>();
+            if (id.getClass().isArray()) {
+                for (final Object i : (Object[]) id) {
+                    ids.add(i);
                 }
-                return has(accessor, P.within(arr));
-            }
-        } else if (values.length == 0) {
-            return has(accessor, value instanceof P ? (P) value : P.eq(value));
+            } else
+                ids.add(id);
+            Collections.addAll(ids, otherIds);
+            this.asAdmin().getBytecode().addStep(Symbols.hasId, ids.toArray());
+            if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+                ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : 
P.within(ids)));
+                return this;
+            } else
+                return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : 
P.within(ids))));
         }
-        final Object[] objects = new Object[values.length + 1];
-        objects[0] = value;
-        System.arraycopy(values, 0, objects, 1, values.length);
-        return has(accessor, P.within(objects));
     }
 
-    public default GraphTraversal<S, E> hasLabel(final Object value, final 
Object... values) {
-        return has(T.label, value, values);
+    public default GraphTraversal<S, E> hasId(final P<Object> predicate) {
+        this.asAdmin().getBytecode().addStep(Symbols.hasId, predicate);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.id.getAccessor(), predicate));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.id.getAccessor(), predicate)));
+    }
+
+    public default GraphTraversal<S, E> hasKey(final String label, final 
String... otherLabels) {
+        final String[] labels = new String[otherLabels.length + 1];
+        labels[0] = label;
+        System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
+        this.asAdmin().getBytecode().addStep(Symbols.hasKey, labels);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : 
P.within(labels)));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : 
P.within(labels))));
     }
 
-    public default GraphTraversal<S, E> hasId(final Object value, final 
Object... values) {
-        return has(T.id, value, values);
+    public default GraphTraversal<S, E> hasKey(final P<String> predicate) {
+        this.asAdmin().getBytecode().addStep(Symbols.hasKey, predicate);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.key.getAccessor(), predicate));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.key.getAccessor(), predicate)));
     }
 
-    public default GraphTraversal<S, E> hasKey(final Object value, final 
Object... values) {
-        return has(T.key, value, values);
+    public default GraphTraversal<S, E> hasValue(final Object value, final 
Object... otherValues) {
+        if (value instanceof P)
+            return this.hasValue((P) value);
+        else {
+            final List<Object> values = new ArrayList<>();
+            if (value.getClass().isArray()) {
+                for (final Object v : (Object[]) value) {
+                    values.add(v);
+                }
+            } else
+                values.add(value);
+            Collections.addAll(values, otherValues);
+            this.asAdmin().getBytecode().addStep(Symbols.hasValue, 
values.toArray());
+            if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+                ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : 
P.within(values)));
+                return this;
+            } else
+                return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : 
P.within(values))));
+        }
     }
 
-    public default GraphTraversal<S, E> hasValue(final Object value, final 
Object... values) {
-        return has(T.value, value, values);
+    public default GraphTraversal<S, E> hasValue(final P<Object> predicate) {
+        this.asAdmin().getBytecode().addStep(Symbols.hasValue, predicate);
+        if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+            ((HasContainerHolder) 
this.asAdmin().getEndStep()).addHasContainer(new 
HasContainer(T.value.getAccessor(), predicate));
+            return this;
+        } else
+            return this.asAdmin().addStep(new HasStep(this.asAdmin(), new 
HasContainer(T.value.getAccessor(), predicate)));
     }
 
     public default GraphTraversal<S, E> is(final P<E> predicate) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/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 83739d8..dfd5878 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
@@ -661,31 +661,45 @@ public class __ {
     }
 
     /**
-     * @see GraphTraversal#has(T, Object, Object...)
+     * @see GraphTraversal#hasLabel(String, String...)
      */
-    public static <A> GraphTraversal<A, A> has(final T accessor, final Object 
value, Object... values) {
-        return __.<A>start().has(accessor, value, values);
+    public static <A> GraphTraversal<A, A> hasLabel(final String label, 
String... otherLabels) {
+        return __.<A>start().hasLabel(label, otherLabels);
     }
 
     /**
-     * @see GraphTraversal#hasLabel(Object, Object...)
+     * @see GraphTraversal#hasLabel(P)
      */
-    public static <A> GraphTraversal<A, A> hasLabel(final Object value, 
Object... values) {
-        return __.<A>start().hasLabel(value, values);
+    public static <A> GraphTraversal<A, A> hasLabel(final P<String> predicate) 
{
+        return __.<A>start().hasLabel(predicate);
     }
 
     /**
      * @see GraphTraversal#hasId(Object, Object...)
      */
-    public static <A> GraphTraversal<A, A> hasId(final Object value, Object... 
values) {
-        return __.<A>start().hasId(value, values);
+    public static <A> GraphTraversal<A, A> hasId(final Object id, Object... 
otherIds) {
+        return __.<A>start().hasId(id, otherIds);
     }
 
     /**
-     * @see GraphTraversal#hasKey(Object, Object...)
+     * @see GraphTraversal#hasId(P)
      */
-    public static <A> GraphTraversal<A, A> hasKey(final Object value, 
Object... values) {
-        return __.<A>start().hasKey(value, values);
+    public static <A> GraphTraversal<A, A> hasId(final P<Object> predicate) {
+        return __.<A>start().hasId(predicate);
+    }
+
+    /**
+     * @see GraphTraversal#hasKey(String, String...)
+     */
+    public static <A> GraphTraversal<A, A> hasKey(final String label, 
String... otherLabels) {
+        return __.<A>start().hasKey(label, otherLabels);
+    }
+
+    /**
+     * @see GraphTraversal#hasKey(P)
+     */
+    public static <A> GraphTraversal<A, A> hasKey(final P<String> predicate) {
+        return __.<A>start().hasKey(predicate);
     }
 
     /**
@@ -696,6 +710,13 @@ public class __ {
     }
 
     /**
+     * @see GraphTraversal#hasValue(P)
+     */
+    public static <A> GraphTraversal<A, A> hasValue(final P<Object> predicate) 
{
+        return __.<A>start().hasValue(predicate);
+    }
+
+    /**
      * @see GraphTraversal#where(String, P)
      */
     public static <A> GraphTraversal<A, A> where(final String startKey, final 
P<String> predicate) {

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
index 63c843d..215d6c1 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
@@ -75,22 +75,18 @@ public class HasStepTest extends StepTest {
                 // hasLabel(Object label, Object... moreLabels) should be 
compatible with hasLabel(Object... labels)
                 Arrays.asList(
                         __.hasLabel("person"),
-                        __.hasLabel(eq("person")),
-                        __.hasLabel(new String[]{"person"})),
+                        __.hasLabel(eq("person"))),
                 Arrays.asList(
                         __.hasLabel("person", "software"),
-                        __.hasLabel(within("person", "software")),
-                        __.hasLabel(new String[]{"person", "software"})),
+                        __.hasLabel(within("person", "software"))),
 
                 // hasKey(Object key, Object... moreKeys) should be compatible 
with hasKey(Object... keys)
                 Arrays.asList(
                         __.hasKey("name"),
-                        __.hasKey(eq("name")),
-                        __.hasKey(new String[]{"name"})),
+                        __.hasKey(eq("name"))),
                 Arrays.asList(
                         __.hasKey("name", "age"),
-                        __.hasKey(within("name", "age")),
-                        __.hasKey(new String[]{"name", "age"})),
+                        __.hasKey(within("name", "age"))),
 
                 // hasValue(Object value, Object... moreValues) should be 
compatible with hasValue(Object... values)
                 Arrays.asList(

Reply via email to