You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/05/07 18:49:37 UTC
incubator-tinkerpop git commit: implemented select(local). Updated
MatchTest and docs accordingly. Have an idea for an 'auto-scope' strategy so
we don't have the ugly select(local, 'a'). will be cool.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 1aa36aa90 -> 141af5aa3
implemented select(local). Updated MatchTest and docs accordingly. Have an idea for an 'auto-scope' strategy so we don't have the ugly select(local,'a'). will be cool.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/141af5aa
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/141af5aa
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/141af5aa
Branch: refs/heads/master
Commit: 141af5aa32ec26c886e8bc0333b4c4e06f4aa0b5
Parents: 1aa36aa
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu May 7 10:49:28 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu May 7 10:49:28 2015 -0600
----------------------------------------------------------------------
docs/src/the-traversal.asciidoc | 26 +++++++++---------
.../traversal/dsl/graph/GraphTraversal.java | 12 +++++++--
.../traversal/step/map/SelectOneStep.java | 8 +++---
.../process/traversal/step/map/SelectStep.java | 9 ++++---
.../traversal/step/map/GroovyMatchTest.groovy | 25 +++++++++--------
.../process/traversal/step/map/MatchTest.java | 28 +++++++++-----------
6 files changed, 61 insertions(+), 47 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/docs/src/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-traversal.asciidoc b/docs/src/the-traversal.asciidoc
index 4d9d0c2..a7f6e9d 100644
--- a/docs/src/the-traversal.asciidoc
+++ b/docs/src/the-traversal.asciidoc
@@ -670,7 +670,7 @@ g.V().match('a',
__.as('a').out('created').as('b'),
__.as('b').has('name', 'lop'),
__.as('b').in('created').as('c'),
- __.as('c').has('age', 29)).select('a','c').by('name')
+ __.as('c').has('age', 29)).select(local,'a','c').by('name')
----
Note that the above can also be more concisely written as below which demonstrates that imperative inner-traversals can be arbitrarily defined.
@@ -679,7 +679,7 @@ Note that the above can also be more concisely written as below which demonstrat
----
g.V().match('a',
__.as('a').out('created').has('name', 'lop').as('b'),
- __.as('b').in('created').has('age', 29).as('c')).select('a','c').by('name')
+ __.as('b').in('created').has('age', 29).as('c')).select(local,'a','c').by('name')
----
[[grateful-dead]]
@@ -695,7 +695,7 @@ g = graph.traversal(standard())
g.V().match('a',
__.as('a').has('name', 'Garcia'),
__.as('a').in('writtenBy').as('b'),
- __.as('a').in('sungBy').as('b')).select('b').values('name')
+ __.as('a').in('sungBy').as('b')).select(local,'b').values('name')
----
Among the features which differentiate `match()` from SPARQL are:
@@ -706,7 +706,7 @@ g.V().match('a',
__.as('a').out('created').has('name','lop').as('b'), <1>
__.as('b').in('created').has('age', 29).as('c'),
__.as('c').repeat(out()).times(2)). <2>
- select('c').out('knows').dedup().values('name') <3>
+ select(local,'c').out('knows').dedup().values('name') <3>
----
<1> *Patterns of arbitrary complexity*: `match()` is not restricted to triple patterns or property paths.
@@ -720,11 +720,11 @@ To extend point #3, it is possible to support going from imperative, to declarat
g.V().match('a',
__.as('a').out('knows').as('b'),
__.as('b').out('created').has('name','lop')).
- select('b').out('created').
+ select(local,'b').out('created').
match('a',
__.as('a').in('created').as('b'),
__.as('b').out('knows').as('c')).
- select('c').values('name')
+ select(local,'c').values('name')
----
Like all other steps in Gremlin, `match()` is a function and thus, `match()` within `match()` is a natural consequence of Gremlin's functional foundation (i.e. recursive matching).
@@ -737,8 +737,8 @@ g.V().match('a',
__.as('b').match('x',
__.as('x').out('created').as('y'),
__.as('y').has('name','ripple')).
- select('y').as('c')).
- select('a','c').by('name')
+ select(local,'y').as('c')).
+ select(local,'a','c').by('name')
----
WARNING: Currently, `match()` does not operate within a multi-JVM <<graphcomputer,GraphComputer>> OLAP environment. Future work includes a linearization <<traversalstrategy,TraversalStrategy>> for `match()`.
@@ -754,7 +754,7 @@ Match is typically used in conjunction with both `select()` (demonstrated previo
g.V().match('a',
__.as('a').out('created').as('b'),
__.as('b').in('created').as('c')).
- where('a', neq('c')).select('a','c').by('name')
+ where('a', neq('c')).select(local,'a','c').by('name')
----
The `where()`-step can take either a `BiPredicate` (first example below) or a `Traversal` (second example below). Using `MatchWhereStrategy`, `where()`-clauses can be automatically folded into `match()` and thus, subject to `match()`-steps budget-match algorithm.
@@ -765,7 +765,7 @@ traversal = g.V().match('a',
__.as('a').out('created').as('b'),
__.as('b').in('created').as('c')).
where(__.as('a').out('knows').as('c')). <1>
- select('a','c').by('name'); null <2>
+ select(local,'a','c').by('name'); null <2>
traversal.toString() <3>
traversal <4> <5>
traversal.toString() <6>
@@ -1169,9 +1169,9 @@ The second use case is best understood in terms of <<match-step,`match()`>>-step
[gremlin-groovy,modern]
----
g.V().range(0, 2).as('a').map {[b:1,c:2]} <1>
-g.V().range(0, 2).as('a').map {[b:1,c:2]}.select() <2>
-g.V().range(0, 2).as('a').map {[b:1,c:2]}.select('a','c') <3>
-g.V().range(0, 2).as('a').map {[b:1,c:2]}.select('c') <4>
+g.V().range(0, 2).as('a').map {[b:1,c:2]}.select(local) <2>
+g.V().range(0, 2).as('a').map {[b:1,c:2]}.select(local,'a','c') <3>
+g.V().range(0, 2).as('a').map {[b:1,c:2]}.select(local,'c') <4>
----
<1> A contrived example to create a `Map<String,Object>` flow as a foundation for the examples to follow.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/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 60ae481..f199c17 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
@@ -290,12 +290,20 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
}
+ public default <E2> GraphTraversal<S, Map<String, E2>> select(final Scope scope, final String... stepLabels) {
+ return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), scope, stepLabels));
+ }
+
public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
- return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), stepLabels));
+ return this.select(Scope.global, stepLabels);
+ }
+
+ public default <E2> GraphTraversal<S, E2> select(final Scope scope, final String stepLabel) {
+ return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), scope, stepLabel));
}
public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
- return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), stepLabel));
+ return this.select(Scope.global, stepLabel);
}
public default <E2> GraphTraversal<S, E2> unfold() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
index f957c7a..2480de7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
@@ -36,18 +37,19 @@ import java.util.Set;
*/
public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent {
+ private final Scope scope;
private final String selectLabel;
private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
- public SelectOneStep(final Traversal.Admin traversal, final String selectLabel) {
+ public SelectOneStep(final Traversal.Admin traversal, final Scope scope, final String selectLabel) {
super(traversal);
+ this.scope = scope;
this.selectLabel = selectLabel;
}
@Override
protected E map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- return (E) TraversalUtil.apply(start instanceof Map ? ((Map) start).get(this.selectLabel) : traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
+ return (E) TraversalUtil.apply(Scope.local == this.scope ? ((Map) traverser.get()).get(this.selectLabel) : traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
index d0bab93..0e509fe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -38,11 +39,13 @@ import java.util.Set;
*/
public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements TraversalParent {
- protected TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+ private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+ private final Scope scope;
private final List<String> selectLabels;
- public SelectStep(final Traversal.Admin traversal, final String... selectLabels) {
+ public SelectStep(final Traversal.Admin traversal, final Scope scope, final String... selectLabels) {
super(traversal);
+ this.scope = scope;
this.selectLabels = Arrays.asList(selectLabels);
}
@@ -51,7 +54,7 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
final S start = traverser.get();
final Map<String, E> bindings = new LinkedHashMap<>();
- if (start instanceof Map) {
+ if (Scope.local == this.scope) {
if (this.selectLabels.isEmpty())
((Map<String, Object>) start).forEach((key, value) -> bindings.put(key, (E) TraversalUtil.apply(value, this.traversalRing.next())));
else
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
index aae6f26..e6e2c0b 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
@@ -18,13 +18,16 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map
-import org.apache.tinkerpop.gremlin.structure.T
+import org.apache.tinkerpop.gremlin.process.UseEngine
import org.apache.tinkerpop.gremlin.process.traversal.Traversal
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import static org.apache.tinkerpop.gremlin.structure.P.*;
-import org.apache.tinkerpop.gremlin.structure.Vertex
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.T
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.Scope.local
+import static org.apache.tinkerpop.gremlin.structure.P.neq;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
@@ -40,7 +43,7 @@ public abstract class GroovyMatchTest {
@Override
public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
- g.V().match('a', __.as('a').out().as('b')).select('b').by(T.id)
+ g.V().match('a', __.as('a').out().as('b')).select(local, 'b').by(T.id)
}
@Override
@@ -70,7 +73,7 @@ public abstract class GroovyMatchTest {
public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
g.V().match('a',
__.as('a').out('created').as('b'),
- __.as('a').repeat(__.out).times(2).as('b')).select('a', 'b').by('name')
+ __.as('a').repeat(__.out).times(2).as('b')).select(local, 'a', 'b').by('name')
}
@Override
@@ -78,14 +81,14 @@ public abstract class GroovyMatchTest {
g.V().match('a',
__.as('a').out('created').has('name', 'lop').as('b'),
__.as('b').in('created').has('age', 29).as('c'),
- __.as('c').repeat(__.out).times(2)).select.by('name')
+ __.as('c').repeat(__.out).times(2)).select(local).by('name')
}
@Override
public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
g.V().out().out().match('a',
__.as('a').in('created').as('b'),
- __.as('b').in('knows').as('c')).select('c').out('created').name
+ __.as('b').in('knows').as('c')).select(local, 'c').out('created').name
}
@Override
@@ -108,7 +111,7 @@ public abstract class GroovyMatchTest {
__.as('b').out('created').has('name', 'lop'),
__.as('b').match('a1',
__.as('a1').out('created').as('b1'),
- __.as('b1').in('created').as('c1')).select('c1').as('c')).select.by('name')
+ __.as('b1').in('created').as('c1')).select(local, 'c1').as('c')).select(local).by('name')
}
@Override
@@ -156,7 +159,7 @@ public abstract class GroovyMatchTest {
__.as("a").out("created").has("name", "lop").as("b"),
__.as("b").in("created").has("age", 29).as("c"))
.where(__.as("c").repeat(__.out()).times(2))
- .select.by('name')
+ .select(local).by('name')
}
@Override
@@ -165,7 +168,7 @@ public abstract class GroovyMatchTest {
__.as('a').out('created').as('b'),
__.as('b').in('created').as('c'))
.where('a', neq('c'))
- .select('a', 'c').by('name')
+ .select(local, 'a', 'c').by('name')
}
/*@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/141af5aa/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
index 4393a8e..802dd16 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -20,11 +20,11 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Bindings;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.CrossJoinEnumerator;
@@ -32,9 +32,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Enumerator;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.InnerJoinEnumerator;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.IteratorEnumerator;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
-import static org.apache.tinkerpop.gremlin.structure.P.*;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
@@ -55,10 +55,8 @@ import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.apache.tinkerpop.gremlin.structure.P.neq;
+import static org.junit.Assert.*;
/**
* @author Joshua Shinavier (http://fortytwo.net)
@@ -657,7 +655,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
@Override
public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
- return g.V().match("a", as("a").out().as("b")).select("b").by(T.id);
+ return g.V().match("a", as("a").out().as("b")).select(Scope.local, "b").by(T.id);
}
@Override
@@ -687,7 +685,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
return g.V().match("a",
as("a").out("created").as("b"),
- __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select("a", "b").by("name");
+ __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select(Scope.local, "a", "b").by("name");
}
@Override
@@ -695,7 +693,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
return g.V().match("a",
as("a").out("created").has("name", "lop").as("b"),
as("b").in("created").has("age", 29).as("c"),
- __.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+ __.<Vertex>as("c").repeat(out()).times(2)).<String>select(Scope.local).by("name");
}
@Override
@@ -703,14 +701,14 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
return g.V().match("a",
as("a").out("created").has("name", "lop").as("b"),
as("b").in("created").has("age", 29).as("c"))
- .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+ .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select(Scope.local).by("name");
}
@Override
public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
return g.V().out().out().match("a",
as("a").in("created").as("b"),
- as("b").in("knows").as("c")).select("c").out("created").values("name");
+ as("b").in("knows").as("c")).select(Scope.local, "c").out("created").values("name");
}
@Override
@@ -733,7 +731,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
as("b").out("created").has("name", "lop"),
as("b").match("a1",
as("a1").out("created").as("b1"),
- as("b1").in("created").as("c1")).select("c1").as("c")).<String>select().by("name");
+ as("b1").in("created").as("c1")).select(Scope.local, "c1").as("c")).<String>select(Scope.local).by("name");
}
@Override
@@ -781,7 +779,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
as("a").out("created").as("b"),
as("b").in("created").as("c"))
.where("a", neq("c"))
- .<String>select("a", "c").by("name");
+ .<String>select(Scope.local, "a", "c").by("name");
}
/*@Override