generalized match() to locally compute with all barriers, not just reducing 
barriers.


Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/04b61d59
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/04b61d59
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/04b61d59

Branch: refs/heads/TINKERPOP-1756
Commit: 04b61d5943ecf12338ff15181ff01ba6fd2f143b
Parents: 74f10b1
Author: Marko A. Rodriguez <[email protected]>
Authored: Wed Aug 30 08:33:34 2017 -0600
Committer: Marko A. Rodriguez <[email protected]>
Committed: Wed Aug 30 08:33:34 2017 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../upgrade/release-3.2.x-incubating.asciidoc   | 39 ++++++++++++++++++++
 .../process/traversal/step/map/MatchStep.java   |  5 ++-
 .../traversal/step/map/GroovyMatchTest.groovy   | 12 ++++++
 .../process/traversal/step/map/MatchTest.java   | 23 ++++++++++++
 5 files changed, 78 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/04b61d59/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index fc0b9ef..102f74d 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 TinkerPop 3.2.7 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Generalized `MatchStep` to locally compute all clauses with barriers (not 
just reducing barriers).
 * Ensured that plugins were applied in the order they were configured.
 * Fixed a bug in `Neo4jGremlinPlugin` that prevented it from loading properly 
in the `GremlinPythonScriptEngine`.
 * Fixed a bug in `ComputerVerificationStrategy` where child traversals were 
being analyzed prior to compilation.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/04b61d59/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 9c9721f..25d776a 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -22,6 +22,45 @@ 
image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 *Nine Inch Gremlins*
 
+TinkerPop 3.2.7
+---------------
+
+*NOT OFFICIALLY RELEASED YET*
+
+Upgrading for Users
+~~~~~~~~~~~~~~~~~~~
+
+The `match()`-step has been generalized to suppor the local scoping of all 
barrier steps, not just reducing barrier steps.
+Previously, the `order().limit()` clause would have worked globally yielding:
+
+[source,groovy]
+----
+gremlin> g.V().match(
+......1>   
__.as('a').outE('created').order().by('weight',decr).limit(1).inV().as('b'),
+......2>   __.as('b').has('lang','java')
+......3> ).select('a','b').by('name')
+==>[a:marko,b:lop]
+----
+
+However, now, `order()` (and all other barriers) are treated as local 
computations to the pattern and thus, the result set is:
+
+[source,groovy]
+----
+gremlin> g.V().match(
+......1>   
__.as('a').outE('created').order().by('weight',decr).limit(1).inV().as('b'),
+......2>   __.as('b').has('lang','java')
+......3> ).select('a','b').by('name')
+==>[a:marko,b:lop]
+==>[a:josh,b:ripple]
+==>[a:peter,b:lop]
+----
+
+Note that this is not that intense of a breaking change as all of the reducing 
barriers behaved in this manner previously.
+This includes steps like `count()`, `min()`, `max()`, `sum()`, `group()`, 
`groupCount()`, etc. This update has now
+generalized this behavior to all barriers and thus, adds `aggregate()`, 
`dedup()`, `range()`, `limit()`, `tail()`, and `order()`
+to the list of locally computed clauses.
+
+
 TinkerPop 3.2.6
 ---------------
 

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/04b61d59/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index 8a8237a..e74b8d1 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -20,10 +20,12 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Pop;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 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.traversal.step.Barrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -36,7 +38,6 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
-import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
 import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -153,7 +154,7 @@ public final class MatchStep<S, E> extends 
ComputerAwareStep<S, Map<String, E>>
         matchTraversal.asAdmin().addStep(matchEndStep);
 
         // this turns barrier computations into locally computable traversals
-        if 
(!TraversalHelper.getStepsOfAssignableClass(ReducingBarrierStep.class, 
matchTraversal).isEmpty()) {
+        if (TraversalHelper.hasStepOfAssignableClass(Barrier.class, 
matchTraversal)) {
             final Traversal.Admin newTraversal = new DefaultTraversal<>();
             
TraversalHelper.removeToTraversal(matchTraversal.getStartStep().getNextStep(), 
matchTraversal.getEndStep(), newTraversal);
             TraversalHelper.insertAfterStep(new 
TraversalFlatMapStep<>(matchTraversal, newTraversal), 
matchTraversal.getStartStep(), matchTraversal);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/04b61d59/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 8c36d26..a93ae36 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
@@ -24,6 +24,8 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
 import org.apache.tinkerpop.gremlin.structure.Vertex
 import org.junit.Before
 
+import static org.apache.tinkerpop.gremlin.process.traversal.Order.decr
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -377,5 +379,15 @@ public abstract class GroovyMatchTest {
                     
__.as("a").in("followedBy").count().is(gt(10)).as("b")).count;
             """)
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> 
get_g_V_matchXa_outEXcreatedX_order_byXweight_decrX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX()
 {
+            new ScriptTraversal<>(g, "gremlin-groovy", """
+             g.V.match(
+                    __.as("a").outE("created").order.by("weight", 
decr).limit(1).inV.as("b"),
+                    __.as("b").has("lang", "java")).
+                select("a", "b").by("name")
+            """)
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/04b61d59/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 b8bf1b6..5283637 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
@@ -42,6 +42,7 @@ import java.util.Set;
 
 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.Order.decr;
 import static org.apache.tinkerpop.gremlin.process.traversal.P.eq;
 import static org.apache.tinkerpop.gremlin.process.traversal.P.neq;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.and;
@@ -159,6 +160,9 @@ public abstract class MatchTest extends 
AbstractGremlinProcessTest {
     // test inline counts
     public abstract Traversal<Vertex, Long> 
get_g_V_matchXa_followedBy_count_isXgtX10XX_b__a_0followedBy_count_isXgtX10XX_bX_count();
 
+    // test order barriers
+    public abstract Traversal<Vertex, Map<String, String>> 
get_g_V_matchXa_outEXcreatedX_order_byXweight_decrX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_valueMap_matchXa_selectXnameX_bX() {
@@ -566,6 +570,17 @@ public abstract class MatchTest extends 
AbstractGremlinProcessTest {
         checkResults(Collections.singletonList(6L), traversal);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void 
g_V_matchXa_outEXcreatedX_order_byXweight_decrX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX()
 {
+        final Traversal<Vertex, Map<String, String>> traversal = 
get_g_V_matchXa_outEXcreatedX_order_byXweight_decrX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX();
+        printTraversalForm(traversal);
+        checkResults(makeMapList(2,
+                "a", "marko", "b", "lop",
+                "a", "peter", "b", "lop",
+                "a", "josh", "b", "ripple"), traversal);
+    }
+
     public static class GreedyMatchTraversals extends Traversals {
         @Before
         public void setupTest() {
@@ -850,5 +865,13 @@ public abstract class MatchTest extends 
AbstractGremlinProcessTest {
                     as("a").out("followedBy").count().is(P.gt(10)).as("b"),
                     
as("a").in("followedBy").count().is(P.gt(10)).as("b")).count();
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> 
get_g_V_matchXa_outEXcreatedX_order_byXweight_decrX_limitX1X_inV_b__b_hasXlang_javaXX_selectXa_bX_byXnameX()
 {
+            return g.V().match(
+                    as("a").outE("created").order().by("weight", 
decr).limit(1).inV().as("b"),
+                    as("b").has("lang", "java")).
+                    <String>select("a", "b").by("name");
+        }
     }
 }

Reply via email to