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:28 UTC
[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.
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());