added optimized versions of labels() and objects() for ImmutablePath and added more test cases to PathTest to ensure the path retraction is sound. It is. CTR.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8cd4cfa5 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8cd4cfa5 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8cd4cfa5 Branch: refs/heads/TINKERPOP-1278 Commit: 8cd4cfa528c972fd1ae8bc267c389810e176a5ee Parents: 3d1168f Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Mon Jul 11 16:55:40 2016 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Mon Jul 11 16:55:40 2016 -0600 ---------------------------------------------------------------------- .../traversal/step/util/ImmutablePath.java | 38 +++++++++++++++----- .../gremlin/process/traversal/PathTest.java | 14 +++++++- 2 files changed, 42 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8cd4cfa5/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 feddc59..729b4f3 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 @@ -156,23 +156,43 @@ public class ImmutablePath implements Path, ImmutablePathImpl, Serializable, Clo @Override public boolean hasLabel(final String label) { - return this.currentLabels.contains(label) || this.previousPath.hasLabel(label); + ImmutablePath currentPathSection = this; + while (true) { + if (currentPathSection.currentLabels.contains(label)) + return true; + if (currentPathSection.previousPath instanceof TailPath) + return false; + else + currentPathSection = (ImmutablePath) currentPathSection.previousPath; + } } @Override public List<Object> objects() { - final List<Object> objectPath = new ArrayList<>(); // TODO: optimize - objectPath.addAll(this.previousPath.objects()); - objectPath.add(this.currentObject); - return Collections.unmodifiableList(objectPath); + final List<Object> objects = new ArrayList<>(); + ImmutablePath currentPathSection = this; + while (true) { + objects.add(0, currentPathSection.currentObject); + if (currentPathSection.previousPath instanceof TailPath) + break; + else + currentPathSection = (ImmutablePath) currentPathSection.previousPath; + } + return Collections.unmodifiableList(objects); } @Override public List<Set<String>> labels() { - final List<Set<String>> labelPath = new ArrayList<>(); // TODO: optimize - labelPath.addAll(this.previousPath.labels()); - labelPath.add(this.currentLabels); - return Collections.unmodifiableList(labelPath); + final List<Set<String>> labels = new ArrayList<>(); + ImmutablePath currentPathSection = this; + while (true) { + labels.add(0, currentPathSection.currentLabels); + if (currentPathSection.previousPath instanceof TailPath) + break; + else + currentPathSection = (ImmutablePath) currentPathSection.previousPath; + } + return Collections.unmodifiableList(labels); } @Override http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8cd4cfa5/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java index 21f1ec8..1b37502 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/PathTest.java @@ -76,17 +76,29 @@ public class PathTest { assertEquals(Integer.valueOf(2), path.get(1)); assertEquals(Integer.valueOf(3), path.get(2)); assertEquals(Integer.valueOf(3), path.get(3)); - Path retractedPath = path.retract(Collections.singleton("f")); + Path retractedPath = path.retract(Collections.singleton("f")).clone(); assertFalse(path.hasLabel("f")); + assertEquals(4, path.size()); assertEquals(retractedPath, path); path = path.retract(Collections.singleton("b")); assertFalse(path.hasLabel("b")); + assertEquals(3, path.size()); + assertEquals(retractedPath.retract(Collections.singleton("b")), path); path = path.retract(Collections.singleton("a")); + assertEquals(2, path.size()); assertFalse(path.hasLabel("a")); assertTrue(path.hasLabel("d")); path = path.retract(new HashSet<>(Arrays.asList("c", "d"))); assertFalse(path.hasLabel("c")); assertFalse(path.hasLabel("d")); + assertTrue(path.hasLabel("e")); + assertEquals(1, path.size()); + path = path.retract(Collections.singleton("e")); + assertFalse(path.hasLabel("c")); + assertFalse(path.hasLabel("d")); + assertFalse(path.hasLabel("e")); + assertNotEquals(retractedPath, path); + assertEquals(0, path.size()); }); }