You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/04/06 11:33:38 UTC

[11/50] tinkerpop git commit: Added ScopingStrategy which does a single TraversalHelper.getLabels() call and recurssively tells where() and select() steps the path labels accessed by the Traversal.

Added ScopingStrategy which does a single TraversalHelper.getLabels() call and recurssively tells where() and select() steps the path labels accessed by the Traversal.


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

Branch: refs/heads/TINKERPOP-1443
Commit: b49c5beec0c7ae891b8267130d97366bee0cd20a
Parents: e8011e4
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Mar 3 09:27:58 2017 -0700
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Mar 29 11:20:43 2017 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../process/traversal/TraversalStrategies.java  |  2 +
 .../gremlin/process/traversal/step/Scoping.java | 10 ++++
 .../step/filter/WherePredicateStep.java         | 11 +++-
 .../step/filter/WhereTraversalStep.java         | 16 ++++--
 .../traversal/step/map/SelectOneStep.java       | 21 ++++++--
 .../process/traversal/step/map/SelectStep.java  | 15 ++++--
 .../strategy/finalization/ScopingStrategy.java  | 57 ++++++++++++++++++++
 8 files changed, 121 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 7d4e74b..82cdd8d 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -44,6 +44,7 @@ TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET)
 * Added `FromToModulating` interface for use with `to()`- and `from()`-based step modulators.
 * Added `Path.subPath()` which supports isolating a sub-path from `Path` via to/from-labels.
 * Fixed an `NullPointerException` in `GraphMLReader` that occurred when an `<edge>` didn't have an ID field and the base graph supported ID assignment.
+* Added `ScopingStrategy` which will computer and provide all `Scoping` steps with the path labels of the global `Traversal`.
 * Split `ComputerVerificationStrategy` into two strategies: `ComputerVerificationStrategy` and `ComputerFinalizationStrategy`.
 * Removed `HasTest.g_V_hasId_compilationEquality` from process test suite as it makes too many assumptions about provider compilation.
 * Deprecated `CustomizerProvider` infrastructure.

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index 63ae23f..0ddae91 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimiza
 import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ScopingStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy;
@@ -214,6 +215,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
                     RangeByIsCountStrategy.instance(),
                     PathRetractionStrategy.instance(),
                     LazyBarrierStrategy.instance(),
+                    ScopingStrategy.instance(),
                     ProfileStrategy.instance(),
                     StandardVerificationStrategy.instance());
             GRAPH_CACHE.put(Graph.class, graphStrategies);

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
index 8c27405..68655e4 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java
@@ -70,4 +70,14 @@ public interface Scoping {
     }
 
     public Set<String> getScopeKeys();
+
+    /**
+     * If a Scoping step can do intelligent optimizations by knowing the step labels being accessed globally, then it should implement this label.
+     * The default implementation does nothing.
+     *
+     * @param labels the step labels of the global traversal
+     */
+    public default void setPathLabels(final Set<String> labels) {
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
index 05637f6..b213314 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
@@ -49,6 +49,7 @@ public final class WherePredicateStep<S> extends FilterStep<S> implements Scopin
 
     protected String startKey;
     protected List<String> selectKeys;
+    private Boolean pathSelectKey = null;
     protected P<Object> predicate;
     protected final Set<String> scopeKeys = new HashSet<>();
     protected Set<String> keepLabels;
@@ -137,14 +138,22 @@ public final class WherePredicateStep<S> extends FilterStep<S> implements Scopin
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        final Set<TraverserRequirement> requirements =
+        final Set<TraverserRequirement> requirements = null == this.pathSelectKey ?
                 TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
                         TYPICAL_GLOBAL_REQUIREMENTS :
+                        TYPICAL_LOCAL_REQUIREMENTS :
+                this.pathSelectKey ?
+                        TYPICAL_GLOBAL_REQUIREMENTS :
                         TYPICAL_LOCAL_REQUIREMENTS;
         return this.getSelfAndChildRequirements(requirements.toArray(new TraverserRequirement[requirements.size()]));
     }
 
     @Override
+    public void setPathLabels(final Set<String> labels) {
+        this.pathSelectKey = labels.stream().filter(this.scopeKeys::contains).findAny().isPresent();
+    }
+
+    @Override
     public List<Traversal.Admin<S, ?>> getLocalChildren() {
         return (List) this.traversalRing.getTraversals();
     }

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
index 1dd92e2..c004d30 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
@@ -46,6 +46,7 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
 
     protected Traversal.Admin<?, ?> whereTraversal;
     protected final Set<String> scopeKeys = new HashSet<>();
+    private Boolean pathSelectKey = null;
     protected Set<String> keepLabels;
 
     public WhereTraversalStep(final Traversal.Admin traversal, final Traversal<?, ?> whereTraversal) {
@@ -134,9 +135,18 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.getTraversal())).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
-                TYPICAL_GLOBAL_REQUIREMENTS :
-                TYPICAL_LOCAL_REQUIREMENTS;
+        return null == this.pathSelectKey ?
+                TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.getTraversal())).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
+                        TYPICAL_GLOBAL_REQUIREMENTS :
+                        TYPICAL_LOCAL_REQUIREMENTS :
+                this.pathSelectKey ?
+                        TYPICAL_GLOBAL_REQUIREMENTS :
+                        TYPICAL_LOCAL_REQUIREMENTS;
+    }
+
+    @Override
+    public void setPathLabels(final Set<String> labels) {
+        this.pathSelectKey = labels.stream().filter(this.scopeKeys::contains).findAny().isPresent();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/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 a51a8d2..baedbcf 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
@@ -41,6 +41,7 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
 
     private final Pop pop;
     private final String selectKey;
+    private Boolean pathSelectKey = null;
     private Traversal.Admin<S, E> selectTraversal = null;
     private Set<String> keepLabels;
 
@@ -103,9 +104,17 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).contains(this.selectKey) ?
-                TYPICAL_GLOBAL_REQUIREMENTS_ARRAY :
-                TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+        if (null == this.pathSelectKey)
+            return this.getSelfAndChildRequirements(TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).contains(this.selectKey) ?
+                    TYPICAL_GLOBAL_REQUIREMENTS_ARRAY :
+                    TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+        else
+            return this.getSelfAndChildRequirements(this.pathSelectKey ? TYPICAL_GLOBAL_REQUIREMENTS_ARRAY : TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+    }
+
+    @Override
+    public void setPathLabels(final Set<String> labels) {
+        this.pathSelectKey = labels.contains(this.selectKey);
     }
 
     @Override
@@ -123,12 +132,14 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa
     }
 
     @Override
-    public Set<String> getKeepLabels() { return this.keepLabels; }
+    public Set<String> getKeepLabels() {
+        return this.keepLabels;
+    }
 
     @Override
     protected Traverser.Admin<E> processNextStart() {
         final Traverser.Admin<E> traverser = super.processNextStart();
-        if(!(this.getTraversal().getParent() instanceof MatchStep)) {
+        if (!(this.getTraversal().getParent() instanceof MatchStep)) {
             PathProcessor.processTraverserPathLabels(traverser, this.keepLabels);
         }
         return traverser;

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/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 77db60f..3a96380 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
@@ -48,6 +48,7 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
     private TraversalRing<Object, E> traversalRing = new TraversalRing<>();
     private final Pop pop;
     private final List<String> selectKeys;
+    private Boolean pathSelectKey = null;
     private final Set<String> selectKeysSet;
     private Set<String> keepLabels;
 
@@ -120,9 +121,17 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).stream().filter(this.selectKeys::contains).findAny().isPresent() ?
-                TYPICAL_GLOBAL_REQUIREMENTS_ARRAY :
-                TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+        if (null == this.pathSelectKey)
+            return this.getSelfAndChildRequirements(TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).stream().filter(this.selectKeys::contains).findAny().isPresent() ?
+                    TYPICAL_GLOBAL_REQUIREMENTS_ARRAY :
+                    TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+        else
+            return this.getSelfAndChildRequirements(this.pathSelectKey ? TYPICAL_GLOBAL_REQUIREMENTS_ARRAY : TYPICAL_LOCAL_REQUIREMENTS_ARRAY);
+    }
+
+    @Override
+    public void setPathLabels(final Set<String> labels) {
+        this.pathSelectKey = labels.stream().filter(this.selectKeysSet::contains).findAny().isPresent();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/b49c5bee/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ScopingStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ScopingStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ScopingStrategy.java
new file mode 100644
index 0000000..ce66da4
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ScopingStrategy.java
@@ -0,0 +1,57 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ScopingStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
+
+    private static final ScopingStrategy INSTANCE = new ScopingStrategy();
+
+
+    private ScopingStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        // only operate on the root traversal and apply global step labels recursively
+        if (!(traversal.getParent() instanceof EmptyStep))
+            return;
+
+        final Set<String> labels = TraversalHelper.getLabels(traversal);
+        for (final Scoping scoping : TraversalHelper.getStepsOfAssignableClassRecursively(Scoping.class, traversal)) {
+            scoping.setPathLabels(labels);
+        }
+    }
+
+    public static final ScopingStrategy instance() {
+        return INSTANCE;
+    }
+}