to hell and back and got nowhere. 2 hour code hole trying to remove GraphComputer semantics from Actor traversals..... had it all working up till group() not finalizing results. No idea why.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/3bcc34d2 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/3bcc34d2 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/3bcc34d2 Branch: refs/heads/TINKERPOP-1564 Commit: 3bcc34d2e7b97583777d13804590522517786fa6 Parents: e615534 Author: Marko A. Rodriguez <[email protected]> Authored: Tue Dec 13 15:30:31 2016 -0700 Committer: Marko A. Rodriguez <[email protected]> Committed: Wed Jan 4 05:07:59 2017 -0700 ---------------------------------------------------------------------- .../akka/process/AkkaActorsProvider.java | 5 +- .../gremlin/akka/process/AkkaPlayTest.java | 8 +- .../actor/traversal/TraversalActorProgram.java | 7 +- .../actor/traversal/step/map/ActorStep.java | 6 +- .../decoration/ActorProgramStrategy.java | 82 +++++++++++++++++++ .../strategy/decoration/ActorStrategy.java | 86 -------------------- .../verification/ActorVerificationStrategy.java | 12 ++- 7 files changed, 102 insertions(+), 104 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java ---------------------------------------------------------------------- diff --git a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java index 3a9e16f..7c8c1a1 100644 --- a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java +++ b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaActorsProvider.java @@ -23,9 +23,8 @@ import org.apache.commons.configuration.Configuration; import org.apache.tinkerpop.gremlin.AbstractGraphProvider; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.akka.process.actor.AkkaActors; -import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorStrategy; +import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy; import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest; -import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.step.ComplexTest; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest; @@ -154,7 +153,7 @@ public class AkkaActorsProvider extends AbstractGraphProvider { //throw new VerificationException("This test current does not work with Gremlin-Python", EmptyTraversal.instance()); else { final GraphTraversalSource g = graph.traversal(); - return g.withStrategies(new ActorStrategy(AkkaActors.class, new HashPartitioner(graph.partitioner(), 3))); + return g.withStrategies(new ActorProgramStrategy(AkkaActors.class, new HashPartitioner(graph.partitioner(), 3))); } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaPlayTest.java ---------------------------------------------------------------------- diff --git a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaPlayTest.java b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaPlayTest.java index f94083c..5be2a67 100644 --- a/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaPlayTest.java +++ b/akka-gremlin/src/test/java/org/apache/tinkerpop/gremlin/akka/process/AkkaPlayTest.java @@ -20,8 +20,7 @@ package org.apache.tinkerpop.gremlin.akka.process; import org.apache.tinkerpop.gremlin.akka.process.actor.AkkaActors; -import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoIo; @@ -29,9 +28,6 @@ import org.apache.tinkerpop.gremlin.structure.util.partitioner.HashPartitioner; import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph; import org.junit.Test; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE; - /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -41,7 +37,7 @@ public class AkkaPlayTest { public void testPlay1() throws Exception { final Graph graph = TinkerGraph.open(); graph.io(GryoIo.build()).readGraph("../data/tinkerpop-modern.kryo"); - GraphTraversalSource g = graph.traversal().withStrategies(new ActorStrategy(AkkaActors.class, new HashPartitioner(graph.partitioner(), 3))); + GraphTraversalSource g = graph.traversal().withStrategies(new ActorProgramStrategy(AkkaActors.class, new HashPartitioner(graph.partitioner(), 3))); System.out.println(g.V().values("name").toList()); //3, 1.9, 1 /*for (int i = 0; i < 10000; i++) { http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java index 88eb670..3b0b8d8 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/TraversalActorProgram.java @@ -28,12 +28,15 @@ import org.apache.tinkerpop.gremlin.process.actor.traversal.message.SideEffectSe import org.apache.tinkerpop.gremlin.process.actor.traversal.message.StartMessage; import org.apache.tinkerpop.gremlin.process.actor.traversal.message.Terminate; import org.apache.tinkerpop.gremlin.process.actor.traversal.message.VoteToHaltMessage; +import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy; import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.verification.ActorVerificationStrategy; import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; import org.apache.tinkerpop.gremlin.structure.Partitioner; @@ -63,8 +66,8 @@ public final class TraversalActorProgram<R> implements ActorProgram<TraverserSet public TraversalActorProgram(final Traversal.Admin<?, R> traversal, final Partitioner partitioner) { this.partitioner = partitioner; final TraversalStrategies strategies = traversal.getStrategies().clone(); - strategies.removeStrategies(ComputerVerificationStrategy.class, StandardVerificationStrategy.class); - strategies.addStrategies(ActorVerificationStrategy.instance()); + strategies.addStrategies(ActorVerificationStrategy.instance(), VertexProgramStrategy.instance(), ReadOnlyStrategy.instance()); + strategies.removeStrategies(ActorProgramStrategy.class, ComputerVerificationStrategy.class, StandardVerificationStrategy.class); traversal.setStrategies(strategies); traversal.applyStrategies(); this.traversal = (Traversal.Admin) ((TraversalVertexProgramStep) traversal.getStartStep()).computerTraversal.get(); http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/ActorStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/ActorStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/ActorStep.java index 207dd57..7da9a12 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/ActorStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/ActorStep.java @@ -26,7 +26,7 @@ package org.apache.tinkerpop.gremlin.process.actor.traversal.step.map; import org.apache.tinkerpop.gremlin.process.actor.ActorProgram; import org.apache.tinkerpop.gremlin.process.actor.Actors; import org.apache.tinkerpop.gremlin.process.actor.traversal.TraversalActorProgram; -import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorStrategy; +import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; @@ -54,10 +54,6 @@ public final class ActorStep<S, E> extends AbstractStep<E, E> { super(traversal); this.actorsClass = actorsClass; this.partitionTraversal = (Traversal.Admin) traversal.clone(); - final TraversalStrategies strategies = this.partitionTraversal.getStrategies().clone(); - strategies.removeStrategies(ActorStrategy.class); - strategies.addStrategies(VertexProgramStrategy.instance()); - this.partitionTraversal.setStrategies(strategies); this.partitioner = partitioner; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorProgramStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorProgramStrategy.java new file mode 100644 index 0000000..1994de3 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorProgramStrategy.java @@ -0,0 +1,82 @@ +/* + * 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.actor.traversal.strategy.decoration; + +import org.apache.tinkerpop.gremlin.process.actor.Actors; +import org.apache.tinkerpop.gremlin.process.actor.traversal.step.map.ActorStep; +import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; +import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +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.verification.ReadOnlyStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; +import org.apache.tinkerpop.gremlin.structure.Partitioner; + +import java.util.Collections; +import java.util.Set; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class ActorProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> + implements TraversalStrategy.DecorationStrategy { + + + private static final Set<Class<? extends DecorationStrategy>> PRIORS = Collections.singleton(RemoteStrategy.class); + private static final Set<Class<? extends DecorationStrategy>> POSTS = Collections.singleton(VertexProgramStrategy.class); + + private final Partitioner partitioner; + private final Class<? extends Actors> actors; + + public ActorProgramStrategy(final Class<? extends Actors> actors, final Partitioner partitioner) { + this.actors = actors; + this.partitioner = partitioner; + } + + @Override + public void apply(final Traversal.Admin<?, ?> traversal) { + ReadOnlyStrategy.instance().apply(traversal); + + if (!(traversal.getParent() instanceof EmptyStep)) + return; + + final ActorStep<?, ?> actorStep = new ActorStep<>(traversal, this.actors, this.partitioner); + TraversalHelper.removeAllSteps(traversal); + traversal.addStep(actorStep); + + // validations + assert traversal.getStartStep().equals(actorStep); + assert traversal.getSteps().size() == 1; + assert traversal.getEndStep() == actorStep; + } + + @Override + public Set<Class<? extends DecorationStrategy>> applyPost() { + return POSTS; + } + + @Override + public Set<Class<? extends DecorationStrategy>> applyPrior() { + return PRIORS; + } +} + http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorStrategy.java deleted file mode 100644 index ca9f64c..0000000 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/decoration/ActorStrategy.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.actor.traversal.strategy.decoration; - -import org.apache.tinkerpop.gremlin.process.actor.Actors; -import org.apache.tinkerpop.gremlin.process.actor.traversal.step.map.ActorStep; -import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; -import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep; -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.verification.ReadOnlyStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; -import org.apache.tinkerpop.gremlin.structure.Partitioner; - -import java.util.Collections; -import java.util.Set; - -/** - * @author Marko A. Rodriguez (http://markorodriguez.com) - */ -public final class ActorStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> - implements TraversalStrategy.DecorationStrategy { - - - private static final Set<Class<? extends DecorationStrategy>> PRIORS = Collections.singleton(RemoteStrategy.class); - private static final Set<Class<? extends DecorationStrategy>> POSTS = Collections.singleton(VertexProgramStrategy.class); - - private final Partitioner partitioner; - private final Class<? extends Actors> actors; - - public ActorStrategy(final Class<? extends Actors> actors, final Partitioner partitioner) { - this.actors = actors; - this.partitioner = partitioner; - } - - @Override - public void apply(final Traversal.Admin<?, ?> traversal) { - ReadOnlyStrategy.instance().apply(traversal); - if (!TraversalHelper.getStepsOfAssignableClass(InjectStep.class, traversal).isEmpty()) - throw new VerificationException("Inject traversal currently not supported", traversal); - - if (!(traversal.getParent() instanceof EmptyStep)) - return; - - final ActorStep<?, ?> actorStep = new ActorStep<>(traversal, this.actors, this.partitioner); - TraversalHelper.removeAllSteps(traversal); - traversal.addStep(actorStep); - - // validations - assert traversal.getStartStep().equals(actorStep); - assert traversal.getSteps().size() == 1; - assert traversal.getEndStep() == actorStep; - } - - @Override - public Set<Class<? extends DecorationStrategy>> applyPost() { - return POSTS; - } - - @Override - public Set<Class<? extends DecorationStrategy>> applyPrior() { - return PRIORS; - } -} - http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3bcc34d2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/verification/ActorVerificationStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/verification/ActorVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/verification/ActorVerificationStrategy.java index 6e0b410..5e1913d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/verification/ActorVerificationStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/strategy/verification/ActorVerificationStrategy.java @@ -23,10 +23,16 @@ 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.GraphComputing; +import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep; import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.structure.Graph; +import java.util.Collections; +import java.util.Set; + /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ @@ -39,8 +45,10 @@ public final class ActorVerificationStrategy extends AbstractTraversalStrategy<T @Override public void apply(final Traversal.Admin<?, ?> traversal) { - if (!TraversalHelper.onGraphComputer(traversal)) - return; + if (!TraversalHelper.getStepsOfAssignableClass(InjectStep.class, traversal).isEmpty()) + throw new VerificationException("Inject traversal currently not supported", traversal); + + final boolean globalChild = TraversalHelper.isGlobalChild(traversal); for (final Step<?, ?> step : traversal.getSteps()) { // only global children are graph computing
