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

Reply via email to