You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/03/25 17:53:56 UTC
[22/24] incubator-tinkerpop git commit: VertexProgramStrategy and
RemoteStrategy were not in decoration sub-packages. Moved them accordingly.
Also,
fixed a minor bug in ComputerVerificationStrategy around the definition of a
'global child'.
VertexProgramStrategy and RemoteStrategy were not in decoration sub-packages. Moved them accordingly. Also, fixed a minor bug in ComputerVerificationStrategy around the definition of a 'global child'.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/cbdac5ef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/cbdac5ef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/cbdac5ef
Branch: refs/heads/TINKERPOP-1236
Commit: cbdac5efc2b5bfb6a3faee35639dd0cd8f1c38e8
Parents: 4c97dd7
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Mar 25 09:32:38 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Mar 25 09:32:38 2016 -0600
----------------------------------------------------------------------
.../traversal/TraversalVertexProgram.java | 2 +-
.../decoration/VertexProgramStrategy.java | 150 +++++++++++++++++++
.../gremlin/process/remote/RemoteGraph.java | 2 +-
.../remote/traversal/step/map/RemoteStep.java | 2 +-
.../traversal/strategy/RemoteStrategy.java | 96 ------------
.../strategy/decoration/RemoteStrategy.java | 96 ++++++++++++
.../process/traversal/TraversalSource.java | 2 +-
.../decoration/RequirementsStrategy.java | 1 +
.../decoration/VertexProgramStrategy.java | 150 -------------------
.../finalization/MatchAlgorithmStrategy.java | 10 +-
.../strategy/finalization/ProfileStrategy.java | 4 +-
.../ComputerVerificationStrategy.java | 2 +-
.../process/traversal/util/TraversalHelper.java | 9 ++
.../gremlin/structure/util/StringFactory.java | 2 +-
.../decoration/VertexProgramStrategyTest.java | 1 +
.../groovy/plugin/HadoopRemoteAcceptor.java | 2 +-
16 files changed, 271 insertions(+), 260 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/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 a24386d..8e4a75e 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
@@ -59,7 +59,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSid
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
new file mode 100644
index 0000000..aecff68
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/strategy/decoration/VertexProgramStrategy.java
@@ -0,0 +1,150 @@
+/*
+ * 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.computer.traversal.strategy.decoration;
+
+import org.apache.tinkerpop.gremlin.process.computer.Computer;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComputing;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.HashSet;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class VertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+
+ private Computer computer;
+
+ private VertexProgramStrategy() {
+
+ }
+
+ public VertexProgramStrategy(final Computer computer) {
+ this.computer = computer;
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ // VertexPrograms can only execute at the root level of a Traversal and should not be applied locally prior to RemoteStrategy
+ if (!(traversal.getParent() instanceof EmptyStep) || traversal.getStrategies().toList().contains(RemoteStrategy.instance()))
+ return;
+
+ // back propagate as()-labels off of vertex computing steps
+ Step<?, ?> currentStep = traversal.getEndStep();
+ final Set<String> currentLabels = new HashSet<>();
+ while (!(currentStep instanceof EmptyStep)) {
+ if (currentStep instanceof VertexComputing) {
+ currentLabels.addAll(currentStep.getLabels());
+ currentStep.getLabels().forEach(currentStep::removeLabel);
+ } else {
+ currentLabels.forEach(currentStep::addLabel);
+ currentLabels.clear();
+ }
+ currentStep = currentStep.getPreviousStep();
+ }
+
+ // push GraphStep forward in the chain to reduce the number of TraversalVertexProgram compilations
+ currentStep = traversal.getStartStep();
+ while (!(currentStep instanceof EmptyStep)) {
+ if (currentStep instanceof GraphStep && currentStep.getNextStep() instanceof VertexComputing) {
+ int index = TraversalHelper.stepIndex(currentStep.getNextStep(), traversal);
+ traversal.removeStep(currentStep);
+ traversal.addStep(index, currentStep);
+ } else
+ currentStep = currentStep.getNextStep();
+ }
+
+ // wrap all non-VertexComputing steps into a TraversalVertexProgramStep
+ currentStep = traversal.getStartStep();
+ while (!(currentStep instanceof EmptyStep)) {
+ Traversal.Admin<?, ?> computerTraversal = new DefaultTraversal<>();
+ Step<?, ?> firstLegalOLAPStep = getFirstLegalOLAPStep(currentStep);
+ Step<?, ?> lastLegalOLAPStep = getLastLegalOLAPStep(currentStep);
+ if (!(firstLegalOLAPStep instanceof EmptyStep)) {
+ int index = TraversalHelper.stepIndex(firstLegalOLAPStep, traversal);
+ TraversalHelper.removeToTraversal(firstLegalOLAPStep, lastLegalOLAPStep.getNextStep(), (Traversal.Admin) computerTraversal);
+ final TraversalVertexProgramStep traversalVertexProgramStep = new TraversalVertexProgramStep(traversal, computerTraversal);
+ traversal.addStep(index, traversalVertexProgramStep);
+ }
+ currentStep = traversal.getStartStep();
+ while (!(currentStep instanceof EmptyStep)) {
+ if (!(currentStep instanceof VertexComputing))
+ break;
+ currentStep = currentStep.getNextStep();
+ }
+ }
+ // if the last vertex computing step is a TraversalVertexProgramStep convert to OLTP with ComputerResultStep
+ TraversalHelper.getLastStepOfAssignableClass(VertexComputing.class, traversal).ifPresent(step -> {
+ if (step instanceof TraversalVertexProgramStep) {
+ final ComputerResultStep computerResultStep = new ComputerResultStep<>(traversal);
+ ((TraversalVertexProgramStep) step).getGlobalChildren().get(0).getEndStep().getLabels().forEach(computerResultStep::addLabel);
+ // labeling should happen in TraversalVertexProgram (perhaps MapReduce)
+ TraversalHelper.insertAfterStep(computerResultStep, (Step) step, traversal);
+ }
+ });
+ // if there is a dangling vertex computing step, add an identity traversal (solve this in the future with a specialized MapReduce)
+ if (traversal.getEndStep() instanceof VertexComputing && !(traversal.getEndStep() instanceof TraversalVertexProgramStep)) {
+ final TraversalVertexProgramStep traversalVertexProgramStep = new TraversalVertexProgramStep(traversal, __.identity().asAdmin());
+ traversal.addStep(traversalVertexProgramStep);
+ traversal.addStep(new ComputerResultStep<>(traversal));
+ }
+ // all vertex computing steps needs the graph computer function
+ traversal.getSteps().stream().filter(step -> step instanceof VertexComputing).forEach(step -> ((VertexComputing) step).setGraphComputerFunction(this.computer));
+ }
+
+ private static Step<?, ?> getFirstLegalOLAPStep(Step<?, ?> currentStep) {
+ while (!(currentStep instanceof EmptyStep)) {
+ if (!(currentStep instanceof VertexComputing))
+ return currentStep;
+ currentStep = currentStep.getNextStep();
+ }
+ return EmptyStep.instance();
+ }
+
+ private static Step<?, ?> getLastLegalOLAPStep(Step<?, ?> currentStep) {
+ while (currentStep instanceof VertexComputing)
+ currentStep = currentStep.getNextStep();
+ while (!(currentStep instanceof EmptyStep)) {
+ if (currentStep instanceof VertexComputing)
+ return currentStep.getPreviousStep();
+ currentStep = currentStep.getNextStep();
+ }
+ return EmptyStep.instance();
+ }
+
+ public static Optional<Computer> getComputer(final TraversalStrategies strategies) {
+ final Optional<TraversalStrategy<?>> optional = strategies.toList().stream().filter(strategy -> strategy instanceof VertexProgramStrategy).findAny();
+ return optional.isPresent() ? Optional.of(((VertexProgramStrategy) optional.get()).computer) : Optional.empty();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
index 3fe6eb2..6fd04b1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/RemoteGraph.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.remote;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.RemoteStrategy;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
index 5da4c9d..873f86e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/step/map/RemoteStep.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.process.remote.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
import org.apache.tinkerpop.gremlin.process.remote.RemoteConnectionException;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.RemoteStrategy;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.decoration.RemoteStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/RemoteStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/RemoteStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/RemoteStrategy.java
deleted file mode 100644
index 934e5bd..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/RemoteStrategy.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.remote.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
-import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * Reconstructs a {@link Traversal} by appending a {@link RemoteStep} to its end. That step will submit the
- * {@link Traversal} to a {@link RemoteConnection} instance which will typically send it to a remote server for
- * execution and return results.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RemoteStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy>
- implements TraversalStrategy.DecorationStrategy {
-
- private static final RemoteStrategy INSTANCE = new RemoteStrategy();
-
- private static final Set<Class<? extends DecorationStrategy>> POSTS = Collections.singleton(VertexProgramStrategy.class);
-
- private RemoteStrategy() {
- }
-
- public static RemoteStrategy instance() {
- return INSTANCE;
- }
-
- @Override
- public Set<Class<? extends DecorationStrategy>> applyPost() {
- return POSTS;
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- // ensure that ids are not elements so they are serializable
- TraversalHelper.getStepsOfAssignableClass(GraphStep.class, traversal).forEach(GraphStep::convertElementsToIds);
-
- if (!(traversal.getParent() instanceof EmptyStep))
- return;
-
- // verifications to ensure unsupported steps do not exist in the traversal
- if (TraversalHelper.hasStepOfAssignableClassRecursively(Arrays.asList(ProfileSideEffectStep.class, LambdaHolder.class), traversal))
- throw new VerificationException("RemoteGraph does not support profiling nor lambdas", traversal);
-
- if (!(traversal.getGraph().orElse(EmptyGraph.instance()) instanceof RemoteGraph))
- throw new IllegalStateException("RemoteStrategy expects a RemoteGraph instance attached to the Traversal");
-
- final RemoteGraph remoteGraph = (RemoteGraph) traversal.getGraph().get();
- if (null == remoteGraph.getConnection())
- throw new IllegalStateException("RemoteStrategy expects the RemoteGraph instance to have a RemoteConnection");
-
- final Traversal.Admin<?, ?> remoteTraversal = new DefaultTraversal<>();
- TraversalHelper.removeToTraversal(traversal.getStartStep(), EmptyStep.instance(), (Traversal.Admin) remoteTraversal);
- final RemoteStep<?, ?> remoteStep = new RemoteStep<>(traversal, remoteTraversal, remoteGraph.getConnection());
- traversal.addStep(remoteStep);
-
- assert traversal.getStartStep().equals(remoteStep);
- assert traversal.getSteps().size() == 1;
- assert traversal.getEndStep() == remoteStep;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
new file mode 100644
index 0000000..eb10bb5
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/remote/traversal/strategy/decoration/RemoteStrategy.java
@@ -0,0 +1,96 @@
+/*
+ * 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.remote.traversal.strategy.decoration;
+
+import org.apache.tinkerpop.gremlin.process.remote.RemoteConnection;
+import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
+import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Reconstructs a {@link Traversal} by appending a {@link RemoteStep} to its end. That step will submit the
+ * {@link Traversal} to a {@link RemoteConnection} instance which will typically send it to a remote server for
+ * execution and return results.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RemoteStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy>
+ implements TraversalStrategy.DecorationStrategy {
+
+ private static final RemoteStrategy INSTANCE = new RemoteStrategy();
+
+ private static final Set<Class<? extends DecorationStrategy>> POSTS = Collections.singleton(VertexProgramStrategy.class);
+
+ private RemoteStrategy() {
+ }
+
+ public static RemoteStrategy instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Set<Class<? extends DecorationStrategy>> applyPost() {
+ return POSTS;
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ // ensure that ids are not elements so they are serializable
+ TraversalHelper.getStepsOfAssignableClass(GraphStep.class, traversal).forEach(GraphStep::convertElementsToIds);
+
+ if (!(traversal.getParent() instanceof EmptyStep))
+ return;
+
+ // verifications to ensure unsupported steps do not exist in the traversal
+ if (TraversalHelper.hasStepOfAssignableClassRecursively(Arrays.asList(ProfileSideEffectStep.class, LambdaHolder.class), traversal))
+ throw new VerificationException("RemoteGraph does not support profiling nor lambdas", traversal);
+
+ if (!(traversal.getGraph().orElse(EmptyGraph.instance()) instanceof RemoteGraph))
+ throw new IllegalStateException("RemoteStrategy expects a RemoteGraph instance attached to the Traversal");
+
+ final RemoteGraph remoteGraph = (RemoteGraph) traversal.getGraph().get();
+ if (null == remoteGraph.getConnection())
+ throw new IllegalStateException("RemoteStrategy expects the RemoteGraph instance to have a RemoteConnection");
+
+ final Traversal.Admin<?, ?> remoteTraversal = new DefaultTraversal<>();
+ TraversalHelper.removeToTraversal(traversal.getStartStep(), EmptyStep.instance(), (Traversal.Admin) remoteTraversal);
+ final RemoteStep<?, ?> remoteStep = new RemoteStep<>(traversal, remoteTraversal, remoteGraph.getConnection());
+ traversal.addStep(remoteStep);
+
+ assert traversal.getStartStep().equals(remoteStep);
+ assert traversal.getSteps().size() == 1;
+ assert traversal.getEndStep() == remoteStep;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/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 aeabca8..54942aa 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
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
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.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
index 44ae81e..fc3f181 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
@@ -19,6 +19,7 @@
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
deleted file mode 100644
index 87979f5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-
-import org.apache.tinkerpop.gremlin.process.computer.Computer;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComputing;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
-import org.apache.tinkerpop.gremlin.process.remote.traversal.strategy.RemoteStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class VertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
-
- private Computer computer;
-
- private VertexProgramStrategy() {
-
- }
-
- public VertexProgramStrategy(final Computer computer) {
- this.computer = computer;
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- // VertexPrograms can only execute at the root level of a Traversal and should not be applied locally prior to RemoteStrategy
- if (!(traversal.getParent() instanceof EmptyStep) || traversal.getStrategies().toList().contains(RemoteStrategy.instance()))
- return;
-
- // back propagate as()-labels off of vertex computing steps
- Step<?, ?> currentStep = traversal.getEndStep();
- final Set<String> currentLabels = new HashSet<>();
- while (!(currentStep instanceof EmptyStep)) {
- if (currentStep instanceof VertexComputing) {
- currentLabels.addAll(currentStep.getLabels());
- currentStep.getLabels().forEach(currentStep::removeLabel);
- } else {
- currentLabels.forEach(currentStep::addLabel);
- currentLabels.clear();
- }
- currentStep = currentStep.getPreviousStep();
- }
-
- // push GraphStep forward in the chain to reduce the number of TraversalVertexProgram compilations
- currentStep = traversal.getStartStep();
- while (!(currentStep instanceof EmptyStep)) {
- if (currentStep instanceof GraphStep && currentStep.getNextStep() instanceof VertexComputing) {
- int index = TraversalHelper.stepIndex(currentStep.getNextStep(), traversal);
- traversal.removeStep(currentStep);
- traversal.addStep(index, currentStep);
- } else
- currentStep = currentStep.getNextStep();
- }
-
- // wrap all non-VertexComputing steps into a TraversalVertexProgramStep
- currentStep = traversal.getStartStep();
- while (!(currentStep instanceof EmptyStep)) {
- Traversal.Admin<?, ?> computerTraversal = new DefaultTraversal<>();
- Step<?, ?> firstLegalOLAPStep = getFirstLegalOLAPStep(currentStep);
- Step<?, ?> lastLegalOLAPStep = getLastLegalOLAPStep(currentStep);
- if (!(firstLegalOLAPStep instanceof EmptyStep)) {
- int index = TraversalHelper.stepIndex(firstLegalOLAPStep, traversal);
- TraversalHelper.removeToTraversal(firstLegalOLAPStep, lastLegalOLAPStep.getNextStep(), (Traversal.Admin) computerTraversal);
- final TraversalVertexProgramStep traversalVertexProgramStep = new TraversalVertexProgramStep(traversal, computerTraversal);
- traversal.addStep(index, traversalVertexProgramStep);
- }
- currentStep = traversal.getStartStep();
- while (!(currentStep instanceof EmptyStep)) {
- if (!(currentStep instanceof VertexComputing))
- break;
- currentStep = currentStep.getNextStep();
- }
- }
- // if the last vertex computing step is a TraversalVertexProgramStep convert to OLTP with ComputerResultStep
- TraversalHelper.getLastStepOfAssignableClass(VertexComputing.class, traversal).ifPresent(step -> {
- if (step instanceof TraversalVertexProgramStep) {
- final ComputerResultStep computerResultStep = new ComputerResultStep<>(traversal);
- ((TraversalVertexProgramStep) step).getGlobalChildren().get(0).getEndStep().getLabels().forEach(computerResultStep::addLabel);
- // labeling should happen in TraversalVertexProgram (perhaps MapReduce)
- TraversalHelper.insertAfterStep(computerResultStep, (Step) step, traversal);
- }
- });
- // if there is a dangling vertex computing step, add an identity traversal (solve this in the future with a specialized MapReduce)
- if (traversal.getEndStep() instanceof VertexComputing && !(traversal.getEndStep() instanceof TraversalVertexProgramStep)) {
- final TraversalVertexProgramStep traversalVertexProgramStep = new TraversalVertexProgramStep(traversal, __.identity().asAdmin());
- traversal.addStep(traversalVertexProgramStep);
- traversal.addStep(new ComputerResultStep<>(traversal));
- }
- // all vertex computing steps needs the graph computer function
- traversal.getSteps().stream().filter(step -> step instanceof VertexComputing).forEach(step -> ((VertexComputing) step).setGraphComputerFunction(this.computer));
- }
-
- private static Step<?, ?> getFirstLegalOLAPStep(Step<?, ?> currentStep) {
- while (!(currentStep instanceof EmptyStep)) {
- if (!(currentStep instanceof VertexComputing))
- return currentStep;
- currentStep = currentStep.getNextStep();
- }
- return EmptyStep.instance();
- }
-
- private static Step<?, ?> getLastLegalOLAPStep(Step<?, ?> currentStep) {
- while (currentStep instanceof VertexComputing)
- currentStep = currentStep.getNextStep();
- while (!(currentStep instanceof EmptyStep)) {
- if (currentStep instanceof VertexComputing)
- return currentStep.getPreviousStep();
- currentStep = currentStep.getNextStep();
- }
- return EmptyStep.instance();
- }
-
- public static Optional<Computer> getComputer(final TraversalStrategies strategies) {
- final Optional<TraversalStrategy<?>> optional = strategies.toList().stream().filter(strategy -> strategy instanceof VertexProgramStrategy).findAny();
- return optional.isPresent() ? Optional.of(((VertexProgramStrategy) optional.get()).computer) : Optional.empty();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java
index ffafbc0..be31575 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/MatchAlgorithmStrategy.java
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
/**
@@ -38,9 +38,11 @@ public final class MatchAlgorithmStrategy extends AbstractTraversalStrategy<Trav
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.hasStepOfClass(MatchStep.class, traversal))
- return;
- TraversalHelper.getStepsOfClass(MatchStep.class, traversal).forEach(matchStep -> matchStep.setMatchAlgorithm(this.matchAlgorithmClass));
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ if (step instanceof MatchStep) {
+ ((MatchStep) step).setMatchAlgorithm(this.matchAlgorithmClass);
+ }
+ }
}
public static Builder build() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index 995ee18..6d08652 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -21,9 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -42,7 +40,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal).asAdmin()).isEmpty()) {
+ if (TraversalHelper.hasStepOfAssignableClassRecursively(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal).asAdmin())) {
prepTraversalForProfiling(traversal);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index b5af063..4087f08 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -65,7 +65,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
if (!TraversalHelper.onGraphComputer(traversal))
return;
- final boolean globalChild = traversal.getParent().isGlobalChild(traversal);
+ final boolean globalChild = TraversalHelper.isGlobalChild(traversal);
if (traversal.getParent() instanceof TraversalVertexProgramStep) {
if (TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index 6f442fd..9f5a236 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -238,6 +238,15 @@ public final class TraversalHelper {
return list;
}
+ public static boolean isGlobalChild(Traversal.Admin<?, ?> traversal) {
+ while (!(traversal.getParent() instanceof EmptyStep)) {
+ if (traversal.getParent().isLocalChild(traversal))
+ return false;
+ traversal = traversal.getParent().asStep().getTraversal();
+ }
+ return true;
+ }
+
/**
* Determine if the traversal has a step of a particular class.
*
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index 88e7f4d..b803d6e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -30,7 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategyTest.java
index 7664c40..c091bb3 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategyTest.java
@@ -22,6 +22,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
import org.apache.tinkerpop.gremlin.process.computer.Computer;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cbdac5ef/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
index 356959a..558376e 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
@@ -28,7 +28,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Computer
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
import org.codehaus.groovy.tools.shell.Groovysh;