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/08/27 01:09:55 UTC
incubator-tinkerpop git commit: added Path.popEquals(pop,
other) as a way to test path equality based on labeled pops. This is
useful for TraverserRequirement.LABELED_PATH and ensuring that there is a
higher probability of bulking. I need to add a MAX_POP
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master b7000b22f -> 784d657af
added Path.popEquals(pop,other) as a way to test path equality based on labeled pops. This is useful for TraverserRequirement.LABELED_PATH and ensuring that there is a higher probability of bulking. I need to add a MAX_POP requirement so that the total pop of a traversal can be specified (typically Pop.last is what is used).
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/784d657a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/784d657a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/784d657a
Branch: refs/heads/master
Commit: 784d657afcec6e23cf8a570e19583ef64e39a2c7
Parents: b7000b2
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Aug 26 17:09:46 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Aug 26 17:09:46 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../gremlin/process/traversal/Path.java | 19 ++++-
.../traverser/B_LP_O_S_SE_SL_Traverser.java | 3 +-
.../gremlin/process/traversal/PathTest.java | 79 ++++++++++++++++++++
4 files changed, 99 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/784d657a/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 4c4944d..19ece09 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
TinkerPop 3.1.0 (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Added `Path.popEquals(Pop,Object)` to check for path equality based on `Pop` (useful for `TraverserRequirement.LABELED_PATH`).
* Added `Operator.assign` to allow setting a direct value.
* `Operator` is now a `BinaryOperator<Object>` with appropriate typecasting for respective number operators.
* Simplified `SackValueStep` so it now supports both `sack(function)` and sack(function).by()`. Deprecated `sack(function,string)`.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/784d657a/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 25e69bb..a302165 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
@@ -21,7 +21,11 @@ package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.javatuples.Pair;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
import java.util.function.BiConsumer;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@@ -152,7 +156,7 @@ public interface Path extends Cloneable, Iterable<Object> {
/**
* An ordered list of the labels associated with the path
- * The set of labels for a particular step are ordered by the order in which {@link Path#addLabel} was called.
+ * The set of labels for a particular step are ordered by the order in which {@link Path#extend(Object, Set)} was called.
*
* @return the labels of the path
*/
@@ -196,6 +200,17 @@ public interface Path extends Cloneable, Iterable<Object> {
return IntStream.range(0, this.size()).mapToObj(i -> Pair.with(objects.get(i), labels.get(i)));
}
+ public default boolean popEquals(final Pop pop, final Object other) {
+ if (!(other instanceof Path))
+ return false;
+ final Path otherPath = (Path) other;
+ return !this.labels().stream().
+ flatMap(Set::stream).
+ filter(label -> !otherPath.hasLabel(label) || !otherPath.get(pop, label).equals(this.get(pop, label))).
+ findAny().
+ isPresent();
+ }
+
public static class Exceptions {
public static IllegalArgumentException stepWithProvidedLabelDoesNotExist(final String label) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/784d657a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
index 61683c9..4d74c49 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_O_S_SE_SL_Traverser.java
@@ -22,6 +22,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.traverser;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Pop;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
@@ -100,7 +101,7 @@ public class B_LP_O_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
&& ((B_LP_O_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
&& ((B_LP_O_S_SE_SL_Traverser) object).loops() == this.loops()
&& (null == this.sack)
- && ((B_LP_O_S_SE_SL_Traverser) object).path().equals(this.path);
+ && ((B_LP_O_S_SE_SL_Traverser) object).path().popEquals(Pop.last,this.path); // this should be Pop.all?
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/784d657a/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 18d160e..522f3b7 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
@@ -245,6 +245,85 @@ public class PathTest {
}
@Test
+ public void shouldHavePopEquality() {
+ PATH_SUPPLIERS.forEach(supplier -> {
+ Path pathA1 = supplier.get();
+ Path pathA2 = supplier.get();
+ Path pathB1 = supplier.get();
+ Path pathB2 = supplier.get();
+ assertTrue(pathA1.popEquals(Pop.all, pathA2));
+ assertTrue(pathA2.popEquals(Pop.all, pathB1));
+ assertTrue(pathB1.popEquals(Pop.all, pathB2));
+ assertTrue(pathA1.popEquals(Pop.first, pathA2));
+ assertTrue(pathA2.popEquals(Pop.first, pathB1));
+ assertTrue(pathB1.popEquals(Pop.first, pathB2));
+ assertTrue(pathA1.popEquals(Pop.last, pathA2));
+ assertTrue(pathA2.popEquals(Pop.last, pathB1));
+ assertTrue(pathB1.popEquals(Pop.last, pathB2));
+
+ ///
+ pathA1 = pathA1.extend("marko", Collections.singleton("a"));
+ pathA2 = pathA2.extend("marko", Collections.singleton("a"));
+ pathB1 = pathB1.extend("matthias", Collections.singleton("a"));
+ pathB2 = pathB2.extend("matthias", Collections.singleton("a"));
+ assertTrue(pathA1.popEquals(Pop.all, pathA2));
+ assertFalse(pathA2.popEquals(Pop.all, pathB1));
+ assertTrue(pathB1.popEquals(Pop.all, pathB2));
+ assertTrue(pathA1.popEquals(Pop.first, pathA2));
+ assertFalse(pathA2.popEquals(Pop.first, pathB1));
+ assertTrue(pathB1.popEquals(Pop.first, pathB2));
+ assertTrue(pathA1.popEquals(Pop.last, pathA2));
+ assertFalse(pathA2.popEquals(Pop.last, pathB1));
+ assertTrue(pathB1.popEquals(Pop.last, pathB2));
+
+ ///
+ pathA1 = pathA1.extend("matthias", Collections.singleton("a"));
+ pathA2 = pathA2.extend("matthias", Collections.singleton("a"));
+ pathB1 = pathB1.extend("marko", Collections.singleton("a"));
+ pathB2 = pathB2.extend("marko", Collections.singleton("a"));
+ assertTrue(pathA1.popEquals(Pop.all, pathA2));
+ assertFalse(pathA2.popEquals(Pop.all, pathB1));
+ assertTrue(pathB1.popEquals(Pop.all, pathB2));
+ assertTrue(pathA1.popEquals(Pop.first, pathA2));
+ assertFalse(pathA2.popEquals(Pop.first, pathB1));
+ assertTrue(pathB1.popEquals(Pop.first, pathB2));
+ assertTrue(pathA1.popEquals(Pop.last, pathA2));
+ assertFalse(pathA2.popEquals(Pop.last, pathB1));
+ assertTrue(pathB1.popEquals(Pop.last, pathB2));
+
+ ///
+ pathA1 = pathA1.extend("bob", Collections.singleton("a"));
+ pathA2 = pathA2.extend("bob", Collections.singleton("a"));
+ pathB1 = pathB1.extend("bob", Collections.singleton("a"));
+ pathB2 = pathB2.extend("bob", Collections.singleton("a"));
+ assertTrue(pathA1.popEquals(Pop.all, pathA2));
+ assertFalse(pathA2.popEquals(Pop.all, pathB1));
+ assertTrue(pathB1.popEquals(Pop.all, pathB2));
+ assertTrue(pathA1.popEquals(Pop.first, pathA2));
+ assertFalse(pathA2.popEquals(Pop.first, pathB1));
+ assertTrue(pathB1.popEquals(Pop.first, pathB2));
+ assertTrue(pathA1.popEquals(Pop.last, pathA2));
+ assertTrue(pathA2.popEquals(Pop.last, pathB1));
+ assertTrue(pathB1.popEquals(Pop.last, pathB2));
+
+ ///
+ pathA1 = pathA1.extend("stephen", Collections.singleton("b"));
+ pathA2 = pathA2.extend("stephen", Collections.singleton("b"));
+ pathB1 = pathB1.extend("stephen", Collections.singleton("b"));
+ pathB2 = pathB2.extend("stephen", Collections.singleton("b"));
+ assertTrue(pathA1.popEquals(Pop.all, pathA2));
+ assertFalse(pathA2.popEquals(Pop.all, pathB1));
+ assertTrue(pathB1.popEquals(Pop.all, pathB2));
+ assertTrue(pathA1.popEquals(Pop.first, pathA2));
+ assertFalse(pathA2.popEquals(Pop.first, pathB1));
+ assertTrue(pathB1.popEquals(Pop.first, pathB2));
+ assertTrue(pathA1.popEquals(Pop.last, pathA2));
+ assertTrue(pathA2.popEquals(Pop.last, pathB1));
+ assertTrue(pathB1.popEquals(Pop.last, pathB2));
+ });
+ }
+
+ @Test
public void shouldHaveCrossTypeEquality() {
List<Path> paths = PATH_SUPPLIERS.stream()
.map(Supplier::get)