added TraversalHelper.addHasContainer() which will either append a HasStep with container or if the traverasl ends with a HasContainerHolder, fold the container into the holder. This just makes the code in GraphTravesrsal cleaner with less copy/paste.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/ffe1b4c1 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/ffe1b4c1 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/ffe1b4c1 Branch: refs/heads/tp32 Commit: ffe1b4c18ef4c66f259d3b9c6a80046261dbf38c Parents: 05bfb02 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Mon Nov 14 15:44:40 2016 -0700 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Wed Nov 16 05:43:45 2016 -0700 ---------------------------------------------------------------------- .../traversal/dsl/graph/GraphTraversal.java | 94 ++++---------------- .../process/traversal/util/TraversalHelper.java | 17 ++++ 2 files changed, 33 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ffe1b4c1/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 7543c32..d8f7888 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 @@ -36,7 +36,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal; import org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser; import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal; import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating; -import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder; import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent; @@ -51,7 +50,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep; 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; @@ -908,20 +906,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { public default GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) { this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, predicate); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate)); - return this; - } else - return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, predicate)); } public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) { this.asAdmin().getBytecode().addStep(Symbols.has, accessor, predicate); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), predicate)); - return this; - } else - return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), predicate))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), predicate)); } public default GraphTraversal<S, E> has(final String propertyKey, final Object value) { @@ -931,45 +921,25 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { return this.has(propertyKey, (Traversal) value); else { this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, value); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, P.eq(value))); - return this; - } else - return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(propertyKey, P.eq(value)))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, P.eq(value))); } } public default GraphTraversal<S, E> has(final T accessor, final Object value) { this.asAdmin().getBytecode().addStep(Symbols.has, accessor, value); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value))); - return this; - } else - return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value)))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value))); } public default GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) { this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, predicate); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label))); - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate)); - return this; - } else { - this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label)))); - return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate))); - } + TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, predicate)); } public default GraphTraversal<S, E> has(final String label, final String propertyKey, final Object value) { this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, value); - if (this.asAdmin().getEndStep() instanceof HasContainerHolder) { - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label))); - ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, value instanceof P ? (P) value : P.eq(value))); - return this; - } else { - this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label)))); - return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, value instanceof P ? (P) value : P.eq(value)))); - } + TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, value instanceof P ? (P) value : P.eq(value))); } public default GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) { @@ -1001,20 +971,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { 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)))); + return TraversalHelper.addHasContainer(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))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), predicate)); } public default GraphTraversal<S, E> hasId(final Object id, final Object... otherIds) { @@ -1030,21 +992,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { 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)))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids))); } } 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))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.id.getAccessor(), predicate)); } public default GraphTraversal<S, E> hasKey(final String label, final String... otherLabels) { @@ -1052,20 +1006,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { 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)))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels))); } 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))); + return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.key.getAccessor(), predicate)); } public default GraphTraversal<S, E> hasValue(final Object value, final Object... otherValues) { @@ -1081,21 +1027,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { 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)))); + return TraversalHelper.addHasContainer(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 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))); + return TraversalHelper.addHasContainer(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/ffe1b4c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java index e6ba9ca..c8ec3f3 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java @@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep; @@ -672,4 +673,20 @@ public final class TraversalHelper { break; } } + + /** + * Used to left-fold a {@link HasContainer} to a {@link HasContainerHolder} if it exists. Else, append a {@link HasStep}. + * + * @param traversal the traversal to fold or append. + * @param hasContainer the container to add left or append. + * @param <T> the traversal type + * @return the has container folded or appended traversal + */ + public static <T extends Traversal.Admin<?, ?>> T addHasContainer(final T traversal, final HasContainer hasContainer) { + if (traversal.getEndStep() instanceof HasContainerHolder) { + ((HasContainerHolder) traversal.getEndStep()).addHasContainer(hasContainer); + return traversal; + } else + return (T) traversal.addStep(new HasStep<>(traversal, hasContainer)); + } }