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 2017/01/23 21:24:03 UTC
[07/50] [abbrv] tinkerpop git commit: So much.
withProcessor(Processor). No more Compute. Process.submit(Graph) as we are
now staging it so that every Processor (GraphComputer/GraphAgents) can work
over any Graph. This will all be via Partitioner. withCo
So much. withProcessor(Processor). No more Compute. Process.submit(Graph) as we are now staging it so that every Processor (GraphComputer/GraphAgents) can work over any Graph. This will all be via Partitioner. withComputer() deprecated. Lots of cool stuff with Process strategies -- ProcessorTraveralStrategy like VertexProgramStratgegy and ActorProgramStrategy work directly with TraversalStrategies.GlobalCache. So much other stuf... I forget. Check the CHANGELOG. This was a massive undertaking but, thank god, its all backwards compatible (though with deprecation).
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/6353595e
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/6353595e
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/6353595e
Branch: refs/heads/TINKERPOP-1564
Commit: 6353595ec802d0d71e9dc1e2a2bb16e6bac5869f
Parents: a45e142
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Dec 16 04:43:50 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Jan 23 14:22:53 2017 -0700
----------------------------------------------------------------------
CHANGELOG.asciidoc | 11 ++
.../akka/process/actor/AkkaGraphActors.java | 49 +++++--
.../akka/process/AkkaActorsProvider.java | 7 +-
.../gremlin/akka/process/AkkaPlayTest.java | 5 +-
.../process/computer/GiraphGraphComputer.java | 19 +++
.../tinkerpop/gremlin/process/Processor.java | 28 ++--
.../tinkerpop/gremlin/process/actor/Actors.java | 80 -----------
.../gremlin/process/actor/GraphActors.java | 45 ++++--
.../step/map/TraversalActorProgramStep.java | 26 ++--
.../decoration/ActorProgramStrategy.java | 80 ++---------
.../gremlin/process/computer/Computer.java | 61 ++++----
.../gremlin/process/computer/GraphComputer.java | 51 ++++++-
.../decoration/VertexProgramStrategy.java | 141 +++++++++----------
.../process/traversal/TraversalSource.java | 31 +++-
.../process/traversal/TraversalStrategies.java | 48 ++++---
.../dsl/graph/GraphTraversalSource.java | 2 +-
.../strategy/ProcessorTraversalStrategy.java | 44 ++++++
.../gremlin/structure/util/StringFactory.java | 9 +-
.../process/TraversalStrategiesTest.java | 5 +
.../gremlin/process/traversal/BytecodeTest.java | 19 ++-
.../jython/gremlin_python/process/strategies.py | 12 +-
.../process/computer/GraphComputerTest.java | 13 +-
.../traversal/step/map/PeerPressureTest.java | 2 +
.../groovy/plugin/HadoopRemoteAcceptor.java | 5 +-
.../hadoop/jsr223/HadoopRemoteAcceptor.java | 5 +-
.../computer/AbstractHadoopGraphComputer.java | 11 +-
.../process/computer/SparkGraphComputer.java | 17 +++
.../process/computer/TinkerGraphComputer.java | 35 +++++
.../process/TinkerGraphComputerProvider.java | 26 ++--
...erGraphGroovyTranslatorComputerProvider.java | 2 +-
30 files changed, 513 insertions(+), 376 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index d62141c..895fe85 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -27,6 +27,17 @@ TinkerPop 3.3.0 (Release Date: NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Added more specific typing to various `__` traversal steps. E.g. `<A,Vertex>out()` is `<Vertex,Vertex>out()`.
+* Added `Partitioner` which provides information about how a `Graph` is partitioned.
+* Added `Graph.partitioner()` to access the graph's `Partitioner`.
+* Added `Partition` which is accessible from `Partitioner` and provides `Vertex` and `Edge` iterators for partitions of the `Graph`.
+* Added `GraphActors` which is an asynchronous, partition-centric, distributed, message passing graph processing framework.
+* Added `akka-gremlin/` module which is an Akka implementation of `GraphActors`.
+* Added `Processor` interface and both `GraphActors` and `GraphComputer` extend it.
+* Deprecated `TraversalSource.withComputer()` in favor of `TraversalSource.withProcessor()`.
+* Added `ProcessTraversalStrategy` which is used to get cached strategies associated with a `Processor`.
+* Deprecated `Computer` in favor of `GraphComputer.open()`.
+* Deprecated `Graph.compute()` and `GraphComputer.submit()` in favor of `GraphComputer.submit(Graph)`.
+>>>>>>> So much. withProcessor(Processor). No more Compute. Process.submit(Graph) as we are now staging it so that every Processor (GraphComputer/GraphAgents) can work over any Graph. This will all be via Partitioner. withComputer() deprecated. Lots of cool stuff with Process strategies -- ProcessorTraveralStrategy like VertexProgramStratgegy and ActorProgramStrategy work directly with TraversalStrategies.GlobalCache. So much other stuf... I forget. Check the CHANGELOG. This was a massive undertaking but, thank god, its all backwards compatible (though with deprecation).
* Updated Docker build scripts to include Python dependencies (NOTE: users should remove any previously generated TinkerPop Docker images).
* Added "attachment requisite" `VertexProperty.element()` and `Property.element()` data in GraphSON serialization.
* Added `Vertex`, `Edge`, `VertexProperty`, and `Property` serializers to Gremlin-Python and exposed tests that use graph object arguments.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
----------------------------------------------------------------------
diff --git a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
index 5739369..c602dae 100644
--- a/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
+++ b/akka-gremlin/src/main/java/org/apache/tinkerpop/gremlin/akka/process/actor/AkkaGraphActors.java
@@ -24,16 +24,21 @@ import akka.actor.Props;
import com.typesafe.config.Config;
import com.typesafe.config.ConfigFactory;
import com.typesafe.config.ConfigValueFactory;
+import org.apache.commons.configuration.BaseConfiguration;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.actor.ActorProgram;
import org.apache.tinkerpop.gremlin.process.actor.ActorsResult;
import org.apache.tinkerpop.gremlin.process.actor.Address;
import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
import org.apache.tinkerpop.gremlin.process.actor.util.DefaultActorsResult;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Partitioner;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.structure.util.partitioner.HashPartitioner;
import java.net.InetAddress;
import java.net.UnknownHostException;
+import java.util.Collections;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;
@@ -45,11 +50,13 @@ import java.util.stream.Collectors;
public final class AkkaGraphActors<R> implements GraphActors<R> {
private ActorProgram<R> actorProgram;
- private Partitioner partitioner;
+ private int workers = 1;
+ private Configuration configuration;
private boolean executed = false;
- public AkkaGraphActors() {
-
+ private AkkaGraphActors(final Configuration configuration) {
+ this.configuration = configuration;
+ this.configuration.setProperty(GRAPH_ACTORS, AkkaGraphActors.class.getCanonicalName());
}
@Override
@@ -64,25 +71,28 @@ public final class AkkaGraphActors<R> implements GraphActors<R> {
}
@Override
- public GraphActors<R> partitioner(final Partitioner partitioner) {
- this.partitioner = partitioner;
+ public GraphActors<R> workers(final int workers) {
+ this.workers = workers;
+ this.configuration.setProperty(GRAPH_ACTORS_WORKERS, workers);
return this;
}
@Override
- public Future<R> submit() {
+ public Future<R> submit(final Graph graph) {
if (this.executed)
throw new IllegalStateException("Can not execute twice");
this.executed = true;
- final ActorSystem system;
+ final Config config = ConfigFactory.defaultApplication().withValue("message-priorities",
+ ConfigValueFactory.fromAnyRef(this.actorProgram.getMessagePriorities().
+ orElse(Collections.singletonList(Object.class)).
+ stream().
+ map(Class::getCanonicalName).
+ collect(Collectors.toList()).toString()));
+ final ActorSystem system = ActorSystem.create("traversal-" + UUID.randomUUID(), config);
final ActorsResult<R> result = new DefaultActorsResult<>();
-
- final Config config = ConfigFactory.defaultApplication().
- withValue("message-priorities",
- ConfigValueFactory.fromAnyRef(actorProgram.getMessagePriorities().get().stream().map(Class::getCanonicalName).collect(Collectors.toList()).toString()));
- system = ActorSystem.create("traversal-" + UUID.randomUUID(), config);
+ final Partitioner partitioner = this.workers == 1 ? graph.partitioner() : new HashPartitioner(graph.partitioner(), this.workers);
try {
- new Address.Master(system.actorOf(Props.create(MasterActor.class, actorProgram, partitioner, result), "master").path().toString(), InetAddress.getLocalHost());
+ new Address.Master(system.actorOf(Props.create(MasterActor.class, this.actorProgram, partitioner, result), "master").path().toString(), InetAddress.getLocalHost());
} catch (final UnknownHostException e) {
throw new IllegalStateException(e.getMessage(), e);
}
@@ -93,5 +103,18 @@ public final class AkkaGraphActors<R> implements GraphActors<R> {
return result.getResult();
});
}
+
+ @Override
+ public Configuration configuration() {
+ return this.configuration;
+ }
+
+ public static AkkaGraphActors open(final Configuration configuration) {
+ return new AkkaGraphActors(configuration);
+ }
+
+ public static AkkaGraphActors open() {
+ return new AkkaGraphActors(new BaseConfiguration());
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/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 3e9f5df..968fb99 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,7 +23,7 @@ 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.AkkaGraphActors;
-import org.apache.tinkerpop.gremlin.process.actor.Actors;
+import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalInterruptionTest;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.step.ComplexTest;
@@ -39,7 +39,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Partit
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.partitioner.HashPartitioner;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerElement;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
@@ -147,8 +146,8 @@ public class AkkaActorsProvider extends AbstractGraphProvider {
else {
final GraphTraversalSource g = graph.traversal();
return RANDOM.nextBoolean() ?
- g.withProcessor(Actors.of(AkkaGraphActors.class).workers(new Random().nextInt(15) + 1)) :
- g.withProcessor(Actors.of(AkkaGraphActors.class));
+ g.withProcessor(AkkaGraphActors.open().workers(new Random().nextInt(15) + 1)) :
+ g.withProcessor(GraphActors.open(AkkaGraphActors.class));
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/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 7de8304..df40748 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,11 +20,10 @@
package org.apache.tinkerpop.gremlin.akka.process;
import org.apache.tinkerpop.gremlin.akka.process.actor.AkkaGraphActors;
-import org.apache.tinkerpop.gremlin.process.actor.Actors;
+import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
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;
-import org.apache.tinkerpop.gremlin.structure.util.partitioner.HashPartitioner;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.junit.Ignore;
import org.junit.Test;
@@ -42,7 +41,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().withProcessor(Actors.of(AkkaGraphActors.class).workers(3));
+ GraphTraversalSource g = graph.traversal().withProcessor(GraphActors.open(AkkaGraphActors.class).workers(3));
// System.out.println(g.V().group().by("name").by(outE().values("weight").fold()).toList());
for (int i = 0; i < 1000; i++) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/giraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphGraphComputer.java
----------------------------------------------------------------------
diff --git a/giraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphGraphComputer.java b/giraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphGraphComputer.java
index 1be548a..3047ee4 100644
--- a/giraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphGraphComputer.java
+++ b/giraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphGraphComputer.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.giraph.process.computer;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationUtils;
import org.apache.commons.configuration.FileConfiguration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.giraph.conf.GiraphConfiguration;
@@ -57,6 +58,7 @@ import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.util.DefaultComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.io.Storage;
import org.apache.tinkerpop.gremlin.structure.io.gryo.kryoshim.KryoShimServiceLoader;
import org.apache.tinkerpop.gremlin.util.Gremlin;
@@ -99,6 +101,18 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
this.useWorkerThreadsInConfiguration = this.giraphConfiguration.getInt(GiraphConstants.MAX_WORKERS, -666) != -666 || this.giraphConfiguration.getInt(GiraphConstants.NUM_COMPUTE_THREADS.getKey(), -666) != -666;
}
+ public static GiraphGraphComputer open(final org.apache.commons.configuration.Configuration configuration) {
+ return HadoopGraph.open(configuration).compute(GiraphGraphComputer.class);
+ }
+
+ @Override
+ public Future<ComputerResult> submit(final Graph graph) {
+ this.hadoopGraph = (HadoopGraph)graph;
+ final Configuration configuration = this.hadoopGraph.configuration();
+ configuration.getKeys().forEachRemaining(key -> this.giraphConfiguration.set(key, configuration.getProperty(key).toString()));
+ return this.submit();
+ }
+
@Override
public GraphComputer workers(final int workers) {
this.useWorkerThreadsInConfiguration = false;
@@ -131,6 +145,11 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
return ComputerSubmissionHelper.runWithBackgroundThread(this::submitWithExecutor, "GiraphSubmitter");
}
+ @Override
+ public org.apache.commons.configuration.Configuration configuration() {
+ return ConfUtil.makeApacheConfiguration(this.giraphConfiguration);
+ }
+
private Future<ComputerResult> submitWithExecutor(final Executor exec) {
final long startTime = System.currentTimeMillis();
final Configuration apacheConfiguration = ConfUtil.makeApacheConfiguration(this.giraphConfiguration);
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Processor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Processor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Processor.java
index bffda58..78c544c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Processor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Processor.java
@@ -19,9 +19,11 @@
package org.apache.tinkerpop.gremlin.process;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.ProcessorTraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.Graph;
-import java.io.Serializable;
+import java.util.concurrent.Future;
/**
* This is a marker interface that denotes that the respective implementation is able to evaluate/execute/process a
@@ -31,22 +33,10 @@ import java.io.Serializable;
*/
public interface Processor {
- /**
- * A {@link Processor} description provides the necessary configuration to create a {@link Processor}.
- * This also entails {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy} creation
- * for a {@link TraversalSource}.
- *
- * @param <P> The type of {@link Processor} this description is used for.
- */
- public static interface Description<P extends Processor> extends Cloneable, Serializable {
-
- /**
- * Add respective {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies} to the
- * provided {@link TraversalSource}.
- *
- * @param traversalSource the traversal source to add processor-specific strategies to
- */
- public TraversalSource addTraversalStrategies(final TraversalSource traversalSource);
- }
+ public Configuration configuration();
+
+ public ProcessorTraversalStrategy<? extends Processor> getProcessorTraversalStrategy();
+
+ public Future submit(final Graph graph);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actors.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actors.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actors.java
deleted file mode 100644
index bba7674..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/Actors.java
+++ /dev/null
@@ -1,80 +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;
-
-import org.apache.tinkerpop.gremlin.process.Processor;
-import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class Actors implements Processor.Description<GraphActors> {
-
- private Class<? extends GraphActors> graphActorsClass;
- private int workers = 1;
-
- private Actors(final Class<? extends GraphActors> graphActorsClass) {
- this.graphActorsClass = graphActorsClass;
- }
-
- public static Actors of(final Class<? extends GraphActors> graphActorsClass) {
- return new Actors(graphActorsClass);
- }
-
- public Actors graphActors(final Class<? extends GraphActors> graphActorsClass) {
- final Actors clone = this.clone();
- clone.graphActorsClass = graphActorsClass;
- return clone;
- }
-
- public Actors workers(final int workers) {
- final Actors clone = this.clone();
- clone.workers = workers;
- return clone;
- }
-
- public Class<? extends GraphActors> getGraphActorsClass() {
- return this.graphActorsClass;
- }
-
- public int getWorkers() {
- return this.workers;
- }
-
-
- @Override
- public String toString() {
- return this.graphActorsClass.getSimpleName().toLowerCase();
- }
-
- public Actors clone() {
- try {
- return (Actors) super.clone();
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public TraversalSource addTraversalStrategies(final TraversalSource traversalSource) {
- return traversalSource.withStrategies(new ActorProgramStrategy(this));
- }
-}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/GraphActors.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/GraphActors.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/GraphActors.java
index 0cc2790..63804ab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/GraphActors.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/GraphActors.java
@@ -19,8 +19,13 @@
package org.apache.tinkerpop.gremlin.process.actor;
+import org.apache.commons.configuration.BaseConfiguration;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.Processor;
-import org.apache.tinkerpop.gremlin.structure.Partitioner;
+import org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration.ActorProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.ProcessorTraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import java.util.concurrent.Future;
@@ -32,6 +37,9 @@ import java.util.concurrent.Future;
*/
public interface GraphActors<R> extends Processor {
+ public static final String GRAPH_ACTORS = "gremlin.graphActors";
+ public static final String GRAPH_ACTORS_WORKERS = "gremlin.graphActors.workers";
+
/**
* Provide the {@link ActorProgram} that the GraphActors will execute.
*
@@ -41,19 +49,40 @@ public interface GraphActors<R> extends Processor {
public GraphActors<R> program(final ActorProgram<R> program);
/**
- * Provide the {@link Partitioner} that the GraphActors will execute over.
- * Typically, there will be a single {@link org.apache.tinkerpop.gremlin.process.actor.Actor.Worker}
- * for each {@link org.apache.tinkerpop.gremlin.structure.Partition} in the partitioner.
+ * Specify the number of workers per {@link Graph} {@link org.apache.tinkerpop.gremlin.structure.Partition}.
*
- * @param partitioner the partitioner defining the data partitions
- * @return the updated GraphActors with newly defined partitioner
+ * @param workers the number of workers per partition
+ * @return the updated GraphActors with newly defined workers
*/
- public GraphActors<R> partitioner(final Partitioner partitioner);
+ public GraphActors<R> workers(final int workers);
/**
* Submit the {@link ActorProgram} for execution by the {@link GraphActors}.
*
* @return a {@link Future} denoting a reference to the asynchronous computation's result
*/
- public Future<R> submit();
+ public Future<R> submit(final Graph graph);
+
+ /**
+ * Returns an {@link ActorProgramStrategy} which enables a {@link Traversal} to execute on {@link GraphActors}.
+ *
+ * @return a traversal strategy capable of executing traversals on a GraphActors
+ */
+ public default ProcessorTraversalStrategy<GraphActors> getProcessorTraversalStrategy() {
+ return new ActorProgramStrategy(this);
+ }
+
+ public static <A extends GraphActors> A open(final Configuration configuration) {
+ try {
+ return (A) Class.forName(configuration.getString(GRAPH_ACTORS)).getMethod("open", Configuration.class).invoke(null, configuration);
+ } catch (final Exception e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ public static <A extends GraphActors> A open(final Class<A> graphActorsClass) {
+ final BaseConfiguration configuration = new BaseConfiguration();
+ configuration.setProperty(GRAPH_ACTORS, graphActorsClass.getCanonicalName());
+ return GraphActors.open(configuration);
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/TraversalActorProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/TraversalActorProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/TraversalActorProgramStep.java
index 5d643af..e4520aa 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/TraversalActorProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/actor/traversal/step/map/TraversalActorProgramStep.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.actor.traversal.step.map;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.actor.ActorProgram;
import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
import org.apache.tinkerpop.gremlin.process.actor.traversal.TraversalActorProgram;
@@ -27,7 +28,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Partitioner;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import java.util.NoSuchElementException;
@@ -37,22 +37,16 @@ import java.util.NoSuchElementException;
*/
public final class TraversalActorProgramStep<S, E> extends AbstractStep<E, E> {
- private final Class<? extends GraphActors> actorsClass;
+
private final Traversal.Admin<S, E> actorsTraversal;
- private final Partitioner partitioner;
+ private final Configuration graphActorsConfiguration;
private boolean first = true;
- public TraversalActorProgramStep(final Traversal.Admin<?, ?> traversal, final Class<? extends GraphActors> actorsClass, final Partitioner partitioner) {
+ public TraversalActorProgramStep(final Traversal.Admin<?, ?> traversal, final Configuration graphActorsConfiguration) {
super(traversal);
- this.actorsClass = actorsClass;
+ this.graphActorsConfiguration = graphActorsConfiguration;
this.actorsTraversal = (Traversal.Admin) traversal.clone();
this.actorsTraversal.setParent(EmptyStep.instance());
- this.partitioner = partitioner;
- }
-
- @Override
- public String toString() {
- return StringFactory.stepString(this, this.actorsTraversal);
}
@Override
@@ -60,14 +54,20 @@ public final class TraversalActorProgramStep<S, E> extends AbstractStep<E, E> {
if (this.first) {
this.first = false;
try {
- final GraphActors<TraverserSet<E>> graphActors = this.actorsClass.newInstance();
+ final GraphActors<TraverserSet<E>> graphActors = GraphActors.open(this.graphActorsConfiguration);
final ActorProgram<TraverserSet<E>> actorProgram = new TraversalActorProgram<>(this.actorsTraversal);
- graphActors.partitioner(this.partitioner).program(actorProgram).submit().get().forEach(this.starts::add);
+ graphActors.program(actorProgram).submit(this.getTraversal().getGraph().get()).get().forEach(this.starts::add);
} catch (final Exception e) {
throw new IllegalStateException(e.getMessage(), e);
}
}
return this.starts.next();
}
+
+ @Override
+ public String toString() {
+ return StringFactory.stepString(this, this.actorsTraversal);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/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
index 81bcda6..7e713de 100644
--- 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
@@ -20,8 +20,6 @@
package org.apache.tinkerpop.gremlin.process.actor.traversal.strategy.decoration;
import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.MapConfiguration;
-import org.apache.tinkerpop.gremlin.process.actor.Actors;
import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
import org.apache.tinkerpop.gremlin.process.actor.traversal.step.map.TraversalActorProgramStep;
import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
@@ -29,34 +27,25 @@ 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.ProcessorTraversalStrategy;
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.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.structure.util.partitioner.HashPartitioner;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
import java.util.Set;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
public final class ActorProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy>
- implements TraversalStrategy.DecorationStrategy {
+ implements TraversalStrategy.DecorationStrategy, ProcessorTraversalStrategy<GraphActors> {
private static final Set<Class<? extends DecorationStrategy>> PRIORS = Collections.singleton(RemoteStrategy.class);
- private final Actors actors;
+ private final Configuration graphActorsConfiguration;
- private ActorProgramStrategy() {
- this(null);
- }
-
- public ActorProgramStrategy(final Actors actors) {
- this.actors = actors;
+ public ActorProgramStrategy(final GraphActors graphActors) {
+ this.graphActorsConfiguration = graphActors.configuration();
}
@Override
@@ -66,10 +55,7 @@ public final class ActorProgramStrategy extends AbstractTraversalStrategy<Traver
if (!(traversal.getParent() instanceof EmptyStep))
return;
- final TraversalActorProgramStep<?, ?> actorStep = new TraversalActorProgramStep<>(traversal, this.actors.getGraphActorsClass(),
- 1 == this.actors.getWorkers() ?
- traversal.getGraph().orElse(EmptyGraph.instance()).partitioner() :
- new HashPartitioner(traversal.getGraph().orElse(EmptyGraph.instance()).partitioner(), this.actors.getWorkers()));
+ final TraversalActorProgramStep<?, ?> actorStep = new TraversalActorProgramStep<>(traversal, this.graphActorsConfiguration);
TraversalHelper.removeAllSteps(traversal);
traversal.addStep(actorStep);
@@ -86,64 +72,22 @@ public final class ActorProgramStrategy extends AbstractTraversalStrategy<Traver
////////////////////////////////////////////////////////////
- public static final String GRAPH_ACTORS = "graphActors";
- public static final String WORKERS = "workers";
-
@Override
public Configuration getConfiguration() {
- final Map<String, Object> map = new HashMap<>();
- map.put(GRAPH_ACTORS, this.actors.getGraphActorsClass().getCanonicalName());
- map.put(WORKERS, this.actors.getWorkers());
- return new MapConfiguration(map);
+ return this.graphActorsConfiguration;
}
public static ActorProgramStrategy create(final Configuration configuration) {
try {
- final ActorProgramStrategy.Builder builder = ActorProgramStrategy.build();
- for (final String key : (List<String>) IteratorUtils.asList(configuration.getKeys())) {
- if (key.equals(GRAPH_ACTORS))
- builder.graphComputer((Class) Class.forName(configuration.getString(key)));
- else if (key.equals(WORKERS))
- builder.workers(configuration.getInt(key));
- else
- throw new IllegalArgumentException("The provided key is unknown: " + key);
- }
- return builder.create();
- } catch (final ClassNotFoundException e) {
+ return new ActorProgramStrategy(GraphActors.open(configuration));
+ } catch (final Exception e) {
throw new IllegalArgumentException(e.getMessage(), e);
}
}
- public static ActorProgramStrategy.Builder build() {
- return new ActorProgramStrategy.Builder();
- }
-
- public final static class Builder {
-
- private Actors actors = Actors.of(GraphActors.class);
-
- private Builder() {
- }
-
- public Builder computer(final Actors actors) {
- this.actors = actors;
- return this;
- }
-
- public Builder graphComputer(final Class<? extends GraphActors> graphActorsClass) {
- this.actors = this.actors.graphActors(graphActorsClass);
- return this;
- }
-
-
- public Builder workers(final int workers) {
- this.actors = this.actors.workers(workers);
- return this;
- }
-
- public ActorProgramStrategy create() {
- return new ActorProgramStrategy(this.actors);
- }
+ @Override
+ public GraphActors getProcessor() {
+ return GraphActors.open(this.graphActorsConfiguration);
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Computer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Computer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Computer.java
index 96d5e7c..0e15ef7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Computer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/Computer.java
@@ -19,25 +19,31 @@
package org.apache.tinkerpop.gremlin.process.computer;
-import org.apache.tinkerpop.gremlin.process.Processor;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.MapConfiguration;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
+import java.io.Serializable;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
import java.util.function.Function;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.EDGES;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.GRAPH_COMPUTER;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.PERSIST;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.RESULT;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.VERTICES;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.WORKERS;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @deprecated As of release 3.3.0, replaced by use of {@link GraphComputer#open(Configuration)}.
*/
-public final class Computer implements Processor.Description<GraphComputer>, Function<Graph, GraphComputer> {
+@Deprecated
+public final class Computer implements Function<Graph, GraphComputer>, Serializable, Cloneable {
private Class<? extends GraphComputer> graphComputerClass = GraphComputer.class;
private Map<String, Object> configuration = new HashMap<>();
@@ -47,35 +53,18 @@ public final class Computer implements Processor.Description<GraphComputer>, Fun
private Traversal<Vertex, Vertex> vertices = null;
private Traversal<Vertex, Edge> edges = null;
- private Computer(final Class<? extends GraphComputer> graphComputerClass) {
- this.graphComputerClass = graphComputerClass;
- }
-
private Computer() {
}
- public static Computer of() {
- return new Computer(GraphComputer.class);
- }
-
- public static Computer of(final Class<? extends GraphComputer> graphComputerClass) {
- return new Computer(graphComputerClass);
+ private Computer(final Class<? extends GraphComputer> graphComputerClass) {
+ this.graphComputerClass = graphComputerClass;
}
-
- /**
- * @deprecated As of release 3.3.0, replaced by using {@link Computer#of()}.
- */
- @Deprecated
public static Computer compute() {
return new Computer(GraphComputer.class);
}
- /**
- * @deprecated As of release 3.3.0, replaced by using {@link Computer#of(Class)}.
- */
- @Deprecated
public static Computer compute(final Class<? extends GraphComputer> graphComputerClass) {
return new Computer(graphComputerClass);
}
@@ -143,7 +132,7 @@ public final class Computer implements Processor.Description<GraphComputer>, Fun
if (null != this.vertices)
computer = computer.vertices(this.vertices);
if (null != this.edges)
- computer.edges(this.edges);
+ computer = computer.edges(this.edges);
return computer;
}
@@ -167,9 +156,21 @@ public final class Computer implements Processor.Description<GraphComputer>, Fun
}
}
- @Override
- public TraversalSource addTraversalStrategies(final TraversalSource traversalSource) {
- return traversalSource.withStrategies(new VertexProgramStrategy(this));
+ public Configuration configuration() {
+ final Map<String, Object> map = new HashMap<>();
+ map.put(GRAPH_COMPUTER, this.graphComputerClass.getCanonicalName());
+ if (-1 != this.workers)
+ map.put(WORKERS, this.workers);
+ if (null != this.persist)
+ map.put(PERSIST, this.persist.name());
+ if (null != this.resultGraph)
+ map.put(RESULT, this.resultGraph.name());
+ if (null != this.vertices)
+ map.put(VERTICES, this.vertices);
+ if (null != this.edges)
+ map.put(EDGES, this.edges);
+ map.putAll(this.getConfiguration());
+ return new MapConfiguration(map);
}
/////////////////
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputer.java
index d63b9e8..25074fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputer.java
@@ -18,9 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.process.computer;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.Processor;
+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.strategy.ProcessorTraversalStrategy;
import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.concurrent.Future;
@@ -35,6 +39,13 @@ import java.util.concurrent.Future;
*/
public interface GraphComputer extends Processor {
+ public static final String GRAPH_COMPUTER = "gremlin.graphComputer";
+ public static final String WORKERS = "gremlin.graphComputer.workers";
+ public static final String PERSIST = "gremlin.graphComputer.persist";
+ public static final String RESULT = "gremlin.graphComputer.result";
+ public static final String VERTICES = "gremlin.graphComputer.vertices";
+ public static final String EDGES = "gremlin.graphComputer.edges";
+
public enum ResultGraph {
/**
* When the computation is complete, the {@link org.apache.tinkerpop.gremlin.structure.Graph} in {@link ComputerResult} is the original graph that spawned the graph computer.
@@ -147,12 +158,50 @@ public interface GraphComputer extends Processor {
}
/**
+ * Get the configuration associated with the {@link GraphComputer}
+ *
+ * @return the GraphComputer's configuration
+ */
+ public Configuration configuration();
+
+ /**
+ * Returns a {@link VertexProgramStrategy} which enables a {@link Traversal} to execute on {@link GraphComputer}.
+ *
+ * @return a traversal strategy capable of executing traversals on a GraphComputer
+ */
+ public default ProcessorTraversalStrategy<GraphComputer> getProcessorTraversalStrategy() {
+ return new VertexProgramStrategy(this);
+ }
+
+ public static <A extends GraphComputer> A open(final Configuration configuration) {
+ try {
+ return (A) Class.forName(configuration.getString(GRAPH_COMPUTER)).getMethod("open", Configuration.class).invoke(null, configuration);
+ } catch (final Exception e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
+ /**
* Submit the {@link VertexProgram} and the set of {@link MapReduce} jobs for execution by the {@link GraphComputer}.
*
- * @return a {@link Future} denoting a reference to the asynchronous computation and where to get the {@link org.apache.tinkerpop.gremlin.process.computer.util.DefaultComputerResult} when its is complete.
+ * @return a {@link Future} denoting a reference to the computational result
+ * @deprecated As of release 3.3.0, replaced by use of {@link GraphComputer#submit(Graph)}.
*/
+ @Deprecated
public Future<ComputerResult> submit();
+ /**
+ * Submit the configured {@link GraphComputer} to the provided {@link Graph}.
+ * That is, execute the {@link VertexProgram} over the {@link Graph}.
+ *
+ * @param graph the graph to execute the vertex program over
+ * @return a {@link Future} denoting a reference to the computational result
+ */
+ @Override
+ public default Future<ComputerResult> submit(final Graph graph) {
+ return this.submit();
+ }
+
public default Features features() {
return new Features() {
};
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
index ac2e75a..bd6892f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
@@ -19,7 +19,9 @@
package org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration;
+import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
+import org.apache.commons.configuration.ConfigurationConverter;
import org.apache.commons.configuration.MapConfiguration;
import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
@@ -30,41 +32,50 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Traversa
import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
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.ProcessorTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
+import static org.apache.tinkerpop.gremlin.process.computer.GraphComputer.GRAPH_COMPUTER;
+
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-public final class VertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+public final class VertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy, ProcessorTraversalStrategy<GraphComputer> {
- private static final VertexProgramStrategy INSTANCE = new VertexProgramStrategy(Computer.of());
+ private static final VertexProgramStrategy INSTANCE = new VertexProgramStrategy(Computer.compute());
- private final Computer computer;
+ private final Map<String, Object> graphComputerConfiguration;
private VertexProgramStrategy() {
- this(null);
+ this(new BaseConfiguration());
+ }
+
+ private VertexProgramStrategy(final Configuration configuration) {
+ this.graphComputerConfiguration = new HashMap<>((Map) ConfigurationConverter.getMap(configuration));
+ if (!this.graphComputerConfiguration.containsKey(GRAPH_COMPUTER))
+ this.graphComputerConfiguration.put(GRAPH_COMPUTER, GraphComputer.class.getCanonicalName());
}
public VertexProgramStrategy(final Computer computer) {
- this.computer = computer;
+ this(computer.configuration());
+ }
+
+ public VertexProgramStrategy(final GraphComputer graphComputer) {
+ this(graphComputer.configuration());
}
@Override
@@ -133,7 +144,7 @@ public final class VertexProgramStrategy extends AbstractTraversalStrategy<Trave
traversal.addStep(new ComputerResultStep<>(traversal));
}
// all vertex computing steps needs the graph computer function
- traversal.getSteps().stream().filter(step -> step instanceof VertexComputing).forEach(step -> ((VertexComputing) step).setComputer(this.computer));
+ traversal.getSteps().stream().filter(step -> step instanceof VertexComputing).forEach(step -> ((VertexComputing) step).setComputer(this.createComputer()));
}
private static Step<?, ?> getFirstLegalOLAPStep(Step<?, ?> currentStep) {
@@ -156,23 +167,29 @@ public final class VertexProgramStrategy extends AbstractTraversalStrategy<Trave
return EmptyStep.instance();
}
- public static Optional<Computer> getComputer(final TraversalStrategies strategies) {
- final Optional<TraversalStrategy<?>> optional = strategies.toList().stream().filter(strategy -> strategy instanceof VertexProgramStrategy).findAny();
- return optional.isPresent() ? Optional.of(((VertexProgramStrategy) optional.get()).computer) : Optional.empty();
- }
-
- public void addGraphComputerStrategies(final TraversalSource traversalSource) {
- Class<? extends GraphComputer> graphComputerClass;
- if (this.computer.getGraphComputerClass().equals(GraphComputer.class)) {
- try {
- graphComputerClass = this.computer.apply(traversalSource.getGraph()).getClass();
- } catch (final Exception e) {
- graphComputerClass = GraphComputer.class;
+ private final Computer createComputer() {
+ try {
+ Computer computer = Computer.compute();
+ for (final String key : this.graphComputerConfiguration.keySet()) {
+ if (key.equals(GRAPH_COMPUTER))
+ computer = computer.graphComputer((Class) Class.forName((String) this.graphComputerConfiguration.get(key)));
+ else if (key.equals(GraphComputer.WORKERS))
+ computer = computer.workers((int) this.graphComputerConfiguration.get(key));
+ else if (key.equals(GraphComputer.PERSIST))
+ computer = computer.persist(GraphComputer.Persist.valueOf((String) this.graphComputerConfiguration.get(key)));
+ else if (key.equals(GraphComputer.RESULT))
+ computer = computer.result(GraphComputer.ResultGraph.valueOf((String) this.graphComputerConfiguration.get(key)));
+ else if (key.equals(GraphComputer.VERTICES))
+ computer = computer.vertices((Traversal) this.graphComputerConfiguration.get(key));
+ else if (key.equals(GraphComputer.EDGES))
+ computer = computer.edges((Traversal) this.graphComputerConfiguration.get(key));
+ else
+ computer = computer.configure(key, this.graphComputerConfiguration.get(key));
}
- } else
- graphComputerClass = this.computer.getGraphComputerClass();
- final List<TraversalStrategy<?>> graphComputerStrategies = TraversalStrategies.GlobalCache.getStrategies(graphComputerClass).toList();
- traversalSource.getStrategies().addStrategies(graphComputerStrategies.toArray(new TraversalStrategy[graphComputerStrategies.size()]));
+ return computer;
+ } catch (final ClassNotFoundException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
}
public static VertexProgramStrategy instance() {
@@ -181,60 +198,40 @@ public final class VertexProgramStrategy extends AbstractTraversalStrategy<Trave
////////////////////////////////////////////////////////////
- public static final String GRAPH_COMPUTER = "graphComputer";
- public static final String WORKERS = "workers";
- public static final String PERSIST = "persist";
- public static final String RESULT = "result";
- public static final String VERTICES = "vertices";
- public static final String EDGES = "edges";
- @Override
- public Configuration getConfiguration() {
- final Map<String, Object> map = new HashMap<>();
- map.put(GRAPH_COMPUTER, this.computer.getGraphComputerClass().getCanonicalName());
- if (-1 != this.computer.getWorkers())
- map.put(WORKERS, this.computer.getWorkers());
- if (null != this.computer.getPersist())
- map.put(PERSIST, this.computer.getPersist().name());
- if (null != this.computer.getResultGraph())
- map.put(RESULT, this.computer.getResultGraph().name());
- if (null != this.computer.getVertices())
- map.put(VERTICES, this.computer.getVertices());
- if (null != this.computer.getEdges())
- map.put(EDGES, this.computer.getEdges());
- map.putAll(this.computer.getConfiguration());
- return new MapConfiguration(map);
+ public static VertexProgramStrategy create(final Configuration configuration) {
+ return new VertexProgramStrategy(configuration);
}
- public static VertexProgramStrategy create(final Configuration configuration) {
- try {
- final VertexProgramStrategy.Builder builder = VertexProgramStrategy.build();
- for (final String key : (List<String>) IteratorUtils.asList(configuration.getKeys())) {
- if (key.equals(GRAPH_COMPUTER))
- builder.graphComputer((Class) Class.forName(configuration.getString(key)));
- else if (key.equals(WORKERS))
- builder.workers(configuration.getInt(key));
- else if (key.equals(PERSIST))
- builder.persist(GraphComputer.Persist.valueOf(configuration.getString(key)));
- else if (key.equals(RESULT))
- builder.result(GraphComputer.ResultGraph.valueOf(configuration.getString(key)));
- else if (key.equals(VERTICES))
- builder.vertices((Traversal) configuration.getProperty(key));
- else if (key.equals(EDGES))
- builder.edges((Traversal) configuration.getProperty(key));
- else
- builder.configure(key, configuration.getProperty(key));
- }
- return builder.create();
- } catch (final ClassNotFoundException e) {
- throw new IllegalArgumentException(e.getMessage(), e);
- }
+ @Override
+ public Configuration getConfiguration() {
+ return new MapConfiguration(this.graphComputerConfiguration);
}
+ @Deprecated
public static Builder build() {
return new Builder();
}
+ @Override
+ public GraphComputer getProcessor() {
+ if (GraphComputer.class.getCanonicalName().equals(this.graphComputerConfiguration.get(GRAPH_COMPUTER)))
+ throw new IllegalStateException("This is an artifact of using the older Computer builder model.");
+ return GraphComputer.open(new MapConfiguration(this.graphComputerConfiguration));
+ }
+
+ @Deprecated
+ public Class<? extends GraphComputer> getGraphComputerClassHistoric(final Graph graph) {
+ try {
+ final GraphComputer graphComputer = graph.compute();
+ this.graphComputerConfiguration.put(GRAPH_COMPUTER, graphComputer.getClass().getCanonicalName());
+ return graphComputer.getClass();
+ } catch (final Exception e) {
+ return GraphComputer.class;
+ }
+ }
+
+ @Deprecated
public final static class Builder {
private Computer computer = Computer.compute();
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
index 20926fc..02894a3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.ProcessorTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SackStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SideEffectStrategy;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -32,6 +33,7 @@ import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
import java.io.Serializable;
import java.lang.reflect.Constructor;
+import java.util.List;
import java.util.Optional;
import java.util.function.BinaryOperator;
import java.util.function.Supplier;
@@ -109,8 +111,17 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
clone.getStrategies().addStrategies(traversalStrategies);
clone.getBytecode().addSource(TraversalSource.Symbols.withStrategies, traversalStrategies);
for (final TraversalStrategy traversalStrategy : traversalStrategies) {
- if (traversalStrategy instanceof VertexProgramStrategy) {
- ((VertexProgramStrategy) traversalStrategy).addGraphComputerStrategies(clone); // TODO: this is not generalized
+ if (traversalStrategy instanceof ProcessorTraversalStrategy) {
+ List<TraversalStrategy<?>> processorStrategies;
+ try {
+ final Class<? extends Processor> processorClass = ((ProcessorTraversalStrategy<?>) traversalStrategy).getProcessor().getClass();
+ processorStrategies = TraversalStrategies.GlobalCache.getStrategies(processorClass).toList();
+ } catch (final Exception e) {
+ // this is an issue due to the historic Computer way in which VertexProgramStrategies were created
+ // when (deprecated) Computer goes away, this try/catch block can be removed
+ processorStrategies = TraversalStrategies.GlobalCache.getStrategies(((VertexProgramStrategy) traversalStrategy).getGraphComputerClassHistoric(clone.getGraph())).toList();
+ }
+ clone.getStrategies().addStrategies(processorStrategies.toArray(new TraversalStrategy[processorStrategies.size()]));
}
}
return clone;
@@ -131,13 +142,13 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
}
/**
- * Define the type of {@link Processor} that will evaluate all subsequent {@link Traversal}s spawned from this source.
+ * Provide the {@link Processor} that will be used to evaluate all subsequent {@link Traversal}s spawned from this source.
*
* @param processor the description of the processor to use
* @return a new traversal source with updated strategies
*/
- public default TraversalSource withProcessor(final Processor.Description processor) {
- return processor.addTraversalStrategies(this.clone());
+ public default TraversalSource withProcessor(final Processor processor) {
+ return this.withStrategies((TraversalStrategy) processor.getProcessorTraversalStrategy());
}
/**
@@ -159,7 +170,9 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
*
* @param computer a builder to generate a graph computer from the graph
* @return a new traversal source with updated strategies
+ * @deprecated As of release 3.3.0, replaced by {@link TraversalSource#withProcessor(Processor)}.
*/
+ @Deprecated
public default TraversalSource withComputer(final Computer computer) {
return this.withStrategies(new VertexProgramStrategy(computer));
}
@@ -170,9 +183,11 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
*
* @param graphComputerClass the graph computer class
* @return a new traversal source with updated strategies
+ * @deprecated As of release 3.3.0, replaced by {@link TraversalSource#withProcessor(Processor)}.
*/
+ @Deprecated
public default TraversalSource withComputer(final Class<? extends GraphComputer> graphComputerClass) {
- return this.withStrategies(new VertexProgramStrategy(Computer.of(graphComputerClass)));
+ return this.withStrategies(new VertexProgramStrategy(Computer.compute(graphComputerClass)));
}
/**
@@ -180,9 +195,11 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
* This adds a {@link VertexProgramStrategy} to the strategies.
*
* @return a new traversal source with updated strategies
+ * @deprecated As of release 3.3.0, replaced by {@link TraversalSource#withProcessor(Processor)}.
*/
+ @Deprecated
public default TraversalSource withComputer() {
- return this.withStrategies(new VertexProgramStrategy(Computer.of()));
+ return this.withStrategies(new VertexProgramStrategy(Computer.compute()));
}
/**
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/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 015df70..96dae61 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
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal;
+import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
@@ -197,7 +198,8 @@ public interface TraversalStrategies extends Serializable, Cloneable {
public static final class GlobalCache {
private static final Map<Class<? extends Graph>, TraversalStrategies> GRAPH_CACHE = new HashMap<>();
- private static final Map<Class<? extends GraphComputer>, TraversalStrategies> GRAPH_COMPUTER_CACHE = new HashMap<>();
+ private static final Map<Class<? extends GraphComputer>, TraversalStrategies> COMPUTER_CACHE = new HashMap<>();
+ private static final Map<Class<? extends GraphActors>, TraversalStrategies> ACTORS_CACHE = new HashMap<>();
static {
final TraversalStrategies graphStrategies = new DefaultTraversalStrategies();
@@ -225,37 +227,47 @@ public interface TraversalStrategies extends Serializable, Cloneable {
OrderLimitStrategy.instance(),
PathProcessorStrategy.instance(),
ComputerVerificationStrategy.instance());
- GRAPH_COMPUTER_CACHE.put(GraphComputer.class, graphComputerStrategies);
+ COMPUTER_CACHE.put(GraphComputer.class, graphComputerStrategies);
+
+ /////////////////////
+
+ final TraversalStrategies graphActorsStrategies = new DefaultTraversalStrategies();
+ ACTORS_CACHE.put(GraphActors.class, graphActorsStrategies);
}
- public static void registerStrategies(final Class graphOrGraphComputerClass, final TraversalStrategies traversalStrategies) {
- if (Graph.class.isAssignableFrom(graphOrGraphComputerClass))
- GRAPH_CACHE.put(graphOrGraphComputerClass, traversalStrategies);
- else if (GraphComputer.class.isAssignableFrom(graphOrGraphComputerClass))
- GRAPH_COMPUTER_CACHE.put(graphOrGraphComputerClass, traversalStrategies);
+ public static void registerStrategies(final Class graphOrProcessorClass, final TraversalStrategies traversalStrategies) {
+ if (Graph.class.isAssignableFrom(graphOrProcessorClass))
+ GRAPH_CACHE.put(graphOrProcessorClass, traversalStrategies);
+ else if (GraphComputer.class.isAssignableFrom(graphOrProcessorClass))
+ COMPUTER_CACHE.put(graphOrProcessorClass, traversalStrategies);
+ else if (GraphActors.class.isAssignableFrom(graphOrProcessorClass))
+ ACTORS_CACHE.put(graphOrProcessorClass, traversalStrategies);
else
- throw new IllegalArgumentException("The TraversalStrategies.GlobalCache only supports Graph and GraphComputer strategy caching: " + graphOrGraphComputerClass.getCanonicalName());
+ throw new IllegalArgumentException("The TraversalStrategies.GlobalCache only supports Graph, GraphComputer, and GraphActors strategy caching: " + graphOrProcessorClass.getCanonicalName());
}
- public static TraversalStrategies getStrategies(final Class graphOrGraphComputerClass) {
+ public static TraversalStrategies getStrategies(final Class graphOrProcessorClass) {
try {
// be sure to load the class so that its static{} traversal strategy registration component is loaded.
// this is more important for GraphComputer classes as they are typically not instantiated prior to strategy usage like Graph classes.
- final String graphComputerClassName = null != graphOrGraphComputerClass.getDeclaringClass() ?
- graphOrGraphComputerClass.getCanonicalName().replace("." + graphOrGraphComputerClass.getSimpleName(), "$" + graphOrGraphComputerClass.getSimpleName()) :
- graphOrGraphComputerClass.getCanonicalName();
+ final String graphComputerClassName = null != graphOrProcessorClass.getDeclaringClass() ?
+ graphOrProcessorClass.getCanonicalName().replace("." + graphOrProcessorClass.getSimpleName(), "$" + graphOrProcessorClass.getSimpleName()) :
+ graphOrProcessorClass.getCanonicalName();
Class.forName(graphComputerClassName);
} catch (final ClassNotFoundException e) {
throw new IllegalStateException(e.getMessage(), e);
}
- if (Graph.class.isAssignableFrom(graphOrGraphComputerClass)) {
- final TraversalStrategies traversalStrategies = GRAPH_CACHE.get(graphOrGraphComputerClass);
+ if (Graph.class.isAssignableFrom(graphOrProcessorClass)) {
+ final TraversalStrategies traversalStrategies = GRAPH_CACHE.get(graphOrProcessorClass);
return null == traversalStrategies ? GRAPH_CACHE.get(Graph.class) : traversalStrategies;
- } else if (GraphComputer.class.isAssignableFrom(graphOrGraphComputerClass)) {
- final TraversalStrategies traversalStrategies = GRAPH_COMPUTER_CACHE.get(graphOrGraphComputerClass);
- return null == traversalStrategies ? GRAPH_COMPUTER_CACHE.get(GraphComputer.class) : traversalStrategies;
+ } else if (GraphComputer.class.isAssignableFrom(graphOrProcessorClass)) {
+ final TraversalStrategies traversalStrategies = COMPUTER_CACHE.get(graphOrProcessorClass);
+ return null == traversalStrategies ? COMPUTER_CACHE.get(GraphComputer.class) : traversalStrategies;
+ } else if (GraphActors.class.isAssignableFrom(graphOrProcessorClass)) {
+ final TraversalStrategies traversalStrategies = ACTORS_CACHE.get(graphOrProcessorClass);
+ return null == traversalStrategies ? ACTORS_CACHE.get(GraphActors.class) : traversalStrategies;
} else {
- throw new IllegalArgumentException("The TraversalStrategies.GlobalCache only supports Graph and GraphComputer strategy caching: " + graphOrGraphComputerClass.getCanonicalName());
+ throw new IllegalArgumentException("The TraversalStrategies.GlobalCache only supports Graph, GraphComputer, and GraphActors strategy caching: " + graphOrProcessorClass.getCanonicalName());
}
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
index d6facb7..bd23c65 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -134,7 +134,7 @@ public class GraphTraversalSource implements TraversalSource {
}
@Override
- public GraphTraversalSource withProcessor(final Processor.Description processor) {
+ public GraphTraversalSource withProcessor(final Processor processor) {
return (GraphTraversalSource) TraversalSource.super.withProcessor(processor);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/ProcessorTraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/ProcessorTraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/ProcessorTraversalStrategy.java
new file mode 100644
index 0000000..30e6caf
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/ProcessorTraversalStrategy.java
@@ -0,0 +1,44 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.Processor;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface ProcessorTraversalStrategy<P extends Processor> {
+
+ public P getProcessor();
+
+ public static <P extends Processor> Optional<P> getProcessor(final TraversalStrategies strategies) {
+ for (final TraversalStrategy strategy : strategies.toList()) {
+ if (strategy instanceof ProcessorTraversalStrategy)
+ return Optional.of(((ProcessorTraversalStrategy<P>) strategy).getProcessor());
+ }
+ return Optional.empty();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index 553ebe3..61d9551 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -18,14 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.structure.util;
+import org.apache.tinkerpop.gremlin.process.Processor;
import org.apache.tinkerpop.gremlin.process.actor.GraphActors;
-import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
import org.apache.tinkerpop.gremlin.process.computer.Memory;
import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Translator;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -33,6 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.ProcessorTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -49,7 +49,6 @@ import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -156,8 +155,8 @@ public final class StringFactory {
public static String traversalSourceString(final TraversalSource traversalSource) {
final String graphString = traversalSource.getGraph().toString();
- final Optional<Computer> optional = VertexProgramStrategy.getComputer(traversalSource.getStrategies());
- return traversalSource.getClass().getSimpleName().toLowerCase() + L_BRACKET + graphString + COMMA_SPACE + (optional.isPresent() ? optional.get().toString() : "standard") + R_BRACKET;
+ final String processorString = ProcessorTraversalStrategy.getProcessor(traversalSource.getStrategies()).map(Processor::toString).orElse("standard");
+ return traversalSource.getClass().getSimpleName().toLowerCase() + L_BRACKET + graphString + COMMA_SPACE + processorString + R_BRACKET;
}
public static String featureString(final Graph.Features features) {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
index bb58a06..c8fcc33 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
@@ -166,6 +166,11 @@ public class TraversalStrategiesTest {
}
@Override
+ public Configuration configuration() {
+ return new BaseConfiguration();
+ }
+
+ @Override
public Future<ComputerResult> submit() {
return new CompletableFuture<>();
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java
index 62ef89b..27cde58 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/BytecodeTest.java
@@ -20,8 +20,8 @@
package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.process.computer.Computer;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
-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.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
@@ -29,10 +29,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.Read
import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.junit.Ignore;
import org.junit.Test;
-import java.util.List;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
@@ -105,23 +104,23 @@ public class BytecodeTest {
public void shouldIncludeBindingsInNestedTraversals() {
final Bindings b = Bindings.instance();
final GraphTraversalSource g = EmptyGraph.instance().traversal();
- final Bytecode bytecode = g.V().in(b.of("a","created")).where(__.out(b.of("b","knows")).has("age",b.of("c",P.gt(32))).map(__.values(b.of("d","name")))).asAdmin().getBytecode();
+ final Bytecode bytecode = g.V().in(b.of("a", "created")).where(__.out(b.of("b", "knows")).has("age", b.of("c", P.gt(32))).map(__.values(b.of("d", "name")))).asAdmin().getBytecode();
assertEquals(4, bytecode.getBindings().size());
assertEquals("created", bytecode.getBindings().get("a"));
assertEquals("knows", bytecode.getBindings().get("b"));
assertEquals(P.gt(32), bytecode.getBindings().get("c"));
assertEquals("name", bytecode.getBindings().get("d"));
//
- Bytecode.Binding binding = (Bytecode.Binding)(bytecode.getStepInstructions()).get(1).getArguments()[0];
+ Bytecode.Binding binding = (Bytecode.Binding) (bytecode.getStepInstructions()).get(1).getArguments()[0];
assertEquals("a", binding.variable());
assertEquals("created", binding.value());
- binding = (Bytecode.Binding) (((Bytecode)(bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(0).getArguments()[0];
+ binding = (Bytecode.Binding) (((Bytecode) (bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(0).getArguments()[0];
assertEquals("b", binding.variable());
assertEquals("knows", binding.value());
- binding = (Bytecode.Binding) (((Bytecode)(bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(1).getArguments()[1];
+ binding = (Bytecode.Binding) (((Bytecode) (bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(1).getArguments()[1];
assertEquals("c", binding.variable());
assertEquals(P.gt(32), binding.value());
- binding = (Bytecode.Binding) (((Bytecode)(((Bytecode)(bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(0).getArguments()[0];
+ binding = (Bytecode.Binding) (((Bytecode) (((Bytecode) (bytecode.getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(2).getArguments()[0]).getStepInstructions()).get(0).getArguments()[0];
assertEquals("d", binding.variable());
assertEquals("name", binding.value());
}
@@ -141,7 +140,7 @@ public class BytecodeTest {
final GraphTraversalSource g = EmptyGraph.instance().traversal();
Bytecode bytecode = g.withComputer(Computer.compute().workers(10)).getBytecode();
assertEquals(VertexProgramStrategy.build().create(), bytecode.getSourceInstructions().get(0).getArguments()[0]);
- assertEquals(VertexProgramStrategy.build().workers(10).create().getConfiguration().getInt(VertexProgramStrategy.WORKERS),
- ((VertexProgramStrategy) bytecode.getSourceInstructions().iterator().next().getArguments()[0]).getConfiguration().getInt(VertexProgramStrategy.WORKERS));
+ assertEquals(VertexProgramStrategy.build().workers(10).create().getConfiguration().getInt(GraphComputer.WORKERS),
+ ((VertexProgramStrategy) bytecode.getSourceInstructions().iterator().next().getArguments()[0]).getConfiguration().getInt(GraphComputer.WORKERS));
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6353595e/gremlin-python/src/main/jython/gremlin_python/process/strategies.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/gremlin_python/process/strategies.py b/gremlin-python/src/main/jython/gremlin_python/process/strategies.py
index 8eb7fbd..ed8e7db 100644
--- a/gremlin-python/src/main/jython/gremlin_python/process/strategies.py
+++ b/gremlin-python/src/main/jython/gremlin_python/process/strategies.py
@@ -74,17 +74,17 @@ class VertexProgramStrategy(TraversalStrategy):
configuration=None):
TraversalStrategy.__init__(self)
if graph_computer is not None:
- self.configuration["graphComputer"] = graph_computer
+ self.configuration["gremlin.graphComputer"] = graph_computer
if workers is not None:
- self.configuration["workers"] = workers
+ self.configuration["gremlin.graphComputer.workers"] = workers
if persist is not None:
- self.configuration["persist"] = persist
+ self.configuration["gremlin.graphComputer.persist"] = persist
if result is not None:
- self.configuration["result"] = result
+ self.configuration["gremlin.graphComputer.result"] = result
if vertices is not None:
- self.configuration["vertices"] = vertices
+ self.configuration["gremlin.graphComputer.vertices"] = vertices
if edges is not None:
- self.configuration["edges"] = edges
+ self.configuration["gremlin.graphComputer.edges"] = edges
if configuration is not None:
self.configuration.update(configuration)