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/06/11 18:30:45 UTC
incubator-tinkerpop git commit: added Path.getSingle(pop,
label) and Path.getList(label). Right now,
just default methods in Path. Added two new tests to PathTest which ensures
proper semantics for all Path implementations (PATH_SUPPLIERS). Moved
PathTest
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 9f9ccf166 -> 1d576d88e
added Path.getSingle(pop,label) and Path.getList(label). Right now, just default methods in Path. Added two new tests to PathTest which ensures proper semantics for all Path implementations (PATH_SUPPLIERS). Moved PathTest to its right directory. Added Pop to AbstractImportCustomizer as we will use it in select()-soon.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/1d576d88
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/1d576d88
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/1d576d88
Branch: refs/heads/master
Commit: 1d576d88e233eb5c850fd19f67229f20bd707901
Parents: 9f9ccf1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 11 10:30:39 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 11 10:30:39 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
README.asciidoc | 2 +-
.../gremlin/process/traversal/Path.java | 22 +-
.../gremlin/process/traversal/Pop.java | 31 +++
.../AbstractImportCustomizerProvider.java | 3 +-
.../gremlin/process/ProcessStandardSuite.java | 3 +-
.../gremlin/process/traversal/PathTest.java | 212 +++++++++++++++++++
.../process/traversal/step/util/PathTest.java | 168 ---------------
8 files changed, 270 insertions(+), 172 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index ce89d77..c65a036 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.GA (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Added `Path.getSingle(pop,label)` and `Path.getList(label)` as default helpers in `Path`.
* Gremlin Server `Settings` now has sensible defaults thus allowing the server to be started with no additional configuration.
* Fixed garbled characters in Gremlin Console that notably showed up in `:help`
* `GraphTraversal.and()` (and `or()`) now take `Object...` composed of `P` predicates or `Traversals` to be converted to `TraversalP`.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/README.asciidoc
----------------------------------------------------------------------
diff --git a/README.asciidoc b/README.asciidoc
index 77be81f..141c5bf 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -36,7 +36,7 @@ TinkerPop requires `Java 1.8.0_40+` for proper building and proper operations.
** Specify specific tests in a TinkerPop Suite to run with the `GREMLIN_TESTS` environment variable, along with the Maven project list argument, e.g.:
+
----
-export GREMLIN_TESTS='org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest$Traversals,org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest'
+export GREMLIN_TESTS='org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest$Traversals,org.apache.tinkerpop.gremlin.process.traversal.PathTest'
mvn -Dmaven.javadoc.skip=true --projects tinkergraph-gremlin test
----
** Clean the `.groovy/grapes/org.apache.tinkerpop` directory on build: `mvn clean install -DcleanGrapes`
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/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 d20fe2c..a8f2680 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
@@ -31,7 +31,7 @@ import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
- * A Path denotes a particular walk through a {@link Graph} as defined by a {@link Traverser}.
+ * A Path denotes a particular walk through a {@link Graph} as defined by a {@link Traversal}.
* In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
* The list of labels are the labels of the steps traversed. The list of objects are the objects traversed.
*
@@ -97,6 +97,26 @@ public interface Path extends Cloneable {
return (A) object;
}
+ public default <A> List<A> getList(final String label) throws IllegalArgumentException {
+ if (this.hasLabel(label)) {
+ final Object object = this.get(label);
+ if (object instanceof List)
+ return (List<A>) object;
+ else
+ return Collections.singletonList((A) object);
+ } else {
+ return Collections.emptyList();
+ }
+ }
+
+ public default <A> A getSingle(final Pop pop, final String label) throws IllegalArgumentException {
+ final Object object = this.get(label);
+ if (object instanceof List) {
+ return Pop.head == pop ? ((List<A>) object).get(((List) object).size() - 1) : ((List<A>) object).get(0);
+ } else
+ return (A) object;
+ }
+
/**
* Get the object associated with the specified index into the path.
*
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
new file mode 100644
index 0000000..9acd8c2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Pop.java
@@ -0,0 +1,31 @@
+/*
+ *
+ * * Licensed to the Apache Software Foundation (ASF) under one
+ * * or more contributor license agreements. See the NOTICE file
+ * * distributed with this work for additional information
+ * * regarding copyright ownership. The ASF licenses this file
+ * * to you under the Apache License, Version 2.0 (the
+ * * "License"); you may not use this file except in compliance
+ * * with the License. You may obtain a copy of the License at
+ * *
+ * * http://www.apache.org/licenses/LICENSE-2.0
+ * *
+ * * Unless required by applicable law or agreed to in writing,
+ * * software distributed under the License is distributed on an
+ * * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * * KIND, either express or implied. See the License for the
+ * * specific language governing permissions and limitations
+ * * under the License.
+ *
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum Pop {
+
+ head,
+ tail
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index fcef79d..2e4c626 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
@@ -104,7 +105,7 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
staticImports.add(Order.class.getCanonicalName() + DOT_STAR);
staticImports.add(Operator.class.getCanonicalName() + DOT_STAR);
staticImports.add(Scope.class.getCanonicalName() + DOT_STAR);
-
+ staticImports.add(Pop.class.getCanonicalName() + DOT_STAR);
// utils
imports.add(Gremlin.class.getPackage().getName() + DOT_STAR);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 1888761..9762a5b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process;
import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.PathTest;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsTest;
import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
@@ -153,7 +154,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
// util
TraversalSideEffectsTest.Traversals.class,
- org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest.class,
+ PathTest.class,
// compliance
CoreTraversalTest.class,
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
new file mode 100644
index 0000000..02f0553
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Supplier;
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PathTest extends AbstractGremlinProcessTest {
+
+ private final static List<Supplier<Path>> PATH_SUPPLIERS =
+ Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
+
+ @Test
+ public void shouldHaveStandardSemanticsImplementedCorrectly() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ assertTrue(path.isSimple());
+ assertEquals(0, path.size());
+ 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"));
+ assertEquals(Integer.valueOf(3), path.get("c"));
+ path.addLabel("d");
+ assertEquals(3, path.size());
+ assertEquals(Integer.valueOf(1), path.get("a"));
+ assertEquals(Integer.valueOf(2), path.get("b"));
+ assertEquals(Integer.valueOf(3), path.get("c"));
+ assertEquals(Integer.valueOf(3), path.get("d"));
+ assertTrue(path.hasLabel("a"));
+ assertTrue(path.hasLabel("b"));
+ assertTrue(path.hasLabel("c"));
+ assertTrue(path.hasLabel("d"));
+ assertFalse(path.hasLabel("e"));
+ assertTrue(path.isSimple());
+ path = path.extend(3, Collections.singleton("e"));
+ assertFalse(path.isSimple());
+ assertTrue(path.hasLabel("e"));
+ assertEquals(4, path.size());
+ assertEquals(Integer.valueOf(1), path.get(0));
+ assertEquals(Integer.valueOf(2), path.get(1));
+ assertEquals(Integer.valueOf(3), path.get(2));
+ assertEquals(Integer.valueOf(3), path.get(3));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
+ public void shouldHandleMultiLabelPaths() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ 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());
+ assertEquals(2, new HashSet<>(path.labels()).size());
+ assertTrue(path.get("a") instanceof List);
+ assertTrue(path.get("b") instanceof String);
+ assertEquals(2, path.<List<String>>get("a").size());
+ assertTrue(path.<List<String>>get("a").contains("marko"));
+ assertTrue(path.<List<String>>get("a").contains("matthias"));
+ });
+
+ final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
+ assertEquals(3, path.size());
+ assertEquals(3, path.labels().size());
+ assertEquals(2, new HashSet<>(path.labels()).size());
+ assertTrue(path.get("x") instanceof String);
+ assertTrue(path.get("y") instanceof List);
+ assertEquals(2, path.<List<String>>get("y").size());
+ assertTrue(path.<List<String>>get("y").contains("josh"));
+ assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
+ }
+
+ @Test
+ public void shouldExcludeUnlabeledLabelsFromPath() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ path = path.extend("marko", "a");
+ path = path.extend("stephen", "b");
+ path = path.extend("matthias", "c", "d");
+ assertEquals(3, path.size());
+ assertEquals(3, path.objects().size());
+ assertEquals(3, path.labels().size());
+ assertEquals(1, path.labels().get(0).size());
+ assertEquals(1, path.labels().get(1).size());
+ assertEquals("b", path.labels().get(1).iterator().next());
+ assertEquals(2, path.labels().get(2).size());
+ assertTrue(path.labels().get(2).contains("c"));
+ assertTrue(path.labels().get(2).contains("d"));
+ });
+ }
+
+ @Test
+ public void shouldHaveOrderedPathLabels() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ path = path.extend("marko", "a", "b");
+ path = path.extend("stephen", "c", "a");
+ path = path.extend("matthias", "a", "b");
+ assertEquals(3, path.size());
+ assertEquals(3, path.objects().size());
+ assertEquals(3, path.labels().size());
+ assertEquals(2, path.labels().get(0).size());
+ assertEquals(2, path.labels().get(1).size());
+ assertEquals(2, path.labels().get(2).size());
+ ///
+ Iterator<String> labels = path.labels().get(0).iterator();
+ assertEquals("a", labels.next());
+ assertEquals("b", labels.next());
+ assertFalse(labels.hasNext());
+ labels = path.labels().get(1).iterator();
+ assertEquals("c", labels.next());
+ assertEquals("a", labels.next());
+ assertFalse(labels.hasNext());
+ labels = path.labels().get(2).iterator();
+ assertEquals("a", labels.next());
+ assertEquals("b", labels.next());
+ assertFalse(labels.hasNext());
+ ///
+ List<String> names = path.get("a");
+ assertEquals("marko", names.get(0));
+ assertEquals("stephen", names.get(1));
+ assertEquals("matthias", names.get(2));
+ names = path.get("b");
+ assertEquals("marko", names.get(0));
+ assertEquals("matthias", names.get(1));
+ assertEquals("stephen", path.get("c"));
+ });
+ }
+
+ @Test
+ public void shouldSelectSingleCorrectly() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ path = path.extend("marko", "a", "b");
+ path = path.extend("stephen", "a", "c");
+ path = path.extend("matthias", "c", "d");
+ assertEquals(3, path.size());
+ assertEquals("marko", path.getSingle(Pop.tail, "a"));
+ assertEquals("marko", path.getSingle(Pop.tail, "b"));
+ assertEquals("stephen", path.getSingle(Pop.tail, "c"));
+ assertEquals("matthias", path.getSingle(Pop.tail, "d"));
+ ///
+ assertEquals("marko", path.getSingle(Pop.head, "b"));
+ assertEquals("stephen", path.getSingle(Pop.head, "a"));
+ assertEquals("matthias", path.getSingle(Pop.head, "c"));
+ assertEquals("matthias", path.getSingle(Pop.head, "d"));
+ });
+ }
+
+ @Test
+ public void shouldSelectListCorrectly() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path path = supplier.get();
+ path = path.extend("marko", "a", "b");
+ path = path.extend("stephen", "a", "c");
+ path = path.extend("matthias", "c", "d");
+ assertEquals(3, path.size());
+ assertEquals(2, path.getList("a").size());
+ assertEquals("marko", path.getList("a").get(0));
+ assertEquals("stephen", path.getList("a").get(1));
+ assertEquals(1, path.getList("b").size());
+ assertEquals("marko", path.getList("b").get(0));
+ assertEquals(2, path.getList("c").size());
+ assertEquals("stephen", path.getList("c").get(0));
+ assertEquals("matthias", path.getList("c").get(1));
+ assertEquals(1, path.getList("d").size());
+ assertEquals("matthias", path.getList("d").get(0));
+ ///
+ assertEquals(0,path.getList("noExist").size());
+ });
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/1d576d88/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
deleted file mode 100644
index ace5693..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-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.traversal.Path;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.Supplier;
-
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PathTest extends AbstractGremlinProcessTest {
-
- private final static List<Supplier<Path>> PATH_SUPPLIERS =
- Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
-
- @Test
- public void shouldHaveStandardSemanticsImplementedCorrectly() {
- PATH_SUPPLIERS.forEach(supplier -> {
- Path path = supplier.get();
- assertTrue(path.isSimple());
- assertEquals(0, path.size());
- 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"));
- assertEquals(Integer.valueOf(3), path.get("c"));
- path.addLabel("d");
- assertEquals(3, path.size());
- assertEquals(Integer.valueOf(1), path.get("a"));
- assertEquals(Integer.valueOf(2), path.get("b"));
- assertEquals(Integer.valueOf(3), path.get("c"));
- assertEquals(Integer.valueOf(3), path.get("d"));
- assertTrue(path.hasLabel("a"));
- assertTrue(path.hasLabel("b"));
- assertTrue(path.hasLabel("c"));
- assertTrue(path.hasLabel("d"));
- assertFalse(path.hasLabel("e"));
- assertTrue(path.isSimple());
- path = path.extend(3, Collections.singleton("e"));
- assertFalse(path.isSimple());
- assertTrue(path.hasLabel("e"));
- assertEquals(4, path.size());
- assertEquals(Integer.valueOf(1), path.get(0));
- assertEquals(Integer.valueOf(2), path.get(1));
- assertEquals(Integer.valueOf(3), path.get(2));
- assertEquals(Integer.valueOf(3), path.get(3));
- });
- }
-
- @Test
- @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
- public void shouldHandleMultiLabelPaths() {
- PATH_SUPPLIERS.forEach(supplier -> {
- Path path = supplier.get();
- 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());
- assertEquals(2, new HashSet<>(path.labels()).size());
- assertTrue(path.get("a") instanceof List);
- assertTrue(path.get("b") instanceof String);
- assertEquals(2, path.<List<String>>get("a").size());
- assertTrue(path.<List<String>>get("a").contains("marko"));
- assertTrue(path.<List<String>>get("a").contains("matthias"));
- });
-
- final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
- assertEquals(3, path.size());
- assertEquals(3, path.labels().size());
- assertEquals(2, new HashSet<>(path.labels()).size());
- assertTrue(path.get("x") instanceof String);
- assertTrue(path.get("y") instanceof List);
- assertEquals(2, path.<List<String>>get("y").size());
- assertTrue(path.<List<String>>get("y").contains("josh"));
- assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
- }
-
- @Test
- public void shouldExcludeUnlabeledLabelsFromPath() {
- PATH_SUPPLIERS.forEach(supplier -> {
- Path path = supplier.get();
- path = path.extend("marko", "a");
- path = path.extend("stephen", "b");
- path = path.extend("matthias", "c", "d");
- assertEquals(3, path.size());
- assertEquals(3, path.objects().size());
- assertEquals(3, path.labels().size());
- assertEquals(1, path.labels().get(0).size());
- assertEquals(1, path.labels().get(1).size());
- assertEquals("b", path.labels().get(1).iterator().next());
- assertEquals(2, path.labels().get(2).size());
- assertTrue(path.labels().get(2).contains("c"));
- assertTrue(path.labels().get(2).contains("d"));
- });
- }
-
- @Test
- public void shouldHaveOrderedPathLabels() {
- PATH_SUPPLIERS.forEach(supplier -> {
- Path path = supplier.get();
- path = path.extend("marko", "a", "b");
- path = path.extend("stephen", "c", "a");
- path = path.extend("matthias", "a", "b");
- assertEquals(3, path.size());
- assertEquals(3, path.objects().size());
- assertEquals(3, path.labels().size());
- assertEquals(2, path.labels().get(0).size());
- assertEquals(2, path.labels().get(1).size());
- assertEquals(2, path.labels().get(2).size());
- ///
- Iterator<String> labels = path.labels().get(0).iterator();
- assertEquals("a", labels.next());
- assertEquals("b", labels.next());
- assertFalse(labels.hasNext());
- labels = path.labels().get(1).iterator();
- assertEquals("c", labels.next());
- assertEquals("a", labels.next());
- assertFalse(labels.hasNext());
- labels = path.labels().get(2).iterator();
- assertEquals("a", labels.next());
- assertEquals("b", labels.next());
- assertFalse(labels.hasNext());
- ///
- List<String> names = path.get("a");
- assertEquals("marko", names.get(0));
- assertEquals("stephen", names.get(1));
- assertEquals("matthias", names.get(2));
- names = path.get("b");
- assertEquals("marko", names.get(0));
- assertEquals("matthias", names.get(1));
- assertEquals("stephen", path.get("c"));
- });
- }
-}
\ No newline at end of file