Return-Path: X-Original-To: apmail-tinkerpop-commits-archive@minotaur.apache.org Delivered-To: apmail-tinkerpop-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 26361182BE for ; Tue, 9 Feb 2016 00:36:31 +0000 (UTC) Received: (qmail 45840 invoked by uid 500); 9 Feb 2016 00:36:31 -0000 Delivered-To: apmail-tinkerpop-commits-archive@tinkerpop.apache.org Received: (qmail 45814 invoked by uid 500); 9 Feb 2016 00:36:31 -0000 Mailing-List: contact commits-help@tinkerpop.incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@tinkerpop.incubator.apache.org Delivered-To: mailing list commits@tinkerpop.incubator.apache.org Received: (qmail 45805 invoked by uid 99); 9 Feb 2016 00:36:31 -0000 Received: from Unknown (HELO spamd4-us-west.apache.org) (209.188.14.142) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Feb 2016 00:36:31 +0000 Received: from localhost (localhost [127.0.0.1]) by spamd4-us-west.apache.org (ASF Mail Server at spamd4-us-west.apache.org) with ESMTP id 7CDD8C0179 for ; Tue, 9 Feb 2016 00:36:30 +0000 (UTC) X-Virus-Scanned: Debian amavisd-new at spamd4-us-west.apache.org X-Spam-Flag: NO X-Spam-Score: -3.649 X-Spam-Level: X-Spam-Status: No, score=-3.649 tagged_above=-999 required=6.31 tests=[KAM_ASCII_DIVIDERS=0.8, KAM_LAZY_DOMAIN_SECURITY=1, RCVD_IN_DNSWL_HI=-5, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01, RP_MATCHES_RCVD=-0.429] autolearn=disabled Received: from mx1-eu-west.apache.org ([10.40.0.8]) by localhost (spamd4-us-west.apache.org [10.40.0.11]) (amavisd-new, port 10024) with ESMTP id pyQ--K7MuEN8 for ; Tue, 9 Feb 2016 00:36:15 +0000 (UTC) Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by mx1-eu-west.apache.org (ASF Mail Server at mx1-eu-west.apache.org) with SMTP id 77E5431AE1 for ; Tue, 9 Feb 2016 00:36:13 +0000 (UTC) Received: (qmail 45032 invoked by uid 99); 9 Feb 2016 00:36:12 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 09 Feb 2016 00:36:12 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 8D819E00B2; Tue, 9 Feb 2016 00:36:12 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: okram@apache.org To: commits@tinkerpop.incubator.apache.org Date: Tue, 09 Feb 2016 00:36:15 -0000 Message-Id: <2c103c26aa4940859e73a99a1a376bd4@git.apache.org> In-Reply-To: <3ea0f409fd0b4907b766d2b4c9ac5161@git.apache.org> References: <3ea0f409fd0b4907b766d2b4c9ac5161@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [4/4] incubator-tinkerpop git commit: The most brutal refactor. There is no such thing as a TraversalSource.Builder anymore. All there are are TraversalSources. These are simply a wrapper of a TraversalStrategy and a Graph. There is no such thing as a Tr The most brutal refactor. There is no such thing as a TraversalSource.Builder anymore. All there are are TraversalSources. These are simply a wrapper of a TraversalStrategy and a Graph. There is no such thing as a TraversalEngine anymore. What was ComputerTraversalEngine is now simply a strategy of TraversalVertexProgramStrategy. There is no such thing as EngineDependentStrategy -- this is simply TraversalVertexProgramStrategy. In short, all there are are Graphs and TraversalStrategies. So so so so so much cleaner. This WILL NOT be backwards compatible for graph system providers. They will need to update their GraphProvider implementations -- two methods changed. Moreover, if they have an XXXStrategy that calls traversal.getEngine().isComputer(), they will need to change that to traversal.getStrategies().onGraphComputer(). Really simple to for them to fix. It took me less a minute to fix up Spark, Giraph, and Neo4j. These changes WILL be backwards compatible for users at the level of graph.traversal(computer(SparkGraphComputer)) still working (though Depcrecation introduced). The GraphTraversal.Builder will simply turn into a bunch of TravesalSource calls. It is not used outside of this context. This commit is NOT complete and will be completed on the next sprint. Moreover, there are lots of cleanups and JavaDocing that I need to do -- I just don't want to lose this work so pushing. Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/5f2cd677 Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/5f2cd677 Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/5f2cd677 Branch: refs/heads/TINKERPOP-971 Commit: 5f2cd6770d56b69c3b0eebf07152315237837f12 Parents: d974abc Author: Marko A. Rodriguez Authored: Mon Feb 8 17:35:46 2016 -0700 Committer: Marko A. Rodriguez Committed: Mon Feb 8 17:35:46 2016 -0700 ---------------------------------------------------------------------- .../computer/GiraphHadoopGraphProvider.java | 10 +- .../GephiTraversalVisualizationStrategy.groovy | 6 +- .../bulkloading/BulkLoaderVertexProgram.java | 2 +- .../peerpressure/PeerPressureVertexProgram.java | 10 +- .../ranking/pagerank/PageRankVertexProgram.java | 11 +- .../traversal/TraversalVertexProgram.java | 4 +- .../computer/util/DefaultComputerResult.java | 1 - .../gremlin/process/traversal/Traversal.java | 20 +- .../process/traversal/TraversalSource.java | 43 +-- .../traversal/TraversalSourceFactory.java | 46 +++ .../process/traversal/TraversalStrategies.java | 9 +- .../dsl/graph/GraphTraversalSource.java | 364 ++++++------------- .../engine/ComputerTraversalEngine.java | 14 +- .../engine/StandardTraversalEngine.java | 10 +- .../lambda/AbstractLambdaTraversal.java | 12 - .../process/traversal/step/EngineDependent.java | 4 +- .../process/traversal/step/map/GraphStep.java | 13 +- .../step/sideEffect/GroupSideEffectStep.java | 9 +- .../sideEffect/GroupSideEffectStepV3d0.java | 4 +- .../traversal/step/sideEffect/ProfileStep.java | 11 +- .../traversal/step/util/ComputerAwareStep.java | 9 +- .../step/util/ReducingBarrierStep.java | 5 +- .../strategy/decoration/ConnectiveStrategy.java | 24 +- .../strategy/decoration/SackStrategy.java | 52 +++ .../strategy/decoration/SideEffectStrategy.java | 47 +++ .../finalization/EngineDependentStrategy.java | 57 --- .../finalization/LazyBarrierStrategy.java | 6 +- .../TraversalVertexProgramStrategy.java | 83 +++++ .../optimization/MatchPredicateStrategy.java | 2 +- .../ComputerVerificationStrategy.java | 2 - .../traversal/util/DefaultTraversal.java | 19 +- .../process/traversal/util/EmptyTraversal.java | 12 - .../traversal/util/TraversalScriptFunction.java | 9 +- .../traversal/util/TraversalScriptHelper.java | 14 +- .../tinkerpop/gremlin/structure/Graph.java | 44 ++- .../gremlin/structure/util/StringFactory.java | 14 +- .../decoration/ConnectiveStrategyTest.java | 219 +++++------ .../finalization/LazyBarrierStrategyTest.java | 84 ++--- .../AdjacentToIncidentStrategyTest.java | 123 ++----- .../optimization/FilterRankingStrategyTest.java | 113 ++---- .../IdentityRemovalStrategyTest.java | 109 ++---- .../IncidentToAdjacentStrategyTest.java | 121 ++---- .../MatchPredicateStrategyTest.java | 2 +- .../RangeByIsCountStrategyTest.java | 175 +++------ .../ComputerVerificationStrategyTest.java | 20 +- .../LambdaRestrictionStrategyTest.java | 4 +- .../StandardVerificationStrategyTest.java | 21 +- .../gremlin/groovy/loaders/StepLoader.groovy | 21 -- .../gremlin/groovy/loaders/SugarLoader.groovy | 12 +- .../AbstractImportCustomizerProvider.java | 2 +- .../tinkerpop/gremlin/server/GraphManager.java | 2 +- .../tinkerpop/gremlin/AbstractGremlinTest.java | 18 +- .../apache/tinkerpop/gremlin/GraphManager.java | 6 + .../apache/tinkerpop/gremlin/GraphProvider.java | 23 +- .../process/computer/GraphComputerTest.java | 104 +++--- .../BulkDumperVertexProgramTest.java | 4 +- .../BulkLoaderVertexProgramTest.java | 14 +- .../PeerPressureVertexProgramTest.java | 4 +- .../pagerank/PageRankVertexProgramTest.java | 4 +- .../traversal/step/sideEffect/ProfileTest.java | 6 +- .../ReadOnlyStrategyProcessTest.java | 2 +- .../script/script-output-grateful-dead.groovy | 2 +- .../groovy/plugin/HadoopRemoteAcceptor.java | 17 +- .../structure/io/AbstractStorageCheck.java | 8 +- .../optimization/Neo4jGraphStepStrategy.java | 2 +- .../structure/NativeNeo4jStructureCheck.java | 4 +- .../process/computer/LocalPropertyTest.java | 6 +- .../computer/SparkHadoopGraphProvider.java | 13 +- .../spark/structure/io/InputOutputRDDTest.java | 5 +- .../spark/structure/io/InputRDDTest.java | 6 +- .../spark/structure/io/OutputRDDTest.java | 4 +- .../io/PersistedInputOutputRDDTest.java | 11 +- .../io/gryo/GryoSerializerIntegrateTest.java | 6 +- .../optimization/TinkerGraphStepStrategy.java | 4 +- .../process/TinkerGraphComputerProvider.java | 13 +- .../TinkerGraphNoStrategyComputerProvider.java | 31 +- .../process/TinkerGraphNoStrategyProvider.java | 25 +- .../structure/TinkerGraphPlayTest.java | 29 +- 78 files changed, 967 insertions(+), 1434 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/giraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphHadoopGraphProvider.java ---------------------------------------------------------------------- diff --git a/giraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphHadoopGraphProvider.java b/giraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphHadoopGraphProvider.java index 07b7897..8eae4f1 100644 --- a/giraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphHadoopGraphProvider.java +++ b/giraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/giraph/process/computer/GiraphHadoopGraphProvider.java @@ -22,8 +22,8 @@ import org.apache.giraph.conf.GiraphConstants; import org.apache.tinkerpop.gremlin.GraphProvider; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider; +import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; -import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine; import org.apache.tinkerpop.gremlin.structure.Graph; import java.util.Map; @@ -35,7 +35,6 @@ import java.util.concurrent.TimeUnit; @GraphProvider.Descriptor(computer = GiraphGraphComputer.class) public final class GiraphHadoopGraphProvider extends HadoopGraphProvider { - @Override public Map getBaseConfiguration(final String graphName, final Class test, final String testMethodName, final LoadGraphWith.GraphData loadGraphWith) { final Map config = super.getBaseConfiguration(graphName, test, testMethodName, loadGraphWith); @@ -59,6 +58,11 @@ public final class GiraphHadoopGraphProvider extends HadoopGraphProvider { @Override public GraphTraversalSource traversal(final Graph graph) { - return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(GiraphGraphComputer.class)).create(graph); + return graph.traversal().withComputer(GiraphGraphComputer.class); + } + + @Override + public GraphComputer getGraphComputer(final Graph graph) { + return graph.compute(GiraphGraphComputer.class); } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy ---------------------------------------------------------------------- diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy index 7e390b0..9f3c843 100644 --- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy +++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy @@ -26,9 +26,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep 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.VertexStep import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep -import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy @@ -66,7 +66,7 @@ class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy traversal) { - if (traversal.getEngine().isComputer()) + if (traversal.getStrategies().onGraphComputer()) return // only apply these strategies if the traversal was :submit to the acceptor - otherwise process as usual @@ -102,7 +102,7 @@ class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy final BulkSet objects = ((BulkSet) traverser.sideEffects(sideEffectKey)) if (!objects.isEmpty()) { - final List vertices = objects.findAll{ Object o -> o instanceof Vertex} + final List vertices = objects.findAll { Object o -> o instanceof Vertex } .collect { Object o -> ((Vertex) o).id().toString() } acceptor.updateVisitedVertices(vertices) objects.clear() http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/bulkloading/BulkLoaderVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/bulkloading/BulkLoaderVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/bulkloading/BulkLoaderVertexProgram.java index 3a10582..8eea782 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/bulkloading/BulkLoaderVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/bulkloading/BulkLoaderVertexProgram.java @@ -171,7 +171,7 @@ public class BulkLoaderVertexProgram implements VertexProgram { LOGGER.info("Opened Graph instance: {}", graph); try { listener = new BulkLoadingListener(); - g = GraphTraversalSource.build().with(EventStrategy.build().addListener(listener).create()).create(graph); + g = new GraphTraversalSource(graph).withStrategy(EventStrategy.build().addListener(listener).create()); } catch (Exception e) { try { graph.close(); http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java index f2989e0..c483d07 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java @@ -23,9 +23,6 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.computer.Memory; import org.apache.tinkerpop.gremlin.process.computer.MessageScope; import org.apache.tinkerpop.gremlin.process.computer.Messenger; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalClassFunction; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalObjectFunction; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptFunction; import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder; import org.apache.tinkerpop.gremlin.process.computer.util.ConfigurationTraversal; import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram; @@ -33,6 +30,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalClassFunction; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalObjectFunction; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptFunction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -216,8 +216,8 @@ public class PeerPressureVertexProgram extends StaticVertexProgram(builder, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); + public Builder traversal(final TraversalSource traversalSource, final String scriptEngine, final String traversalScript, final Object... bindings) { + ConfigurationTraversal.storeState(new TraversalScriptFunction<>(traversalSource, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); return this; } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java index efb38ac..931eb12 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java @@ -24,15 +24,15 @@ import org.apache.tinkerpop.gremlin.process.computer.Memory; import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner; import org.apache.tinkerpop.gremlin.process.computer.MessageScope; import org.apache.tinkerpop.gremlin.process.computer.Messenger; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalClassFunction; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalObjectFunction; -import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptFunction; import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder; import org.apache.tinkerpop.gremlin.process.computer.util.ConfigurationTraversal; import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalClassFunction; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalObjectFunction; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptFunction; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -44,7 +44,6 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Optional; import java.util.Set; -import java.util.function.Function; import java.util.function.Supplier; /** @@ -179,8 +178,8 @@ public class PageRankVertexProgram extends StaticVertexProgram { return this; } - public Builder traversal(final TraversalSource.Builder builder, final String scriptEngine, final String traversalScript, final Object... bindings) { - ConfigurationTraversal.storeState(new TraversalScriptFunction<>(builder, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); + public Builder traversal(final TraversalSource traversalSource, final String scriptEngine, final String traversalScript, final Object... bindings) { + ConfigurationTraversal.storeState(new TraversalScriptFunction<>(traversalSource, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); return this; } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java index fe01ea2..3522469 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java @@ -281,8 +281,8 @@ public final class TraversalVertexProgram implements VertexProgram(builder, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); + public Builder traversal(final TraversalSource traversalSource, final String scriptEngine, final String traversalScript, final Object... bindings) { + ConfigurationTraversal.storeState(new TraversalScriptFunction<>(traversalSource, scriptEngine, traversalScript, bindings), this.configuration, TRAVERSAL_SUPPLIER); return this; } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java index 66873fb..da1ebfc 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/DefaultComputerResult.java @@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.process.computer.util; import org.apache.tinkerpop.gremlin.process.computer.ComputerResult; import org.apache.tinkerpop.gremlin.process.computer.Memory; -import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java index f167fb3..c4016a7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java @@ -20,8 +20,6 @@ package org.apache.tinkerpop.gremlin.process.traversal; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; -import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine; -import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; @@ -52,7 +50,7 @@ import java.util.stream.StreamSupport; * This is the base interface for all traversal's, where each extending interface is seen as a domain specific language. * For example, {@link GraphTraversal} is a domain specific language for traversing a graph using "graph concepts" (e.g. vertices, edges). * Another example may represent the graph using "social concepts" (e.g. people, cities, artifacts). - * A {@link Traversal} is evaluated in one of two ways: {@link StandardTraversalEngine} (OLTP) and {@link ComputerTraversalEngine} (OLAP). + * A {@link Traversal} is evaluated in one of two ways: iterator-based OLTP or {@link GraphComputer}-based OLAP. * OLTP traversals leverage an iterator and are executed within a single JVM (with data access allowed to be remote). * OLAP traversals leverage {@link GraphComputer} and are executed between multiple JVMs (and/or cores). * @@ -345,20 +343,6 @@ public interface Traversal extends Iterator, Serializable, Cloneable { public void applyStrategies() throws IllegalStateException; /** - * Get the {@link TraversalEngine} that will be used to execute this traversal. - * - * @return get the traversal engine associated with this traversal. - */ - public TraversalEngine getEngine(); - - /** - * Set the {@link TraversalEngine} to be used for executing this traversal. - * - * @param engine the engine to execute the traversal with. - */ - public void setEngine(final TraversalEngine engine); - - /** * Get the {@link TraverserGenerator} associated with this traversal. * The traversal generator creates {@link Traverser} instances that are respective of the traversal's {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement}. * @@ -381,7 +365,7 @@ public interface Traversal extends Iterator, Serializable, Cloneable { requirements.add(TraverserRequirement.SIDE_EFFECTS); if (null != this.getSideEffects().getSackInitialValue()) requirements.add(TraverserRequirement.SACK); - if (this.getEngine().isComputer()) + if (this.getStrategies().onGraphComputer()) requirements.add(TraverserRequirement.BULK); if (requirements.contains(TraverserRequirement.ONE_BULK)) requirements.remove(TraverserRequirement.BULK); http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/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 58884ee..4354767 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 @@ -18,13 +18,8 @@ */ package org.apache.tinkerpop.gremlin.process.traversal; -import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.structure.Graph; -import java.io.Serializable; -import java.util.List; -import java.util.Optional; - /** * A {@code TraversalSource} is responsible for generating a {@link Traversal}. A {@code TraversalSource}, once built, * can generate any number of {@link Traversal} instances. Each traversal DSL will maintain a corresponding @@ -32,36 +27,20 @@ import java.util.Optional; * * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TraversalSource { - - public TraversalSource.Builder asBuilder(); - - /** - * Gets the {@link GraphComputer} associated with the {@code TraversalSource} which could be constructed as empty. - */ - public Optional getGraphComputer(); - - /** - * Gets the {@link Graph} associated with the {@code TraversalSource} which could be constructed as empty. - */ - public Optional getGraph(); - - /** - * Gets the list of {@link TraversalStrategy} instances that will be applied to {@link Traversal} objects - * generated from this {@code TraversalSource}. - */ - public List getStrategies(); - - //////////////// +public interface TraversalSource extends Cloneable { - public interface Builder extends Serializable { + // withStrategy + // withoutStrategy + // withBulk + // withPath + // withSack + // withSideEffect - public Builder engine(final TraversalEngine.Builder engine); + public TraversalStrategies getStrategies(); - public Builder with(final TraversalStrategy strategy); + public Graph getGraph(); - public Builder without(final Class strategyClass); + @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException") + public TraversalSource clone(); - public C create(final Graph graph); - } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSourceFactory.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSourceFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSourceFactory.java new file mode 100644 index 0000000..f955d88 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSourceFactory.java @@ -0,0 +1,46 @@ +/* + * 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; + +import org.apache.tinkerpop.gremlin.structure.Graph; + +import java.io.Serializable; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class TraversalSourceFactory implements Serializable { + + private final TraversalStrategies traversalStrategies; + private final Class traversalSourceClass; + + public TraversalSourceFactory(final T traversalSource) { + this.traversalSourceClass = (Class) traversalSource.getClass(); + this.traversalStrategies = traversalSource.getStrategies(); + } + + public T createTraversalSource(final Graph graph) { + try { + return this.traversalSourceClass.getConstructor(Graph.class, TraversalStrategies.class).newInstance(graph, this.traversalStrategies); + } catch (final Exception e) { + throw new IllegalStateException(e.getMessage(), e); + } + } +} http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/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 cdd2f9a..2ef0df3 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 @@ -19,15 +19,14 @@ package org.apache.tinkerpop.gremlin.process.traversal; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.EngineDependentStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.TraversalVertexProgramStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.FilterRankingStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchPredicateStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory; import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies; @@ -62,6 +61,10 @@ public interface TraversalStrategies extends Serializable, Cloneable { */ public List> toList(); + public default boolean onGraphComputer() { + return toList().stream().filter(strategy -> strategy instanceof TraversalVertexProgramStrategy).findAny().isPresent(); + } + /** * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}. * This method must ensure that the strategies are sorted prior to application. @@ -197,7 +200,6 @@ public interface TraversalStrategies extends Serializable, Cloneable { final TraversalStrategies coreStrategies = new DefaultTraversalStrategies(); coreStrategies.addStrategies( ConnectiveStrategy.instance(), - EngineDependentStrategy.instance(), ProfileStrategy.instance(), IncidentToAdjacentStrategy.instance(), AdjacentToIncidentStrategy.instance(), @@ -205,7 +207,6 @@ public interface TraversalStrategies extends Serializable, Cloneable { IdentityRemovalStrategy.instance(), MatchPredicateStrategy.instance(), RangeByIsCountStrategy.instance(), - ComputerVerificationStrategy.instance(), StandardVerificationStrategy.instance()); //LambdaRestrictionStrategy.instance(), //LazyBarrierStrategy.instance(), http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/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 8395ace..0b7058c 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 @@ -19,14 +19,15 @@ package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; 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.engine.ComputerTraversalEngine; -import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep; +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.process.traversal.strategy.finalization.TraversalVertexProgramStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -34,12 +35,13 @@ import org.apache.tinkerpop.gremlin.structure.Transaction; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier; +import org.javatuples.Pair; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.function.BinaryOperator; +import java.util.function.Function; import java.util.function.Supplier; import java.util.function.UnaryOperator; @@ -48,317 +50,187 @@ import java.util.function.UnaryOperator; */ public class GraphTraversalSource implements TraversalSource { - public static Builder standard() { - return GraphTraversalSource.build().engine(StandardTraversalEngine.build()); - } + private final Graph graph; + private TraversalStrategies strategies; + private boolean oneBulk = false; + private boolean pathOn = false; - public static Builder computer() { - return GraphTraversalSource.build().engine(ComputerTraversalEngine.build()); + public GraphTraversalSource(final Graph graph, final TraversalStrategies traversalStrategies) { + this.graph = graph; + this.strategies = traversalStrategies; } - public static Builder computer(final Class graphComputerClass) { - return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(graphComputerClass)); - } - - //// - - private final transient Graph graph; - private final TraversalEngine.Builder engineBuilder; - private final TraversalStrategies strategies; - private final List withStrategies; - private final List> withoutStrategies; - - private GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engineBuilder, final List withStrategies, final List> withoutStrategies) { - this.graph = graph; - this.engineBuilder = engineBuilder; - this.withStrategies = withStrategies; - this.withoutStrategies = withoutStrategies; - this.withStrategies.addAll(engineBuilder.getWithStrategies()); - this.withoutStrategies.addAll(engineBuilder.getWithoutStrategies()); - final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()); - this.strategies = withStrategies.isEmpty() && withoutStrategies.isEmpty() ? - tempStrategies : - tempStrategies.clone() - .addStrategies(withStrategies.toArray(new TraversalStrategy[withStrategies.size()])) - .removeStrategies(withoutStrategies.toArray(new Class[withoutStrategies.size()])); + public GraphTraversalSource(final Graph graph) { + this(graph, TraversalStrategies.GlobalCache.getStrategies(graph.getClass())); } private GraphTraversal.Admin generateTraversal() { final GraphTraversal.Admin traversal = new DefaultGraphTraversal<>(this.graph); - final TraversalEngine engine = this.engineBuilder.create(this.graph); - traversal.setEngine(engine); traversal.setStrategies(this.strategies); + if (this.oneBulk) + traversal.addTraverserRequirement(TraverserRequirement.ONE_BULK); + if (this.pathOn) + traversal.addTraverserRequirement(TraverserRequirement.PATH); return traversal; } - public GraphTraversal inject(S... starts) { - return (GraphTraversal) this.generateTraversal().inject(starts); + @Override + public TraversalStrategies getStrategies() { + return this.strategies; } - /** - * @deprecated As of release 3.1.0, replaced by {@link #addV()} - */ - @Deprecated - public GraphTraversal addV(final Object... keyValues) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.addStep(new AddVertexStartStep(traversal, null)); - ((AddVertexStartStep) traversal.getEndStep()).addPropertyMutations(keyValues); - return traversal; + @Override + public Graph getGraph() { + return this.graph; } - public GraphTraversal addV(final String label) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - return traversal.addStep(new AddVertexStartStep(traversal, label)); + @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException") + public GraphTraversalSource clone() { + try { + final GraphTraversalSource clone = (GraphTraversalSource) super.clone(); + return clone; + } catch (final CloneNotSupportedException e) { + throw new IllegalStateException(e.getMessage(), e); + } } - public GraphTraversal addV() { - final GraphTraversal.Admin traversal = this.generateTraversal(); - return traversal.addStep(new AddVertexStartStep(traversal, null)); + //// UTILITIES + + + public GraphTraversalSource withComputer(final Function graphComputerFunction) { + this.strategies = this.strategies.clone(); + this.strategies.addStrategies(new TraversalVertexProgramStrategy(graphComputerFunction), ComputerVerificationStrategy.instance()); + return this; } - public GraphTraversal V(final Object... vertexIds) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - return traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, vertexIds)); + public GraphTraversalSource withComputer(final Class graphComputerClass) { + return this.withComputer(g -> g.compute(graphComputerClass)); } - public GraphTraversal E(final Object... edgesIds) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - return traversal.addStep(new GraphStep<>(traversal, Edge.class, true, edgesIds)); + public GraphTraversalSource withComputer() { + return this.withComputer(Graph::compute); } - //// UTILITIES + public GraphTraversalSource withStrategy(final TraversalStrategy... traversalStrategies) { + this.strategies = this.strategies.clone(); + this.strategies.addStrategies(traversalStrategies); + return this; + } + + public GraphTraversalSource withoutStrategy(final Class... traversalStrategyClass) { + this.strategies = this.strategies.clone(); + this.strategies.removeStrategies(traversalStrategyClass); + return this; + } - public GraphTraversalSourceStub withSideEffect(final String key, final Supplier supplier) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.getSideEffects().registerSupplier(key, supplier); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withSideEffect(final String key, final Supplier sideEffect) { + this.strategies = this.strategies.clone(); + this.strategies.addStrategies(new SideEffectStrategy(Collections.singletonList(new Pair<>(key, sideEffect)))); + return this; } - public GraphTraversalSourceStub withSideEffect(final String key, final Object object) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.getSideEffects().registerSupplier(key, new ConstantSupplier<>(object)); - return new GraphTraversalSourceStub(traversal); + + public GraphTraversalSource withSideEffect(final Object... keyValues) { + this.strategies = this.strategies.clone(); + final List> sideEffects = new ArrayList<>(); + for (int i = 0; i < keyValues.length; i = i + 2) { + sideEffects.add(new Pair<>((String) keyValues[i], keyValues[i + 1] instanceof Supplier ? (Supplier) keyValues[i + 1] : new ConstantSupplier<>(keyValues[i + 1]))); + } + this.strategies.addStrategies(new SideEffectStrategy(sideEffects)); + return this; } - public GraphTraversalSourceStub withSack(final A initialValue) { + public GraphTraversalSource withSack(final A initialValue) { return this.withSack(initialValue, null, null); } - public GraphTraversalSourceStub withSack(final Supplier initialValue) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.getSideEffects().setSack(initialValue, null, null); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withSack(final Supplier initialValue) { + return this;//.withSack((Supplier) initialValue, null, null); } - public GraphTraversalSourceStub withSack(final Supplier initialValue, final UnaryOperator splitOperator) { + public GraphTraversalSource withSack(final Supplier initialValue, final UnaryOperator splitOperator) { return this.withSack(initialValue, splitOperator, null); } - public GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator splitOperator) { + public GraphTraversalSource withSack(final A initialValue, final UnaryOperator splitOperator) { return this.withSack(initialValue, splitOperator, null); } - public GraphTraversalSourceStub withSack(final Supplier initialValue, final BinaryOperator mergeOperator) { + public GraphTraversalSource withSack(final Supplier initialValue, final BinaryOperator mergeOperator) { return this.withSack(initialValue, null, mergeOperator); } - public GraphTraversalSourceStub withSack(final A initialValue, final BinaryOperator mergeOperator) { + public GraphTraversalSource withSack(final A initialValue, final BinaryOperator mergeOperator) { return this.withSack(initialValue, null, mergeOperator); } - public GraphTraversalSourceStub withSack(final Supplier initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.getSideEffects().setSack(initialValue, splitOperator, mergeOperator); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withSack(final Supplier initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { + this.strategies = this.strategies.clone(); + this.strategies.addStrategies(new SackStrategy(initialValue, splitOperator, mergeOperator)); + return this; } - public GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withSack(final A initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { + this.strategies = this.strategies.clone(); + this.strategies.addStrategies(new SackStrategy(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator)); + return this; } - public GraphTraversalSourceStub withBulk(final boolean useBulk) { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.addTraverserRequirement(useBulk ? TraverserRequirement.BULK : TraverserRequirement.ONE_BULK); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withBulk(final boolean useBulk) { + this.oneBulk = !useBulk; + return this; } - public GraphTraversalSourceStub withPath() { - final GraphTraversal.Admin traversal = this.generateTraversal(); - traversal.addTraverserRequirement(TraverserRequirement.PATH); - return new GraphTraversalSourceStub(traversal); + public GraphTraversalSource withPath() { + this.pathOn = true; + return this; } - public Transaction tx() { - return this.graph.tx(); - } + ///////////////////////////// - public static Builder build() { - return new Builder(); + /** + * @deprecated As of release 3.1.0, replaced by {@link #addV()} + */ + @Deprecated + public GraphTraversal addV(final Object... keyValues) { + final GraphTraversal.Admin traversal = this.generateTraversal(); + traversal.addStep(new AddVertexStartStep(traversal, null)); + ((AddVertexStartStep) traversal.getEndStep()).addPropertyMutations(keyValues); + return traversal; } - @Override - public List getStrategies() { - return Collections.unmodifiableList(this.strategies.toList()); + public GraphTraversal addV(final String label) { + final GraphTraversal.Admin traversal = this.generateTraversal(); + return traversal.addStep(new AddVertexStartStep(traversal, label)); } - @Override - public Optional getGraphComputer() { - return this.engineBuilder.create(this.graph).getGraphComputer(); + public GraphTraversal addV() { + final GraphTraversal.Admin traversal = this.generateTraversal(); + return traversal.addStep(new AddVertexStartStep(traversal, null)); } - @Override - public Optional getGraph() { - return Optional.ofNullable(this.graph); + public GraphTraversal inject(S... starts) { + return (GraphTraversal) this.generateTraversal().inject(starts); } - @Override - public GraphTraversalSource.Builder asBuilder() { - final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engineBuilder); - this.withStrategies.forEach(builder::with); - this.withoutStrategies.forEach(builder::without); - return builder; + public GraphTraversal V(final Object... vertexIds) { + final GraphTraversal.Admin traversal = this.generateTraversal(); + return traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, vertexIds)); } - @Override - public String toString() { - return StringFactory.traversalSourceString(this); + public GraphTraversal E(final Object... edgesIds) { + final GraphTraversal.Admin traversal = this.generateTraversal(); + return traversal.addStep(new GraphStep<>(traversal, Edge.class, true, edgesIds)); } - ////// - - public final static class Builder implements TraversalSource.Builder { - - private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build(); - private List withStrategies = new ArrayList<>(); - private List> withoutStrategies = new ArrayList<>(); - - private Builder() { - } - - @Override - public Builder engine(final TraversalEngine.Builder engineBuilder) { - this.engineBuilder = engineBuilder; - return this; - } - @Override - public Builder with(final TraversalStrategy strategy) { - this.withStrategies.add(strategy); - return this; - } - - @Override - public TraversalSource.Builder without(final Class strategyClass) { - this.withoutStrategies.add(strategyClass); - return this; - } - - @Override - public GraphTraversalSource create(final Graph graph) { - return new GraphTraversalSource(graph, this.engineBuilder, this.withStrategies, this.withoutStrategies); - } + public Transaction tx() { + return this.graph.tx(); } - public static class GraphTraversalSourceStub { - - private final GraphTraversal.Admin traversal; - - public GraphTraversalSourceStub(final GraphTraversal.Admin traversal) { - this.traversal = traversal; - } - - public GraphTraversal inject(S... starts) { - return this.traversal.inject(starts); - } - - /** - * @deprecated As of release 3.1.0, replaced by {@link #addV()} - */ - @Deprecated - public GraphTraversal addV(final Object... keyValues) { - this.traversal.addStep(new AddVertexStartStep(this.traversal, null)); - ((AddVertexStartStep) this.traversal.getEndStep()).addPropertyMutations(keyValues); - return this.traversal; - } - - public GraphTraversal addV(final String label) { - return this.traversal.addStep(new AddVertexStartStep(this.traversal, label)); - } - public GraphTraversal addV() { - return this.traversal.addStep(new AddVertexStartStep(this.traversal, null)); - } - - public GraphTraversal V(final Object... vertexIds) { - return this.traversal.addStep(new GraphStep<>(this.traversal, Vertex.class, true, vertexIds)); - } - - public GraphTraversal E(final Object... edgesIds) { - return this.traversal.addStep(new GraphStep<>(this.traversal, Edge.class, true, edgesIds)); - } - - //// UTILITIES - - public GraphTraversalSourceStub withSideEffect(final String key, final Supplier supplier) { - this.traversal.getSideEffects().registerSupplier(key, supplier); - return this; - } - - public GraphTraversalSourceStub withSideEffect(final String key, final Object object) { - this.traversal.getSideEffects().registerSupplier(key, new ConstantSupplier<>(object)); - return this; - } - - public GraphTraversalSourceStub withSack(final A initialValue) { - this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), null, null); - return this; - } - - public GraphTraversalSourceStub withSack(final Supplier initialValue) { - this.traversal.getSideEffects().setSack(initialValue, null, null); - return this; - } - - public GraphTraversalSourceStub withSack(final Supplier initialValue, final UnaryOperator splitOperator) { - this.traversal.getSideEffects().setSack(initialValue, splitOperator, null); - return this; - } - - public GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator splitOperator) { - this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, null); - return this; - } - - public GraphTraversalSourceStub withSack(final Supplier initialValue, final BinaryOperator mergeOperator) { - this.traversal.getSideEffects().setSack(initialValue, null, mergeOperator); - return this; - } - - public GraphTraversalSourceStub withSack(final A initialValue, final BinaryOperator mergeOperator) { - this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), null, mergeOperator); - return this; - } - - public GraphTraversalSourceStub withSack(final Supplier initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { - this.traversal.getSideEffects().setSack(initialValue, splitOperator, mergeOperator); - return this; - } - - public GraphTraversalSourceStub withSack(final A initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { - this.traversal.getSideEffects().setSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator); - return this; - } - - public GraphTraversalSourceStub withBulk(final boolean useBulk) { - this.traversal.addTraverserRequirement(useBulk ? TraverserRequirement.BULK : TraverserRequirement.ONE_BULK); - return this; - } - - public GraphTraversalSourceStub withPath() { - this.traversal.addTraverserRequirement(TraverserRequirement.PATH); - return this; - } + @Override + public String toString() { + return StringFactory.traversalSourceString(this); } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java index 3928bf9..0064502 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java @@ -19,7 +19,6 @@ package org.apache.tinkerpop.gremlin.process.traversal.engine; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; -import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; @@ -29,7 +28,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.Prof 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.structure.util.StringFactory; import java.util.Collections; import java.util.HashSet; @@ -40,6 +38,7 @@ import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ +@Deprecated public final class ComputerTraversalEngine implements TraversalEngine { private final transient GraphComputer graphComputer; @@ -55,7 +54,8 @@ public final class ComputerTraversalEngine implements TraversalEngine { @Override public String toString() { - return StringFactory.traversalEngineString(this); + return null; + //return StringFactory.traversalEngineString(this); } @Override @@ -132,9 +132,9 @@ public final class ComputerTraversalEngine implements TraversalEngine { @Override public void apply(final Traversal.Admin traversal) { if (traversal.getParent() instanceof EmptyStep) { - final TraversalEngine engine = traversal.getEngine(); - if (engine.isComputer()) - traversal.addStep(new ComputerResultStep<>(traversal, engine.getGraphComputer().get(), true)); + //final TraversalEngine engine = traversal.getEngine(); + //if (engine.isComputer()) + // traversal.addStep(new ComputerResultStep<>(traversal, engine.getGraphComputer().get(), true)); } } @@ -147,4 +147,4 @@ public final class ComputerTraversalEngine implements TraversalEngine { return INSTANCE; } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java index d2a62f1..d72dc36 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java @@ -18,17 +18,16 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.engine; -import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; +import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.structure.Graph; -import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.Optional; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ +@Deprecated public final class StandardTraversalEngine implements TraversalEngine { private static final StandardTraversalEngine INSTANCE = new StandardTraversalEngine(); @@ -57,7 +56,8 @@ public final class StandardTraversalEngine implements TraversalEngine { @Override public String toString() { - return StringFactory.traversalEngineString(this); + return "null"; + //return StringFactory.traversalEngineString(this); } public final static class Builder implements TraversalEngine.Builder { @@ -69,4 +69,4 @@ public final class StandardTraversalEngine implements TraversalEngine { return StandardTraversalEngine.INSTANCE; } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java index 2f27372..c7ca249 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java @@ -20,12 +20,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.lambda; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator; -import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator; @@ -71,11 +69,6 @@ public abstract class AbstractLambdaTraversal implements Traversal.Admin implements Traversal.Admin getGraph() { return Optional.empty(); } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java index cb1aeec..d1efd11 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java @@ -18,13 +18,11 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.step; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; - /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ public interface EngineDependent { - public void onEngine(final TraversalEngine traversalEngine); + public void onGraphComputer(); } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java index de3e669..5f33750 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java @@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent; import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep; @@ -99,13 +98,11 @@ public class GraphStep extends AbstractStep implemen } @Override - public void onEngine(final TraversalEngine traversalEngine) { - if (traversalEngine.isComputer()) { - this.iteratorSupplier = Collections::emptyIterator; - for (int i = 0; i < this.ids.length; i++) { // if this is going to OLAP, convert to ids so you don't serialize elements - if (this.ids[i] instanceof Element) - this.ids[i] = ((Element) this.ids[i]).id(); - } + public void onGraphComputer() { + this.iteratorSupplier = Collections::emptyIterator; + for (int i = 0; i < this.ids.length; i++) { // if this is going to OLAP, convert to ids so you don't serialize elements + if (this.ids[i] instanceof Element) + this.ids[i] = ((Element) this.ids[i]).id(); } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java index b2885b9..ecabfec 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java @@ -25,7 +25,6 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier; @@ -131,8 +130,8 @@ public final class GroupSideEffectStep extends SideEffectStep implem } @Override - public void onEngine(final TraversalEngine traversalEngine) { - this.onGraphComputer = traversalEngine.isComputer(); + public void onGraphComputer() { + this.onGraphComputer = true; } @Override @@ -232,10 +231,10 @@ public final class GroupSideEffectStep extends SideEffectStep implem @Override public void reduce(final K key, final Iterator> values, final ReduceEmitter emitter) { - Traversal.Admin reduceTraversalClone = this.reduceTraversal.clone(); + Traversal.Admin reduceTraversalClone = this.reduceTraversal.clone(); while (values.hasNext()) { final BulkSet value = (BulkSet) values.next(); - value.forEach((v,bulk) -> reduceTraversalClone.addStart(reduceTraversalClone.getTraverserGenerator().generate(v, (Step) reduceTraversalClone.getStartStep(), bulk))); + value.forEach((v, bulk) -> reduceTraversalClone.addStart(reduceTraversalClone.getTraverserGenerator().generate(v, (Step) reduceTraversalClone.getStartStep(), bulk))); TraversalHelper.getFirstStepOfAssignableClass(Barrier.class, reduceTraversalClone).ifPresent(Barrier::processAllStarts); } emitter.emit(key, reduceTraversalClone.next()); http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStepV3d0.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStepV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStepV3d0.java index 643466d..a6bece6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStepV3d0.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStepV3d0.java @@ -96,8 +96,8 @@ public final class GroupSideEffectStepV3d0 extends SideEffectStep } @Override - public void onEngine(final TraversalEngine traversalEngine) { - this.onGraphComputer = traversalEngine.isComputer(); + public void onGraphComputer() { + this.onGraphComputer = true; } @Override http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java index e42e5fa..f8a182b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java @@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent; import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer; import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; @@ -44,10 +45,11 @@ import java.util.NoSuchElementException; /** * @author Bob Briody (http://bobbriody.com) */ -public final class ProfileStep extends AbstractStep implements MapReducer { +public final class ProfileStep extends AbstractStep implements MapReducer, EngineDependent { // Stored in the Traversal sideEffects but kept here as a reference for convenience. private StandardTraversalMetrics traversalMetrics; + private boolean onGraphComputer = false; public ProfileStep(final Traversal.Admin traversal) { super(traversal); @@ -140,7 +142,7 @@ public final class ProfileStep extends AbstractStep implements MapReduc MutableMetrics metrics; // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time. - if (traversal.getEngine().isComputer()) { + if (this.onGraphComputer) { metrics = new MutableMetrics(step.getId(), step.toString()); } else { metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics); @@ -178,6 +180,11 @@ public final class ProfileStep extends AbstractStep implements MapReduc } } + @Override + public void onGraphComputer() { + this.onGraphComputer = true; + } + ////////////////// public static final class ProfileMapReduce extends StaticMapReduce { http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java index 419205c..b5b3346 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java @@ -19,7 +19,6 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.util; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; @@ -49,8 +48,8 @@ public abstract class ComputerAwareStep extends AbstractStep impleme } @Override - public void onEngine(final TraversalEngine engine) { - this.traverserStepIdAndLabelsSetByChild = engine.isComputer(); + public void onGraphComputer() { + this.traverserStepIdAndLabelsSetByChild = true; } @Override @@ -88,8 +87,8 @@ public abstract class ComputerAwareStep extends AbstractStep impleme } @Override - public void onEngine(final TraversalEngine engine) { - this.traverserStepIdAndLabelsSetByChild = engine.isComputer(); + public void onGraphComputer() { + this.traverserStepIdAndLabelsSetByChild = true; } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java index b459071..69ba60d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java @@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce; import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier; import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent; @@ -68,8 +67,8 @@ public abstract class ReducingBarrierStep extends AbstractStep imple } @Override - public void onEngine(final TraversalEngine traversalEngine) { - this.byPass = traversalEngine.isComputer(); + public void onGraphComputer() { + this.byPass = true; } @Override http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java index a3e6b77..b3eb8a2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java @@ -58,7 +58,7 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy traversal) { if (TraversalHelper.hasStepOfAssignableClass(ConnectiveStep.class, traversal)) { - processConjunctionMarkers(traversal); + processConnectiveMarker(traversal); } } @@ -66,7 +66,7 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy traversal) { + private static void processConnectiveMarker(final Traversal.Admin traversal) { processConjunctionMarker(OrStep.class, traversal); processConjunctionMarker(AndStep.class, traversal); } @@ -75,15 +75,15 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy conjunctionStep.getLocalChildren().isEmpty()) - .findFirst().ifPresent(conjunctionStep -> { + .findFirst().ifPresent(connectiveStep -> { - Step currentStep = conjunctionStep.getNextStep(); + Step currentStep = connectiveStep.getNextStep(); final Traversal.Admin rightTraversal = __.start().asAdmin(); - if (!conjunctionStep.getLabels().isEmpty()) { + if (!connectiveStep.getLabels().isEmpty()) { final StartStep startStep = new StartStep<>(rightTraversal); - final Set conjunctionLabels = ((Step) conjunctionStep).getLabels(); + final Set conjunctionLabels = ((Step) connectiveStep).getLabels(); conjunctionLabels.forEach(startStep::addLabel); - conjunctionLabels.forEach(label -> conjunctionStep.removeLabel(label)); + conjunctionLabels.forEach(label -> connectiveStep.removeLabel(label)); rightTraversal.addStep(startStep); } while (legalCurrentStep(currentStep)) { @@ -92,9 +92,9 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy leftTraversal = __.start().asAdmin(); while (legalCurrentStep(currentStep)) { final Step previousStep = currentStep.getPreviousStep(); @@ -102,10 +102,10 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy { + + private final Supplier initialValue; + private final UnaryOperator splitOperator; + private final BinaryOperator mergeOperator; + + + public SackStrategy(final Supplier initialValue, final UnaryOperator splitOperator, final BinaryOperator mergeOperator) { + this.initialValue = initialValue; + this.splitOperator = splitOperator; + this.mergeOperator = mergeOperator; + } + + @Override + public void apply(final Traversal.Admin traversal) { + if (traversal.getParent() instanceof EmptyStep) + traversal.getSideEffects().setSack(this.initialValue, this.splitOperator, this.mergeOperator); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5f2cd677/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java new file mode 100644 index 0000000..02c76be --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SideEffectStrategy.java @@ -0,0 +1,47 @@ +/* + * 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.decoration; + +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.javatuples.Pair; + +import java.util.List; +import java.util.function.Supplier; + +/** + * @author Marko A. Rodriguez (http://markorodriguez.com) + */ +public final class SideEffectStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy { + + private final List> sideEffects; + + public SideEffectStrategy(final List> sideEffects) { + this.sideEffects = sideEffects; + } + + @Override + public void apply(final Traversal.Admin traversal) { + if (traversal.getParent() instanceof EmptyStep) + this.sideEffects.forEach(pair -> traversal.getSideEffects().registerSupplier(pair.getValue0(), pair.getValue1())); + } +} \ No newline at end of file