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/05/07 16:40:26 UTC
incubator-tinkerpop git commit: Lots of good JavaDoc on how to write
a TraversalStrategy. finalized various decoration/ strategies.
ComputerResultStrategy has a PRIOR of ProfileStrategy.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 0d239c056 -> f3b91ceac
Lots of good JavaDoc on how to write a TraversalStrategy. finalized various decoration/ strategies. ComputerResultStrategy has a PRIOR of ProfileStrategy.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/f3b91cea
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/f3b91cea
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/f3b91cea
Branch: refs/heads/master
Commit: f3b91ceacbcfbbf1d55e7ebe531773ce107ff5f5
Parents: 0d239c0
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu May 7 08:40:20 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu May 7 08:40:20 2015 -0600
----------------------------------------------------------------------
.../process/traversal/TraversalStrategy.java | 27 ++++++++++++++++++--
.../engine/ComputerTraversalEngine.java | 14 ++++++++++
.../strategy/decoration/EventStrategy.java | 2 +-
.../strategy/decoration/PartitionStrategy.java | 2 +-
.../strategy/decoration/SubgraphStrategy.java | 2 +-
.../finalization/EngineDependentStrategy.java | 4 +++
6 files changed, 46 insertions(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
index de1b57d..bc343e5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
@@ -29,9 +29,14 @@ import java.util.Set;
/**
* A {@link TraversalStrategy} defines a particular atomic operation for mutating a {@link Traversal} prior to its evaluation.
- * There are 4 typical "traversal categories": {@link DecorationStrategy}, {@link OptimizationStrategy}, {@link FinalizationStrategy}, and {@link VerificationStrategy}.
+ * There are 4 pre-defined "traversal categories": {@link DecorationStrategy}, {@link OptimizationStrategy}, {@link FinalizationStrategy}, and {@link VerificationStrategy}.
* Strategies within a category are sorted amongst themselves and then category sorts are applied in the ordered specified previous.
+ * That is, decorations are applied, then optimizations, then finalizations, and finally, verifications.
* If a strategy does not fit within the specified categories, then it can simply implement {@link TraversalStrategy} and can have priors/posts that span categories.
+ * <p/>
+ * A traversal strategy should be a final class as various internal operations on a strategy are based on its ability to be assigned to more general classes.
+ * A traversal strategy should typically be stateless with a public static <code>instance()</code> method.
+ * However, at limit, a traversal strategy can have a state defining constructor (typically via a "builder"), but that state can not mutate once instantiated.
*
* @author Marko A. Rodriguez (http://markorodriguez.com)
* @author Matthias Broecheler (me@matthiasb.com)
@@ -41,14 +46,31 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ
public void apply(final Traversal.Admin<?, ?> traversal);
+ /**
+ * The set of strategies that must be executed before this strategy is executed.
+ * If there are no ordering requirements, the default implementation returns an empty set.
+ *
+ * @return the set of strategies that must be executed prior to this one.
+ */
public default Set<Class<? extends S>> applyPrior() {
return Collections.emptySet();
}
+ /**
+ * The set of strategies that must be executed after this strategy is executed.
+ * If there are no ordering requirements, the default implementation returns an empty set.
+ *
+ * @return the set of strategies that must be executed post this one
+ */
public default Set<Class<? extends S>> applyPost() {
return Collections.emptySet();
}
+ /**
+ * The type of traversal strategy -- i.e. {@link DecorationStrategy}, {@link OptimizationStrategy}, {@link FinalizationStrategy}, or {@link VerificationStrategy}.
+ *
+ * @return the traversal strategy category class
+ */
public default Class<S> getTraversalCategory() {
return (Class) TraversalStrategy.class;
}
@@ -134,9 +156,10 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ
return 0;
}
}
+
/**
* Implemented by strategies where there is no more behavioral tweaking of the traversal required. Strategies that
- * implement this marker will simply analyze the traversal and throw exceptions if the traversal is not correct
+ * implement this category will simply analyze the traversal and throw exceptions if the traversal is not correct
* for the execution context (e.g. {@link LambdaRestrictionStrategy}).
*/
public interface VerificationStrategy extends TraversalStrategy<VerificationStrategy> {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
index b4aafbb..bfcfaa2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
@@ -25,12 +25,15 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
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.strategy.finalization.ProfileStrategy;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -95,6 +98,12 @@ public final class ComputerTraversalEngine implements TraversalEngine {
public static class ComputerResultStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
private static final ComputerResultStrategy INSTANCE = new ComputerResultStrategy();
+ private static final Set<Class<? extends FinalizationStrategy>> PRIORS = new HashSet<>();
+
+ static {
+ PRIORS.add(ProfileStrategy.class);
+ }
+
private ComputerResultStrategy() {
@@ -109,6 +118,11 @@ public final class ComputerTraversalEngine implements TraversalEngine {
}
}
+ @Override
+ public Set<Class<? extends FinalizationStrategy>> applyPrior() {
+ return PRIORS;
+ }
+
public static ComputerResultStrategy instance() {
return INSTANCE;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
index 28d5bd6..7910e81 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
@@ -45,7 +45,7 @@ import java.util.List;
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
-public class EventStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+public final class EventStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
private final List<MutationListener> listeners = new ArrayList<>();
private EventStrategy(final MutationListener... listeners) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index 75dc3c5..442576a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -47,7 +47,7 @@ import java.util.stream.Stream;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
-public class PartitionStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+public final class PartitionStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
private String writePartition;
private final String partitionKey;
private final Set<String> readPartitions;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
index 21a549f..5880720 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
@@ -45,7 +45,7 @@ import java.util.stream.Collectors;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
-public class SubgraphStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+public final class SubgraphStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
private final Predicate<Traverser<Vertex>> vertexPredicate;
private final Predicate<Traverser<Edge>> edgePredicate;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f3b91cea/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
index 376f283..4104c7a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
@@ -24,6 +24,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
/**
+ * A {@link org.apache.tinkerpop.gremlin.process.traversal.Step} can extend {@link EngineDependent}.
+ * If it does, that means that the steps internal logic is modulated by whether the execution is via {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type#STANDARD} or {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type#COMPUTER}.
+ * EngineDependentStrategy simply locates all engine dependent steps and provides the respective {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine}.
+ *
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public final class EngineDependentStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {