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/01 16:59:25 UTC

[1/5] incubator-tinkerpop git commit: added support for Steps having multiple labels.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 433f584a1 -> d8ad3c8e4


added support for Steps having multiple labels.


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

Branch: refs/heads/master
Commit: 95f370d7c2c0a5f1a750e2903acf169dbe311180
Parents: be4bb3e
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Apr 30 16:34:12 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Apr 30 16:34:12 2015 -0600

----------------------------------------------------------------------
 .../tinkerpop/gremlin/process/traversal/Step.java  |  4 ++--
 .../traversal/dsl/graph/GraphTraversal.java        |  5 +----
 .../process/traversal/step/filter/WhereStep.java   | 14 +++++++-------
 .../traversal/step/map/match/MatchStep.java        |  6 +++---
 .../process/traversal/step/util/AbstractStep.java  | 17 +++++++++--------
 .../process/traversal/step/util/EmptyStep.java     |  6 +++---
 .../optimization/IdentityRemovalStrategy.java      |  2 +-
 .../verification/LabeledEndStepStrategy.java       |  2 +-
 .../traverser/B_O_P_S_SE_SL_Traverser.java         | 10 ++++------
 .../process/traversal/util/TraversalHelper.java    | 14 ++++++--------
 .../traversal/step/sideEffect/TinkerGraphStep.java |  3 +--
 .../optimization/TinkerGraphStepStrategy.java      |  6 +-----
 12 files changed, 39 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
index 642a4ea..d447175 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
@@ -121,14 +121,14 @@ public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Clonea
      *
      * @return the optional label of the step
      */
-    public Optional<String> getLabel();
+    public Set<String> getLabels();
 
     /**
      * Set the label of this step.
      *
      * @param label the label for this step
      */
-    public void setLabel(final String label);
+    public void addLabel(final String label);
 
     /**
      * Get the unique id of the step.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/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 11a036b..32f04d1 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
@@ -707,10 +707,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
 
     public default GraphTraversal<S, E> as(final String stepLabel) {
         if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
-        final Step<?, E> endStep = this.asAdmin().getEndStep();
-        if (endStep.getLabel().isPresent())
-            throw new IllegalStateException("The previous step has already been labeled: " + endStep);
-        endStep.setLabel(stepLabel);
+        this.asAdmin().getEndStep().addLabel(stepLabel);
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index 8414001..9fbf91f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -76,14 +76,14 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
                 endStep = endStep.getPreviousStep();
 
             final Map<String, E> map = traverser.get();
-            if (!map.containsKey(startStep.getLabel().get()))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabel().get());
-            final Object startObject = map.get(startStep.getLabel().get());
+            if (!map.containsKey(startStep.getLabels().iterator().next()))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabels().iterator().next());
+            final Object startObject = map.get(startStep.getLabels().iterator().next());
             final Object endObject;
-            if (endStep.getLabel().isPresent()) {
-                if (!map.containsKey(endStep.getLabel().get()))
-                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabel().get());
-                endObject = map.get(endStep.getLabel().get());
+            if (!endStep.getLabels().isEmpty()) {
+                if (!map.containsKey(endStep.getLabels().iterator().next()))
+                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabels().iterator().next());
+                endObject = map.get(endStep.getLabels().iterator().next());
             } else
                 endObject = null;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
index 70e2ac3..31112ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
@@ -181,9 +181,9 @@ public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> imple
 
     private void addTraversalPrivate(final Traversal<S, S> traversal) {
 
-        String startAs = traversal.asAdmin().getStartStep().getLabel().orElseThrow(()
-                -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
-        String endAs = traversal.asAdmin().getEndStep().getLabel().orElse(null);
+        String startAs = traversal.asAdmin().getStartStep().getLabels().iterator().next();
+        //        -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
+        String endAs = traversal.asAdmin().getEndStep().getLabels().stream().findFirst().orElse(null);
         checkAs(startAs);
         if (null == endAs) {
             endAs = createAnonymousAs();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
index 14c3b36..bb70e67 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -23,17 +23,19 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Objects;
-import java.util.Optional;
+import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public abstract class AbstractStep<S, E> implements Step<S, E> {
 
-    protected String label = null;
+    protected Set<String> labels = new HashSet<>();
     protected String id = Traverser.Admin.HALT;
     protected Traversal.Admin traversal;
     protected ExpandableStepIterator<S> starts;
@@ -60,14 +62,13 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
     }
 
     @Override
-    public void setLabel(final String label) {
-        Objects.nonNull(label);
-        this.label = label;
+    public void addLabel(final String label) {
+        this.labels.add(label);
     }
 
     @Override
-    public Optional<String> getLabel() {
-        return Optional.ofNullable(this.label);
+    public Set<String> getLabels() {
+        return Collections.unmodifiableSet(this.labels);
     }
 
     @Override
@@ -176,7 +177,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
 
     private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
         if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
-        if (null != this.label) traverser.path().addLabel(this.label);
+        this.labels.forEach(label -> traverser.path().addLabel(label));
         return traverser;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
index ee6a5d6..1a9c2d9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
@@ -97,12 +97,12 @@ public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
     }
 
     @Override
-    public Optional<String> getLabel() {
-        return Optional.empty();
+    public Set<String> getLabels() {
+        return Collections.emptySet();
     }
 
     @Override
-    public void setLabel(final String label) {
+    public void addLabel(final String label) {
 
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
index 729e2b9..a66aeff 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
@@ -39,7 +39,7 @@ public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
             return;
 
         TraversalHelper.getStepsOfClass(IdentityStep.class, traversal).stream()
-                .filter(step -> !step.getLabel().isPresent())
+                .filter(step -> step.getLabels().isEmpty())
                 .forEach(traversal::removeStep);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
index c9ecd6f..8ba86f9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
@@ -35,7 +35,7 @@ public final class LabeledEndStepStrategy extends AbstractTraversalStrategy {
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEndStep().getLabel().isPresent())
+        if (!traversal.getEndStep().getLabels().isEmpty())
             traversal.addStep(new MarkerIdentityStep<>(traversal));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
index c976c69..3daa672 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
@@ -40,10 +40,8 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
 
     public B_O_P_S_SE_SL_Traverser(final T t, final Step<T, ?> step, final long initialBulk) {
         super(t, step, initialBulk);
-        final Optional<String> stepLabel = step.getLabel();
-        this.path = stepLabel.isPresent() ?
-                ImmutablePath.make().extend(t, stepLabel.get()) :
-                ImmutablePath.make().extend(t);
+        final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
+        this.path = ImmutablePath.make().extend(t, stepLabels);
     }
 
     /////////////////
@@ -81,8 +79,8 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
     public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
 
             final B_O_P_S_SE_SL_Traverser<R> clone = (B_O_P_S_SE_SL_Traverser<R>) super.split(r,step);
-            final Optional<String> stepLabel = step.getLabel();
-            clone.path = stepLabel.isPresent() ? clone.path.clone().extend(r, stepLabel.get()) : clone.path.clone().extend(r);
+            final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
+            clone.path = clone.path.clone().extend(r, stepLabels);
             //clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
             return clone;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/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 0ffe53f..be70805 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
@@ -20,12 +20,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.util;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
 import java.util.ArrayList;
@@ -48,8 +48,7 @@ public final class TraversalHelper {
 
     public static <S, E> Step<S, E> getStepByLabel(final String label, final Traversal.Admin<?, ?> traversal) {
         return traversal.getSteps().stream()
-                .filter(step -> step.getLabel().isPresent())
-                .filter(step -> label.equals(step.getLabel().get()))
+                .filter(step -> step.getLabels().contains(label))
                 .findAny()
                 .orElseThrow(() -> new IllegalArgumentException("The provided step label does not exist: " + label));
     }
@@ -63,8 +62,7 @@ public final class TraversalHelper {
 
     public static boolean hasLabel(final String label, final Traversal.Admin<?, ?> traversal) {
         return traversal.getSteps().stream()
-                .filter(step -> step.getLabel().isPresent())
-                .filter(step -> label.equals(step.getLabel().get()))
+                .filter(step -> step.getLabels().contains(label))
                 .findAny().isPresent();
     }
 
@@ -72,7 +70,7 @@ public final class TraversalHelper {
         final List<String> labels = new ArrayList<>();
         for (final Step<?, ?> temp : traversal.getSteps()) {
             if (temp == step) break;
-            temp.getLabel().ifPresent(labels::add);
+            temp.getLabels().forEach(labels::add);
         }
         return labels;
     }
@@ -164,7 +162,7 @@ public final class TraversalHelper {
             builder.append(String.join(",", strings));
             builder.append(')');
         }
-        step.getLabel().ifPresent(label -> builder.append('@').append(label));
+        if (!step.getLabels().isEmpty()) builder.append('@').append(step.getLabels());
         //builder.append("^").append(step.getId());
         return builder.toString();
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
index a3cd192..8ae4344 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
@@ -46,8 +46,7 @@ public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements
 
     public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
         super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
-        if (originalGraphStep.getLabel().isPresent())
-            this.setLabel(originalGraphStep.getLabel().get());
+        originalGraphStep.getLabels().forEach(this::addLabel);
         //No need to do anything if the first element is an Element, all elements are guaranteed to be an element and will be return as is
         if ((this.ids.length == 0 || !(this.ids[0] instanceof Element)))
             this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/95f370d7/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
index 9a1832a..4403693 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
@@ -52,11 +52,7 @@ public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
             while (true) {
                 if (currentStep instanceof HasContainerHolder) {
                     tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
-                    if (currentStep.getLabel().isPresent()) {
-                        final IdentityStep identityStep = new IdentityStep<>(traversal);
-                        identityStep.setLabel(currentStep.getLabel().get());
-                        TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
-                    }
+                    currentStep.getLabels().forEach(tinkerGraphStep::addLabel);
                     traversal.removeStep(currentStep);
                 } else if (currentStep instanceof IdentityStep) {
                     // do nothing


[4/5] incubator-tinkerpop git commit: Multi-label steps complete. Cleaned up various aspects of the code base related to multi-labels in both steps and paths.

Posted by ok...@apache.org.
Multi-label steps complete. Cleaned up various aspects of the code base related to multi-labels in both steps and paths.


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

Branch: refs/heads/master
Commit: 036d6379201837f92c5e5255dc58ad284097e10d
Parents: 04928e1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri May 1 08:58:58 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri May 1 08:58:58 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../gremlin/process/traversal/Path.java         |  2 +-
 .../gremlin/process/traversal/Step.java         | 10 ++--
 .../traversal/dsl/graph/GraphTraversal.java     | 30 +++++------
 .../gremlin/process/traversal/dsl/graph/__.java | 21 ++++----
 .../traversal/step/filter/WhereStep.java        | 52 ++++++++++----------
 .../process/traversal/step/map/PathStep.java    |  6 +--
 .../traversal/step/sideEffect/StartStep.java    |  6 +--
 .../traversal/step/util/AbstractStep.java       |  8 +--
 .../process/traversal/step/util/EmptyPath.java  |  3 +-
 .../step/util/ExpandableStepIterator.java       | 18 +++----
 .../traversal/step/util/HasContainer.java       | 43 ++++++++--------
 .../traversal/step/util/ImmutablePath.java      | 11 ++---
 .../traversal/step/util/MutablePath.java        | 13 +++--
 .../TraversalVerificationStrategy.java          | 13 +++--
 .../traverser/B_O_P_S_SE_SL_Traverser.java      | 13 ++---
 .../structure/util/detached/DetachedPath.java   |  2 +-
 .../structure/util/reference/ReferencePath.java |  2 +-
 .../process/traversal/step/util/PathTest.java   | 23 ++++-----
 19 files changed, 135 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 35926dd..49d8f9c 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)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* A `Step` now has a `Set<String>` of labels. Updated `as()` to take a var args of labels.
 * Dropped `BatchGraph` from the code base - it will be replaced by bulk loader functionality over OLAP.
 * `TraversalSideEffects` now implements `Optional` semantics. Less code as Java8 provides the helper methods.
 * `TraversalScriptSupplier` now takes an `Object` var args for setting `ScriptEngine` bindings if needed.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
index b83bd23..5ff3aa3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -54,7 +54,7 @@ public interface Path extends Cloneable {
      * @param labels the labels at the head of the path
      * @return the extended path
      */
-    public Path extend(final Object object, final String... labels);
+    public Path extend(final Object object, final Set<String> labels);
 
     /**
      * Get the object associated with the particular label of the path.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
index d447175..14a6014 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -116,17 +115,16 @@ public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Clonea
     public Step<S, E> clone();
 
     /**
-     * Get the label of this step.
-     * If the step is  not labeled, then an {@link Optional#empty} is returned.
+     * Get the labels of this step.
      *
-     * @return the optional label of the step
+     * @return the set of labels for this step
      */
     public Set<String> getLabels();
 
     /**
-     * Set the label of this step.
+     * Add a label to this step.
      *
-     * @param label the label for this step
+     * @param label the label to add to this step
      */
     public void addLabel(final String label);
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/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 32f04d1..60ae481 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
@@ -462,31 +462,27 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> has(final String key, final P<?>... predicates) {
-        final HasContainer[] hasContainers = new HasContainer[predicates.length];
-        for (int i = 0; i < predicates.length; i++) {
-            hasContainers[i] = new HasContainer(key, predicates[i].getBiPredicate(), predicates[i].getValue());
-        }
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), hasContainers));
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(key, predicates)));
     }
 
-    public default GraphTraversal<S, E> has(final String key, final Object value) {
-        return this.has(key, new P<?>[]{value instanceof P ? (P) value : P.eq(value)});
+    public default GraphTraversal<S, E> has(final T accessor, final P<?>... predicates) {
+        return this.has(accessor.getAccessor(), 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) {
+        return this.has(key, new P<?>[]{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 Object value) {
-        return this.has(label, key, P.eq(value));
+    public default GraphTraversal<S, E> has(final String label, final String key, final P<?>... predicates) {
+        return this.has(T.label, label).has(key, 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) {
+        return this.has(label, key, new P<?>[]{value instanceof P ? (P) value : P.eq(value)});
     }
 
     public default GraphTraversal<S, E> has(final String key) {
@@ -705,9 +701,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
 
     ///////////////////// UTILITY STEPS /////////////////////
 
-    public default GraphTraversal<S, E> as(final String stepLabel) {
+    public default GraphTraversal<S, E> as(final String stepLabel, final String... stepLabels) {
         if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
-        this.asAdmin().getEndStep().addLabel(stepLabel);
+        final Step<?, E> endStep = this.asAdmin().getEndStep();
+        endStep.addLabel(stepLabel);
+        for (final String label : stepLabels) {
+            endStep.addLabel(label);
+        }
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/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 4ade570..74e6e65 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
@@ -218,7 +218,6 @@ public class __ {
         return __.<A>start().sum(scope);
     }
 
-
     public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
         return __.<A>start().min();
     }
@@ -317,16 +316,16 @@ public class __ {
         return __.<A>start().hasNot(hasNotNextTraversal);
     }
 
-    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 String key, final P<?>... predicates) {
+        return __.<A>start().has(key, predicates);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
-        return __.<A>start().has(key, value);
+    public static <A> GraphTraversal<A, A> has(final T accessor, final P<?>... predicates) {
+        return __.<A>start().has(accessor, 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) {
+        return __.<A>start().has(key, value);
     }
 
     public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
@@ -337,8 +336,8 @@ 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) {
-        return __.<A>start().has(label, key, predicate);
+    public static <A> GraphTraversal<A, A> has(final String label, final String key, final P<?>... predicates) {
+        return __.<A>start().has(label, key, predicates);
     }
 
     public static <A> GraphTraversal<A, A> has(final String key) {
@@ -555,8 +554,8 @@ public class __ {
 
     ///////////////////// UTILITY STEPS /////////////////////
 
-    public static <A> GraphTraversal<A, A> as(final String label) {
-        return __.<A>start().as(label);
+    public static <A> GraphTraversal<A, A> as(final String label, final String... labels) {
+        return __.<A>start().as(label, labels);
     }
 
     public static <A> GraphTraversal<A, A> profile() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index d7d7142..7b80015 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -41,7 +41,7 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
     private final String firstKey;
     private final String secondKey;
     private final BiPredicate biPredicate;
-    private Traversal.Admin constraint;
+    private Traversal.Admin traversalConstraint;
 
 
     public WhereStep(final Traversal.Admin traversal, final String firstKey, final P<?> secondKeyPredicate) {
@@ -49,39 +49,42 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
         this.firstKey = firstKey;
         this.secondKey = (String) secondKeyPredicate.getValue();
         this.biPredicate = secondKeyPredicate.getBiPredicate();
-        this.constraint = null;
+        this.traversalConstraint = null;
     }
 
-    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
+    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin traversalConstraint) {
         super(traversal);
         this.biPredicate = null;
-        this.constraint = this.integrateChild(constraint);
+        this.traversalConstraint = this.integrateChild(traversalConstraint);
         // TODO: do we need to compile the traversal first (probably)
-        ///
-        final Step<?, ?> startStep = this.constraint.getStartStep();
+        ///  get the start-step as()
+        final Step<?, ?> startStep = this.traversalConstraint.getStartStep();
         if (startStep.getLabels().isEmpty())
-            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.constraint);
+            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.traversalConstraint);
         if (startStep.getLabels().size() > 1)
-            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.constraint);
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.traversalConstraint);
         this.firstKey = startStep.getLabels().iterator().next();
-        ///
-        Step<?, ?> endStep = this.constraint.getEndStep();
+        /// get the end-step as()
+        Step<?, ?> endStep = this.traversalConstraint.getEndStep();
         if (endStep instanceof MarkerIdentityStep) endStep = endStep.getPreviousStep();  // DAH
         if (endStep.getLabels().size() > 1)
-            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.constraint);
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.traversalConstraint);
         this.secondKey = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
         final Map<String, E> map = traverser.get();
-        if (null == this.constraint) {
+        // bi-predicate predicate
+        if (null == this.traversalConstraint) {
             if (!map.containsKey(this.firstKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
             if (!map.containsKey(this.secondKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
-        } else {
+        }
+        // traversal predicate
+        else {
             final Object startObject = map.get(this.firstKey);
             if (null == startObject)
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
@@ -89,40 +92,39 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             final Object endObject = null == this.secondKey ? null : map.get(this.secondKey);
             //
-            this.constraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.constraint.getStartStep(), traverser.bulk()));
+            this.traversalConstraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.traversalConstraint.getStartStep(), traverser.bulk()));
             if (null == endObject) {
-                if (this.constraint.hasNext()) {
-                    this.constraint.reset();
+                if (this.traversalConstraint.hasNext()) {
+                    this.traversalConstraint.reset();
                     return true;
-                } else {
-                    return false;
                 }
             } else {
-                while (this.constraint.hasNext()) {
-                    if (this.constraint.next().equals(endObject)) {
-                        this.constraint.reset();
+                while (this.traversalConstraint.hasNext()) {
+                    if (this.traversalConstraint.next().equals(endObject)) {
+                        this.traversalConstraint.reset();
                         return true;
                     }
                 }
-                return false;
             }
+            return false;
         }
     }
 
     @Override
     public List<Traversal.Admin> getLocalChildren() {
-        return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
+        return null == this.traversalConstraint ? Collections.emptyList() : Collections.singletonList(this.traversalConstraint);
     }
 
     @Override
     public String toString() {
-        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
+        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.traversalConstraint);
     }
 
     @Override
     public WhereStep<E> clone() {
         final WhereStep<E> clone = (WhereStep<E>) super.clone();
-        if (null != this.constraint) clone.constraint = clone.integrateChild(this.constraint.clone());
+        if (null != this.traversalConstraint)
+            clone.traversalConstraint = clone.integrateChild(this.traversalConstraint.clone());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
index fcb6b9a..60699a3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
@@ -22,11 +22,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
 
 import java.util.Collections;
 import java.util.List;
@@ -51,7 +51,7 @@ public final class PathStep<S> extends MapStep<S, Path> implements TraversalPare
             path = traverser.path();
         else {
             path = MutablePath.make();
-            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
+            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels));
         }
         this.traversalRing.reset();
         return path;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
index 5e762fe..63ab045 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
@@ -24,7 +24,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
 import java.util.Iterator;
-import java.util.stream.Stream;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -47,10 +46,7 @@ public class StartStep<S> extends AbstractStep<S, S> {
         return (T) this.start;
     }
 
-    public boolean startAssignableTo(final Class... assignableClasses) {
-        return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
-    }
-
+    @Override
     public String toString() {
         return TraversalHelper.makeStepString(this, this.start);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
index bb70e67..28b85f8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -47,7 +47,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
 
     public AbstractStep(final Traversal.Admin traversal) {
         this.traversal = traversal;
-        this.starts = new ExpandableStepIterator<S>((Step) this);
+        this.starts = new ExpandableStepIterator<>(this);
     }
 
     @Override
@@ -164,8 +164,8 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
     @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
     public AbstractStep<S, E> clone() {
         try {
-            final AbstractStep clone = (AbstractStep) super.clone();
-            clone.starts = new ExpandableStepIterator<S>(clone);
+            final AbstractStep<S,E> clone = (AbstractStep<S,E>) super.clone();
+            clone.starts = new ExpandableStepIterator<>(clone);
             clone.previousStep = EmptyStep.instance();
             clone.nextStep = EmptyStep.instance();
             clone.nextEnd = null;
@@ -177,7 +177,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
 
     private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
         if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
-        this.labels.forEach(label -> traverser.path().addLabel(label));
+        if (!this.labels.isEmpty()) this.labels.forEach(label -> traverser.path().addLabel(label));
         return traverser;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
index 8be354d..72d8c01 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
@@ -42,7 +42,7 @@ public final class EmptyPath implements Path, Serializable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         return this;
     }
 
@@ -82,6 +82,7 @@ public final class EmptyPath implements Path, Serializable {
     }
 
     @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
     public EmptyPath clone() {
         return this;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
index 57687c1..09e82d0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
@@ -29,13 +29,13 @@ import java.util.Iterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
+public final class ExpandableStepIterator<S> implements Iterator<Traverser.Admin<S>>, Serializable {
 
-    private final TraverserSet<E> traverserSet = new TraverserSet<>();
-    private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
-    private final Step<?, E> hostStep;
+    private final TraverserSet<S> traverserSet = new TraverserSet<>();
+    private final MultiIterator<Traverser.Admin<S>> traverserIterators = new MultiIterator<>();
+    private final Step<S,?> hostStep;
 
-    public ExpandableStepIterator(final Step<?, E> hostStep) {
+    public ExpandableStepIterator(final Step<S,?> hostStep) {
         this.hostStep = hostStep;
     }
 
@@ -45,23 +45,23 @@ public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin
     }
 
     @Override
-    public Traverser.Admin<E> next() {
+    public Traverser.Admin<S> next() {
         if (!this.traverserSet.isEmpty())
             return this.traverserSet.remove();
         if (this.traverserIterators.hasNext())
             return this.traverserIterators.next();
         /////////////
         if (this.hostStep.getPreviousStep().hasNext())
-            return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
+            return (Traverser.Admin<S>) this.hostStep.getPreviousStep().next();
         /////////////
         return this.traverserSet.remove();
     }
 
-    public void add(final Iterator<Traverser.Admin<E>> iterator) {
+    public void add(final Iterator<Traverser.Admin<S>> iterator) {
         this.traverserIterators.addIterator(iterator);
     }
 
-    public void add(final Traverser.Admin<E> traverser) {
+    public void add(final Traverser.Admin<S> traverser) {
         this.traverserSet.add(traverser);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/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 4f16d96..014f21f 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
@@ -18,10 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
-import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.P;
 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;
 
@@ -44,26 +45,14 @@ public final class HasContainer implements Serializable {
         this.predicate = predicate;
         this.value = value;
         if (null == this.value && !(this.predicate instanceof Contains)) {
-            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
+            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate with null-value");
         }
     }
 
-    public HasContainer(final String key, final Contains contains) {
-        this(key, contains, null);
-    }
-
-    public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
-        this(accessor.getAccessor(), predicate, value);
-    }
-
-    public HasContainer(final T accessor, final Contains contains) {
-        this(accessor.getAccessor(), contains, null);
-    }
-
     public boolean test(final Element element) {
         if (null != this.value) {
             // it is OK to evaluate equality of ids via toString() now given that the toString() the test suite
-            // enforces the value of id.()toString() to be a first class representation of the identifier
+            // enforces the value of id().toString() to be a first class representation of the identifier
             if (this.key.equals(T.id.getAccessor()))
                 return this.predicate.test(element.id().toString(), this.value.toString());
             else if (this.key.equals(T.label.getAccessor()))
@@ -92,6 +81,17 @@ public final class HasContainer implements Serializable {
         }
     }
 
+    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
+    public String toString() {
+        return this.value == null ?
+                (this.predicate == Contains.within ?
+                        '[' + this.key + ']' :
+                        "[!" + this.key + ']') :
+                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+    }
+
+    ////////////
+
     public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
         if (hasContainers.size() == 0)
             return true;
@@ -104,12 +104,11 @@ public final class HasContainer implements Serializable {
         }
     }
 
-    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
-    public String toString() {
-        return this.value == null ?
-                (this.predicate == Contains.within ?
-                        '[' + this.key + ']' :
-                        "[!" + this.key + ']') :
-                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+    public static HasContainer[] makeHasContainers(final String key, final P<?>... predicates) {
+        final HasContainer[] hasContainers = new HasContainer[predicates.length];
+        for (int i = 0; i < predicates.length; i++) {
+            hasContainers[i] = new HasContainer(key, predicates[i].getBiPredicate(), predicates[i].getValue());
+        }
+        return hasContainers;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
index 608c3f6..18914be 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
@@ -51,15 +51,14 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
         return this;
     }
 
-    private ImmutablePath(final Object currentObject, final String... currentLabels) {
+    private ImmutablePath(final Object currentObject, final Set<String> currentLabels) {
         this(HeadPath.instance(), currentObject, currentLabels);
     }
 
-    private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
+    private ImmutablePath(final Path previousPath, final Object currentObject, final Set<String> currentLabels) {
         this.previousPath = previousPath;
         this.currentObject = currentObject;
-        if (currentLabels.length > 0)
-            Stream.of(currentLabels).forEach(this.currentLabels::add);
+        this.currentLabels.addAll(currentLabels);
     }
 
     @Override
@@ -68,7 +67,7 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         return new ImmutablePath(this, object, labels);
     }
 
@@ -121,7 +120,7 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
         }
 
         @Override
-        public Path extend(final Object object, final String... labels) {
+        public Path extend(final Object object, final Set<String> labels) {
             return new ImmutablePath(object, labels);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
index d458bfb..10fd639 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
@@ -23,21 +23,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class MutablePath implements Path, Serializable {
 
-    final protected List<Object> objects;
-    final protected List<Set<String>> labels;
+    protected final List<Object> objects;
+    protected final List<Set<String>> labels;
 
     protected MutablePath() {
-        this(0);
+        this(10);
     }
 
     private MutablePath(final int capacity) {
@@ -69,9 +68,9 @@ public class MutablePath implements Path, Serializable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         this.objects.add(object);
-        this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
+        this.labels.add(new HashSet<>(labels));
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
index 70dfdd2..9e38646 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
@@ -18,14 +18,15 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
@@ -53,9 +54,9 @@ public final class TraversalVerificationStrategy extends AbstractTraversalStrate
             endStep = endStep.getPreviousStep();
 
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
+            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep)))
                 throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
-            }
+
             if (step instanceof TraversalParent) {
                 final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
                         .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
@@ -63,6 +64,8 @@ public final class TraversalVerificationStrategy extends AbstractTraversalStrate
                 if (traversalOptional.isPresent())
                     throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
             }
+            if (step instanceof Mutating)
+                throw new IllegalStateException("Muting steps are currently not supported on GraphComputer traversals");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
index 3daa672..b6920e5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
@@ -25,7 +25,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
 import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 
-import java.util.Optional;
 import java.util.function.Function;
 
 /**
@@ -40,8 +39,7 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
 
     public B_O_P_S_SE_SL_Traverser(final T t, final Step<T, ?> step, final long initialBulk) {
         super(t, step, initialBulk);
-        final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
-        this.path = ImmutablePath.make().extend(t, stepLabels);
+        this.path = ImmutablePath.make().extend(t, step.getLabels());
     }
 
     /////////////////
@@ -77,12 +75,9 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
 
     @Override
     public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
-
-            final B_O_P_S_SE_SL_Traverser<R> clone = (B_O_P_S_SE_SL_Traverser<R>) super.split(r,step);
-            final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
-            clone.path = clone.path.clone().extend(r, stepLabels);
-            //clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
-            return clone;
+        final B_O_P_S_SE_SL_Traverser<R> clone = (B_O_P_S_SE_SL_Traverser<R>) super.split(r, step);
+        clone.path = clone.path.clone().extend(r, step.getLabels());
+        return clone;
 
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
index 6f9b540..d2d0094 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
@@ -63,7 +63,7 @@ public class DetachedPath extends MutablePath implements Attachable<Path> {
     @Override
     public Path attach(final Function<Attachable<Path>, Path> method) {
         final Path path = MutablePath.make();  // TODO: Use ImmutablePath?
-        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels.toArray(new String[labels.size()])));
+        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels));
         return path;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
index f2e0571..d7ac31d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
@@ -66,7 +66,7 @@ public class ReferencePath extends MutablePath implements Attachable<Path> {
     @Override
     public Path attach(final Function<Attachable<Path>, Path> method) {
         final Path path = MutablePath.make();  // TODO: Use ImmutablePath?
-        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels.toArray(new String[labels.size()])));
+        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels));
         return path;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
index 752d2e2..94ea30a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
@@ -20,12 +20,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.junit.Test;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -43,9 +44,9 @@ public class PathTest extends AbstractGremlinProcessTest {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
             assertTrue(path.isSimple());
             assertEquals(0, path.size());
-            path = path.extend(1, "a");
-            path = path.extend(2, "b");
-            path = path.extend(3, "c");
+            path = path.extend(1, Collections.singleton("a"));
+            path = path.extend(2, Collections.singleton("b"));
+            path = path.extend(3, Collections.singleton("c"));
             assertEquals(3, path.size());
             assertEquals(Integer.valueOf(1), path.get("a"));
             assertEquals(Integer.valueOf(2), path.get("b"));
@@ -62,7 +63,7 @@ public class PathTest extends AbstractGremlinProcessTest {
             assertTrue(path.hasLabel("d"));
             assertFalse(path.hasLabel("e"));
             assertTrue(path.isSimple());
-            path = path.extend(3, "e");
+            path = path.extend(3, Collections.singleton("e"));
             assertFalse(path.isSimple());
             assertTrue(path.hasLabel("e"));
             assertEquals(4, path.size());
@@ -77,9 +78,9 @@ public class PathTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
     public void shouldHandleMultiLabelPaths() {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "a");
+            path = path.extend("marko", Collections.singleton("a"));
+            path = path.extend("stephen", Collections.singleton("b"));
+            path = path.extend("matthias", Collections.singleton("a"));
             assertEquals(3, path.size());
             assertEquals(3, path.objects().size());
             assertEquals(3, path.labels().size());
@@ -105,9 +106,9 @@ public class PathTest extends AbstractGremlinProcessTest {
     @Test
     public void shouldExcludeUnlabeledLabelsFromPath() {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "c", "d");
+            path = path.extend("marko", Collections.singleton("a"));
+            path = path.extend("stephen", Collections.singleton("b"));
+            path = path.extend("matthias", new HashSet<>(Arrays.asList("c", "d")));
             assertEquals(3, path.size());
             assertEquals(3, path.objects().size());
             assertEquals(3, path.labels().size());


[5/5] incubator-tinkerpop git commit: Merge branch 'multi-label-steps'

Posted by ok...@apache.org.
Merge branch 'multi-label-steps'


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

Branch: refs/heads/master
Commit: d8ad3c8e412a127e91c33d814405bdcffb53fc87
Parents: 433f584 036d637
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri May 1 08:59:16 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri May 1 08:59:16 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../gremlin/process/traversal/Path.java         |  2 +-
 .../gremlin/process/traversal/Step.java         | 14 ++--
 .../traversal/dsl/graph/GraphTraversal.java     | 31 ++++----
 .../gremlin/process/traversal/dsl/graph/__.java | 21 +++--
 .../traversal/step/filter/WhereStep.java        | 82 ++++++++++----------
 .../process/traversal/step/map/PathStep.java    |  6 +-
 .../traversal/step/map/match/MatchStep.java     | 21 +++--
 .../traversal/step/sideEffect/StartStep.java    |  6 +-
 .../traversal/step/util/AbstractStep.java       | 23 +++---
 .../process/traversal/step/util/EmptyPath.java  |  3 +-
 .../process/traversal/step/util/EmptyStep.java  |  6 +-
 .../step/util/ExpandableStepIterator.java       | 18 ++---
 .../traversal/step/util/HasContainer.java       | 43 +++++-----
 .../traversal/step/util/ImmutablePath.java      | 11 ++-
 .../traversal/step/util/MutablePath.java        | 13 ++--
 .../optimization/IdentityRemovalStrategy.java   |  2 +-
 .../verification/LabeledEndStepStrategy.java    |  2 +-
 .../TraversalVerificationStrategy.java          | 13 ++--
 .../traverser/B_O_P_S_SE_SL_Traverser.java      | 15 +---
 .../process/traversal/util/TraversalHelper.java | 14 ++--
 .../structure/util/detached/DetachedPath.java   |  2 +-
 .../structure/util/reference/ReferencePath.java |  2 +-
 .../process/traversal/step/util/PathTest.java   | 23 +++---
 .../step/sideEffect/TinkerGraphStep.java        |  3 +-
 .../optimization/TinkerGraphStepStrategy.java   |  6 +-
 26 files changed, 187 insertions(+), 196 deletions(-)
----------------------------------------------------------------------



[3/5] incubator-tinkerpop git commit: Merge branch 'master' into multi-label-steps

Posted by ok...@apache.org.
Merge branch 'master' into multi-label-steps


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

Branch: refs/heads/master
Commit: 04928e1bc0cb1fc4cd033d438a130e731059d076
Parents: 426cf99 8435e51
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri May 1 08:05:54 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri May 1 08:05:54 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   1 +
 docs/src/the-graph.asciidoc                     | 377 ++++-------
 .../structure/io/graphml/GraphMLReader.java     |   3 +-
 .../structure/io/graphson/GraphSONReader.java   |   3 +-
 .../io/graphson/LegacyGraphSONReader.java       |   3 +-
 .../gremlin/structure/io/gryo/GryoReader.java   |   3 +-
 .../structure/util/batch/BatchFeatures.java     | 216 -------
 .../structure/util/batch/BatchGraph.java        | 643 -------------------
 .../gremlin/structure/util/batch/Exists.java    |  62 --
 .../structure/util/batch/VertexIdType.java      |  65 --
 .../util/batch/cache/AbstractIDVertexCache.java |  78 ---
 .../util/batch/cache/LongIDVertexCache.java     |  94 ---
 .../util/batch/cache/ObjectIDVertexCache.java   |  25 -
 .../util/batch/cache/StringCompression.java     |  29 -
 .../util/batch/cache/StringIDVertexCache.java   |  87 ---
 .../util/batch/cache/URLCompression.java        |  67 --
 .../structure/util/batch/cache/VertexCache.java |  36 --
 .../driver/benchmark/ProfilingApplication.java  |  27 +-
 .../AbstractImportCustomizerProvider.java       |   2 -
 .../tinkerpop/gremlin/structure/BatchTest.java  | 475 --------------
 .../structure/StructureStandardSuite.java       |   6 -
 21 files changed, 147 insertions(+), 2155 deletions(-)
----------------------------------------------------------------------



[2/5] incubator-tinkerpop git commit: super optimization to WhereStep I never realized before.

Posted by ok...@apache.org.
super optimization to WhereStep I never realized before.


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

Branch: refs/heads/master
Commit: 426cf997a64cca0a34fa0e59418909b1687ad3d2
Parents: 95f370d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Apr 30 17:12:44 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Apr 30 17:12:44 2015 -0600

----------------------------------------------------------------------
 .../traversal/step/filter/WhereStep.java        | 48 ++++++++++----------
 .../traversal/step/map/match/MatchStep.java     | 21 ++++++---
 2 files changed, 39 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/426cf997/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index 9fbf91f..d7d7142 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -54,40 +54,42 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
 
     public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
         super(traversal);
-        this.firstKey = null;
-        this.secondKey = null;
         this.biPredicate = null;
         this.constraint = this.integrateChild(constraint);
+        // TODO: do we need to compile the traversal first (probably)
+        ///
+        final Step<?, ?> startStep = this.constraint.getStartStep();
+        if (startStep.getLabels().isEmpty())
+            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.constraint);
+        if (startStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.constraint);
+        this.firstKey = startStep.getLabels().iterator().next();
+        ///
+        Step<?, ?> endStep = this.constraint.getEndStep();
+        if (endStep instanceof MarkerIdentityStep) endStep = endStep.getPreviousStep();  // DAH
+        if (endStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.constraint);
+        this.secondKey = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
+        final Map<String, E> map = traverser.get();
         if (null == this.constraint) {
-            final Map<String, E> map = traverser.get();
             if (!map.containsKey(this.firstKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
             if (!map.containsKey(this.secondKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
         } else {
-            final Step<?, ?> startStep = this.constraint.getStartStep();
-            Step<?, ?> endStep = this.constraint.getEndStep();
-            if (endStep instanceof MarkerIdentityStep) // DAH!
-                endStep = endStep.getPreviousStep();
-
-            final Map<String, E> map = traverser.get();
-            if (!map.containsKey(startStep.getLabels().iterator().next()))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabels().iterator().next());
-            final Object startObject = map.get(startStep.getLabels().iterator().next());
-            final Object endObject;
-            if (!endStep.getLabels().isEmpty()) {
-                if (!map.containsKey(endStep.getLabels().iterator().next()))
-                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabels().iterator().next());
-                endObject = map.get(endStep.getLabels().iterator().next());
-            } else
-                endObject = null;
-
-            startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
+            final Object startObject = map.get(this.firstKey);
+            if (null == startObject)
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
+            if (null != this.secondKey && !map.containsKey(this.secondKey))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
+            final Object endObject = null == this.secondKey ? null : map.get(this.secondKey);
+            //
+            this.constraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.constraint.getStartStep(), traverser.bulk()));
             if (null == endObject) {
                 if (this.constraint.hasNext()) {
                     this.constraint.reset();
@@ -95,7 +97,6 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
                 } else {
                     return false;
                 }
-
             } else {
                 while (this.constraint.hasNext()) {
                     if (this.constraint.next().equals(endObject)) {
@@ -121,8 +122,7 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
     @Override
     public WhereStep<E> clone() {
         final WhereStep<E> clone = (WhereStep<E>) super.clone();
-        if (null != this.constraint)
-            clone.constraint = clone.integrateChild(this.constraint.clone());
+        if (null != this.constraint) clone.constraint = clone.integrateChild(this.constraint.clone());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/426cf997/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
index 31112ea..ddfc83f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
@@ -19,13 +19,14 @@
 package org.apache.tinkerpop.gremlin.process.traversal.step.map.match;
 
 import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.ArrayList;
@@ -180,10 +181,18 @@ public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> imple
     }
 
     private void addTraversalPrivate(final Traversal<S, S> traversal) {
-
-        String startAs = traversal.asAdmin().getStartStep().getLabels().iterator().next();
-        //        -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
-        String endAs = traversal.asAdmin().getEndStep().getLabels().stream().findFirst().orElse(null);
+        final Step<S,?> startStep = traversal.asAdmin().getStartStep();
+        if (startStep.getLabels().isEmpty())
+            throw new IllegalArgumentException("Match traversals must have their start step labeled with as(): " + traversal);
+        if (startStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Match traversals can not have multiple labels on the start step: " + traversal);
+        final String startAs = traversal.asAdmin().getStartStep().getLabels().iterator().next();
+        ///
+        final Step<?,S> endStep = traversal.asAdmin().getEndStep();
+        if(endStep.getLabels().size() > 1)
+            throw new IllegalArgumentException("Match traversals can not have multiple labels on the end step: " + traversal);
+
+        String endAs = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
         checkAs(startAs);
         if (null == endAs) {
             endAs = createAnonymousAs();