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/05 21:59:05 UTC
incubator-tinkerpop git commit: Implemented LazyBarrierStrategy which
will 'stall' a traversal pipeline in order to gain a bulking optimization.
Only traversals that meet the pattern defiintion of the strategy get
NoOpBarrierSteps inserted into them. Thi
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 2b4743803 -> 6796130a0
Implemented LazyBarrierStrategy which will 'stall' a traversal pipeline in order to gain a bulking optimization. Only traversals that meet the pattern defiintion of the strategy get NoOpBarrierSteps inserted into them. This strategy is NOT turned on by default.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/6796130a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/6796130a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/6796130a
Branch: refs/heads/master
Commit: 6796130a02e0194e464898f652f96ce9f5bd4621
Parents: 2b47438
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Jun 5 13:59:00 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Jun 5 13:59:00 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 1 +
.../finalization/LazyBarrierStrategy.java | 46 ++++++++++++++++++--
.../AbstractImportCustomizerProvider.java | 13 ++++--
3 files changed, 52 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6796130a/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 44a4b84..a751a94 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Added `LazyBarrierStrategy` which "stalls" a traversal of a particular form in order to gain a bulking optimization.
* `CollectingBarrierStep` supports `maxBarrierSize` for "lazy barrier," memory conservation.
* `Scoping` now has `getScope()`, `setScope()`, and `getScopeKeys()`.
* `ScopingStrategy` is smart about `Scope.global` settings based on traversal labels.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6796130a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
index 95752d9..62f4274 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
@@ -21,11 +21,19 @@
package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
-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.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.NoOpBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import java.util.HashSet;
@@ -40,6 +48,10 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers
private static final Set<Class<? extends FinalizationStrategy>> PRIORS = new HashSet<>();
private static final Set<Class<? extends FinalizationStrategy>> POSTS = new HashSet<>();
+ private static final int REQUIRED_DEPTH = 2;
+ private static final int BIG_START_SIZE = 5;
+ private static final int MAX_BARRIER_SIZE = 10000;
+
static {
PRIORS.add(ScopingStrategy.class);
//
@@ -52,9 +64,35 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
- if(traversal.getEngine().isComputer())
+ if (traversal.getEngine().isComputer())
+ return;
+
+ if (traversal.getTraverserRequirements().contains(TraverserRequirement.PATH))
return;
- // TODO:
+
+ int depth = 0;
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ if (step instanceof VertexStep)
+ depth++;
+ }
+
+ if (depth > REQUIRED_DEPTH) {
+ boolean bigStart = false;
+ for (int i = 0; i < traversal.getSteps().size() - 1; i++) {
+ final Step<?, ?> step = traversal.getSteps().get(i);
+ if (i == 0)
+ bigStart = step instanceof GraphStep && (((GraphStep) step).getIds().length >= BIG_START_SIZE || (((GraphStep) step).getIds().length == 0 && step instanceof HasContainerHolder && ((HasContainerHolder) step).getHasContainers().isEmpty()));
+ else if (i > 1 || bigStart) {
+ if (!(step instanceof FilterStep) &&
+ !(step instanceof CollectingBarrierStep) &&
+ !(step instanceof SupplyingBarrierStep) &&
+ !(step instanceof ReducingBarrierStep) &&
+ !(step instanceof VertexStep && ((VertexStep) step).returnsEdge())) {
+ TraversalHelper.insertAfterStep(new NoOpBarrierStep<>(traversal, MAX_BARRIER_SIZE), step, traversal);
+ }
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6796130a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 79424aa..fcef79d 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -27,9 +27,10 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
@@ -38,12 +39,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEn
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
+import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.io.GraphReader;
import org.apache.tinkerpop.gremlin.structure.io.IoCore;
@@ -90,7 +92,10 @@ public abstract class AbstractImportCustomizerProvider implements ImportCustomiz
imports.add(GraphTraversal.class.getPackage().getName() + DOT_STAR);
imports.add(ComputerTraversalEngine.class.getPackage().getName() + DOT_STAR);
imports.add(PartitionStrategy.class.getPackage().getName() + DOT_STAR); // decoration strategies
+ imports.add(IdentityRemovalStrategy.class.getPackage().getName() + DOT_STAR); // optimization strategies
+ imports.add(ProfileStrategy.class.getPackage().getName() + DOT_STAR); // finalization strategies
imports.add(ReadOnlyStrategy.class.getPackage().getName() + DOT_STAR); // verification strategies
+
imports.add(Event.class.getPackage().getName() + DOT_STAR); // eventing
staticImports.add(__.class.getCanonicalName() + DOT_STAR);
staticImports.add(TraversalOptionParent.Pick.class.getCanonicalName() + DOT_STAR);