You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/05/27 21:53:41 UTC
incubator-tinkerpop git commit: TinkerGraphComputer,
SparkGraphComputer,
and GiraphGraphComputer are all consistent regarding ResultGraph/Persist
options. Added helper methods to GraphComputerHelper so its easy for vendors
to get consistent behavior with
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master ec9365a21 -> 6faea9038
TinkerGraphComputer, SparkGraphComputer, and GiraphGraphComputer are all consistent regarding ResultGraph/Persist options. Added helper methods to GraphComputerHelper so its easy for vendors to get consistent behavior without any deep thought. More GraphComputerTests that validate semantics.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/6faea903
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/6faea903
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/6faea903
Branch: refs/heads/master
Commit: 6faea903836cb213af7798d49ae911622eb306b6
Parents: ec9365a
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed May 27 13:53:49 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed May 27 13:53:49 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 2 +
.../computer/util/GraphComputerHelper.java | 12 +-
.../process/computer/GraphComputerTest.java | 123 +++++++++++++++++--
.../computer/AbstractHadoopGraphComputer.java | 18 ++-
.../computer/giraph/GiraphGraphComputer.java | 6 +-
.../computer/spark/SparkGraphComputer.java | 6 +-
.../process/computer/TinkerGraphComputer.java | 55 ++++++---
.../process/computer/TinkerGraphView.java | 9 ++
.../tinkergraph/structure/TinkerVertex.java | 6 +-
9 files changed, 188 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 4bf047d..330b5f6 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* `GraphComputerTest` extended with validation of the semantics of all `ResultGraph`/`Persist` combinations.
+* GiraphGraphComputer no longer requires an extra iteration and MapReduce job to derive the full `Memory` result.
* SparkGraphComputer now supports `InputRDD` to allow vendors/users to use a `SparkContext` to generate the adjacency list representation.
* Added `Scope.getScopeValueByKey()` static method so all "selecting" steps use the same pattern for map, path, and sideEffect data retrieval.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
index 2b8cf12..468791f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
@@ -24,10 +24,8 @@ import org.apache.tinkerpop.gremlin.process.computer.Memory;
import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
import org.apache.tinkerpop.gremlin.structure.Graph;
-import java.io.Serializable;
import java.lang.reflect.Method;
-import java.util.Comparator;
-import java.util.List;
+import java.util.Optional;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -62,6 +60,14 @@ public final class GraphComputerHelper {
}
}
+ public static GraphComputer.ResultGraph getResultGraphState(final Optional<VertexProgram> vertexProgram, final Optional<GraphComputer.ResultGraph> resultGraph) {
+ return resultGraph.isPresent() ? resultGraph.get() : vertexProgram.isPresent() ? vertexProgram.get().getPreferredResultGraph() : GraphComputer.ResultGraph.ORIGINAL;
+ }
+
+ public static GraphComputer.Persist getPersistState(final Optional<VertexProgram> vertexProgram, final Optional<GraphComputer.Persist> persist) {
+ return persist.isPresent() ? persist.get() : vertexProgram.isPresent() ? vertexProgram.get().getPreferredPersist() : GraphComputer.Persist.NOTHING;
+ }
+
public static boolean areEqual(final MapReduce a, final Object b) {
if (null == a)
throw Graph.Exceptions.argumentCanNotBeNull("a");
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
index a364ed0..93bf48d 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
@@ -426,7 +426,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
} catch (IllegalArgumentException e) {
assertEquals(Memory.Exceptions.memoryDoesNotExist("BAD").getMessage(), e.getMessage());
}
- assertEquals(Long.valueOf(6), results.graph().traversal().V().count().next());
+ assertEquals(Long.valueOf(0), results.graph().traversal().V().count().next()); // persist new/nothing.
results.graph().traversal().V().forEachRemaining(v -> {
assertTrue(v.property("nameLengthCounter").isPresent());
@@ -1187,14 +1187,42 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
/////////////////////////////////////////////
@Test
+ @LoadGraphWith
+ public void shouldSupportPersistResultGraphPairsStatedInFeatures() throws Exception {
+ for (final GraphComputer.ResultGraph resultGraph : GraphComputer.ResultGraph.values()) {
+ for (final GraphComputer.Persist persist : GraphComputer.Persist.values()) {
+ final GraphComputer computer = graph.compute(graphComputerClass.get());
+ if (computer.features().supportsResultGraphPersistCombination(resultGraph, persist)) {
+ computer.program(new VertexProgramK()).result(resultGraph).persist(persist).submit().get();
+ } else {
+ try {
+ computer.program(new VertexProgramK()).result(resultGraph).persist(persist).submit().get();
+ fail("The GraphComputer " + computer + " states that it does support the following resultGraph/persist pair: " + resultGraph + ":" + persist);
+ } catch (final IllegalArgumentException e) {
+ assertEquals(GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(resultGraph, persist).getMessage(), e.getMessage());
+ }
+ }
+ }
+ }
+ }
+
+ @Test
@LoadGraphWith(MODERN)
- public void shouldWriteNewGraphResultWithEdges() throws Exception {
+ public void shouldWriteNewGraphResultWithNothing() throws Exception {
final GraphComputer computer = graph.compute(graphComputerClass.get());
- if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.EDGES)) {
- final ComputerResult result = computer.program(new VertexProgramK()).submit().get();
- assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
- assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
- assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+ if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.NOTHING)) {
+ final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.NOTHING).submit().get();
+ assertEquals(Long.valueOf(0l), result.graph().traversal().V().count().next());
+ assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next());
+ assertEquals(Long.valueOf(0l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+ assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
}
}
@@ -1204,9 +1232,57 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
final GraphComputer computer = graph.compute(graphComputerClass.get());
if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.VERTEX_PROPERTIES)) {
final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.VERTEX_PROPERTIES).submit().get();
- assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next());
assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+ assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldWriteNewGraphResultWithEdges() throws Exception {
+ final GraphComputer computer = graph.compute(graphComputerClass.get());
+ if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.EDGES)) {
+ final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.EDGES).submit().get();
+ assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+ assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+ assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldWriteOriginalGraphResultWithNothing() throws Exception {
+ final GraphComputer computer = graph.compute(graphComputerClass.get());
+ if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.NOTHING)) {
+ final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.NOTHING).submit().get();
+ assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+ assertEquals(Long.valueOf(12l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+ assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
}
}
@@ -1216,14 +1292,37 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
final GraphComputer computer = graph.compute(graphComputerClass.get());
if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.VERTEX_PROPERTIES)) {
final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.VERTEX_PROPERTIES).submit().get();
- assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+ assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
assertEquals(Long.valueOf(18l), graph.traversal().V().values().count().next());
- ///
- assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldWriteOriginalGraphResultWithEdges() throws Exception {
+ final GraphComputer computer = graph.compute(graphComputerClass.get());
+ if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.EDGES)) {
+ final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.EDGES).submit().get();
+ assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
- result.graph().traversal().V().valueMap().forEachRemaining(System.out::println);
assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+ ///
+ assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+ assertEquals(Long.valueOf(18l), graph.traversal().V().values().count().next());
+ assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+ assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
index 6cfc50e..7980fe6 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
@@ -50,8 +50,8 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
protected final Set<MapReduce> mapReducers = new HashSet<>();
protected VertexProgram<Object> vertexProgram;
- protected Optional<ResultGraph> resultGraph = Optional.empty();
- protected Optional<Persist> persist = Optional.empty();
+ protected ResultGraph resultGraph = null;
+ protected Persist persist = null;
public AbstractHadoopGraphComputer(final HadoopGraph hadoopGraph) {
this.hadoopGraph = hadoopGraph;
@@ -60,13 +60,13 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
@Override
public GraphComputer result(final ResultGraph resultGraph) {
- this.resultGraph = Optional.of(resultGraph);
+ this.resultGraph = resultGraph;
return this;
}
@Override
public GraphComputer persist(final Persist persist) {
- this.persist = Optional.of(persist);
+ this.persist = persist;
return this;
}
@@ -102,13 +102,11 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
this.mapReducers.addAll(this.vertexProgram.getMapReducers());
}
// if the user didn't set desired persistence/resultgraph, then get from vertex program or else, no persistence
- if (!this.persist.isPresent())
- this.persist = Optional.of(null == this.vertexProgram ? Persist.NOTHING : this.vertexProgram.getPreferredPersist());
- if (!this.resultGraph.isPresent())
- this.resultGraph = Optional.of(null == this.vertexProgram ? ResultGraph.ORIGINAL : this.vertexProgram.getPreferredResultGraph());
+ this.persist = GraphComputerHelper.getPersistState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.persist));
+ this.resultGraph = GraphComputerHelper.getResultGraphState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.resultGraph));
// determine persistence and result graph options
- if (!this.features().supportsResultGraphPersistCombination(this.resultGraph.get(), this.persist.get()))
- throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph.get(), this.persist.get());
+ if (!this.features().supportsResultGraphPersistCombination(this.resultGraph, this.persist))
+ throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph, this.persist);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
index e8f026f..6995331 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
@@ -107,13 +107,13 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
}
this.memory.setRuntime(System.currentTimeMillis() - startTime);
- return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph.get(), this.persist.get()), this.memory.asImmutable());
+ return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph, this.persist), this.memory.asImmutable());
});
}
@Override
public int run(final String[] args) {
- this.giraphConfiguration.setBoolean(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.get().equals(Persist.EDGES));
+ this.giraphConfiguration.setBoolean(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.equals(Persist.EDGES));
try {
// it is possible to run graph computer without a vertex program (and thus, only map reduce jobs if they exist)
if (null != this.vertexProgram) {
@@ -162,7 +162,7 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
}
// if no persistence, delete the map reduce output
- if (this.persist.get().equals(Persist.NOTHING)) {
+ if (this.persist.equals(Persist.NOTHING)) {
final Path outputPath = new Path(this.giraphConfiguration.get(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION) + "/" + Constants.HIDDEN_G);
if (FileSystem.get(this.giraphConfiguration).exists(outputPath)) // TODO: what about when the output is not a file output?
FileSystem.get(this.giraphConfiguration).delete(outputPath, true);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
index b6f6968..3c5c6ab 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
@@ -68,7 +68,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
super.validateStatePriorToExecution();
// apache and hadoop configurations that are used throughout the graph computer computation
final org.apache.commons.configuration.Configuration apacheConfiguration = new HadoopConfiguration(this.hadoopGraph.configuration());
- apacheConfiguration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.get().equals(Persist.EDGES));
+ apacheConfiguration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.equals(Persist.EDGES));
final Configuration hadoopConfiguration = ConfUtil.makeHadoopConfiguration(apacheConfiguration);
if (FileInputFormat.class.isAssignableFrom(hadoopConfiguration.getClass(Constants.GREMLIN_HADOOP_GRAPH_INPUT_FORMAT, InputFormat.class))) {
try {
@@ -150,7 +150,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
}
}
// write the graph rdd using the output rdd
- if (!this.persist.get().equals(Persist.NOTHING)) {
+ if (!this.persist.equals(Persist.NOTHING)) {
try {
hadoopConfiguration.getClass(Constants.GREMLIN_HADOOP_OUTPUT_RDD, OutputFormatRDD.class, OutputRDD.class)
.newInstance()
@@ -184,7 +184,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
}
// update runtime and return the newly computed graph
finalMemory.setRuntime(System.currentTimeMillis() - startTime);
- return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph.get(), this.persist.get()), finalMemory.asImmutable());
+ return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph, this.persist), finalMemory.asImmutable());
}
});
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
index f8693b0..622530f 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
@@ -25,8 +25,10 @@ import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraph;
import org.apache.tinkerpop.gremlin.process.computer.util.GraphComputerHelper;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
@@ -45,8 +47,8 @@ import java.util.concurrent.Future;
*/
public final class TinkerGraphComputer implements GraphComputer {
- private Optional<ResultGraph> resultGraph = Optional.empty();
- private Optional<Persist> persist = Optional.empty();
+ private ResultGraph resultGraph = null;
+ private Persist persist = null;
private VertexProgram<?> vertexProgram;
private final TinkerGraph graph;
@@ -66,13 +68,13 @@ public final class TinkerGraphComputer implements GraphComputer {
@Override
public GraphComputer result(final ResultGraph resultGraph) {
- this.resultGraph = Optional.of(resultGraph);
+ this.resultGraph = resultGraph;
return this;
}
@Override
public GraphComputer persist(final Persist persist) {
- this.persist = Optional.of(persist);
+ this.persist = persist;
return this;
}
@@ -90,11 +92,11 @@ public final class TinkerGraphComputer implements GraphComputer {
@Override
public Future<ComputerResult> submit() {
+ // a graph computer can only be executed once
if (this.executed)
throw Exceptions.computerHasAlreadyBeenSubmittedAVertexProgram();
else
this.executed = true;
-
// it is not possible execute a computer if it has no vertex program nor mapreducers
if (null == this.vertexProgram && this.mapReducers.isEmpty())
throw GraphComputer.Exceptions.computerHasNoVertexProgramNorMapReducers();
@@ -103,14 +105,13 @@ public final class TinkerGraphComputer implements GraphComputer {
GraphComputerHelper.validateProgramOnComputer(this, this.vertexProgram);
this.mapReducers.addAll(this.vertexProgram.getMapReducers());
}
+ // get the result graph and persist state to use for the computation
+ this.resultGraph = GraphComputerHelper.getResultGraphState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.resultGraph));
+ this.persist = GraphComputerHelper.getPersistState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.persist));
+ if (!this.features().supportsResultGraphPersistCombination(this.resultGraph, this.persist))
+ throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph, this.persist);
- if (!this.persist.isPresent())
- this.persist = Optional.of(null == this.vertexProgram ? Persist.NOTHING : this.vertexProgram.getPreferredPersist());
- if (!this.resultGraph.isPresent())
- this.resultGraph = Optional.of(null == this.vertexProgram ? ResultGraph.ORIGINAL : this.vertexProgram.getPreferredResultGraph());
- if (!this.features().supportsResultGraphPersistCombination(this.resultGraph.get(), this.persist.get()))
- throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph.get(), this.persist.get());
-
+ // initialize the memory
this.memory = new TinkerMemory(this.vertexProgram, this.mapReducers);
return CompletableFuture.<ComputerResult>supplyAsync(() -> {
final long time = System.currentTimeMillis();
@@ -191,10 +192,34 @@ public final class TinkerGraphComputer implements GraphComputer {
// update runtime and return the newly computed graph
this.memory.setRuntime(System.currentTimeMillis() - time);
this.memory.complete();
- if (Persist.NOTHING != this.persist.get() && ResultGraph.ORIGINAL == this.resultGraph.get()) {
- TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+
+ // determine the resultant graph based on the result graph/persist state
+ final Graph resultGraph;
+ if (Persist.NOTHING == this.persist) {
+ if (ResultGraph.ORIGINAL == this.resultGraph) {
+ resultGraph = this.graph;
+ TinkerHelper.dropGraphView(this.graph);
+ } else {
+ resultGraph = EmptyGraph.instance();
+ TinkerHelper.dropGraphView(this.graph);
+ }
+ } else if (Persist.VERTEX_PROPERTIES == this.persist) {
+ if (ResultGraph.ORIGINAL == this.resultGraph) {
+ TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+ resultGraph = this.graph;
+ } else {
+ TinkerHelper.getGraphView(this.graph).setHideEdges(true);
+ resultGraph = this.graph;
+ }
+ } else { // Persist.EDGES
+ if (ResultGraph.ORIGINAL == this.resultGraph) {
+ TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+ resultGraph = this.graph;
+ } else {
+ resultGraph = this.graph;
+ }
}
- return new TinkerComputerResult(this.graph, this.memory.asImmutable());
+ return new TinkerComputerResult(resultGraph, this.memory.asImmutable());
} catch (Exception ex) {
throw new RuntimeException(ex);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
index 607fde6..a32b589 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
@@ -46,6 +46,7 @@ public final class TinkerGraphView {
private final TinkerGraph graph;
protected final Set<String> computeKeys;
private Map<Element, Map<String, List<VertexProperty>>> computeProperties;
+ private boolean hideEdges = false;
public TinkerGraphView(final TinkerGraph graph, final Set<String> computeKeys) {
this.graph = graph;
@@ -136,4 +137,12 @@ public final class TinkerGraphView {
});
this.computeProperties.clear();
}
+
+ public boolean getHideEdges() {
+ return this.hideEdges;
+ }
+
+ public void setHideEdges(final boolean hideEdges) {
+ this.hideEdges = hideEdges;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
index 525a793..2c59500 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
@@ -84,7 +84,7 @@ public final class TinkerVertex extends TinkerElement implements Vertex {
@Override
public <V> VertexProperty<V> property(final String key, final V value, final Object... keyValues) {
- return this.property(VertexProperty.Cardinality.single,key,value,keyValues);
+ return this.property(VertexProperty.Cardinality.single, key, value, keyValues);
}
@Override
@@ -151,12 +151,12 @@ public final class TinkerVertex extends TinkerElement implements Vertex {
@Override
public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
- return (Iterator) TinkerHelper.getEdges(this, direction, edgeLabels);
+ return TinkerHelper.inComputerMode(this.graph) && TinkerHelper.getGraphView(this.graph).getHideEdges() ? Collections.emptyIterator() : (Iterator) TinkerHelper.getEdges(this, direction, edgeLabels);
}
@Override
public Iterator<Vertex> vertices(final Direction direction, final String... edgeLabels) {
- return (Iterator) TinkerHelper.getVertices(this, direction, edgeLabels);
+ return TinkerHelper.inComputerMode(this.graph) && TinkerHelper.getGraphView(this.graph).getHideEdges() ? Collections.emptyIterator() : (Iterator) TinkerHelper.getVertices(this, direction, edgeLabels);
}
@Override