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 2016/11/16 13:36:25 UTC
[01/10] tinkerpop git commit: added more test cases around has()
handling.
Repository: tinkerpop
Updated Branches:
refs/heads/tp32 265f39bbf -> 997e94fb4
added more test cases around has() handling.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/0d4ee569
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/0d4ee569
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/0d4ee569
Branch: refs/heads/tp32
Commit: 0d4ee569c48c6fab92cd23203dc0fb27af7cfece
Parents: 4a316c5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 10:00:24 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700
----------------------------------------------------------------------
.../strategy/optimization/InlineFilterStrategyTest.java | 1 +
.../strategy/optimization/Neo4jGraphStepStrategyTest.java | 6 ++++++
.../strategy/optimization/TinkerGraphStepStrategyTest.java | 6 ++++++
3 files changed, 13 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0d4ee569/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 0d02fe4..924182b 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
@@ -113,6 +113,7 @@ public class InlineFilterStrategyTest {
{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"))},
//
{filter(dedup()), filter(dedup())},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0d4ee569/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
index a6b0862..77a2610 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
@@ -123,6 +123,12 @@ public class Neo4jGraphStepStrategyTest {
g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob"), "age", eq(10).or(gt(32))).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(Neo4jGraph.class).toList()},
{__.V().has("name", "marko").or(not(has("age")), has("age", gt(32))).has("name", "bob").has("lang", "java"),
g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(not(filter(properties("age"))), has("age", gt(32))), TraversalStrategies.GlobalCache.getStrategies(Neo4jGraph.class).toList()},
+ {__.V().has("name", P.eq("marko").or(P.eq("bob").and(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko").or(P.eq("bob").and(P.eq("stephen")))).out("knows"), Collections.emptyList()},
+ {__.V().has("name", P.eq("marko").and(P.eq("bob").and(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko"), "name", eq("bob"), "name", eq("stephen")).out("knows"), Collections.emptyList()},
+ {__.V().has("name", P.eq("marko").and(P.eq("bob").or(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko"), "name", P.eq("bob").or(eq("stephen"))).out("knows"), Collections.emptyList()},
///////
{__.V().out().out().V().has("name", "marko").out(), g_V().out().barrier(LAZY_SIZE).out().barrier(LAZY_SIZE).asAdmin().addStep(V("name", eq("marko"))).barrier(LAZY_SIZE).out().barrier(LAZY_SIZE), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance(), LazyBarrierStrategy.instance())},
{__.V().out().out().V().has("name", "marko").as("a").out(), g_V().out().barrier(LAZY_SIZE).out().barrier(LAZY_SIZE).asAdmin().addStep(V("name", eq("marko"))).barrier(LAZY_SIZE).as("a").out(), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance(), LazyBarrierStrategy.instance())},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0d4ee569/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
index 393cf32..c62bd5a 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
@@ -124,6 +124,12 @@ public class TinkerGraphStepStrategyTest {
g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob"), "age", eq(10).or(gt(32))).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(TinkerGraph.class).toList()},
{__.V().has("name", "marko").or(not(has("age")), has("age", gt(32))).has("name", "bob").has("lang", "java"),
g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(not(filter(properties("age"))), has("age", gt(32))), TraversalStrategies.GlobalCache.getStrategies(TinkerGraph.class).toList()},
+ {__.V().has("name", P.eq("marko").or(P.eq("bob").and(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko").or(P.eq("bob").and(P.eq("stephen")))).out("knows"), Collections.emptyList()},
+ {__.V().has("name", P.eq("marko").and(P.eq("bob").and(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko"), "name", eq("bob"), "name", eq("stephen")).out("knows"), Collections.emptyList()},
+ {__.V().has("name", P.eq("marko").and(P.eq("bob").or(P.eq("stephen")))).out("knows"),
+ g_V("name", eq("marko"), "name", P.eq("bob").or(eq("stephen"))).out("knows"), Collections.emptyList()},
///////
{__.V().out().out().V().has("name", "marko").out(), g_V().out().barrier(LAZY_SIZE).out().barrier(LAZY_SIZE).asAdmin().addStep(V("name", eq("marko"))).barrier(LAZY_SIZE).out().barrier(LAZY_SIZE), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance(), LazyBarrierStrategy.instance())},
{__.V().out().out().V().has("name", "marko").as("a").out(), g_V().out().barrier(LAZY_SIZE).out().barrier(LAZY_SIZE).asAdmin().addStep(V("name", eq("marko"))).barrier(LAZY_SIZE).as("a").out(), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance(), LazyBarrierStrategy.instance())},
[04/10] tinkerpop git commit: first push on 'left-append' of has()
containers.
Posted by ok...@apache.org.
first push on 'left-append' of has() containers.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/8c1391cf
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/8c1391cf
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/8c1391cf
Branch: refs/heads/tp32
Commit: 8c1391cfb83cce58246dbd20dec559a71f4e76c8
Parents: 265f39b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Nov 14 12:54:07 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700
----------------------------------------------------------------------
.../traversal/dsl/graph/GraphTraversal.java | 57 ++++++++++++++------
1 file changed, 41 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/8c1391cf/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 088a4de..e875513 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -36,6 +36,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
@@ -905,12 +906,20 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
public default GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, predicate);
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
}
public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, accessor, predicate);
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), predicate)));
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), predicate)));
}
public default GraphTraversal<S, E> has(final String propertyKey, final Object value) {
@@ -918,29 +927,47 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
return this.has(propertyKey, (P) value);
else if (value instanceof Traversal)
return this.has(propertyKey, (Traversal) value);
- else
- return this.has(propertyKey, P.eq(value));
+ else {
+ this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, value);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, P.eq(value)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(propertyKey, P.eq(value))));
+ }
}
public default GraphTraversal<S, E> has(final T accessor, final Object value) {
this.asAdmin().getBytecode().addStep(Symbols.has, accessor, value);
- return value instanceof P ?
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), (P) value))) :
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), P.eq(value))));
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value))));
}
public default GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, predicate);
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(T.label.getAccessor(), P.eq(label))));
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label)));
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate));
+ return this;
+ } else {
+ this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))));
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
+ }
}
public default GraphTraversal<S, E> has(final String label, final String propertyKey, final Object value) {
this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, value);
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(T.label.getAccessor(), P.eq(label))));
- return value instanceof P ?
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, (P) value))) :
- this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, P.eq(value))));
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label)));
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, value instanceof P ? (P) value : P.eq(value)));
+ return this;
+ } else {
+ this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))));
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, value instanceof P ? (P) value : P.eq(value))));
+ }
}
public default GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) {
@@ -1014,9 +1041,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
*/
public default GraphTraversal<S, E> is(final Object value) {
this.asAdmin().getBytecode().addStep(Symbols.is, value);
- return value instanceof P ?
- this.asAdmin().addStep(new IsStep<>(this.asAdmin(), (P<E>) value)) :
- this.asAdmin().addStep(new IsStep<>(this.asAdmin(), P.eq((E) value)));
+ return this.asAdmin().addStep(new IsStep<>(this.asAdmin(), value instanceof P ? (P<E>) value : P.eq((E) value)));
}
public default GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) {
[08/10] tinkerpop git commit: fixed a FilterRankStrategy bug that was
introduced with where().by(). Added test cases to verify behavior. Updated
CHANGELOG.
Posted by ok...@apache.org.
fixed a FilterRankStrategy bug that was introduced with where().by(). Added test cases to verify behavior. Updated CHANGELOG.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/248ccc68
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/248ccc68
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/248ccc68
Branch: refs/heads/tp32
Commit: 248ccc685720535e93b1b2ac3adc94443e697c68
Parents: 0d4ee56
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 12:10:22 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:44:18 2016 -0700
----------------------------------------------------------------------
CHANGELOG.asciidoc | 5 +++++
.../optimization/FilterRankingStrategy.java | 12 +++++++-----
.../optimization/FilterRankingStrategyTest.java | 3 +++
.../traversal/step/filter/GroovyWhereTest.groovy | 5 +++++
.../process/traversal/step/filter/WhereTest.java | 16 ++++++++++++++++
5 files changed, 36 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/248ccc68/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 7c4d41f..0613a39 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -27,6 +27,11 @@ TinkerPop 3.2.4 (Release Date: NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Converted Spark process suite tests to "integration" tests.
+* Fixed a bug in `InlineFilterStrategy` having to do with folding `HasContainers` into `VertexStep`.
+* Deprecated `HasContainer.makeHasContainers()` which was used to dissect `AndP` and shouldn't be used at the TinkerPop-level.
+* `GraphTraversal.has()` now will try and fold-left `HasContainer` if end step is a `HasContainerHolder`.
+* Created explicit `P`-predicate methods for `GraphTraversal.hasXXX()`.
+* Fixed a bug in `FilterRankStrategy` around `where().by()` ordering.
* Added another optimization in `RangeByIsCountStrategy`, that removes `count().is()` altogether if it's not needed.
* Fixed a OLAP `MatchStep.clone()`-bug that occurs when the `match()` is in a local child.
* Added another optimization in `RangeByIsCountStrategy`, that removes `count().is()` altogether if it's not needed.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/248ccc68/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
index 2f8061b..4ff485a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
@@ -126,7 +126,7 @@ public final class FilterRankingStrategy extends AbstractTraversalStrategy<Trave
return 1;
else if (step instanceof HasStep)
return 2;
- else if (step instanceof WherePredicateStep)
+ else if (step instanceof WherePredicateStep && ((WherePredicateStep) step).getLocalChildren().isEmpty())
return 3;
else if (step instanceof SimplePathStep || step instanceof CyclicPathStep)
return 4;
@@ -134,14 +134,16 @@ public final class FilterRankingStrategy extends AbstractTraversalStrategy<Trave
return 5;
else if (step instanceof WhereTraversalStep)
return 6;
- else if (step instanceof OrStep)
+ else if (step instanceof WherePredicateStep) // has by()-modulation
return 7;
- else if (step instanceof AndStep)
+ else if (step instanceof OrStep)
return 8;
- else if (step instanceof DedupGlobalStep)
+ else if (step instanceof AndStep)
return 9;
- else if (step instanceof OrderGlobalStep)
+ else if (step instanceof DedupGlobalStep)
return 10;
+ else if (step instanceof OrderGlobalStep)
+ return 11;
else
return 0;
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/248ccc68/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
index fbeeef5..577e160 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
@@ -18,6 +18,7 @@
*/
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;
@@ -105,6 +106,8 @@ public class FilterRankingStrategyTest {
{__.dedup().has("value", 0).or(not(has("age")), has("age", 10)).has("value", 1), __.has("value", 0).has("value", 1).or(not(has("age")), has("age", 10)).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{__.dedup().filter(out()).has("value", 0), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{filter(out()).dedup().has("value", 0), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
+ {__.as("a").out().has("age").where(P.eq("a")), __.as("a").out().where(P.eq("a")).has("age"), Collections.emptyList()},
+ {__.as("a").out().has("age").where(P.eq("a")).by("age"), __.as("a").out().has("age").where(P.eq("a")).by("age"), Collections.emptyList()},
{has("value", 0).filter(out()).dedup(), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{has("value", 0).or(has("name"), has("age")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(has("name"), has("age")).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).or(out(), in()).as(Graph.Hidden.hide("x")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(outE(), inE()).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/248ccc68/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
index 9348524..02bf5ef 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
@@ -152,5 +152,10 @@ public abstract class GroovyWhereTest {
new ScriptTraversal<>(g, "gremlin-groovy", "g.V().as('a').outE('created').as('b').inV().as('c').in('created').as('d').where('a', lt('b').or(gt('c')).and(neq('d'))).by('age').by('weight').by(__.in('created').values('age').min()).select('a', 'c', 'd').by('name')")
}
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name(final Object v1Id) {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id).as('a').out.has('age').where(gt('a')).by('age').name", "v1Id", v1Id)
+ }
+
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/248ccc68/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
index ef2a5e4..c9a25ad 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
@@ -119,6 +119,8 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX();
+ public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name(final Object v1Id);
+
@Test
@LoadGraphWith(MODERN)
public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX() {
@@ -385,6 +387,15 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
"a", "josh", "c", "lop", "d", "peter"), traversal);
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name(convertToVertexId(graph, "marko"));
+ printTraversalForm(traversal);
+ assertEquals("josh", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
public static class Traversals extends WhereTest {
@@ -504,5 +515,10 @@ public abstract class WhereTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outEXcreatedX_asXbX_inV_asXcX_inXcreatedX_asXdX_whereXa_ltXbX_orXgtXcXX_andXneqXdXXX_byXageX_byXweightX_byXinXcreatedX_valuesXageX_minX_selectXa_c_dX() {
return g.V().as("a").outE("created").as("b").inV().as("c").in("created").as("d").where("a", lt("b").or(gt("c")).and(neq("d"))).by("age").by("weight").by(in("created").values("age").min()).<String>select("a", "c", "d").by("name");
}
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_out_hasXageX_whereXgtXaXX_byXageX_name(final Object v1Id) {
+ return g.V(v1Id).as("a").out().has("age").where(gt("a")).by("age").values("name");
+ }
}
}
\ No newline at end of file
[06/10] tinkerpop git commit: caught another bug in
FilterRankStrategy. We really need to get the max rank of the traversal
parent's nested steps. Effects AndStep, OrStep, WhereTraversalStep,
WherePredicateStep, DedupStep, OrderStep. This ensures that fi
Posted by ok...@apache.org.
caught another bug in FilterRankStrategy. We really need to get the max rank of the traversal parent's nested steps. Effects AndStep, OrStep, WhereTraversalStep, WherePredicateStep, DedupStep, OrderStep. This ensures that filter(where().by()) isn't pushed forward cause its wrapped in filter().
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/997e94fb
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/997e94fb
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/997e94fb
Branch: refs/heads/tp32
Commit: 997e94fb489afc10cc9bcfc6c92106f021ca1045
Parents: 226633f
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 13:46:44 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:44:18 2016 -0700
----------------------------------------------------------------------
.../optimization/FilterRankingStrategy.java | 41 ++++++++++++++------
.../optimization/FilterRankingStrategyTest.java | 4 +-
2 files changed, 33 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/997e94fb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
index 15040f7..3649615 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
@@ -120,32 +120,51 @@ public final class FilterRankingStrategy extends AbstractTraversalStrategy<Trave
* @return The rank of the given step.
*/
private static int getStepRank(final Step step) {
+ final int rank;
if (!(step instanceof FilterStep || step instanceof OrderGlobalStep))
return 0;
else if (step instanceof IsStep || step instanceof ClassFilterStep)
- return 1;
+ rank = 1;
else if (step instanceof HasStep)
- return 2;
+ rank = 2;
else if (step instanceof WherePredicateStep && ((WherePredicateStep) step).getLocalChildren().isEmpty())
- return 3;
+ rank = 3;
else if (step instanceof SimplePathStep || step instanceof CyclicPathStep)
- return 4;
+ rank = 4;
else if (step instanceof TraversalFilterStep || step instanceof NotStep)
- return 5;
+ rank = 5;
else if (step instanceof WhereTraversalStep)
- return 6;
+ rank = 6;
else if (step instanceof OrStep)
- return 7;
+ rank = 7;
else if (step instanceof AndStep)
- return 8;
+ rank = 8;
else if (step instanceof WherePredicateStep) // has by()-modulation
- return 9;
+ rank = 9;
else if (step instanceof DedupGlobalStep)
- return 10;
+ rank = 10;
else if (step instanceof OrderGlobalStep)
- return 11;
+ rank = 11;
else
return 0;
+ ////////////
+ if (step instanceof TraversalParent)
+ return getMaxStepRank((TraversalParent) step, rank);
+ else
+ return rank;
+ }
+
+ private static int getMaxStepRank(final TraversalParent parent, final int startRank) {
+ int maxStepRank = startRank;
+ // no filter steps are global parents (yet)
+ for (final Traversal.Admin<?, ?> traversal : parent.getLocalChildren()) {
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ final int stepRank = getStepRank(step);
+ if (stepRank > maxStepRank)
+ maxStepRank = stepRank;
+ }
+ }
+ return maxStepRank;
}
private static boolean usesLabels(final Step<?, ?> step, final Set<String> labels) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/997e94fb/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
index b32ae2a..11f390b 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
@@ -112,10 +112,12 @@ public class FilterRankingStrategyTest {
{__.as("a").out().and(has("age"), has("name")).where(P.eq("a")), __.as("a").out().where(P.eq("a")).and(has("age"), has("name")), Collections.emptyList()},
{__.as("a").out().and(has("age"), has("name")).where(P.eq("a")).by("age"), __.as("a").out().has("age").has("name").where(P.eq("a")).by("age"), Collections.singletonList(InlineFilterStrategy.instance())},
{__.as("a").out().and(has("age"), has("name")).where(P.eq("a")), __.as("a").out().where(P.eq("a")).has("age").has("name"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.as("a").out().and(has("age"), has("name")).filter(__.where(P.eq("a"))), __.as("a").out().where(P.eq("a")).has("age").has("name"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.as("a").out().and(has("age"), has("name")).filter(__.where(P.eq("a")).by("age")), __.as("a").out().has("age").has("name").where(P.eq("a")).by("age"), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).filter(out()).dedup(), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{has("value", 0).or(has("name"), has("age")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(has("name"), has("age")).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).or(out(), in()).as(Graph.Hidden.hide("x")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(outE(), inE()).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
- // {has("value", 0).and(has("age"), has("name", "marko")).is(10), __.is(10).has("value", 0).has("name", "marko").has("age"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {has("value", 0).and(has("age"), has("name", "marko")).is(10), __.is(10).has("value", 0).has("age").has("name", "marko"), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).filter(or(not(has("age")), has("age", 1))).has("value", 1).dedup(), has("value", 0).has("value", 1).or(not(filter(properties("age"))), has("age", 1)).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
});
}
[05/10] tinkerpop git commit: fixed up the hasXXX() methods to
account of P and Object differently. Will go through and create a
TraversalHelper.addHasContainer() method which will left append or right
append depending on Traversal state. this will simpl
Posted by ok...@apache.org.
fixed up the hasXXX() methods to account of P and Object differently. Will go through and create a TraversalHelper.addHasContainer() method which will left append or right append depending on Traversal state. this will simplify methods signficiantly.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/05bfb029
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/05bfb029
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/05bfb029
Branch: refs/heads/tp32
Commit: 05bfb029c20fd21cba468b4bf25cbab322526807
Parents: 8c1391c
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Nov 14 13:46:00 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700
----------------------------------------------------------------------
.../traversal/dsl/graph/GraphTraversal.java | 114 +++++++++++++++----
.../gremlin/process/traversal/dsl/graph/__.java | 43 +++++--
.../traversal/step/filter/HasStepTest.java | 12 +-
3 files changed, 128 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index e875513..7543c32 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -147,8 +147,10 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
@@ -994,38 +996,106 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), __.values(propertyKey)));
}
- public default GraphTraversal<S, E> has(final T accessor, final Object value, final Object... values) {
- if (value instanceof Object[]) {
- final Object[] arr = (Object[]) value;
- if (values.length == 0) {
- if (arr.length == 1) {
- return has(accessor, P.eq(arr[0]));
+ public default GraphTraversal<S, E> hasLabel(final String label, final String... otherLabels) {
+ final String[] labels = new String[otherLabels.length + 1];
+ labels[0] = label;
+ System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
+ this.asAdmin().getBytecode().addStep(Symbols.hasLabel, labels);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels))));
+ }
+
+ public default GraphTraversal<S, E> hasLabel(final P<String> predicate) {
+ this.asAdmin().getBytecode().addStep(Symbols.hasLabel, predicate);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), predicate)));
+ }
+
+ public default GraphTraversal<S, E> hasId(final Object id, final Object... otherIds) {
+ if (id instanceof P)
+ return this.hasId((P) id);
+ else {
+ final List<Object> ids = new ArrayList<>();
+ if (id.getClass().isArray()) {
+ for (final Object i : (Object[]) id) {
+ ids.add(i);
}
- return has(accessor, P.within(arr));
- }
- } else if (values.length == 0) {
- return has(accessor, value instanceof P ? (P) value : P.eq(value));
+ } else
+ ids.add(id);
+ Collections.addAll(ids, otherIds);
+ this.asAdmin().getBytecode().addStep(Symbols.hasId, ids.toArray());
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids))));
}
- final Object[] objects = new Object[values.length + 1];
- objects[0] = value;
- System.arraycopy(values, 0, objects, 1, values.length);
- return has(accessor, P.within(objects));
}
- public default GraphTraversal<S, E> hasLabel(final Object value, final Object... values) {
- return has(T.label, value, values);
+ public default GraphTraversal<S, E> hasId(final P<Object> predicate) {
+ this.asAdmin().getBytecode().addStep(Symbols.hasId, predicate);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.id.getAccessor(), predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.id.getAccessor(), predicate)));
+ }
+
+ public default GraphTraversal<S, E> hasKey(final String label, final String... otherLabels) {
+ final String[] labels = new String[otherLabels.length + 1];
+ labels[0] = label;
+ System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
+ this.asAdmin().getBytecode().addStep(Symbols.hasKey, labels);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels))));
}
- public default GraphTraversal<S, E> hasId(final Object value, final Object... values) {
- return has(T.id, value, values);
+ public default GraphTraversal<S, E> hasKey(final P<String> predicate) {
+ this.asAdmin().getBytecode().addStep(Symbols.hasKey, predicate);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.key.getAccessor(), predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.key.getAccessor(), predicate)));
}
- public default GraphTraversal<S, E> hasKey(final Object value, final Object... values) {
- return has(T.key, value, values);
+ public default GraphTraversal<S, E> hasValue(final Object value, final Object... otherValues) {
+ if (value instanceof P)
+ return this.hasValue((P) value);
+ else {
+ final List<Object> values = new ArrayList<>();
+ if (value.getClass().isArray()) {
+ for (final Object v : (Object[]) value) {
+ values.add(v);
+ }
+ } else
+ values.add(value);
+ Collections.addAll(values, otherValues);
+ this.asAdmin().getBytecode().addStep(Symbols.hasValue, values.toArray());
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values)));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values))));
+ }
}
- public default GraphTraversal<S, E> hasValue(final Object value, final Object... values) {
- return has(T.value, value, values);
+ public default GraphTraversal<S, E> hasValue(final P<Object> predicate) {
+ this.asAdmin().getBytecode().addStep(Symbols.hasValue, predicate);
+ if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.value.getAccessor(), predicate));
+ return this;
+ } else
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.value.getAccessor(), predicate)));
}
public default GraphTraversal<S, E> is(final P<E> predicate) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 83739d8..dfd5878 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -661,31 +661,45 @@ public class __ {
}
/**
- * @see GraphTraversal#has(T, Object, Object...)
+ * @see GraphTraversal#hasLabel(String, String...)
*/
- public static <A> GraphTraversal<A, A> has(final T accessor, final Object value, Object... values) {
- return __.<A>start().has(accessor, value, values);
+ public static <A> GraphTraversal<A, A> hasLabel(final String label, String... otherLabels) {
+ return __.<A>start().hasLabel(label, otherLabels);
}
/**
- * @see GraphTraversal#hasLabel(Object, Object...)
+ * @see GraphTraversal#hasLabel(P)
*/
- public static <A> GraphTraversal<A, A> hasLabel(final Object value, Object... values) {
- return __.<A>start().hasLabel(value, values);
+ public static <A> GraphTraversal<A, A> hasLabel(final P<String> predicate) {
+ return __.<A>start().hasLabel(predicate);
}
/**
* @see GraphTraversal#hasId(Object, Object...)
*/
- public static <A> GraphTraversal<A, A> hasId(final Object value, Object... values) {
- return __.<A>start().hasId(value, values);
+ public static <A> GraphTraversal<A, A> hasId(final Object id, Object... otherIds) {
+ return __.<A>start().hasId(id, otherIds);
}
/**
- * @see GraphTraversal#hasKey(Object, Object...)
+ * @see GraphTraversal#hasId(P)
*/
- public static <A> GraphTraversal<A, A> hasKey(final Object value, Object... values) {
- return __.<A>start().hasKey(value, values);
+ public static <A> GraphTraversal<A, A> hasId(final P<Object> predicate) {
+ return __.<A>start().hasId(predicate);
+ }
+
+ /**
+ * @see GraphTraversal#hasKey(String, String...)
+ */
+ public static <A> GraphTraversal<A, A> hasKey(final String label, String... otherLabels) {
+ return __.<A>start().hasKey(label, otherLabels);
+ }
+
+ /**
+ * @see GraphTraversal#hasKey(P)
+ */
+ public static <A> GraphTraversal<A, A> hasKey(final P<String> predicate) {
+ return __.<A>start().hasKey(predicate);
}
/**
@@ -696,6 +710,13 @@ public class __ {
}
/**
+ * @see GraphTraversal#hasValue(P)
+ */
+ public static <A> GraphTraversal<A, A> hasValue(final P<Object> predicate) {
+ return __.<A>start().hasValue(predicate);
+ }
+
+ /**
* @see GraphTraversal#where(String, P)
*/
public static <A> GraphTraversal<A, A> where(final String startKey, final P<String> predicate) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/05bfb029/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
index 63c843d..215d6c1 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStepTest.java
@@ -75,22 +75,18 @@ public class HasStepTest extends StepTest {
// hasLabel(Object label, Object... moreLabels) should be compatible with hasLabel(Object... labels)
Arrays.asList(
__.hasLabel("person"),
- __.hasLabel(eq("person")),
- __.hasLabel(new String[]{"person"})),
+ __.hasLabel(eq("person"))),
Arrays.asList(
__.hasLabel("person", "software"),
- __.hasLabel(within("person", "software")),
- __.hasLabel(new String[]{"person", "software"})),
+ __.hasLabel(within("person", "software"))),
// hasKey(Object key, Object... moreKeys) should be compatible with hasKey(Object... keys)
Arrays.asList(
__.hasKey("name"),
- __.hasKey(eq("name")),
- __.hasKey(new String[]{"name"})),
+ __.hasKey(eq("name"))),
Arrays.asList(
__.hasKey("name", "age"),
- __.hasKey(within("name", "age")),
- __.hasKey(new String[]{"name", "age"})),
+ __.hasKey(within("name", "age"))),
// hasValue(Object value, Object... moreValues) should be compatible with hasValue(Object... values)
Arrays.asList(
[02/10] tinkerpop git commit: found a bug in
HasContainer.makeHasContainers() around AndP recurssion. No biggie,
just didn't yield ultimate optimization. Found a bug in InlineFilterStrategy
where hasLabel() should only back propagate into VertexStep[edge
Posted by ok...@apache.org.
found a bug in HasContainer.makeHasContainers() around AndP recurssion. No biggie, just didn't yield ultimate optimization. Found a bug in InlineFilterStrategy where hasLabel() should only back propagate into VertexStep[edges] if the step doesn't already have edge labels. Removed HasContainer.makeHasContainers() -- another ticket I'm putting into this branch. GraphTraversal.has() is fixed up accordingly with left-fold HasContainers and valid Object[] usage. Going to add a few more tests around hasXXX() steps.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/4a316c55
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/4a316c55
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/4a316c55
Branch: refs/heads/tp32
Commit: 4a316c55c3ab1e42ef6568689cadbca0e2fb9ed8
Parents: ffe1b4c
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 08:27:24 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700
----------------------------------------------------------------------
.../upgrade/release-3.2.x-incubating.asciidoc | 22 +++++++++++++++
.../traversal/dsl/graph/GraphTraversal.java | 29 ++++++++++++++++----
.../traversal/step/util/HasContainer.java | 26 ++++++++++--------
.../optimization/InlineFilterStrategy.java | 20 +++++++++-----
.../optimization/FilterRankingStrategyTest.java | 18 ++++++------
.../optimization/InlineFilterStrategyTest.java | 11 +++++---
.../step/sideEffect/Neo4jGraphStep.java | 11 ++++++--
.../Neo4jGraphStepStrategyTest.java | 6 ++--
.../step/sideEffect/TinkerGraphStep.java | 9 +++++-
.../TinkerGraphStepStrategyTest.java | 4 +--
10 files changed, 111 insertions(+), 45 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index 8574b88..0fd7498 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -61,6 +61,28 @@ Upgrading for Providers
Graph Database Providers
^^^^^^^^^^^^^^^^^^^^^^^^
+HasContainer AndP Splitting
++++++++++++++++++++++++++++
+
+Previously, `GraphTraversal` made it easy for providers to analyze `P`-predicates in `HasContainers`, but always
+splitting `AndP` predicates into their component parts. This helper behavior is no longer provided because,
+1.) `AndP` can be inserted into a `XXXStep` in other ways, 2.) the providers `XXXStep` should process `AndP`
+regardless of `GraphTraversal` helper, and 3.) the `GraphTraversal` helper did not recursively split.
+A simple way to split `AndP` in any custom `XXXStep` that implements `HasContainerHolder` is to use the following method:
+
+[source,java]
+----
+@Override
+public void addHasContainer(final HasContainer hasContainer) {
+ if (hasContainer.getPredicate() instanceof AndP) {
+ for (final P<?> predicate : ((AndP<?>) hasContainer.getPredicate()).getPredicates()) {
+ this.addHasContainer(new HasContainer(hasContainer.getKey(), predicate));
+ }
+ } else
+ this.hasContainers.add(hasContainer);
+}
+----
+
Duplicate Multi-Properties
++++++++++++++++++++++++++
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index d8f7888..fae2d67 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -148,7 +148,6 @@ import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
@@ -926,8 +925,14 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
public default GraphTraversal<S, E> has(final T accessor, final Object value) {
- this.asAdmin().getBytecode().addStep(Symbols.has, accessor, value);
- return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value)));
+ if (value instanceof P)
+ return this.has(accessor, (P) value);
+ else if (value instanceof Traversal)
+ return this.has(accessor, (Traversal) value);
+ else {
+ this.asAdmin().getBytecode().addStep(Symbols.has, accessor, value);
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), P.eq(value)));
+ }
}
public default GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) {
@@ -990,7 +995,14 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
} else
ids.add(id);
- Collections.addAll(ids, otherIds);
+ for (final Object i : otherIds) {
+ if (i.getClass().isArray()) {
+ for (final Object ii : (Object[]) i) {
+ ids.add(ii);
+ }
+ } else
+ ids.add(i);
+ }
this.asAdmin().getBytecode().addStep(Symbols.hasId, ids.toArray());
return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids)));
}
@@ -1025,7 +1037,14 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
}
} else
values.add(value);
- Collections.addAll(values, otherValues);
+ for (final Object v : otherValues) {
+ if (v.getClass().isArray()) {
+ for (final Object vv : (Object[]) v) {
+ values.add(vv);
+ }
+ } else
+ values.add(v);
+ }
this.asAdmin().getBytecode().addStep(Symbols.hasValue, values.toArray());
return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values)));
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
index d08f408..3a3d9cc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
@@ -20,7 +20,11 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.util;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.io.Serializable;
@@ -93,28 +97,23 @@ public class HasContainer implements Serializable, Cloneable, Predicate<Element>
}
}
- protected boolean testId(Element element)
- {
+ protected boolean testId(Element element) {
return this.predicate.test(element.id());
}
- protected boolean testIdAsString(Element element)
- {
+ protected boolean testIdAsString(Element element) {
return this.predicate.test(element.id().toString());
}
- protected boolean testLabel(Element element)
- {
+ protected boolean testLabel(Element element) {
return this.predicate.test(element.label());
}
- protected boolean testValue(Property property)
- {
+ protected boolean testValue(Property property) {
return this.predicate.test(property.value());
}
- protected boolean testKey(Property property)
- {
+ protected boolean testKey(Property property) {
return this.predicate.test(property.key());
}
@@ -177,6 +176,11 @@ public class HasContainer implements Serializable, Cloneable, Predicate<Element>
return true;
}
+
+ /**
+ * @deprecated As of release 3.2.4. Providers should handle composite {@link P#and} predicates and not rely on splitting.
+ */
+ @Deprecated
public static HasContainer[] makeHasContainers(final String key, final P<?> predicate) {
if (predicate instanceof AndP) {
final List<P<?>> predicates = ((AndP) predicate).getPredicates();
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
index 2fa207d..17d1032 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/InlineFilterStrategy.java
@@ -48,7 +48,6 @@ import org.apache.tinkerpop.gremlin.structure.T;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -73,10 +72,10 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
private static final InlineFilterStrategy INSTANCE = new InlineFilterStrategy();
private static final Set<Class<? extends OptimizationStrategy>> POSTS = new HashSet<>(Arrays.asList(
- FilterRankingStrategy.class,
GraphFilterStrategy.class,
AdjacentToIncidentStrategy.class));
private static final Set<Class<? extends OptimizationStrategy>> PRIORS = new HashSet<>(Arrays.asList(
+ FilterRankingStrategy.class,
IdentityRemovalStrategy.class,
MatchPredicateStrategy.class));
@@ -118,18 +117,24 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
TraversalHelper.copyLabels(step, previousStep, false);
traversal.removeStep(step);
return true;
- } else if (step.getPreviousStep() instanceof VertexStep && ((VertexStep) step.getPreviousStep()).returnsEdge()) {
+ } else if (step.getPreviousStep() instanceof VertexStep
+ && ((VertexStep) step.getPreviousStep()).returnsEdge()
+ && 0 == ((VertexStep) step.getPreviousStep()).getEdgeLabels().length) {
final VertexStep<Edge> previousStep = (VertexStep<Edge>) step.getPreviousStep();
final List<String> edgeLabels = new ArrayList<>();
for (final HasContainer hasContainer : new ArrayList<>(step.getHasContainers())) {
if (hasContainer.getKey().equals(T.label.getAccessor())) {
- if (hasContainer.getBiPredicate() == Compare.eq && hasContainer.getValue() instanceof String) {
+ if (hasContainer.getBiPredicate() == Compare.eq &&
+ hasContainer.getValue() instanceof String &&
+ edgeLabels.isEmpty()) {
edgeLabels.add((String) hasContainer.getValue());
step.removeHasContainer(hasContainer);
- } else if (hasContainer.getBiPredicate() == Contains.within && hasContainer.getValue() instanceof Collection) {
+ } else if (hasContainer.getBiPredicate() == Contains.within &&
+ hasContainer.getValue() instanceof Collection &&
+ ((Collection) hasContainer.getValue()).containsAll(edgeLabels)) {
edgeLabels.addAll((Collection<String>) hasContainer.getValue());
step.removeHasContainer(hasContainer);
- } else if (hasContainer.getPredicate() instanceof OrP) {
+ } else if (hasContainer.getPredicate() instanceof OrP && edgeLabels.isEmpty()) {
boolean removeContainer = true;
final List<P<?>> orps = ((OrP) hasContainer.getPredicate()).getPredicates();
final List<String> newEdges = new ArrayList<>();
@@ -266,11 +271,12 @@ public final class InlineFilterStrategy extends AbstractTraversalStrategy<Traver
matchTraversal.getStartStep() instanceof MatchStep.MatchStartStep &&
startLabel.equals(((MatchStep.MatchStartStep) matchTraversal.getStartStep()).getSelectKey().orElse(null))) {
changed = true;
+ step.removeGlobalChild(matchTraversal);
final String endLabel = ((MatchStep.MatchEndStep) matchTraversal.getEndStep()).getMatchKey().orElse(null); // why would this exist? but just in case
matchTraversal.removeStep(0); // remove MatchStartStep
matchTraversal.removeStep(matchTraversal.getSteps().size() - 1); // remove MatchEndStep
TraversalHelper.applySingleLevelStrategies(traversal, matchTraversal, InlineFilterStrategy.class);
- step.removeGlobalChild(matchTraversal);
+
matchTraversal.getEndStep().addLabel(startLabel);
if (null != endLabel) matchTraversal.getEndStep().addLabel(endLabel);
TraversalHelper.insertTraversal((Step) step.getPreviousStep(), matchTraversal, traversal);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
index ff72f8c..fbeeef5 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
@@ -84,13 +84,13 @@ public class FilterRankingStrategyTest {
{__.dedup().order(), __.dedup().order(), Collections.emptyList()},
{__.has("name", "marko").as("a").out().as("b").has("age", 32).where("a", neq("b")).as("c").out(), __.has("name", "marko").as("a").out().has("age", 32).as("b").where("a", neq("b")).as("c").out(), Collections.emptyList()},
{__.has("name", "marko").as("a").out().has("age", 32).as("b").where("a", neq("b")), __.has("name", "marko").as("a").out().has("age", 32).as("b").where("a", neq("b")), Collections.emptyList()},
- {__.has("name", "marko").has("age", 32).dedup().has("name", "bob").as("a"), __.has("name", "marko").has("age", 32).has("name", "bob").dedup().as("a"), Collections.emptyList()},
- {__.has("name", "marko").dedup().as("a").has("age", 32).has("name", "bob").as("b"), __.has("name", "marko").has("age", 32).has("name", "bob").dedup().as("b", "a"), Collections.emptyList()},
+ {__.has("name", "marko").has("age", 32).dedup().has("name", "bob").as("a"), __.has("name", "marko").has("age", 32).has("name", "bob").dedup().as("a"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.has("name", "marko").dedup().as("a").has("age", 32).has("name", "bob").as("b"), __.has("name", "marko").has("age", 32).has("name", "bob").dedup().as("b", "a"), Collections.singletonList(InlineFilterStrategy.instance())},
{__.where("b", eq("c")).as("a").dedup("a").has("name", "marko"), __.has("name", "marko").where("b", eq("c")).as("a").dedup("a"), Collections.emptyList()},
- {__.where("b", eq("c")).has("name", "bob").as("a").dedup("a").has("name", "marko"), __.has("name", "bob").has("name", "marko").where("b", eq("c")).as("a").dedup("a"), Collections.emptyList()},
- {__.has("name","marko").as("a").out().has("name","bob").dedup().as("b").where(__.as("a").out().as("b")),__.has("name","marko").as("a").out().has("name","bob").dedup().as("b").where(__.as("a").out().as("b")),Collections.emptyList()},
- {__.has("name","marko").as("a").out().has("name","bob").as("b").dedup().where(__.as("a").out().as("b")),__.has("name","marko").as("a").out().has("name","bob").dedup().as("b").where(__.as("a").out().as("b")),Collections.emptyList()},
- {__.has("name","marko").as("a").out().has("name","bob").dedup().as("c").where(__.as("a").out().as("b")),__.has("name","marko").as("a").out().has("name","bob").where(__.as("a").out().as("b")).dedup().as("c"),Collections.emptyList()},
+ {__.where("b", eq("c")).has("name", "bob").as("a").dedup("a").has("name", "marko"), __.has("name", "bob").has("name", "marko").where("b", eq("c")).as("a").dedup("a"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.has("name", "marko").as("a").out().has("name", "bob").dedup().as("b").where(__.as("a").out().as("b")), __.has("name", "marko").as("a").out().has("name", "bob").dedup().as("b").where(__.as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.has("name", "marko").as("a").out().has("name", "bob").as("b").dedup().where(__.as("a").out().as("b")), __.has("name", "marko").as("a").out().has("name", "bob").dedup().as("b").where(__.as("a").out().as("b")), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.has("name", "marko").as("a").out().has("name", "bob").dedup().as("c").where(__.as("a").out().as("b")), __.has("name", "marko").as("a").out().has("name", "bob").where(__.as("a").out().as("b")).dedup().as("c"), Collections.singletonList(InlineFilterStrategy.instance())},
{__.order().dedup(), __.dedup().order(), Collections.emptyList()},
{__.order().filter(testP).dedup(), __.order().filter(testP).dedup(), Collections.emptyList()},
{__.order().as("a").dedup(), __.dedup().order().as("a"), Collections.emptyList()},
@@ -102,13 +102,13 @@ public class FilterRankingStrategyTest {
{__.order().identity().dedup(), __.dedup().order(), Collections.singletonList(IdentityRemovalStrategy.instance())},
{__.order().out().dedup(), __.order().out().dedup(), Collections.emptyList()},
{has("value", 0).filter(out()).dedup(), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
- {__.dedup().has("value", 0).or(not(has("age")), has("age", 10)).has("value", 1), __.has("value", 0).has("value", 1).or(not(has("age")), has("age", 10)).dedup(), Collections.emptyList()},
+ {__.dedup().has("value", 0).or(not(has("age")), has("age", 10)).has("value", 1), __.has("value", 0).has("value", 1).or(not(has("age")), has("age", 10)).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{__.dedup().filter(out()).has("value", 0), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{filter(out()).dedup().has("value", 0), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{has("value", 0).filter(out()).dedup(), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
- {has("value", 0).or(has("name"), has("age")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(has("name"), has("age")).dedup(), Collections.emptyList()},
+ {has("value", 0).or(has("name"), has("age")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(has("name"), has("age")).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).or(out(), in()).as(Graph.Hidden.hide("x")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(outE(), inE()).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
- {has("value", 0).and(has("age"), has("name", "marko")).is(10), __.is(10).has("value", 0).has("name", "marko").has("age"), Collections.singletonList(InlineFilterStrategy.instance())},
+ // {has("value", 0).and(has("age"), has("name", "marko")).is(10), __.is(10).has("value", 0).has("name", "marko").has("age"), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).filter(or(not(has("age")), has("age", 1))).has("value", 1).dedup(), has("value", 0).has("value", 1).or(not(filter(properties("age"))), has("age", 1)).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},
});
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/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 c2dbcc4..0d02fe4 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
@@ -110,7 +110,10 @@ public class InlineFilterStrategyTest {
{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).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).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").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"))},
//
{filter(dedup()), filter(dedup())},
{filter(filter(drop())), filter(drop())},
@@ -118,9 +121,9 @@ public class InlineFilterStrategyTest {
{filter(tail(10).as("a")), filter(tail(10).as("a"))},
//
{outE().hasLabel("knows").inV(), outE("knows").inV()},
- {outE().hasLabel("knows").hasLabel("created").inV(), outE("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("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()},
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
index 6b4e9c4..7df47d0 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
@@ -19,9 +19,11 @@
package org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.sideEffect;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -50,7 +52,7 @@ public final class Neo4jGraphStep<S, E extends Element> extends GraphStep<S, E>
}
private Iterator<? extends Edge> edges() {
- return IteratorUtils.filter(this.getTraversal().getGraph().get().edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
+ return IteratorUtils.filter(this.getTraversal().getGraph().get().edges(this.ids), edge -> HasContainer.testAll(edge, this.hasContainers));
}
private Iterator<? extends Vertex> vertices() {
@@ -75,7 +77,12 @@ public final class Neo4jGraphStep<S, E extends Element> extends GraphStep<S, E>
@Override
public void addHasContainer(final HasContainer hasContainer) {
- this.hasContainers.add(hasContainer);
+ if (hasContainer.getPredicate() instanceof AndP) {
+ for (final P<?> predicate : ((AndP<?>) hasContainer.getPredicate()).getPredicates()) {
+ this.addHasContainer(new HasContainer(hasContainer.getKey(), predicate));
+ }
+ } else
+ this.hasContainers.add(hasContainer);
}
@Override
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
index 3f8cd02..a6b0862 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategyTest.java
@@ -18,7 +18,6 @@
*/
package org.apache.tinkerpop.gremlin.neo4j.process.traversal.strategy.optimization;
-import org.apache.tinkerpop.gremlin.neo4j.AbstractNeo4jGremlinTest;
import org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.sideEffect.Neo4jGraphStep;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
import org.apache.tinkerpop.gremlin.process.traversal.P;
@@ -28,7 +27,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
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.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy;
@@ -120,9 +118,9 @@ public class Neo4jGraphStepStrategyTest {
{__.V().as("a").has("name", "marko").as("b").or(has("age"), has("age", gt(32))).has("lang", "java"),
g_V("name", eq("marko"), "lang", eq("java")).or(has("age"), has("age", gt(32))).as("b", "a"), Collections.singletonList(FilterRankingStrategy.instance())},
{__.V().as("a").dedup().has("name", "marko").or(has("age"), has("age", gt(32))).filter(has("name", "bob")).has("lang", "java"),
- g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(has("age"), has("age", gt(32))).dedup().as("a"), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance())},
+ g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob")).or(has("age"), has("age", gt(32))).dedup().as("a"), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance())},
{__.V().as("a").dedup().has("name", "marko").or(has("age", 10), has("age", gt(32))).filter(has("name", "bob")).has("lang", "java"),
- g_V("name", eq("marko"), "age", eq(10).or(gt(32)), "name", eq("bob"), "lang", eq("java")).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(Neo4jGraph.class).toList()},
+ g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob"), "age", eq(10).or(gt(32))).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(Neo4jGraph.class).toList()},
{__.V().has("name", "marko").or(not(has("age")), has("age", gt(32))).has("name", "bob").has("lang", "java"),
g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(not(filter(properties("age"))), has("age", gt(32))), TraversalStrategies.GlobalCache.getStrategies(Neo4jGraph.class).toList()},
///////
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
index 23ba817..36c67ac 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
@@ -19,9 +19,11 @@
package org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.step.sideEffect;
import org.apache.tinkerpop.gremlin.process.traversal.Compare;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.AndP;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -120,7 +122,12 @@ public final class TinkerGraphStep<S, E extends Element> extends GraphStep<S, E>
@Override
public void addHasContainer(final HasContainer hasContainer) {
- this.hasContainers.add(hasContainer);
+ if (hasContainer.getPredicate() instanceof AndP) {
+ for (final P<?> predicate : ((AndP<?>) hasContainer.getPredicate()).getPredicates()) {
+ this.addHasContainer(new HasContainer(hasContainer.getKey(), predicate));
+ }
+ } else
+ this.hasContainers.add(hasContainer);
}
@Override
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/4a316c55/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
index c54a6b7..393cf32 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategyTest.java
@@ -119,9 +119,9 @@ public class TinkerGraphStepStrategyTest {
{__.V().as("a").has("name", "marko").as("b").or(has("age"), has("age", gt(32))).has("lang", "java"),
g_V("name", eq("marko"), "lang", eq("java")).or(has("age"), has("age", gt(32))).as("b", "a"), Collections.singletonList(FilterRankingStrategy.instance())},
{__.V().as("a").dedup().has("name", "marko").or(has("age"), has("age", gt(32))).filter(has("name", "bob")).has("lang", "java"),
- g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(has("age"), has("age", gt(32))).dedup().as("a"), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance())},
+ g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob")).or(has("age"), has("age", gt(32))).dedup().as("a"), Arrays.asList(InlineFilterStrategy.instance(), FilterRankingStrategy.instance())},
{__.V().as("a").dedup().has("name", "marko").or(has("age", 10), has("age", gt(32))).filter(has("name", "bob")).has("lang", "java"),
- g_V("name", eq("marko"), "age", eq(10).or(gt(32)), "name", eq("bob"), "lang", eq("java")).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(TinkerGraph.class).toList()},
+ g_V("name", eq("marko"), "lang", eq("java"), "name", eq("bob"), "age", eq(10).or(gt(32))).dedup().as("a"), TraversalStrategies.GlobalCache.getStrategies(TinkerGraph.class).toList()},
{__.V().has("name", "marko").or(not(has("age")), has("age", gt(32))).has("name", "bob").has("lang", "java"),
g_V("name", eq("marko"), "name", eq("bob"), "lang", eq("java")).or(not(filter(properties("age"))), has("age", gt(32))), TraversalStrategies.GlobalCache.getStrategies(TinkerGraph.class).toList()},
///////
[03/10] tinkerpop git commit: added TraversalHelper.addHasContainer()
which will either append a HasStep with container or if the traverasl ends
with a HasContainerHolder,
fold the container into the holder. This just makes the code in
GraphTravesrsal cl
Posted by ok...@apache.org.
added TraversalHelper.addHasContainer() which will either append a HasStep with container or if the traverasl ends with a HasContainerHolder, fold the container into the holder. This just makes the code in GraphTravesrsal cleaner with less copy/paste.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/ffe1b4c1
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/ffe1b4c1
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/ffe1b4c1
Branch: refs/heads/tp32
Commit: ffe1b4c18ef4c66f259d3b9c6a80046261dbf38c
Parents: 05bfb02
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Nov 14 15:44:40 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:43:45 2016 -0700
----------------------------------------------------------------------
.../traversal/dsl/graph/GraphTraversal.java | 94 ++++----------------
.../process/traversal/util/TraversalHelper.java | 17 ++++
2 files changed, 33 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ffe1b4c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 7543c32..d8f7888 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -36,7 +36,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TimesModulating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
@@ -51,7 +50,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
@@ -908,20 +906,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
public default GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, predicate));
}
public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, accessor, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), predicate));
}
public default GraphTraversal<S, E> has(final String propertyKey, final Object value) {
@@ -931,45 +921,25 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
return this.has(propertyKey, (Traversal) value);
else {
this.asAdmin().getBytecode().addStep(Symbols.has, propertyKey, value);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, P.eq(value)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(propertyKey, P.eq(value))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, P.eq(value)));
}
}
public default GraphTraversal<S, E> has(final T accessor, final Object value) {
this.asAdmin().getBytecode().addStep(Symbols.has, accessor, value);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(accessor.getAccessor(), value instanceof P ? (P) value : P.eq(value)));
}
public default GraphTraversal<S, E> has(final String label, final String propertyKey, final P<?> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label)));
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, predicate));
- return this;
- } else {
- this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))));
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate)));
- }
+ TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, predicate));
}
public default GraphTraversal<S, E> has(final String label, final String propertyKey, final Object value) {
this.asAdmin().getBytecode().addStep(Symbols.has, label, propertyKey, value);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), P.eq(label)));
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(propertyKey, value instanceof P ? (P) value : P.eq(value)));
- return this;
- } else {
- this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label))));
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, value instanceof P ? (P) value : P.eq(value))));
- }
+ TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), P.eq(label)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(propertyKey, value instanceof P ? (P) value : P.eq(value)));
}
public default GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) {
@@ -1001,20 +971,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
labels[0] = label;
System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
this.asAdmin().getBytecode().addStep(Symbols.hasLabel, labels);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
}
public default GraphTraversal<S, E> hasLabel(final P<String> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.hasLabel, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.label.getAccessor(), predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.label.getAccessor(), predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.label.getAccessor(), predicate));
}
public default GraphTraversal<S, E> hasId(final Object id, final Object... otherIds) {
@@ -1030,21 +992,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
ids.add(id);
Collections.addAll(ids, otherIds);
this.asAdmin().getBytecode().addStep(Symbols.hasId, ids.toArray());
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.id.getAccessor(), ids.size() == 1 ? P.eq(ids.get(0)) : P.within(ids)));
}
}
public default GraphTraversal<S, E> hasId(final P<Object> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.hasId, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.id.getAccessor(), predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.id.getAccessor(), predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.id.getAccessor(), predicate));
}
public default GraphTraversal<S, E> hasKey(final String label, final String... otherLabels) {
@@ -1052,20 +1006,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
labels[0] = label;
System.arraycopy(otherLabels, 0, labels, 1, otherLabels.length);
this.asAdmin().getBytecode().addStep(Symbols.hasKey, labels);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.key.getAccessor(), labels.length == 1 ? P.eq(labels[0]) : P.within(labels)));
}
public default GraphTraversal<S, E> hasKey(final P<String> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.hasKey, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.key.getAccessor(), predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.key.getAccessor(), predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.key.getAccessor(), predicate));
}
public default GraphTraversal<S, E> hasValue(final Object value, final Object... otherValues) {
@@ -1081,21 +1027,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
values.add(value);
Collections.addAll(values, otherValues);
this.asAdmin().getBytecode().addStep(Symbols.hasValue, values.toArray());
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values)));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values))));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.value.getAccessor(), values.size() == 1 ? P.eq(values.get(0)) : P.within(values)));
}
}
public default GraphTraversal<S, E> hasValue(final P<Object> predicate) {
this.asAdmin().getBytecode().addStep(Symbols.hasValue, predicate);
- if (this.asAdmin().getEndStep() instanceof HasContainerHolder) {
- ((HasContainerHolder) this.asAdmin().getEndStep()).addHasContainer(new HasContainer(T.value.getAccessor(), predicate));
- return this;
- } else
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(T.value.getAccessor(), predicate)));
+ return TraversalHelper.addHasContainer(this.asAdmin(), new HasContainer(T.value.getAccessor(), predicate));
}
public default GraphTraversal<S, E> is(final P<E> predicate) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/ffe1b4c1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index e6ba9ca..c8ec3f3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -31,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
@@ -672,4 +673,20 @@ public final class TraversalHelper {
break;
}
}
+
+ /**
+ * Used to left-fold a {@link HasContainer} to a {@link HasContainerHolder} if it exists. Else, append a {@link HasStep}.
+ *
+ * @param traversal the traversal to fold or append.
+ * @param hasContainer the container to add left or append.
+ * @param <T> the traversal type
+ * @return the has container folded or appended traversal
+ */
+ public static <T extends Traversal.Admin<?, ?>> T addHasContainer(final T traversal, final HasContainer hasContainer) {
+ if (traversal.getEndStep() instanceof HasContainerHolder) {
+ ((HasContainerHolder) traversal.getEndStep()).addHasContainer(hasContainer);
+ return traversal;
+ } else
+ return (T) traversal.addStep(new HasStep<>(traversal, hasContainer));
+ }
}
[07/10] tinkerpop git commit: updated upgrade with links to the
respective tickets.
Posted by ok...@apache.org.
updated upgrade with links to the respective tickets.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/9323011a
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/9323011a
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/9323011a
Branch: refs/heads/tp32
Commit: 9323011a3abd08330c462a02a0aa4fdfff3ed602
Parents: 09eb0c3
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 12:15:35 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:44:18 2016 -0700
----------------------------------------------------------------------
docs/src/upgrade/release-3.2.x-incubating.asciidoc | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/9323011a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index 0fd7498..29b7833 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -83,13 +83,17 @@ public void addHasContainer(final HasContainer hasContainer) {
}
----
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-1482[TINKERPOP-1482],
+link:https://issues.apache.org/jira/browse/TINKERPOP-1502[TINKERPOP-1502]
+
+
Duplicate Multi-Properties
++++++++++++++++++++++++++
Added `supportsDuplicateMultiProperties` to `VertexFeatures` so that graph provider who only support unique values as
multi-properties have more flexibility in describing their graph capabilities.
-See: https://issues.apache.org/jira/browse/TINKERPOP-919[TINKERPOP-919]
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-919[TINKERPOP-919]
Deprecated Performance OptIn
++++++++++++++++++++++++++++
[10/10] tinkerpop git commit: moved where().by() a bit further down
in the FilterRankStrategy ranking as OrStep and AndStep can have has(xxx)
analyses.
Posted by ok...@apache.org.
moved where().by() a bit further down in the FilterRankStrategy ranking as OrStep and AndStep can have has(xxx) analyses.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/09eb0c33
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/09eb0c33
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/09eb0c33
Branch: refs/heads/tp32
Commit: 09eb0c33136b34da52500d4989dc0075c8fc1179
Parents: 248ccc6
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 12:13:45 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:44:18 2016 -0700
----------------------------------------------------------------------
.../traversal/strategy/optimization/FilterRankingStrategy.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/09eb0c33/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
index 4ff485a..15040f7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategy.java
@@ -134,11 +134,11 @@ public final class FilterRankingStrategy extends AbstractTraversalStrategy<Trave
return 5;
else if (step instanceof WhereTraversalStep)
return 6;
- else if (step instanceof WherePredicateStep) // has by()-modulation
- return 7;
else if (step instanceof OrStep)
- return 8;
+ return 7;
else if (step instanceof AndStep)
+ return 8;
+ else if (step instanceof WherePredicateStep) // has by()-modulation
return 9;
else if (step instanceof DedupGlobalStep)
return 10;
[09/10] tinkerpop git commit: more test cases around where().by().
all still good in the hood.
Posted by ok...@apache.org.
more test cases around where().by(). all still good in the hood.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/226633f3
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/226633f3
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/226633f3
Branch: refs/heads/tp32
Commit: 226633f32c483a3b2e67ad011a9664cc464f516f
Parents: 9323011
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Nov 15 12:22:54 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Nov 16 05:44:18 2016 -0700
----------------------------------------------------------------------
.../strategy/optimization/FilterRankingStrategyTest.java | 4 ++++
1 file changed, 4 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/226633f3/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
index 577e160..b32ae2a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/FilterRankingStrategyTest.java
@@ -108,6 +108,10 @@ public class FilterRankingStrategyTest {
{filter(out()).dedup().has("value", 0), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{__.as("a").out().has("age").where(P.eq("a")), __.as("a").out().where(P.eq("a")).has("age"), Collections.emptyList()},
{__.as("a").out().has("age").where(P.eq("a")).by("age"), __.as("a").out().has("age").where(P.eq("a")).by("age"), Collections.emptyList()},
+ {__.as("a").out().and(has("age"), has("name")).where(P.eq("a")).by("age"), __.as("a").out().and(has("age"), has("name")).where(P.eq("a")).by("age"), Collections.emptyList()},
+ {__.as("a").out().and(has("age"), has("name")).where(P.eq("a")), __.as("a").out().where(P.eq("a")).and(has("age"), has("name")), Collections.emptyList()},
+ {__.as("a").out().and(has("age"), has("name")).where(P.eq("a")).by("age"), __.as("a").out().has("age").has("name").where(P.eq("a")).by("age"), Collections.singletonList(InlineFilterStrategy.instance())},
+ {__.as("a").out().and(has("age"), has("name")).where(P.eq("a")), __.as("a").out().where(P.eq("a")).has("age").has("name"), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).filter(out()).dedup(), has("value", 0).filter(out()).dedup(), Collections.emptyList()},
{has("value", 0).or(has("name"), has("age")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(has("name"), has("age")).dedup(), Collections.singletonList(InlineFilterStrategy.instance())},
{has("value", 0).or(out(), in()).as(Graph.Hidden.hide("x")).has("value", 1).dedup(), has("value", 0).has("value", 1).or(outE(), inE()).dedup(), TraversalStrategies.GlobalCache.getStrategies(Graph.class).toList()},