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");
+        }
     }
 }