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