You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2018/07/17 17:14:23 UTC
[05/11] tinkerpop git commit: Correction to Nested Loop Traverser
split function
Correction to Nested Loop Traverser split function
Added clone() method to LabelledCounter implementing the Cloneable interface.
Deep clone the loop stack when spliting a Nested Loop Traverer.
Added test which fails without this fix.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/3974b071
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/3974b071
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/3974b071
Branch: refs/heads/master
Commit: 3974b071d595b2f98b0d8e7080b1c5cbf6221949
Parents: ad35a6a
Author: GCHQResearcher1337 <39...@users.noreply.github.com>
Authored: Thu Jun 28 09:11:49 2018 +0100
Committer: GCHQResearcher1337 <39...@users.noreply.github.com>
Committed: Sat Jun 30 09:44:43 2018 +0100
----------------------------------------------------------------------
.../B_LP_NL_O_P_S_SE_SL_Traverser.java | 8 +++++--
.../traverser/B_LP_NL_O_S_SE_SL_Traverser.java | 8 +++++--
.../traverser/B_NL_O_S_SE_SL_Traverser.java | 8 +++++--
.../LP_NL_O_OB_P_S_SE_SL_Traverser.java | 8 +++++--
.../traverser/LP_NL_O_OB_S_SE_SL_Traverser.java | 8 +++++--
.../traverser/NL_O_OB_S_SE_SL_Traverser.java | 8 +++++--
.../traverser/util/LabelledCounter.java | 7 +++++-
gremlin-test/features/branch/Repeat.feature | 14 ++++++++++++
.../traversal/step/branch/RepeatTest.java | 23 ++++++++++++++++++++
9 files changed, 79 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java
index c45e9a8..b837642 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_P_S_SE_SL_Traverser.java
@@ -66,14 +66,18 @@ public class B_LP_NL_O_P_S_SE_SL_Traverser<T> extends B_LP_O_P_S_SE_SL_Traverser
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final B_LP_NL_O_P_S_SE_SL_Traverser<R> clone = (B_LP_NL_O_P_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final B_LP_NL_O_P_S_SE_SL_Traverser<T> clone = (B_LP_NL_O_P_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_S_SE_SL_Traverser.java
index 3959dd7..a4bc1bd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_LP_NL_O_S_SE_SL_Traverser.java
@@ -66,14 +66,18 @@ public class B_LP_NL_O_S_SE_SL_Traverser<T> extends B_LP_O_S_SE_SL_Traverser<T>
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final B_LP_NL_O_S_SE_SL_Traverser<R> clone = (B_LP_NL_O_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final B_LP_NL_O_S_SE_SL_Traverser<T> clone = (B_LP_NL_O_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_NL_O_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_NL_O_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_NL_O_S_SE_SL_Traverser.java
index 11ce7fa..369448e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_NL_O_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_NL_O_S_SE_SL_Traverser.java
@@ -66,14 +66,18 @@ public class B_NL_O_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final B_NL_O_S_SE_SL_Traverser<R> clone = (B_NL_O_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final B_NL_O_S_SE_SL_Traverser<T> clone = (B_NL_O_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_P_S_SE_SL_Traverser.java
index f8b814f..2409e4a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_P_S_SE_SL_Traverser.java
@@ -67,14 +67,18 @@ public class LP_NL_O_OB_P_S_SE_SL_Traverser<T> extends LP_O_OB_P_S_SE_SL_Travers
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final LP_NL_O_OB_P_S_SE_SL_Traverser<R> clone = (LP_NL_O_OB_P_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final LP_NL_O_OB_P_S_SE_SL_Traverser<T> clone = (LP_NL_O_OB_P_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_S_SE_SL_Traverser.java
index 9649f80..65fda97 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/LP_NL_O_OB_S_SE_SL_Traverser.java
@@ -67,14 +67,18 @@ public class LP_NL_O_OB_S_SE_SL_Traverser<T> extends LP_O_OB_S_SE_SL_Traverser<T
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final LP_NL_O_OB_S_SE_SL_Traverser<R> clone = (LP_NL_O_OB_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final LP_NL_O_OB_S_SE_SL_Traverser<T> clone = (LP_NL_O_OB_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/NL_O_OB_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/NL_O_OB_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/NL_O_OB_S_SE_SL_Traverser.java
index 2734d51..3975758 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/NL_O_OB_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/NL_O_OB_S_SE_SL_Traverser.java
@@ -67,14 +67,18 @@ public class NL_O_OB_S_SE_SL_Traverser<T> extends O_OB_S_SE_SL_Traverser<T> {
@Override
public <R> Admin<R> split(final R r, final Step<T, R> step) {
final NL_O_OB_S_SE_SL_Traverser<R> clone = (NL_O_OB_S_SE_SL_Traverser<R>) super.split(r, step);
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
@Override
public Admin<T> split() {
final NL_O_OB_S_SE_SL_Traverser<T> clone = (NL_O_OB_S_SE_SL_Traverser<T>) super.split();
- clone.nestedLoops = (Stack<LabelledCounter>)this.nestedLoops.clone();
+ clone.nestedLoops = new Stack<>();
+ for(LabelledCounter lc : this.nestedLoops)
+ clone.nestedLoops.add((LabelledCounter) lc.clone());
return clone;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/LabelledCounter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/LabelledCounter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/LabelledCounter.java
index fe76891..a5214d2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/LabelledCounter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/LabelledCounter.java
@@ -26,7 +26,7 @@ import java.io.Serializable;
/**
* Class to track a count associated with a Label
*/
-public class LabelledCounter implements Serializable {
+public class LabelledCounter implements Serializable, Cloneable {
private final String label;
@@ -53,6 +53,11 @@ public class LabelledCounter implements Serializable {
}
@Override
+ public Object clone() {
+ return new LabelledCounter(this.label, this.count.shortValue());
+ }
+
+ @Override
public boolean equals(final Object o) {
if (this == o) return true;
if (!(o instanceof LabelledCounter)) return false;
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-test/features/branch/Repeat.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/branch/Repeat.feature b/gremlin-test/features/branch/Repeat.feature
index b176477..c38fa1b 100644
--- a/gremlin-test/features/branch/Repeat.feature
+++ b/gremlin-test/features/branch/Repeat.feature
@@ -292,3 +292,17 @@ Scenario: g_V_untilXconstantXtrueXX_repeatXrepeatXout_createdXX_untilXhasXname_r
| result |
| java |
| java |
+
+Scenario: g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values
+ Given the modern graph
+ And using the parameter v3Id defined as "v[lop].id"
+ And the traversal of
+ """
+ g.V(v3Id).repeat(__.both("created")).until(__.loops().is(40)).emit(__.repeat(__.in("knows")).emit(__.loops().is(1))).dedup().values("name")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | josh |
+ | lop |
+ | ripple |
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3974b071/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
index d8da3fb..80c9332 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
@@ -109,6 +109,8 @@ public abstract class RepeatTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, String> get_g_V_untilXconstantXtrueXX_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang();
+ public abstract Traversal<Vertex, String> get_g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values(final Object v3Id);
+
@Test
@LoadGraphWith(MODERN)
public void g_V_repeatXoutX_timesX2X_emit_path() {
@@ -379,6 +381,22 @@ public abstract class RepeatTest extends AbstractGremlinProcessTest {
assertFalse(traversal.hasNext());
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values() {
+ final Traversal<Vertex, String> traversal = get_g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values(convertToVertexId("lop"));
+
+ printTraversalForm(traversal);
+ for (String res : new String[]{"josh","lop", "ripple"})
+ {
+ assertTrue(traversal.hasNext());
+ String lang = traversal.next();
+ assertEquals(lang, res);
+ }
+
+ assertFalse(traversal.hasNext());
+ }
+
public static class Traversals extends RepeatTest {
@@ -477,5 +495,10 @@ public abstract class RepeatTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, String> get_g_V_untilXconstantXtrueXX_repeatXrepeatXout_createdXX_untilXhasXname_rippleXXXemit_lang() {
return g.V().until(__.constant(true)).repeat(__.repeat(out("created")).until(__.has("name", "ripple"))).emit().values("lang");
}
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX3X_repeatXbothX_createdXX_untilXloops_is_40XXemit_repeatXin_knowsXX_emit_loopsXisX1Xdedup_values(final Object v3Id) {
+ return g.V(v3Id).repeat( __.both("created")).until(loops().is(40)).emit(__.repeat(__.in("knows")).emit(loops().is(1))).dedup().values("name");
+ }
}
}