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/master 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(