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));
+    }
 }

Reply via email to