You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by tw...@apache.org on 2016/06/09 12:19:11 UTC

[2/9] incubator-tinkerpop git commit: Further progress.

Further progress.


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

Branch: refs/heads/TINKERPOP-1254
Commit: d914011829aa75b1e146478fb34b31173ada37a9
Parents: 0ba01e4
Author: Ted Wilmes <tw...@gmail.com>
Authored: Mon Apr 11 07:05:22 2016 -0500
Committer: Ted Wilmes <tw...@gmail.com>
Committed: Mon Apr 11 07:05:22 2016 -0500

----------------------------------------------------------------------
 .../gremlin/process/traversal/Path.java         |  8 ++++++
 .../process/traversal/step/util/EmptyPath.java  |  3 ++
 .../traversal/step/util/ImmutablePath.java      | 29 ++++++++++++++++++++
 .../traversal/step/util/MutablePath.java        | 18 ++++++++++++
 .../gremlin/process/traversal/PathTest.java     | 11 +++++++-
 .../structure/TinkerGraphPlayTest.java          | 23 ++++++++++++++++
 6 files changed, 91 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/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 a302165..c4bc347 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
@@ -66,6 +66,14 @@ public interface Path extends Cloneable, Iterable<Object> {
     public Path extend(final Set<String> labels);
 
     /**
+     * Remove labels from path.
+     *
+     * @param labels the labels to remove
+     * @return the path with removed labels
+     */
+    public Path retract(final Set<String> labels);
+
+    /**
      * Get the object associated with the particular label of the path.
      * If the path as multiple labels of the type, then return a {@link List} of those objects.
      *

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/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 c40f228..0c6827e 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
@@ -52,6 +52,9 @@ public final class EmptyPath implements Path, Serializable {
     }
 
     @Override
+    public Path retract(final Set<String> labels) { return this; }
+
+    @Override
     public <A> A get(final String label) {
         throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/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 1a916ca..4aa6379 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
@@ -77,6 +77,30 @@ public class ImmutablePath implements Path, ImmutablePathImpl, Serializable, Clo
     }
 
     @Override
+    public Path retract(final Set<String> labels) {
+        return retract(null, labels);
+    }
+
+    private Path retract(final ImmutablePath parentPath, final Set<String> labels) {
+        if (!Collections.disjoint(this.currentLabels, labels)) {
+            // we found at least one label so we're going to have to branch this path
+            final ImmutablePath clonedPath = new ImmutablePath(this.previousPath, this.currentObject, this.currentLabels);
+            for(final String label : labels) {
+                clonedPath.currentLabels.remove(label);
+            }
+            // if no more labels, drop object
+            if(clonedPath.currentLabels.size() == 0) {
+                this.currentObject = null;
+            }
+            // clone child paths
+            parentPath.previousPath = clonedPath;
+        } else {
+            ((ImmutablePath)this.previousPath).retract(this, labels);
+        }
+        return this;
+    }
+
+    @Override
     public <A> A get(final int index) {
         return (this.size() - 1) == index ? (A) this.currentObject : this.previousPath.get(index);
     }
@@ -200,6 +224,11 @@ public class ImmutablePath implements Path, ImmutablePathImpl, Serializable, Clo
         }
 
         @Override
+        public Path retract(final Set<String> labels) {
+            throw new UnsupportedOperationException("A head path can not have labels added to it");
+        }
+
+        @Override
         public <A> A get(final String label) {
             throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/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 0a35f90..1fce784 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
@@ -24,10 +24,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -85,6 +87,22 @@ public class MutablePath implements Path, Serializable {
     }
 
     @Override
+    public Path retract(final Set<String> labels) {
+        for (int i = this.labels.size() - 1; i >= 0; i--) {
+            for (final String label : labels) {
+                if (this.labels().get(i).contains(label)) {
+                    this.labels.get(i).remove(label);
+                    if (this.labels.get(i).size() == 0) {
+                        this.objects.remove(i);
+                        continue;
+                    }
+                }
+            }
+        }
+        return this;
+    }
+
+    @Override
     public <A> A get(int index) {
         return (A) this.objects.get(index);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/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 66c1a4d..042b60c 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
@@ -40,8 +40,10 @@ import static org.junit.Assert.*;
  */
 public class PathTest {
 
+//    private final static List<Supplier<Path>> PATH_SUPPLIERS =
+//            Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
     private final static List<Supplier<Path>> PATH_SUPPLIERS =
-            Arrays.asList(MutablePath::make, ImmutablePath::make, DetachedPath::make, ReferencePath::make);
+        Arrays.asList(MutablePath::make, ImmutablePath::make);
 
     @Test
     public void shouldHaveStandardSemanticsImplementedCorrectly() {
@@ -76,6 +78,13 @@ 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 = path.retract(Collections.singleton("e"));
+            assertFalse(path.hasLabel("e"));
+            path = path.retract(Collections.singleton("b"));
+            assertFalse(path.hasLabel("b"));
+            path = path.retract(Collections.singleton("a"));
+            assertFalse(path.hasLabel("a"));
+            assertTrue(path.hasLabel("d"));
         });
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d9140118/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index e339519..f6c7b2d 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -297,4 +297,27 @@ public class TinkerGraphPlayTest {
         graph.vertices(50).next().addEdge("uncle", graph.vertices(70).next());
         logger.info(TimeUtil.clockWithResult(500, () -> g.V().match(as("a").out("knows").as("b"), as("a").out("uncle").as("b")).toList()).toString());
     }
+
+    @Test
+    public void testPaths() {
+        final Graph graph = TinkerGraph.open();
+        final GraphTraversalSource g = graph.traversal();
+
+        //     (b)
+        // (a)      (d)  (e)
+        //     (c)
+        Vertex a = graph.addVertex("a");
+        Vertex b = graph.addVertex("b");
+        Vertex c = graph.addVertex("c");
+        Vertex d = graph.addVertex("d");
+        Vertex e = graph.addVertex("e");
+
+        a.addEdge("knows", b);
+        a.addEdge("knows", c);
+        b.addEdge("knows", d);
+        c.addEdge("knows", d);
+        d.addEdge("knows", e);
+
+        g.withComputer().V().out().as("fan").out().as("back").out().select("fan").iterate();
+    }
 }