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 2016/10/04 16:26:19 UTC
tinkerpop git commit: added static create(Configuration) methods to
all Builder-based strategies except EventStrategy as that requires Java
objects :(. Deprecated PartitionStrategy.Builder.addReadParition() in favor
of readParitions(String...). Computer
Repository: tinkerpop
Updated Branches:
refs/heads/TINKERPOP-1455 e6e59e417 -> 95557bf3a
added static create(Configuration) methods to all Builder-based strategies except EventStrategy as that requires Java objects :(. Deprecated PartitionStrategy.Builder.addReadParition() in favor of readParitions(String...). Computer now has a Configuration-based constructor and corresponding withComputer(Object...) arguments.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/95557bf3
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/95557bf3
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/95557bf3
Branch: refs/heads/TINKERPOP-1455
Commit: 95557bf3aac279282e3f3779d68ce195bd4ca058
Parents: e6e59e4
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Oct 4 10:26:12 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Oct 4 10:26:12 2016 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 3 +
.../upgrade/release-3.2.x-incubating.asciidoc | 44 ++++++++
.../gremlin/process/computer/Computer.java | 30 +++++
.../process/traversal/TraversalSource.java | 32 ++++++
.../dsl/graph/GraphTraversalSource.java | 5 +
.../strategy/decoration/ElementIdStrategy.java | 16 ++-
.../decoration/HaltedTraverserStrategy.java | 9 ++
.../strategy/decoration/PartitionStrategy.java | 62 +++++++++--
.../strategy/decoration/SubgraphStrategy.java | 2 +-
.../gremlin/groovy/jsr223/GroovyTranslator.java | 10 +-
.../gremlin/python/jsr223/PythonTranslator.java | 7 +-
.../driver/test_driver_remote_connection.py | 6 +
.../PartitionStrategyProcessTest.java | 109 ++++++++++---------
.../process/TinkerGraphComputerProvider.java | 7 +-
.../decoration/HaltedTraverserStrategyTest.java | 5 +-
15 files changed, 269 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index dc2b03b..35ff317 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,9 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
TinkerPop 3.2.3 (Release Date: NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Added `TraversalSource.withComputer(Object...)` for better language variant support.
+* Added `PartitionStrategy.Builder.readPartitions()` and deprecated `PartitionStrategy.Builder.addPartition()`.
+* Added `TraversalSource.withStrategy(String,Object...)`/`withoutStrategy(String)` for better language variant support.
* `FilterRankStrategy` now propagates labels "right" over non-`Scoping` filters.
* Fixed a bug in `ConnectiveP` where nested equivalent connectives should be inlined.
* Fixed a bug in `IncidentToAdjacentStrategy` where `TreeStep` traversals were allowed.
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/docs/src/upgrade/release-3.2.x-incubating.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/upgrade/release-3.2.x-incubating.asciidoc b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
index 49790af..983c63e 100644
--- a/docs/src/upgrade/release-3.2.x-incubating.asciidoc
+++ b/docs/src/upgrade/release-3.2.x-incubating.asciidoc
@@ -158,6 +158,50 @@ Upgrading for Providers
Graph System Providers
^^^^^^^^^^^^^^^^^^^^^^
+Configurable Strategies
++++++++++++++++++++++++
+
+`TraversalSource.withStrategies()` and `TraversalSource.withoutStrategies()` use Java objects. In order to make strategy
+manipulation possible from Gremlin language variants like Gremlin-Python, it is important to support non-JVM-based versions
+of these methods. As such, `TraversalSource.withStrategy(String,Object...)` and `TraversalSource.withoutStrategy(String)`
+were added.
+
+If the provider has non-configurable `TraversalStrategy` classes, those classes should expose a static `instance()`-method.
+This is typical and thus, backwards compatible. However, if the provider has a `TraversalStrategy` that can be configured
+(e.g. via a `Builder`), then it should expose a static `create(Configuration)`-method, where the keys of the configuration
+are the method names of the `Builder` and the values are the method arguments. For instance, for Gremlin-Python to create
+a `SubgraphStrategy`, it does the following:
+
+[source,python]
+----
+g = Graph().traversal().withRemote(connection).
+ withStrategy('org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy',
+ 'vertices', __.hasLabel('person'),
+ 'edges', __.has('weight',gt(0.5))
+---
+
+`SubgraphStrategy.create(Configuration)`-method is defined as:
+
+[source,java]
+----
+public static SubgraphStrategy create(final Configuration configuration) {
+ final Builder builder = SubgraphStrategy.build();
+ configuration.getKeys().forEachRemaining(key -> {
+ if (key.equals("vertices") || key.equals("vertexCriterion"))
+ builder.vertices((Traversal) configuration.getProperty(key));
+ else if (key.equals("edges") || key.equals("edgeCriterion"))
+ builder.edges((Traversal) configuration.getProperty(key));
+ else if (key.equals("vertexProperties"))
+ builder.vertexProperties((Traversal) configuration.getProperty(key));
+ else
+ throw new IllegalArgumentException("The following " + SubgraphStrategy.class.getSimpleName() + " configuration is unknown: " + key + ":" + configuration.getProperty(key));
+ });
+ return builder.create();
+ }
+----
+
+See: link:https://issues.apache.org/jira/browse/TINKERPOP-1455[TINKERPOP-1455]
+
Deprecated elementNotFound
++++++++++++++++++++++++++
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/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 8fca818..fdeac0b 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,13 +19,16 @@
package org.apache.tinkerpop.gremlin.process.computer;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
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.io.Serializable;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.function.Function;
@@ -46,6 +49,33 @@ public final class Computer implements Function<Graph, GraphComputer>, Serializa
this.graphComputerClass = graphComputerClass;
}
+ public static Computer compute(final Configuration configuration) {
+ try {
+ final Computer computer = new Computer(configuration.containsKey("graphComputer") ?
+ (Class) Class.forName(configuration.getString("graphComputer")) :
+ GraphComputer.class);
+ for (final String key : (List<String>) IteratorUtils.asList(configuration.getKeys())) {
+ if (key.equals("graphComputer")) {
+ // do nothing
+ } else if (key.equals("workers"))
+ computer.workers = configuration.getInt(key);
+ else if (key.equals("persist"))
+ computer.persist = GraphComputer.Persist.valueOf(configuration.getString(key));
+ else if (key.equals("result"))
+ computer.resultGraph = GraphComputer.ResultGraph.valueOf(configuration.getString(key));
+ else if (key.equals("vertices"))
+ computer.vertices = (Traversal) configuration.getProperty(key);
+ else if (key.equals("edges"))
+ computer.edges = (Traversal) configuration.getProperty(key);
+ else
+ computer.configuration.put(key, configuration.getProperty(key));
+ }
+ return computer;
+ } catch (final ClassNotFoundException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
public static Computer compute() {
return new Computer(GraphComputer.class);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/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 8d5cf93..a31b875 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
@@ -189,6 +189,38 @@ public interface TraversalSource extends Cloneable, AutoCloseable {
}
/**
+ * Configure a {@link GraphComputer} to be used for the execution of subsequently spawned traversal.
+ *
+ * @param namedArguments key/value pair arguments where the even indices are string keys
+ * @return a new traversal source with updated strategies
+ */
+ public default TraversalSource withComputer(final Object... namedArguments) {
+ if (namedArguments.length == 1) {
+ if (namedArguments[0] instanceof Class)
+ return this.withComputer((Class<? extends GraphComputer>) namedArguments[1]);
+ else if (namedArguments[0] instanceof Computer)
+ return this.withComputer((Computer) namedArguments[1]);
+ }
+ ElementHelper.legalPropertyKeyValueArray(namedArguments);
+ final Map<String, Object> configuration = new HashMap<>();
+ for (int i = 0; i < namedArguments.length; i = i + 2) {
+ configuration.put((String) namedArguments[i], namedArguments[i + 1]);
+ }
+ final Computer computer = Computer.compute(new MapConfiguration(configuration));
+ final List<TraversalStrategy<?>> graphComputerStrategies = TraversalStrategies.GlobalCache.getStrategies(computer.apply(this.getGraph()).getClass()).toList();
+ final TraversalStrategy[] traversalStrategies = new TraversalStrategy[graphComputerStrategies.size() + 1];
+ traversalStrategies[0] = new VertexProgramStrategy(computer);
+ for (int i = 0; i < graphComputerStrategies.size(); i++) {
+ traversalStrategies[i + 1] = graphComputerStrategies.get(i);
+ }
+ ///
+ final TraversalSource clone = this.clone();
+ clone.getStrategies().addStrategies(traversalStrategies);
+ clone.getBytecode().addSource(TraversalSource.Symbols.withComputer, computer);
+ return clone;
+ }
+
+ /**
* Add a {@link Function} that will generate a {@link GraphComputer} from the {@link Graph} that will be used to execute the traversal.
* This adds a {@link VertexProgramStrategy} to the strategies.
*
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/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 bf2da7e..2bd4bdf 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
@@ -127,6 +127,11 @@ public class GraphTraversalSource implements TraversalSource {
}
@Override
+ public GraphTraversalSource withComputer(final Object... namedArguments) {
+ return (GraphTraversalSource) TraversalSource.super.withComputer(namedArguments);
+ }
+
+ @Override
public GraphTraversalSource withComputer(final Computer computer) {
return (GraphTraversalSource) TraversalSource.super.withComputer(computer);
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
index 40ac805..396de49 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -27,9 +28,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.IdStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -150,4 +151,17 @@ public final class ElementIdStrategy extends AbstractTraversalStrategy<Traversal
return new ElementIdStrategy(idPropertyKey, idMaker);
}
}
+
+ public static ElementIdStrategy create(final Configuration configuration) {
+ final ElementIdStrategy.Builder builder = ElementIdStrategy.build();
+ configuration.getKeys().forEachRemaining(key -> {
+ if (key.equals("idPropertyKey"))
+ builder.idPropertyKey((String) configuration.getProperty(key));
+ else if (key.equals("idMaker"))
+ builder.idMaker((Supplier) configuration.getProperty(key));
+ else
+ throw new IllegalArgumentException("The following " + ElementIdStrategy.class.getSimpleName() + " configuration is unknown: " + key + ":" + configuration.getProperty(key));
+ });
+ return builder.create();
+ }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
index 1a2c207..cd5119b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/HaltedTraverserStrategy.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
@@ -58,6 +59,14 @@ public final class HaltedTraverserStrategy extends AbstractTraversalStrategy<Tra
return traverser;
}
+ public static HaltedTraverserStrategy create(final Configuration configuration) {
+ try {
+ return new HaltedTraverserStrategy(Class.forName((String) configuration.getProperty("haltedTraverserFactory")));
+ } catch (final ClassNotFoundException e) {
+ throw new IllegalArgumentException(e.getMessage(), e);
+ }
+ }
+
////////////
public static HaltedTraverserStrategy detached() {
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index 58e641b..ef424c7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
+import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Parameterizing;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
@@ -33,12 +34,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartSte
import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.Parameters;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
@@ -53,6 +54,7 @@ import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
@@ -83,7 +85,7 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
this.writePartition = builder.writePartition;
this.partitionKey = builder.partitionKey;
this.readPartitions = Collections.unmodifiableSet(builder.readPartitions);
- this.includeMetaProperties = builder.includeMetaProperties;
+ this.includeMetaProperties = builder.includeMetaProperties;
}
public String getWritePartition() {
@@ -190,8 +192,8 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
}
final List<Step> stepsToInsertPropertyMutations = traversal.getSteps().stream().filter(step ->
- step instanceof AddEdgeStep || step instanceof AddVertexStep ||
- step instanceof AddVertexStartStep || (includeMetaProperties && step instanceof AddPropertyStep)
+ step instanceof AddEdgeStep || step instanceof AddVertexStep ||
+ step instanceof AddVertexStartStep || (includeMetaProperties && step instanceof AddPropertyStep)
).collect(Collectors.toList());
stepsToInsertPropertyMutations.forEach(step -> {
@@ -271,11 +273,11 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
* {@link VertexProperty} it applies a filter based on the current partitioning. If is not a
* {@link VertexProperty} the property is simply passed through.
*/
- public final class MapPropertiesFilter implements Function<Traverser<Map<String,List<Property>>>, Map<String,List<Property>>>, Serializable {
+ public final class MapPropertiesFilter implements Function<Traverser<Map<String, List<Property>>>, Map<String, List<Property>>>, Serializable {
@Override
public Map<String, List<Property>> apply(final Traverser<Map<String, List<Property>>> mapTraverser) {
- final Map<String,List<Property>> values = mapTraverser.get();
- final Map<String,List<Property>> filtered = new HashMap<>();
+ final Map<String, List<Property>> values = mapTraverser.get();
+ final Map<String, List<Property>> filtered = new HashMap<>();
// note the final filter that removes the partitionKey from the outgoing Map
values.entrySet().forEach(p -> {
@@ -302,11 +304,11 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
/**
* Takes a {@link Map} of a {@link List} of {@link Property} objects and unwraps the {@link Property#value()}.
*/
- public final class MapPropertiesConverter implements Function<Traverser<Map<String,List<Property>>>, Map<String,List<Property>>>, Serializable {
+ public final class MapPropertiesConverter implements Function<Traverser<Map<String, List<Property>>>, Map<String, List<Property>>>, Serializable {
@Override
public Map<String, List<Property>> apply(final Traverser<Map<String, List<Property>>> mapTraverser) {
- final Map<String,List<Property>> values = mapTraverser.get();
- final Map<String,List<Property>> converted = new HashMap<>();
+ final Map<String, List<Property>> values = mapTraverser.get();
+ final Map<String, List<Property>> converted = new HashMap<>();
values.entrySet().forEach(p -> {
final List l = p.getValue().stream().map(property -> property.value()).collect(Collectors.toList());
@@ -322,13 +324,31 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
}
}
+ public static PartitionStrategy create(final Configuration configuration) {
+ final PartitionStrategy.Builder builder = PartitionStrategy.build();
+ configuration.getKeys().forEachRemaining(key -> {
+ if (key.equals("includeMetaProperties"))
+ builder.includeMetaProperties((Boolean) configuration.getProperty(key));
+ else if (key.equals("writePartition"))
+ builder.writePartition((String) configuration.getProperty(key));
+ else if (key.equals("partitionKey"))
+ builder.partitionKey((String) configuration.getProperty(key));
+ else if (key.equals("readPartitions"))
+ builder.readPartitions((List<String>) configuration.getProperty(key));
+ else
+ throw new IllegalArgumentException("The following " + PartitionStrategy.class.getSimpleName() + " configuration is unknown: " + key + ":" + configuration.getProperty(key));
+ });
+ return builder.create();
+ }
+
public final static class Builder {
private String writePartition;
private String partitionKey;
private Set<String> readPartitions = new HashSet<>();
private boolean includeMetaProperties = false;
- Builder() { }
+ Builder() {
+ }
/**
* Set to {@code true} if the {@link VertexProperty} instances should get assigned to partitions. This
@@ -367,6 +387,26 @@ public final class PartitionStrategy extends AbstractTraversalStrategy<Traversal
* Specifies the partition of the graph to read from. It is possible to assign multiple partition keys so
* as to read from multiple partitions at the same time.
*/
+ public Builder readPartitions(final List<String> readPartitions) {
+ this.readPartitions.addAll(readPartitions);
+ return this;
+ }
+
+ /**
+ * Specifies the partition of the graph to read from. It is possible to assign multiple partition keys so
+ * as to read from multiple partitions at the same time.
+ */
+ public Builder readPartitions(final String... readPartitions) {
+ return this.readPartitions(Arrays.asList(readPartitions));
+ }
+
+ /**
+ * Specifies the partition of the graph to read from. It is possible to assign multiple partition keys so
+ * as to read from multiple partitions at the same time.
+ *
+ * @deprecated Since 3.2.3. Use {@link Builder#readPartitions} instead
+ */
+ @Deprecated
public Builder addReadPartition(final String readPartition) {
this.readPartitions.add(readPartition);
return this;
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
index 097299f..bccff9b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
@@ -301,7 +301,7 @@ public final class SubgraphStrategy extends AbstractTraversalStrategy<TraversalS
else if (key.equals("vertexProperties"))
builder.vertexProperties((Traversal) configuration.getProperty(key));
else
- throw new IllegalArgumentException("The following configuration is unknown: " + key + ":" + configuration.getProperty(key));
+ throw new IllegalArgumentException("The following " + SubgraphStrategy.class.getSimpleName() + " configuration is unknown: " + key + ":" + configuration.getProperty(key));
});
return builder.create();
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
index 88ca626..facb24f 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java
@@ -19,11 +19,11 @@
package org.apache.tinkerpop.gremlin.groovy.jsr223;
-import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.SackFunctions;
import org.apache.tinkerpop.gremlin.process.traversal.Translator;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP;
import org.apache.tinkerpop.gremlin.process.traversal.util.OrP;
import org.apache.tinkerpop.gremlin.structure.Element;
@@ -39,6 +39,8 @@ import java.util.List;
*/
public final class GroovyTranslator implements Translator.ScriptTranslator {
+ private static final boolean IS_TESTING = Boolean.valueOf(System.getProperty("is.testing", "false"));
+
private final String traversalSource;
private GroovyTranslator(final String traversalSource) {
@@ -77,6 +79,8 @@ public final class GroovyTranslator implements Translator.ScriptTranslator {
final StringBuilder traversalScript = new StringBuilder(start);
for (final Bytecode.Instruction instruction : bytecode.getInstructions()) {
final String methodName = instruction.getOperator();
+ if (IS_TESTING && methodName.equals(TraversalSource.Symbols.withStrategies))
+ continue;
if (0 == instruction.getArguments().length)
traversalScript.append(".").append(methodName).append("()");
else {
@@ -122,9 +126,7 @@ public final class GroovyTranslator implements Translator.ScriptTranslator {
return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString();
else if (object instanceof Element)
return convertToString(((Element) object).id()); // hack
- else if (object instanceof Computer) { // TODO: blow out
- return "";
- } else if (object instanceof Lambda) {
+ else if (object instanceof Lambda) {
final String lambdaString = ((Lambda) object).getLambdaScript().trim();
return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}";
} else if (object instanceof Bytecode)
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
index 1a84e26..19302e8 100644
--- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
+++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java
@@ -19,7 +19,6 @@
package org.apache.tinkerpop.gremlin.python.jsr223;
-import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
import org.apache.tinkerpop.gremlin.process.traversal.P;
@@ -52,6 +51,7 @@ import java.util.stream.Stream;
*/
public class PythonTranslator implements Translator.ScriptTranslator {
+ private static final boolean IS_TESTING = Boolean.valueOf(System.getProperty("is.testing", "false"));
private static final Set<String> STEP_NAMES = Stream.of(GraphTraversal.class.getMethods()).filter(method -> Traversal.class.isAssignableFrom(method.getReturnType())).map(Method::getName).collect(Collectors.toSet());
private static final Set<String> NO_STATIC = Stream.of(T.values(), Operator.values())
.flatMap(arg -> IteratorUtils.stream(new ArrayIterator<>(arg)))
@@ -60,7 +60,6 @@ public class PythonTranslator implements Translator.ScriptTranslator {
private final String traversalSource;
private final boolean importStatics;
- private static final boolean isTesting = Boolean.valueOf(System.getProperty("is.testing", "false"));
PythonTranslator(final String traversalSource, final boolean importStatics) {
this.traversalSource = traversalSource;
@@ -102,7 +101,7 @@ public class PythonTranslator implements Translator.ScriptTranslator {
for (final Bytecode.Instruction instruction : bytecode.getInstructions()) {
final String methodName = instruction.getOperator();
final Object[] arguments = instruction.getArguments();
- if (isTesting && methodName.equals(TraversalSource.Symbols.withStrategies))
+ if (IS_TESTING && methodName.equals(TraversalSource.Symbols.withStrategies))
continue;
else if (0 == arguments.length)
traversalScript.append(".").append(SymbolHelper.toPython(methodName)).append("()");
@@ -158,8 +157,6 @@ public class PythonTranslator implements Translator.ScriptTranslator {
return convertToString(((Element) object).id()); // hack
else if (object instanceof Bytecode)
return this.internalTranslate("__", (Bytecode) object);
- else if (object instanceof Computer)
- return "";
else if (object instanceof Lambda)
return convertLambdaToString((Lambda) object);
else
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
----------------------------------------------------------------------
diff --git a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
index f0ca27f..81ee886 100644
--- a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
+++ b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py
@@ -71,6 +71,12 @@ class TestDriverRemoteConnection(TestCase):
assert 0 == g.E().count().next()
assert 1 == g.V().label().dedup().count().next()
assert "person" == g.V().label().dedup().next()
+ #
+ g = g.withComputer("workers", 4, "vertices", __.has("name", "marko"))
+ assert 1 == g.V().count().next()
+ assert 0 == g.E().count().next()
+ assert "person" == g.V().label().next()
+ assert "marko" == g.V().name.next()
connection.close()
def test_side_effects(self):
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
index 79fd859..168e4fe 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
@@ -18,7 +18,6 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
@@ -31,6 +30,7 @@ import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Test;
+import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.stream.Collectors;
@@ -39,7 +39,11 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.core.IsInstanceOf.instanceOf;
import static org.hamcrest.core.StringStartsWith.startsWith;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
@@ -51,8 +55,8 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
public void shouldAppendPartitionToVertex() {
final PartitionStrategy partitionStrategy = PartitionStrategy.build()
- .partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final Vertex v = create(partitionStrategy).addV().property("any", "thing").next();
+ .partitionKey(partition).writePartition("A").readPartitions("A").create();
+ final Vertex v = g.withStrategies(partitionStrategy).addV().property("any", "thing").next();
assertNotNull(v);
assertEquals("thing", v.property("any").value());
@@ -65,8 +69,8 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldAppendPartitionToVertexProperty() {
final PartitionStrategy partitionStrategy = PartitionStrategy.build()
.includeMetaProperties(true)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final Vertex v = create(partitionStrategy).addV().property("any", "thing").next();
+ .partitionKey(partition).writePartition("A").readPartitions("A").create();
+ final Vertex v = g.withStrategies(partitionStrategy).addV().property("any", "thing").next();
assertNotNull(v);
assertEquals("thing", v.property("any").value());
@@ -81,8 +85,8 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldAppendPartitionToVertexPropertyOverMultiProperty() {
final PartitionStrategy partitionStrategy = PartitionStrategy.build()
.includeMetaProperties(true)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final Vertex v = create(partitionStrategy).addV().property(VertexProperty.Cardinality.list, "any", "thing")
+ .partitionKey(partition).writePartition("A").readPartitions("A").create();
+ final Vertex v = g.withStrategies(partitionStrategy).addV().property(VertexProperty.Cardinality.list, "any", "thing")
.property(VertexProperty.Cardinality.list, "any", "more").next();
assertNotNull(v);
@@ -97,8 +101,8 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldNotAppendPartitionToVertexProperty() {
final PartitionStrategy partitionStrategy = PartitionStrategy.build()
.includeMetaProperties(false)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final Vertex v = create(partitionStrategy).addV().property("any", "thing").next();
+ .partitionKey(partition).writePartition("A").readPartitions("A").create();
+ final Vertex v = g.withStrategies(partitionStrategy).addV().property("any", "thing").next();
assertNotNull(v);
assertEquals("thing", v.property("any").value());
@@ -111,19 +115,19 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldAppendPartitionToAllVertexProperties() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
- final GraphTraversalSource gOverB = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverB = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("B").addReadPartition("B").create());
- final GraphTraversalSource gOverAB = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverAB = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("B").addReadPartition("B").addReadPartition("A").create());
- final Vertex v = gOverA.addV().property("any", "thing").property("some","thing").next();
+ final Vertex v = gOverA.addV().property("any", "thing").property("some", "thing").next();
assertNotNull(v);
assertEquals("thing", v.property("any").value());
@@ -173,7 +177,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForValues() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
@@ -191,9 +195,9 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForValuesWithEmptyKeys() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create());
+ .partitionKey(partition).writePartition("A").readPartitions("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
assertEquals(1l, (long) gOverA.V(v).values().count().next());
@@ -204,7 +208,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForProperties() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
@@ -221,9 +225,9 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForPropertiesWithEmptyKeys() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create());
+ .partitionKey(partition).writePartition("A").readPartitions("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
assertEquals(1l, (long) gOverA.V(v).properties().count().next());
@@ -234,9 +238,9 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForPropertyMap() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
- .partitionKey(partition).writePartition("A").addReadPartition("A").create());
+ .partitionKey(partition).writePartition("A").readPartitions("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
gOverA.V(v).propertyMap(partition).next();
@@ -246,7 +250,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForPropertyMapWithEmptyKeys() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
@@ -255,10 +259,11 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
assertEquals("thing", ((List<VertexProperty>) gOverA.V(v).propertyMap().next().get("any")).get(0).value());
}
+ @Test
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForValueMap() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
@@ -267,8 +272,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
gOverA.V(v).valueMap(partition).next();
fail("Should have thrown exception");
} catch (Exception ex) {
- final Throwable root = ExceptionUtils.getRootCause(ex);
- assertThat(root.getMessage(), startsWith("Cannot explicitly request the partitionKey in the traversal"));
+
}
}
@@ -276,7 +280,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.VERTICES_ONLY)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_META_PROPERTIES)
public void shouldHidePartitionKeyForValueMapWithEmptyKeys() {
- final GraphTraversalSource gOverA = create(PartitionStrategy.build()
+ final GraphTraversalSource gOverA = g.withStrategies(PartitionStrategy.build()
.includeMetaProperties(true)
.partitionKey(partition).writePartition("A").addReadPartition("A").create());
final Vertex v = gOverA.addV().property("any", "thing").next();
@@ -290,7 +294,7 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldAppendPartitionToEdge() {
final PartitionStrategy partitionStrategy = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final GraphTraversalSource source = create(partitionStrategy);
+ final GraphTraversalSource source = g.withStrategies(partitionStrategy);
final Vertex v1 = source.addV().property("any", "thing").next();
final Vertex v2 = source.addV().property("some", "thing").next();
final Edge e = source.withSideEffect("v2", v2).V(v1.id()).addE("connectsTo").from("v2").property("every", "thing").next();
@@ -314,19 +318,19 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldWriteVerticesToMultiplePartitions() {
final PartitionStrategy partitionStrategyAA = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final GraphTraversalSource sourceAA = create(partitionStrategyAA);
+ final GraphTraversalSource sourceAA = g.withStrategies(partitionStrategyAA);
final PartitionStrategy partitionStrategyBA = PartitionStrategy.build()
.partitionKey(partition).writePartition("B").addReadPartition("A").create();
- final GraphTraversalSource sourceBA = create(partitionStrategyBA);
+ final GraphTraversalSource sourceBA = g.withStrategies(partitionStrategyBA);
final PartitionStrategy partitionStrategyBB = PartitionStrategy.build()
.partitionKey(partition).writePartition("B").addReadPartition("B").create();
- final GraphTraversalSource sourceBB = create(partitionStrategyBB);
+ final GraphTraversalSource sourceBB = g.withStrategies(partitionStrategyBB);
final PartitionStrategy partitionStrategyBAB = PartitionStrategy.build()
- .partitionKey(partition).writePartition("B").addReadPartition("A").addReadPartition("B").create();
- final GraphTraversalSource sourceBAB = create(partitionStrategyBAB);
+ .partitionKey(partition).writePartition("B").readPartitions("A", "B").create();
+ final GraphTraversalSource sourceBAB = g.withStrategies(partitionStrategyBAB);
final Vertex vA = sourceAA.addV().property("any", "a").next();
@@ -351,11 +355,11 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldThrowExceptionOnVInDifferentPartition() {
final PartitionStrategy partitionStrategyAA = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final GraphTraversalSource sourceAA = create(partitionStrategyAA);
+ final GraphTraversalSource sourceAA = g.withStrategies(partitionStrategyAA);
final PartitionStrategy partitionStrategyA = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").create();
- final GraphTraversalSource sourceA = create(partitionStrategyA);
+ final GraphTraversalSource sourceA = g.withStrategies(partitionStrategyA);
final Vertex vA = sourceAA.addV().property("any", "a").next();
assertEquals(vA.id(), sourceAA.V(vA.id()).id().next());
@@ -373,11 +377,11 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
public void shouldThrowExceptionOnEInDifferentPartition() {
final PartitionStrategy partitionStrategyAA = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final GraphTraversalSource sourceAA = create(partitionStrategyAA);
+ final GraphTraversalSource sourceAA = g.withStrategies(partitionStrategyAA);
final PartitionStrategy partitionStrategyA = PartitionStrategy.build()
.partitionKey(partition).writePartition("A").create();
- final GraphTraversalSource sourceA = create(partitionStrategyA);
+ final GraphTraversalSource sourceA = g.withStrategies(partitionStrategyA);
final Vertex vA = sourceAA.addV().property("any", "a").next();
final Edge e = sourceAA.withSideEffect("vA", vA).V(vA.id()).addE("knows").to("vA").next();
@@ -396,24 +400,24 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
@FeatureRequirementSet(FeatureRequirementSet.Package.SIMPLE)
public void shouldWriteToMultiplePartitions() {
final PartitionStrategy partitionStrategyAA = PartitionStrategy.build()
- .partitionKey(partition).writePartition("A").addReadPartition("A").create();
- final GraphTraversalSource sourceAA = create(partitionStrategyAA);
+ .partitionKey(partition).writePartition("A").readPartitions("A").create();
+ final GraphTraversalSource sourceAA = g.withStrategies(partitionStrategyAA);
final PartitionStrategy partitionStrategyBA = PartitionStrategy.build()
- .partitionKey(partition).writePartition("B").addReadPartition("A").create();
- final GraphTraversalSource sourceBA = create(partitionStrategyBA);
+ .partitionKey(partition).writePartition("B").readPartitions("A").create();
+ final GraphTraversalSource sourceBA = g.withStrategies(partitionStrategyBA);
final PartitionStrategy partitionStrategyCAB = PartitionStrategy.build()
.partitionKey(partition).writePartition("C").addReadPartition("A").addReadPartition("B").create();
- final GraphTraversalSource sourceCAB = create(partitionStrategyCAB);
+ final GraphTraversalSource sourceCAB = g.withStrategies(partitionStrategyCAB);
final PartitionStrategy partitionStrategyC = PartitionStrategy.build()
.partitionKey(partition).writePartition("C").create();
- final GraphTraversalSource sourceC = create(partitionStrategyC);
+ final GraphTraversalSource sourceC = g.withStrategies(partitionStrategyC);
final PartitionStrategy partitionStrategyCA = PartitionStrategy.build()
- .partitionKey(partition).writePartition("C").addReadPartition("A").create();
- final GraphTraversalSource sourceCA = create(partitionStrategyCA);
+ .partitionKey(partition).writePartition("C").readPartitions("A").create();
+ final GraphTraversalSource sourceCA = g.withStrategies(partitionStrategyCA);
final PartitionStrategy partitionStrategyCABC = PartitionStrategy.build()
.partitionKey(partition)
@@ -421,15 +425,18 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
.addReadPartition("A")
.addReadPartition("B")
.addReadPartition("C").create();
- final GraphTraversalSource sourceCABC = create(partitionStrategyCABC);
+ final GraphTraversalSource sourceCABC = g.withStrategy(PartitionStrategy.class.getCanonicalName(),
+ "writePartition", "C",
+ "partitionKey", partition,
+ "readPartitions", Arrays.asList("A", "B", "C"));
final PartitionStrategy partitionStrategyCC = PartitionStrategy.build()
.partitionKey(partition).writePartition("C").addReadPartition("C").create();
- final GraphTraversalSource sourceCC = create(partitionStrategyCC);
+ final GraphTraversalSource sourceCC = g.withStrategies(partitionStrategyCC);
final PartitionStrategy partitionStrategyCBC = PartitionStrategy.build()
- .partitionKey(partition).writePartition("C").addReadPartition("C").addReadPartition("B").create();
- final GraphTraversalSource sourceCBC = create(partitionStrategyCBC);
+ .partitionKey(partition).writePartition("C").readPartitions(Arrays.asList("B", "C")).create();
+ final GraphTraversalSource sourceCBC = g.withStrategies(partitionStrategyCBC);
final Vertex vA = sourceAA.addV().property("any", "a").next();
final Vertex vAA = sourceAA.addV().property("any", "aa").next();
@@ -480,8 +487,4 @@ public class PartitionStrategyProcessTest extends AbstractGremlinProcessTest {
assertEquals(vC.id(), sourceCBC.E(eAtovC.id()).inV().id().next());
assertFalse(sourceCBC.E(eAtovC.id()).outV().hasNext());
}
-
- private GraphTraversalSource create(final PartitionStrategy strategy) {
- return graphProvider.traversal(graph, strategy);
- }
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
index ccea43c..3144211 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.tinkergraph.process;
import org.apache.tinkerpop.gremlin.GraphProvider;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphProvider;
@@ -37,7 +38,11 @@ public class TinkerGraphComputerProvider extends TinkerGraphProvider {
@Override
public GraphTraversalSource traversal(final Graph graph) {
return RANDOM.nextBoolean() ?
- graph.traversal().withComputer() :
+ graph.traversal().withComputer(
+ "workers", RANDOM.nextInt(4) + 1,
+ "graphComputer", RANDOM.nextBoolean() ?
+ GraphComputer.class.getCanonicalName() :
+ TinkerGraphComputer.class.getCanonicalName()) :
graph.traversal(GraphTraversalSource.computer());
}
}
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/95557bf3/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/decoration/HaltedTraverserStrategyTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/decoration/HaltedTraverserStrategyTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/decoration/HaltedTraverserStrategyTest.java
index 0943391..fd3dfaa 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/decoration/HaltedTraverserStrategyTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/decoration/HaltedTraverserStrategyTest.java
@@ -19,10 +19,11 @@
package org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
@@ -58,7 +59,7 @@ public class HaltedTraverserStrategyTest {
@Test
public void shouldReturnDetachedElements() {
final Graph graph = TinkerFactory.createModern();
- final GraphTraversalSource g = graph.traversal().withComputer().withStrategies(HaltedTraverserStrategy.detached());
+ final GraphTraversalSource g = graph.traversal().withComputer().withStrategy(HaltedTraverserStrategy.class.getCanonicalName(), "haltedTraverserFactory", DetachedFactory.class.getCanonicalName());
g.V().out().forEachRemaining(vertex -> assertEquals(DetachedVertex.class, vertex.getClass()));
g.V().out().properties("name").forEachRemaining(vertexProperty -> assertEquals(DetachedVertexProperty.class, vertexProperty.getClass()));
g.V().out().values("name").forEachRemaining(value -> assertEquals(String.class, value.getClass()));