You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2018/09/18 14:32:53 UTC
[1/7] tinkerpop git commit: TINKERPOP-2029 Added tests demonstrating
strategy failures
Repository: tinkerpop
Updated Branches:
refs/heads/master f9668cc62 -> 2199d4788
TINKERPOP-2029 Added tests demonstrating strategy failures
Identified potentially two problems, one with ConnectedStrategy and by virtue of its application InlineFilterStrategy.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/46ee4268
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/46ee4268
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/46ee4268
Branch: refs/heads/master
Commit: 46ee42686a875baf123176040b2f341218e02e1a
Parents: 425bcd0
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Sep 5 13:08:01 2018 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Sep 5 13:08:01 2018 -0400
----------------------------------------------------------------------
.../decoration/ConnectiveStrategyTest.java | 4 +
.../optimization/InlineFilterStrategyTest.java | 109 +++++++++++--------
.../traversal/step/filter/GroovyAndTest.groovy | 5 +
.../process/traversal/step/filter/AndTest.java | 18 ++-
4 files changed, 89 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/46ee4268/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
index 47bee6a..f7a9116 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
@@ -28,6 +28,9 @@ import org.junit.runners.Parameterized;
import java.util.Arrays;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.V;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.filter;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
import static org.junit.Assert.assertEquals;
/**
@@ -58,6 +61,7 @@ public class ConnectiveStrategyTest {
@Parameterized.Parameters(name = "{0}")
public static Iterable<Object[]> generateTestParameters() {
return Arrays.asList(new Traversal[][]{
+ {__.has("name", "marko").and().has("name", "marko").and().has("name", "marko"), __.and(has("name", "marko"), __.has("name", "marko"), __.has("name", "marko"))},
{__.has("name", "stephen").or().where(__.out("knows").has("name", "stephen")), __.or(__.has("name", "stephen"), __.where(__.out("knows").has("name", "stephen")))},
{__.out("a").out("b").and().out("c").or().out("d"), __.or(__.and(__.out("a").out("b"), __.out("c")), __.out("d"))},
{__.as("1").out("a").out("b").as("2").and().as("3").out("c").as("4").or().as("5").out("d").as("6"), __.or(__.and(__.as("1").out("a").out("b").as("2"), __.as("3").out("c").as("4")), __.as("5").out("d").as("6"))},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/46ee4268/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
index 924182b..302a4a5 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
@@ -22,17 +22,22 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
import org.apache.tinkerpop.gremlin.structure.T;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
import static org.apache.tinkerpop.gremlin.process.traversal.P.eq;
import static org.apache.tinkerpop.gremlin.process.traversal.P.gt;
@@ -56,8 +61,6 @@ import static org.junit.Assert.assertEquals;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-
-
@RunWith(Parameterized.class)
public class InlineFilterStrategyTest {
@@ -67,10 +70,16 @@ public class InlineFilterStrategyTest {
@Parameterized.Parameter(value = 1)
public Traversal optimized;
+ @Parameterized.Parameter(value = 2)
+ public List<TraversalStrategy> extras;
+
@Test
public void doTest() {
final TraversalStrategies strategies = new DefaultTraversalStrategies();
strategies.addStrategies(InlineFilterStrategy.instance());
+
+ extras.forEach(strategies::addStrategies);
+
this.original.asAdmin().setStrategies(strategies);
this.original.asAdmin().applyStrategies();
assertEquals(this.optimized, this.original);
@@ -79,56 +88,64 @@ public class InlineFilterStrategyTest {
@Parameterized.Parameters(name = "{0}")
public static Iterable<Object[]> generateTestParameters() {
- return Arrays.asList(new Traversal[][]{
- {has("age", 10).as("a").has("name", "marko").as("b").coin(0.5).as("c"), addHas(__.start(), "age", eq(10), "name", eq("marko")).as("a", "b").coin(0.5).as("c")},
+ return Arrays.asList(new Object[][]{
+ {has("age", 10).as("a").has("name", "marko").as("b").coin(0.5).as("c"), addHas(__.start(), "age", eq(10), "name", eq("marko")).as("a", "b").coin(0.5).as("c"), Collections.emptyList()},
+ //
+ {filter(out("knows")), filter(out("knows")), Collections.emptyList()},
+ {filter(has("age", gt(10))).as("a"), has("age", gt(10)).as("a"), Collections.emptyList()},
+ {filter(has("age", gt(10)).as("b")).as("a"), has("age", gt(10)).as("b", "a"), Collections.emptyList()},
+ {filter(has("age", gt(10)).as("a")), has("age", gt(10)).as("a"), Collections.emptyList()},
+ {filter(and(has("age", gt(10)).as("a"), has("name", "marko"))), addHas(__.start(), "age", gt(10), "name", eq("marko")).as("a"), Collections.emptyList()},
//
- {filter(out("knows")), filter(out("knows"))},
- {filter(has("age", gt(10))).as("a"), has("age", gt(10)).as("a")},
- {filter(has("age", gt(10)).as("b")).as("a"), has("age", gt(10)).as("b", "a")},
- {filter(has("age", gt(10)).as("a")), has("age", gt(10)).as("a")},
- {filter(and(has("age", gt(10)).as("a"), has("name", "marko"))), addHas(__.start(), "age", gt(10), "name", eq("marko")).as("a")},
+ {or(has("name", "marko"), has("age", 32)), or(has("name", "marko"), has("age", 32)), Collections.emptyList()},
+ {or(has("name", "marko"), has("name", "bob")), has("name", eq("marko").or(eq("bob"))), Collections.emptyList()},
+ {or(has("name", "marko"), has("name")), or(has("name", "marko"), has("name")), Collections.emptyList()},
+ {or(has("age", 10), and(has("age", gt(20)), has("age", lt(100)))), has("age", eq(10).or(gt(20).and(lt(100)))), Collections.emptyList()},
+ {or(has("name", "marko"), filter(has("name", "bob"))), has("name", eq("marko").or(eq("bob"))), Collections.emptyList()},
+ {or(has("name", "marko"), filter(or(filter(has("name", "bob")), has("name", "stephen")))), has("name", eq("marko").or(eq("bob").or(eq("stephen")))), Collections.emptyList()},
+ {or(has("name", "marko").as("a"), filter(or(filter(has("name", "bob")).as("b"), has("name", "stephen").as("c")))), has("name", eq("marko").or(eq("bob").or(eq("stephen")))).as("a", "b", "c"), Collections.emptyList()},
//
- {or(has("name", "marko"), has("age", 32)), or(has("name", "marko"), has("age", 32))},
- {or(has("name", "marko"), has("name", "bob")), has("name", eq("marko").or(eq("bob")))},
- {or(has("name", "marko"), has("name")), or(has("name", "marko"), has("name"))},
- {or(has("age", 10), and(has("age", gt(20)), has("age", lt(100)))), has("age", eq(10).or(gt(20).and(lt(100))))},
- {or(has("name", "marko"), filter(has("name", "bob"))), has("name", eq("marko").or(eq("bob")))},
- {or(has("name", "marko"), filter(or(filter(has("name", "bob")), has("name", "stephen")))), has("name", eq("marko").or(eq("bob").or(eq("stephen"))))},
- {or(has("name", "marko").as("a"), filter(or(filter(has("name", "bob")).as("b"), has("name", "stephen").as("c")))), has("name", eq("marko").or(eq("bob").or(eq("stephen")))).as("a", "b", "c")},
+ {has("name", "marko").and().has("name", "marko").and().has("name", "marko"), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
+ {filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
+ {V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
+ {V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
+ {has("name", "marko").and().has("name", "marko").and().has("name", "marko"), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
+ {filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
+ {V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
+ {V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
//
- {and(has("age", gt(10)), filter(has("age", 22))), addHas(__.start(), "age", gt(10), "age", eq(22))},
- {and(has("age", gt(10)).as("a"), filter(has("age", 22).as("b")).as("c")).as("d"), addHas(__.start(), "age", gt(10), "age", eq(22)).as("a", "b", "c", "d")},
- {and(has("age", gt(10)).as("a"), and(filter(has("age", 22).as("b")).as("c"), has("name", "marko").as("d"))), addHas(__.start(), "age", gt(10), "age", eq(22), "name", eq("marko")).as("a", "b", "c", "d")},
- {and(has("age", gt(10)).as("a"), and(has("name", "stephen").as("b"), has("name", "marko").as("c")).as("d")).as("e"), addHas(__.start(), "age", gt(10), "name", eq("stephen"), "name", eq("marko")).as("a", "b", "c", "d", "e")},
- {and(has("age", gt(10)), and(out("knows"), has("name", "marko"))), has("age", gt(10)).and(out("knows"), has("name", "marko"))},
- {and(has("age", gt(20)), or(has("age", lt(10)), has("age", gt(100)))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100)))},
- {and(has("age", gt(20)).as("a"), or(has("age", lt(10)), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b")},
- {and(has("age", gt(20)).as("a"), or(has("age", lt(10)).as("c"), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b", "c")},
+ {and(has("age", gt(10)), filter(has("age", 22))), addHas(__.start(), "age", gt(10), "age", eq(22)), Collections.emptyList()},
+ {and(has("age", gt(10)).as("a"), filter(has("age", 22).as("b")).as("c")).as("d"), addHas(__.start(), "age", gt(10), "age", eq(22)).as("a", "b", "c", "d"), Collections.emptyList()},
+ {and(has("age", gt(10)).as("a"), and(filter(has("age", 22).as("b")).as("c"), has("name", "marko").as("d"))), addHas(__.start(), "age", gt(10), "age", eq(22), "name", eq("marko")).as("a", "b", "c", "d"), Collections.emptyList()},
+ {and(has("age", gt(10)).as("a"), and(has("name", "stephen").as("b"), has("name", "marko").as("c")).as("d")).as("e"), addHas(__.start(), "age", gt(10), "name", eq("stephen"), "name", eq("marko")).as("a", "b", "c", "d", "e"), Collections.emptyList()},
+ {and(has("age", gt(10)), and(out("knows"), has("name", "marko"))), has("age", gt(10)).and(out("knows"), has("name", "marko")), Collections.emptyList()},
+ {and(has("age", gt(20)), or(has("age", lt(10)), has("age", gt(100)))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))), Collections.emptyList()},
+ {and(has("age", gt(20)).as("a"), or(has("age", lt(10)), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b"), Collections.emptyList()},
+ {and(has("age", gt(20)).as("a"), or(has("age", lt(10)).as("c"), has("age", gt(100)).as("b"))), addHas(__.start(), "age", gt(20), "age", lt(10).or(gt(100))).as("a", "b", "c"), Collections.emptyList()},
//
- {V().match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a").match(as("a").has("name").as("b"))},
- {match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), match(as("a").has("age", 10), as("a").has("name").as("b"))},
- {match(as("a").has("age", 10).both().as("b"), as("b").out().as("c")), match(as("a").has("age", 10).both().as("b"), as("b").out().as("c"))},
- {__.map(match(as("a").has("age", 10), as("a").filter(has("name")).as("b"))), __.map(match(as("a").has("age", 10), as("a").has("name").as("b")))},
- {V().match(as("a").has("age", 10)), V().has("age", 10).as("a")},
- {V().match(as("a").has("age", 10).has("name", "marko").as("b")), V().has("age", 10).has("name", "marko").as("a", "b")},
- {V().match(as("a").has("age", 10).has("name", "marko").as("b"), as("a").out("knows").as("c")), V().has("age", 10).has("name", "marko").as("a", "b").match(as("a").out("knows").as("c"))},
- {V().match(as("a").out("knows").as("c"), as("a").has("age", 10).has("name", "marko").as("b")), V().has("age", 10).has("name", "marko").as("a", "b").match(as("a").out("knows").as("c"))},
- {V().match(as("a").out("knows").as("c"), as("a").has("age", 10).has("name", "marko").as("b"), as("a").has("name", "bob")), V().has("age", 10).has("name", "marko").has("name", "bob").as("a", "b").match(as("a").out("knows").as("c"))},
- {V().match(as("a").has("age", 10).as("b"), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a", "b").match(as("a").has("name").as("b"))},
+ {V().match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a").match(as("a").has("name").as("b")), Collections.emptyList()},
+ {match(as("a").has("age", 10), as("a").filter(has("name")).as("b")), match(as("a").has("age", 10), as("a").has("name").as("b")), Collections.emptyList()},
+ {match(as("a").has("age", 10).both().as("b"), as("b").out().as("c")), match(as("a").has("age", 10).both().as("b"), as("b").out().as("c")), Collections.emptyList()},
+ {__.map(match(as("a").has("age", 10), as("a").filter(has("name")).as("b"))), __.map(match(as("a").has("age", 10), as("a").has("name").as("b"))), Collections.emptyList()},
+ {V().match(as("a").has("age", 10)), V().has("age", 10).as("a"), Collections.emptyList()},
+ {V().match(as("a").has("age", 10).has("name", "marko").as("b")), V().has("age", 10).has("name", "marko").as("a", "b"), Collections.emptyList()},
+ {V().match(as("a").has("age", 10).has("name", "marko").as("b"), as("a").out("knows").as("c")), V().has("age", 10).has("name", "marko").as("a", "b").match(as("a").out("knows").as("c")), Collections.emptyList()},
+ {V().match(as("a").out("knows").as("c"), as("a").has("age", 10).has("name", "marko").as("b")), V().has("age", 10).has("name", "marko").as("a", "b").match(as("a").out("knows").as("c")), Collections.emptyList()},
+ {V().match(as("a").out("knows").as("c"), as("a").has("age", 10).has("name", "marko").as("b"), as("a").has("name", "bob")), V().has("age", 10).has("name", "marko").has("name", "bob").as("a", "b").match(as("a").out("knows").as("c")), Collections.emptyList()},
+ {V().match(as("a").has("age", 10).as("b"), as("a").filter(has("name")).as("b")), V().has("age", 10).as("a", "b").match(as("a").has("name").as("b")), Collections.emptyList()},
//
- {filter(dedup()), filter(dedup())},
- {filter(filter(drop())), filter(drop())},
- {and(has("name"), limit(10).has("age")), and(has("name"), limit(10).has("age"))},
- {filter(tail(10).as("a")), filter(tail(10).as("a"))},
+ {filter(dedup()), filter(dedup()), Collections.emptyList()},
+ {filter(filter(drop())), filter(drop()), Collections.emptyList()},
+ {and(has("name"), limit(10).has("age")), and(has("name"), limit(10).has("age")), Collections.emptyList()},
+ {filter(tail(10).as("a")), filter(tail(10).as("a")), Collections.emptyList()},
//
- {outE().hasLabel("knows").inV(), outE("knows").inV()},
- {outE().hasLabel("knows").hasLabel("created").inV(), outE("knows").hasLabel("created").inV()},
- {outE().or(hasLabel("knows"), hasLabel("created")).inV(), outE("knows", "created").inV()},
- {outE().or(hasLabel("knows").as("a"), hasLabel("created").as("b")).as("c").inV(), outE("knows", "created").as("a", "b", "c").inV()},
- {outE().hasLabel(P.eq("knows").or(P.gt("created"))).has("weight", gt(1.0)).inV(), addHas(outE(), T.label.getAccessor(), P.eq("knows").or(P.gt("created")), "weight", gt(1.0)).inV()},
- {outE().hasLabel(P.eq("knows").or(P.eq("created"))).has("weight", gt(1.0)).inV(), outE("knows", "created").has("weight", gt(1.0)).inV()},
- // {outE().or(has(T.label,P.within("knows","likes")).hasLabel("created")).inV(), outE("knows", "likes", "created").inV()},
- {outE().hasLabel(P.within("knows", "created")).inV(), outE("knows", "created").inV()},
+ {outE().hasLabel("knows").inV(), outE("knows").inV(), Collections.emptyList()},
+ {outE().hasLabel("knows").hasLabel("created").inV(), outE("knows").hasLabel("created").inV(), Collections.emptyList()},
+ {outE().or(hasLabel("knows"), hasLabel("created")).inV(), outE("knows", "created").inV(), Collections.emptyList()},
+ {outE().or(hasLabel("knows").as("a"), hasLabel("created").as("b")).as("c").inV(), outE("knows", "created").as("a", "b", "c").inV(), Collections.emptyList()},
+ {outE().hasLabel(P.eq("knows").or(P.gt("created"))).has("weight", gt(1.0)).inV(), addHas(outE(), T.label.getAccessor(), P.eq("knows").or(P.gt("created")), "weight", gt(1.0)).inV(), Collections.emptyList()},
+ {outE().hasLabel(P.eq("knows").or(P.eq("created"))).has("weight", gt(1.0)).inV(), outE("knows", "created").has("weight", gt(1.0)).inV(), Collections.emptyList()},
+ {outE().hasLabel(P.within("knows", "created")).inV(), outE("knows", "created").inV(), Collections.emptyList()},
});
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/46ee4268/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
index fb9d356..bbaaf09 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
@@ -48,5 +48,10 @@ public abstract class GroovyAndTest {
public Traversal<Vertex, Vertex> get_g_V_asXaX_andXselectXaX_selectXaXX() {
new ScriptTraversal<>(g, "gremlin-groovy", "g.V().as('a').and(__.select('a'), __.select('a'))");
}
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V().has('name', 'marko').and().has('name', 'marko').and().has('name', 'marko')")
+ }
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/46ee4268/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
index 59a8ec8..7119e2a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
@@ -29,6 +29,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
@@ -52,6 +53,8 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, Vertex> get_g_V_asXaX_andXselectXaX_selectXaXX();
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX();
+
@Test
@LoadGraphWith(MODERN)
public void g_V_andXhasXage_gt_27X__outE_count_gte_2X_name() {
@@ -73,7 +76,7 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
public void g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name() {
final Traversal<Vertex, Vertex> traversal = get_g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name();
printTraversalForm(traversal);
- checkResults(Arrays.asList(convertToVertex(graph, "marko")), traversal);
+ checkResults(Collections.singletonList(convertToVertex(graph, "marko")), traversal);
}
@Test
@@ -85,6 +88,14 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
assertEquals(6, actual.size());
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX();
+ printTraversalForm(traversal);
+ checkResults(Collections.singletonList(convertToVertex(graph, "marko")), traversal);
+ }
+
public static class Traversals extends AndTest {
@Override
@@ -106,5 +117,10 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, Vertex> get_g_V_asXaX_andXselectXaX_selectXaXX() {
return g.V().as("a").and(select("a"), select("a"));
}
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX() {
+ return g.V().has("name", "marko").and().has("name", "marko").and().has("name", "marko");
+ }
}
}
[5/7] tinkerpop git commit: updated docs
Posted by dk...@apache.org.
updated docs
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/40b21bbd
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/40b21bbd
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/40b21bbd
Branch: refs/heads/master
Commit: 40b21bbd1361712c7b3cef140773ea87da30dbd0
Parents: 9330fcb
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Sep 10 12:21:17 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Sep 10 12:21:17 2018 -0700
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
docs/src/upgrade/release-3.4.x.asciidoc | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/40b21bbd/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 4e00d80..377cb38 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
This release also includes changes from <<release-3-3-3, 3.3.3>>.
+* Rewrote `ConnectiveStrategy` to support an arbitrary number of infix notations in a single traversal.
* GraphSON `MessageSerializer`s will automatically register the GremlinServerModule to a provided GraphSONMapper.
* Implemented `ShortestPathVertexProgram` and the `shortestPath()` step.
* `AbstractGraphProvider` uses `g.io()` for loading test data.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/40b21bbd/docs/src/upgrade/release-3.4.x.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.4.x.asciidoc b/docs/src/upgrade/release-3.4.x.asciidoc
index a9ef4ef..9538f2d 100644
--- a/docs/src/upgrade/release-3.4.x.asciidoc
+++ b/docs/src/upgrade/release-3.4.x.asciidoc
@@ -29,6 +29,29 @@ Please see the link:https://github.com/apache/tinkerpop/blob/3.4.0/CHANGELOG.asc
=== Upgrading for Users
+==== Changed infix behavior
+
+The infix notation of `and()` and `or()` now supports an arbitrary number of traversals and `ConnectiveStrategy` produces a traversal with the correct AND and OR semantics. Furthermore,
+previous versions failed to apply 3 or more `and()` steps in an infix notation, this is now fixed.
+
+[source,groovy]
+----
+gremlin> g.V().has("name","marko").and().has("age", lt(30)).or().has("name","josh").and().has("age", gt(30)).and().out("created")
+==>v[1]
+==>v[4]
+----
+
+In previous versions the above traversal
+[source,groovy]
+----
+gremlin> g.V().repeat(__.in('traverses').repeat(__.in('develops')).emit()).emit().values('name')
+==>stephen
+==>matthias
+==>marko
+----
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-967[TINKERPOP-967]
+
==== sparql-gremlin
The `sparql-gremlin` module is a link:https://en.wikipedia.org/wiki/SPARQL[SPARQL] to Gremlin compiler, which allows
[4/7] tinkerpop git commit: Removed note about infix restriction for
`and()` and `or()` as they are no longer existent.
Posted by dk...@apache.org.
Removed note about infix restriction for `and()` and `or()` as they are no longer existent.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/9330fcbc
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9330fcbc
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9330fcbc
Branch: refs/heads/master
Commit: 9330fcbc477e6a64649b6c6aa22f697756d31140
Parents: 2ce9a6d
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Sep 10 11:49:52 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Sep 10 11:49:52 2018 -0700
----------------------------------------------------------------------
docs/src/reference/the-traversal.asciidoc | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9330fcbc/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index f2a8375..6146f9b 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -339,8 +339,7 @@ g.V().and(
The `and()`-step can take an arbitrary number of traversals. All traversals must produce at least one output for the
original traverser to pass to the next step.
-An link:http://en.wikipedia.org/wiki/Infix_notation[infix notation] can be used as well. Though, with infix notation,
-only two traversals can be and'd together.
+An link:http://en.wikipedia.org/wiki/Infix_notation[infix notation] can be used as well.
[gremlin-groovy,modern]
----
@@ -1864,8 +1863,7 @@ g.V().or(
The `or()`-step can take an arbitrary number of traversals. At least one of the traversals must produce at least one
output for the original traverser to pass to the next step.
-An link:http://en.wikipedia.org/wiki/Infix_notation[infix notation] can be used as well. Though, with infix notation,
-only two traversals can be or'd together.
+An link:http://en.wikipedia.org/wiki/Infix_notation[infix notation] can be used as well.
[gremlin-groovy,modern]
----
[7/7] tinkerpop git commit: Merge branch 'TINKERPOP-2029-master'
Posted by dk...@apache.org.
Merge branch 'TINKERPOP-2029-master'
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/2199d478
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/2199d478
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/2199d478
Branch: refs/heads/master
Commit: 2199d47886c90daf5d7a002edc74b95e46d6e103
Parents: f9668cc 7386f63
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Tue Sep 18 07:32:35 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Tue Sep 18 07:32:35 2018 -0700
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
docs/src/reference/the-traversal.asciidoc | 6 +-
docs/src/upgrade/release-3.4.x.asciidoc | 25 ++++
.../strategy/decoration/ConnectiveStrategy.java | 83 ++++++++------
.../decoration/ConnectiveStrategyTest.java | 55 ++++-----
.../optimization/InlineFilterStrategyTest.java | 113 +++++++++++--------
gremlin-test/features/filter/And.feature | 13 ++-
.../process/traversal/step/filter/AndTest.java | 18 ++-
8 files changed, 193 insertions(+), 121 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2199d478/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --cc CHANGELOG.asciidoc
index 98de5d2,377cb38..54f4f71
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@@ -25,8 -25,8 +25,9 @@@ image::https://raw.githubusercontent.co
This release also includes changes from <<release-3-3-3, 3.3.3>>.
+ * Rewrote `ConnectiveStrategy` to support an arbitrary number of infix notations in a single traversal.
* GraphSON `MessageSerializer`s will automatically register the GremlinServerModule to a provided GraphSONMapper.
+* Removed support for `-i` option in Gremlin Server which was previously deprecated.
* Implemented `ShortestPathVertexProgram` and the `shortestPath()` step.
* `AbstractGraphProvider` uses `g.io()` for loading test data.
* Added the `io()` start step and `read()` and `write()` termination steps to the Gremlin language.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/2199d478/docs/src/upgrade/release-3.4.x.asciidoc
----------------------------------------------------------------------
[2/7] tinkerpop git commit: Rewrote `ConnectiveStrategy`. It's a
breaking change as it now behaves slightly differently, but now it
Posted by dk...@apache.org.
Rewrote `ConnectiveStrategy`. It's a breaking change as it now behaves slightly differently, but now it
* produces correct AND and OR semantics.
* has fewer recursive calls (at most 1).
* is faster in its own execution and produces fewer steps in the final traversal which should make the processed traversal faster as well.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/e518c9af
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/e518c9af
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/e518c9af
Branch: refs/heads/master
Commit: e518c9af9a4aca56449af2b743f24d35a8a43b50
Parents: 46ee426
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Sep 10 11:41:34 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Sep 10 11:41:34 2018 -0700
----------------------------------------------------------------------
.../strategy/decoration/ConnectiveStrategy.java | 83 ++++++++++++--------
.../decoration/ConnectiveStrategyTest.java | 51 ++++--------
.../optimization/InlineFilterStrategyTest.java | 10 ++-
gremlin-test/features/filter/And.feature | 13 ++-
4 files changed, 84 insertions(+), 73 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e518c9af/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
index eb85c7b..3deab6d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
@@ -34,6 +34,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import java.util.Collections;
+import java.util.List;
import java.util.Set;
/**
@@ -76,42 +78,55 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy<Traversa
private static void processConjunctionMarker(final Class<? extends ConnectiveStep> markerClass, final Traversal.Admin<?, ?> traversal) {
- TraversalHelper.getStepsOfClass(markerClass, traversal).stream()
- .filter(conjunctionStep -> conjunctionStep.getLocalChildren().isEmpty())
- .findFirst().ifPresent(connectiveStep -> {
-
- Step<?, ?> currentStep = connectiveStep.getNextStep();
- final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
- if (!connectiveStep.getLabels().isEmpty()) {
- final StartStep<?> startStep = new StartStep<>(rightTraversal);
- final Set<String> conjunctionLabels = ((Step<?, ?>) connectiveStep).getLabels();
- conjunctionLabels.forEach(startStep::addLabel);
- conjunctionLabels.forEach(label -> connectiveStep.removeLabel(label));
- rightTraversal.addStep(startStep);
- }
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> nextStep = currentStep.getNextStep();
- rightTraversal.addStep(currentStep);
- traversal.removeStep(currentStep);
- currentStep = nextStep;
- }
- processConnectiveMarker(rightTraversal);
-
- currentStep = connectiveStep.getPreviousStep();
- final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> previousStep = currentStep.getPreviousStep();
- leftTraversal.addStep(0, currentStep);
- traversal.removeStep(currentStep);
- currentStep = previousStep;
+ final List<Step> steps = traversal.getSteps();
+ for (int i = 0; i < steps.size(); i++) {
+ final Step step = steps.get(i);
+ if (step.getClass().equals(markerClass)) {
+ final ConnectiveStep<?> currentStep = (ConnectiveStep) step;
+ if (currentStep.getLocalChildren().isEmpty()) {
+ Traversal.Admin<?, ?> connectiveTraversal;
+ currentStep.addLocalChild(connectiveTraversal = __.start().asAdmin());
+ for (int j = i - 1; j >= 0; i--, j--) {
+ final Step previousStep = steps.get(j);
+ if (legalCurrentStep(previousStep)) {
+ connectiveTraversal.addStep(0, previousStep);
+ traversal.removeStep(previousStep);
+ } else break;
+ }
+ i++;
+ currentStep.addLocalChild(connectiveTraversal = connectiveTraversal(connectiveTraversal, currentStep));
+ currentStep.getLabels().forEach(currentStep::removeLabel);
+ while (i < steps.size()) {
+ final Step nextStep = steps.get(i);
+ if (legalCurrentStep(nextStep)) {
+ if (nextStep.getClass().equals(markerClass) &&
+ ((ConnectiveStep) nextStep).getLocalChildren().isEmpty()) {
+ final ConnectiveStep<?> nextConnectiveStep = (ConnectiveStep<?>) nextStep;
+ currentStep.addLocalChild(connectiveTraversal = connectiveTraversal(connectiveTraversal, nextConnectiveStep));
+ } else {
+ connectiveTraversal.addStep(nextStep);
+ }
+ traversal.removeStep(nextStep);
+ } else break;
+ }
+ if (currentStep instanceof OrStep) {
+ currentStep.getLocalChildren().forEach(t -> processConjunctionMarker(AndStep.class, t));
+ }
+ }
}
- processConnectiveMarker(leftTraversal);
+ }
+ }
- if (connectiveStep instanceof AndStep)
- TraversalHelper.replaceStep((Step) connectiveStep, new AndStep(traversal, leftTraversal, rightTraversal), traversal);
- else
- TraversalHelper.replaceStep((Step) connectiveStep, new OrStep(traversal, leftTraversal, rightTraversal), traversal);
- });
+ private static Traversal.Admin<?,?> connectiveTraversal(final Traversal.Admin<?, ?> connectiveTraversal,
+ final ConnectiveStep connectiveStep) {
+ final Traversal.Admin<?, ?> traversal = __.start().asAdmin();
+ final Set<String> conjunctionLabels = connectiveStep.getLabels();
+ if (!conjunctionLabels.isEmpty()) {
+ final StartStep<?> startStep = new StartStep<>(connectiveTraversal);
+ conjunctionLabels.forEach(startStep::addLabel);
+ traversal.addStep(startStep);
+ }
+ return traversal;
}
public static ConnectiveStrategy instance() {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e518c9af/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
index f7a9116..13ccd80 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategyTest.java
@@ -87,43 +87,24 @@ public class ConnectiveStrategyTest {
// EXPECT:
__.or(
__.as("a1").out("a").as("a2"),
- __.or(
- __.and(
- __.as("b1").out("b").as("b2"),
- __.as("c1").out("c").as("c2")
- ),
- __.or(
- __.as("d1").out("d").as("d2"),
+ __.and(
+ __.as("b1").out("b").as("b2"),
+ __.as("c1").out("c").as("c2")),
+ __.as("d1").out("d").as("d2"),
+ __.and(
+ __.as("e1").out("e").as("e2"),
+ __.as("f1").out("f").as("f2"),
+ __.as("g1").out("g").as("g2")),
+ __.and(
+ __.as("h1").out("h").as("h2").or(
__.or(
+ __.as("i1").out("i").as("i2"),
__.and(
- __.as("e1").out("e").as("e2"),
- __.and(
- __.as("f1").out("f").as("f2"),
- __.as("g1").out("g").as("g2")
- )
- ),
- __.and(
- __.as("h1").out("h").as("h2").or(
- __.or(
- __.as("i1").out("i").as("i2"),
- __.and(
- __.as("j1").out("j").as("j2"),
- __.as("k1").out("k").as("k2")
- )
- )
- ),
- __.and(
- __.as("l1").out("l").as("l2"),
- __.and(
- __.as("m1").out("m").as("m2"),
- __.as("n1").out("n").as("n2")
- )
- )
- )
- )
- )
- )
- )
+ __.as("j1").out("j").as("j2"),
+ __.as("k1").out("k").as("k2")))),
+ __.as("l1").out("l").as("l2"),
+ __.as("m1").out("m").as("m2"),
+ __.as("n1").out("n").as("n2")))
}
});
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e518c9af/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
index 302a4a5..512f6e5 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategyTest.java
@@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Connec
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@@ -41,6 +42,7 @@ import java.util.List;
import static org.apache.tinkerpop.gremlin.process.traversal.P.eq;
import static org.apache.tinkerpop.gremlin.process.traversal.P.gt;
+import static org.apache.tinkerpop.gremlin.process.traversal.P.inside;
import static org.apache.tinkerpop.gremlin.process.traversal.P.lt;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.V;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.and;
@@ -96,6 +98,7 @@ public class InlineFilterStrategyTest {
{filter(has("age", gt(10)).as("b")).as("a"), has("age", gt(10)).as("b", "a"), Collections.emptyList()},
{filter(has("age", gt(10)).as("a")), has("age", gt(10)).as("a"), Collections.emptyList()},
{filter(and(has("age", gt(10)).as("a"), has("name", "marko"))), addHas(__.start(), "age", gt(10), "name", eq("marko")).as("a"), Collections.emptyList()},
+ {filter(out("created").and().out("knows").or().in("knows")), filter(or(and(out("created"), out("knows")), __.in("knows"))), Collections.singletonList(ConnectiveStrategy.instance())},
//
{or(has("name", "marko"), has("age", 32)), or(has("name", "marko"), has("age", 32)), Collections.emptyList()},
{or(has("name", "marko"), has("name", "bob")), has("name", eq("marko").or(eq("bob"))), Collections.emptyList()},
@@ -110,9 +113,10 @@ public class InlineFilterStrategyTest {
{V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
{V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.emptyList()},
{has("name", "marko").and().has("name", "marko").and().has("name", "marko"), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
- {filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
- {V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
- {V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
+ {V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), and(V().has("name", "marko"), has("name", "marko"), has("name", "marko")), Collections.singletonList(ConnectiveStrategy.instance())},
+ {V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), and(V().has("name", "marko"), has("name", "marko"), has("name", "marko")), Collections.singletonList(ConnectiveStrategy.instance())},
+ {EmptyGraph.instance().traversal().V().filter(has("name", "marko")).and().filter(has("name", "marko")).and().filter(has("name", "marko")), EmptyGraph.instance().traversal().V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
+ {EmptyGraph.instance().traversal().V().has("name", "marko").and().has("name", "marko").and().has("name", "marko"), EmptyGraph.instance().traversal().V().has("name", "marko").has("name", "marko").has("name", "marko"), Collections.singletonList(ConnectiveStrategy.instance())},
//
{and(has("age", gt(10)), filter(has("age", 22))), addHas(__.start(), "age", gt(10), "age", eq(22)), Collections.emptyList()},
{and(has("age", gt(10)).as("a"), filter(has("age", 22).as("b")).as("c")).as("d"), addHas(__.start(), "age", gt(10), "age", eq(22)).as("a", "b", "c", "d"), Collections.emptyList()},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/e518c9af/gremlin-test/features/filter/And.feature
----------------------------------------------------------------------
diff --git a/gremlin-test/features/filter/And.feature b/gremlin-test/features/filter/And.feature
index 1e8732e..f137841 100644
--- a/gremlin-test/features/filter/And.feature
+++ b/gremlin-test/features/filter/And.feature
@@ -66,4 +66,15 @@ Feature: Step - and()
| v[lop] |
| v[josh] |
| v[ripple] |
- | v[peter] |
\ No newline at end of file
+ | v[peter] |
+
+ Scenario: g_V_hasXname_markoX_and_hasXname_markoX_and_hasXname_markoX
+ Given the modern graph
+ And the traversal of
+ """
+ g.V().has("name", "marko").and().has("name", "marko").and().has("name", "marko")
+ """
+ When iterated to list
+ Then the result should be unordered
+ | result |
+ | v[marko] |
[6/7] tinkerpop git commit: Tweaked upgrade docs.
Posted by dk...@apache.org.
Tweaked upgrade docs.
Thanks @robertdale
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/7386f636
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/7386f636
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/7386f636
Branch: refs/heads/master
Commit: 7386f63630257c12ad773d18723e422b46776c8b
Parents: 40b21bb
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Fri Sep 14 08:58:37 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Fri Sep 14 08:58:37 2018 -0700
----------------------------------------------------------------------
docs/src/upgrade/release-3.4.x.asciidoc | 26 ++++++++++++++------------
1 file changed, 14 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/7386f636/docs/src/upgrade/release-3.4.x.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.4.x.asciidoc b/docs/src/upgrade/release-3.4.x.asciidoc
index 9538f2d..36fc4d5 100644
--- a/docs/src/upgrade/release-3.4.x.asciidoc
+++ b/docs/src/upgrade/release-3.4.x.asciidoc
@@ -31,8 +31,19 @@ Please see the link:https://github.com/apache/tinkerpop/blob/3.4.0/CHANGELOG.asc
==== Changed infix behavior
-The infix notation of `and()` and `or()` now supports an arbitrary number of traversals and `ConnectiveStrategy` produces a traversal with the correct AND and OR semantics. Furthermore,
-previous versions failed to apply 3 or more `and()` steps in an infix notation, this is now fixed.
+The infix notation of `and()` and `or()` now supports an arbitrary number of traversals and `ConnectiveStrategy` produces a traversal with proper AND and OR semantics.
+
+```
+Input: a.or.b.and.c.or.d.and.e.or.f.and.g.and.h.or.i
+
+## BEFORE
+Output: or(a, or(and(b, c), or(and(d, e), or(and(and(f, g), h), i))))
+
+## NOW
+Output: or(a, and(b, c), and(d, e), and(f, g, h), i)
+```
+
+Furthermore, previous versions failed to apply 3 or more `and()` steps using the infix notation, this is now fixed.
[source,groovy]
----
@@ -41,16 +52,7 @@ gremlin> g.V().has("name","marko").and().has("age", lt(30)).or().has("name","jos
==>v[4]
----
-In previous versions the above traversal
-[source,groovy]
-----
-gremlin> g.V().repeat(__.in('traverses').repeat(__.in('develops')).emit()).emit().values('name')
-==>stephen
-==>matthias
-==>marko
-----
-
-See: link:https://issues.apache.org/jira/browse/TINKERPOP-967[TINKERPOP-967]
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-2029[TINKERPOP-2029]
==== sparql-gremlin
[3/7] tinkerpop git commit: Merge branch 'TINKERPOP-2029' into
TINKERPOP-2029-master
Posted by dk...@apache.org.
Merge branch 'TINKERPOP-2029' into TINKERPOP-2029-master
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/2ce9a6de
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/2ce9a6de
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/2ce9a6de
Branch: refs/heads/master
Commit: 2ce9a6def3426b2a2ff89e6b556ae8b2653f6098
Parents: 7a814e1 e518c9a
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Mon Sep 10 11:47:46 2018 -0700
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Mon Sep 10 11:47:46 2018 -0700
----------------------------------------------------------------------
.../strategy/decoration/ConnectiveStrategy.java | 83 ++++++++------
.../decoration/ConnectiveStrategyTest.java | 55 ++++-----
.../optimization/InlineFilterStrategyTest.java | 113 +++++++++++--------
gremlin-test/features/filter/And.feature | 13 ++-
.../process/traversal/step/filter/AndTest.java | 18 ++-
5 files changed, 165 insertions(+), 117 deletions(-)
----------------------------------------------------------------------