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/06/10 16:29:20 UTC
incubator-tinkerpop git commit: removed a section of SugarGremlin
docs that no longer exist -- operator overloads. AndStep and OrStep are now
smart about getting the as() of the conjunction. Added more tests to
ConjunctionStrategyTest and AndTest.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 24e1bcd68 -> 18c83f3ae
removed a section of SugarGremlin docs that no longer exist -- operator overloads. AndStep and OrStep are now smart about getting the as() of the conjunction. Added more tests to ConjunctionStrategyTest and AndTest.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/18c83f3a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/18c83f3a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/18c83f3a
Branch: refs/heads/master
Commit: 18c83f3aec5d2af409c806a654d5ad96cd732790
Parents: 24e1bcd
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Jun 10 08:29:15 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Jun 10 08:29:15 2015 -0600
----------------------------------------------------------------------
docs/src/gremlin-applications.asciidoc | 31 ++++----------------
.../decoration/ConjunctionStrategy.java | 17 +++++++----
.../decoration/ConjunctionStrategyTest.java | 3 +-
.../groovy/loaders/SugarLoaderTest.groovy | 2 ++
.../traversal/step/filter/GroovyAndTest.groovy | 9 ++++--
.../gremlin/groovy/loaders/SugarLoader.groovy | 4 +--
.../process/traversal/step/filter/AndTest.java | 17 ++++++++++-
7 files changed, 46 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/docs/src/gremlin-applications.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/gremlin-applications.asciidoc b/docs/src/gremlin-applications.asciidoc
index 976b7f7..0dcd18e 100644
--- a/docs/src/gremlin-applications.asciidoc
+++ b/docs/src/gremlin-applications.asciidoc
@@ -101,6 +101,8 @@ g.V().values('name')
g.V().has('name','marko').out('knows').values('name')
----
+TIP: When using Gremlin-Groovy in a Groovy class file, add `static { GremlinLoader.load() }` to the head of the file.
+
Console Commands
~~~~~~~~~~~~~~~~
@@ -953,6 +955,8 @@ gremlin> :plugin use tinkerpop.sugar
==>tinkerpop.sugar activated
----
+TIP: When using Sugar in a Groovy class file, add `static { SugarLoader.load() }` to the head of the file. `SugarLoader.load()` will automatically call `GremlinLoader.load()`.
+
Graph Traversal Methods
^^^^^^^^^^^^^^^^^^^^^^^
@@ -1006,7 +1010,7 @@ gremlin> g.V[2]
Logical Operators
^^^^^^^^^^^^^^^^^
-The `&` and `|` operator are overloaded in `SugarGremlinPlugin`. When used, they introduce the `AndStep.AndMarker` and `OrStep.OrStep` markers into the traversal. See <<and-step,`and()`>> and <<or-step,`or()`>> for more information.
+The `&` and `|` operator are overloaded in `SugarGremlinPlugin`. When used, they introduce the `AndStep` and `OrStep` markers into the traversal. See <<and-step,`and()`>> and <<or-step,`or()`>> for more information.
[source,groovy]
----
@@ -1027,31 +1031,6 @@ gremlin> t.toString()
<1> Introducing the `AndStep` with the `&` operator.
<2> Introducing the `OrStep` with the `|` operator.
-Comparators
-^^^^^^^^^^^
-
-Unfortunately, Groovy does not support comparator overloading -- `>`, `<=`, `==`, etc. However, the `Compare` enums are available as methods in `SugarGremlinPlugin`.
-
-[source,groovy]
-----
-gremlin> g.V.has(outE('created').count.gt(1l) | __.age.lt(30)).name ////<1>
-==>marko
-==>vadas
-==>josh
-gremlin> t = g.V.has(outE('created').count.gt(1l) | __.age.lt(30) & outE('knows')).name; null ////<2>
-==>null
-gremlin> t.toString()
-==>[GraphStep(vertex), HasTraversalStep([VertexStep(OUT,[created],edge), CountStep, IsStep(gt,1), OrMarker, PropertiesStep([age],value), IsStep(lt,30), AndMarker, VertexStep(OUT,[knows],edge)]), PropertiesStep([name],value)]
-gremlin> t
-==>marko
-==>josh
-gremlin> t.toString()
-==>[TinkerGraphStep(vertex), HasTraversalStep([OrStep([[VertexStep(OUT,[created],edge), CountStep, IsStep(gt,1)], [AndStep([[PropertiesStep([age],value), IsStep(lt,30)], [VertexStep(OUT,[knows],edge)]])]])]), PropertiesStep([name],value)]
-----
-
-<1> Using `gt(x)` in place of `is(gt,x)`.
-<2> A complex and/or chain with `IsStep` substitutions.
-
Traverser Methods
^^^^^^^^^^^^^^^^^
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
index 22920e8..c77d03f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
@@ -39,8 +40,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @example <pre>
- * __.has("name","stephen").or().has(__.out("knows").has("name","stephen")) // is replaced by __.or(__.has("name","stephen"),__.has(__.out("knows").has("name","stephen")))
- * __.out("a").out("b").and().out("c").or().out("d") // is replaced by __.or(__.and(__.out("a").out("b"), __.out("c")), __.out("d"))
+ * __.has("name","stephen").or().where(__.out("knows").has("name","stephen")) // is replaced by __.or(__.has("name","stephen"), __.where(__.out("knows").has("name","stephen")))
+ * __.out("a").out("b").and().out("c").or().out("d") // is replaced by __.or(__.and(__.out("a").out("b"), __.out("c")), __.out("d"))
+ * __.as("a").out().as("b").and().as("c").in().as("d") // is replaced by __.and(__.as("a").out().as("b"), __.as("c").in().as("d"))
* </pre>
*/
public final class ConjunctionStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
@@ -60,13 +62,18 @@ public final class ConjunctionStrategy extends AbstractTraversalStrategy<Travers
}
private static final boolean legalCurrentStep(final Step<?, ?> step) {
- return !(step instanceof EmptyStep || step instanceof OrStep || step instanceof AndStep || step instanceof StartStep);
+ return !(step instanceof EmptyStep || step instanceof ConjunctionStep || step instanceof GraphStep || (step instanceof StartStep && (null != ((StartStep) step).getStart() || step.getLabels().isEmpty())));
}
private static final void processConjunctionMarker(final Class<? extends ConjunctionStep> markerClass, final Traversal.Admin<?, ?> traversal) {
TraversalHelper.getStepsOfClass(markerClass, traversal).forEach(markerStep -> {
Step<?, ?> currentStep = markerStep.getNextStep();
final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
+ if (!markerStep.getLabels().isEmpty()) {
+ final StartStep<?> startStep = new StartStep<>(rightTraversal);
+ ((Step<?, ?>) markerStep).getLabels().forEach(startStep::addLabel);
+ rightTraversal.addStep(startStep);
+ }
while (legalCurrentStep(currentStep)) {
final Step<?, ?> nextStep = currentStep.getNextStep();
rightTraversal.addStep(currentStep);
@@ -84,8 +91,8 @@ public final class ConjunctionStrategy extends AbstractTraversalStrategy<Travers
}
TraversalHelper.replaceStep(markerStep,
markerClass.equals(AndStep.class) ?
- new WhereStep<Object>(traversal, Scope.global, P.traversal(leftTraversal).and(rightTraversal)) :
- new WhereStep<Object>(traversal, Scope.global, P.traversal(leftTraversal).or(rightTraversal)),
+ new WhereStep<>(traversal, Scope.global, P.traversal(leftTraversal).and(rightTraversal)) :
+ new WhereStep<>(traversal, Scope.global, P.traversal(leftTraversal).or(rightTraversal)),
traversal);
});
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
index 78b81a5..aedc750 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategyTest.java
@@ -118,7 +118,8 @@ public class ConjunctionStrategyTest {
return Arrays.asList(new Traversal[][]{
{__.has("name", "stephen").or().where(__.out("knows").has("name", "stephen")), __.or(__.has("name", "stephen"), __.where(__.out("knows").has("name", "stephen")))},
- {__.out("a").out("b").and().out("c").or().out("d"), __.or(__.and(__.out("a").out("b"), __.out("c")), __.out("d"))}
+ {__.out("a").out("b").and().out("c").or().out("d"), __.or(__.and(__.out("a").out("b"), __.out("c")), __.out("d"))},
+ {__.as("a").out().as("b").and().as("c").in().as("d"), __.and(__.as("a").out().as("b"),__.as("c").in().as("d"))}
});
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoaderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoaderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoaderTest.groovy
index 0bfddf7..19f0da2 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoaderTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoaderTest.groovy
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory
import org.junit.Test
import static org.junit.Assert.*
+import static org.apache.tinkerpop.gremlin.process.traversal.P.*
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -82,6 +83,7 @@ class SugarLoaderTest extends AbstractGremlinTest {
assertEquals('okram', g.V(1).next().name);
g.V(1).next()['name'] = 'marko a. rodriguez'
assertEquals(["okram", "marko a. rodriguez"] as Set, g.V(1).values('name').toSet());
+ assertEquals(29, g.V.age.is(eq(29)).next())
}
@Test
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
index abce9ab..dbd7c9d 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.filter
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
import org.apache.tinkerpop.gremlin.structure.Vertex
/**
@@ -36,7 +36,12 @@ public abstract class GroovyAndTest {
@Override
public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
- TraversalScriptHelper.compute("g.V.and(outE(), has(T.label, 'person') & has('age', gte(32))).name", g)
+ TraversalScriptHelper.compute("g.V.and(outE(), has(label, 'person') & has('age', gte(32))).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name() {
+ TraversalScriptHelper.compute("g.V.as('a').out('knows') & out('created').in('created').as('a').name", g)
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
index 816b999..58e52ea 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
@@ -32,8 +32,8 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory
class SugarLoader {
private static final String NAME = "name";
- private static final String FROM = "from";
- private static final String SELECT = "select";
+ //private static final String FROM = "from";
+ //private static final String SELECT = "select";
public static void load() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/18c83f3a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
index d32bb0e..7f01d5a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
@@ -21,8 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.filter;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
@@ -45,6 +45,8 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
+ public abstract Traversal<Vertex, Vertex> get_g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name();
+
@Test
@LoadGraphWith(MODERN)
public void g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
@@ -61,6 +63,14 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
checkResults(Arrays.asList("josh", "peter"), traversal);
}
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(convertToVertex(graph, "marko")), traversal);
+ }
+
public static class Traversals extends AndTest {
@@ -73,5 +83,10 @@ public abstract class AndTest extends AbstractGremlinProcessTest {
public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
return g.V().and(outE(), has(T.label, "person").and().has("age", P.gte(32))).values("name");
}
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_asXaX_outXknowsX_and_outXcreatedX_inXcreatedX_asXaX_name() {
+ return g.V().as("a").out("knows").and().out("created").in("created").as("a").values("name");
+ }
}
}