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)