You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/03/19 19:26:19 UTC
[01/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master b563dc3d7 -> 4c97e9646
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java
deleted file mode 100644
index 60f9221..0000000
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java
+++ /dev/null
@@ -1,74 +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.tinkergraph.process.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.tinkergraph.process.graph.traversal.sideEffect.TinkerGraphStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
-
- private static final TinkerGraphStepStrategy INSTANCE = new TinkerGraphStepStrategy();
-
- private TinkerGraphStepStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getEngine().isComputer())
- return;
-
- final Step<?, ?> startStep = traversal.getStartStep();
- if (startStep instanceof GraphStep) {
- final GraphStep<?> originalGraphStep = (GraphStep) startStep;
- final TinkerGraphStep<?> tinkerGraphStep = new TinkerGraphStep<>(originalGraphStep);
- TraversalHelper.replaceStep(startStep, (Step) tinkerGraphStep, traversal);
-
- Step<?, ?> currentStep = tinkerGraphStep.getNextStep();
- while (true) {
- if (currentStep instanceof HasContainerHolder) {
- tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
- if (currentStep.getLabel().isPresent()) {
- final IdentityStep identityStep = new IdentityStep<>(traversal);
- identityStep.setLabel(currentStep.getLabel().get());
- TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
- }
- traversal.removeStep(currentStep);
- } else if (currentStep instanceof IdentityStep) {
- // do nothing
- } else {
- break;
- }
- currentStep = currentStep.getNextStep();
- }
- }
- }
-
- public static TinkerGraphStepStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
new file mode 100644
index 0000000..4b3c389
--- /dev/null
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
@@ -0,0 +1,117 @@
+/*
+ * 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.tinkergraph.process.traversal.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements HasContainerHolder {
+
+ public final List<HasContainer> hasContainers = new ArrayList<>();
+
+ public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
+ super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
+ if (originalGraphStep.getLabel().isPresent())
+ this.setLabel(originalGraphStep.getLabel().get());
+ this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
+ }
+
+ private Iterator<? extends Edge> edges() {
+ final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
+ final HasContainer indexedContainer = getIndexKey(Edge.class);
+ // ids are present, filter on them first
+ if (this.ids != null && this.ids.length > 0)
+ return this.iteratorList(graph.edges(this.ids));
+ else
+ return null == indexedContainer ?
+ this.iteratorList(graph.edges()) :
+ TinkerHelper.queryEdgeIndex(graph, indexedContainer.key, indexedContainer.value).stream()
+ .filter(edge -> HasContainer.testAll(edge, this.hasContainers))
+ .collect(Collectors.<Edge>toList()).iterator();
+ }
+
+ private Iterator<? extends Vertex> vertices() {
+ final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
+ final HasContainer indexedContainer = getIndexKey(Vertex.class);
+ // ids are present, filter on them first
+ if (this.ids != null && this.ids.length > 0)
+ return this.iteratorList(graph.vertices(this.ids));
+ else
+ return null == indexedContainer ?
+ this.iteratorList(graph.vertices()) :
+ TinkerHelper.queryVertexIndex(graph, indexedContainer.key, indexedContainer.value).stream()
+ .filter(vertex -> HasContainer.testAll(vertex, this.hasContainers))
+ .collect(Collectors.<Vertex>toList()).iterator();
+ }
+
+ private HasContainer getIndexKey(final Class<? extends Element> indexedClass) {
+ final Set<String> indexedKeys = ((TinkerGraph) this.getTraversal().getGraph().get()).getIndexedKeys(indexedClass);
+ return this.hasContainers.stream()
+ .filter(c -> indexedKeys.contains(c.key) && c.predicate.equals(Compare.eq))
+ .findAny()
+ .orElseGet(() -> null);
+ }
+
+ public String toString() {
+ if (this.hasContainers.isEmpty())
+ return super.toString();
+ else
+ return 0 == this.ids.length ?
+ TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), this.hasContainers) :
+ TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids), this.hasContainers);
+ }
+
+ private final <E extends Element> Iterator<E> iteratorList(final Iterator<E> iterator) {
+ final List<E> list = new ArrayList<>();
+ while (iterator.hasNext()) {
+ final E e = iterator.next();
+ if (HasContainer.testAll(e, this.hasContainers))
+ list.add(e);
+ }
+ return list.iterator();
+ }
+
+ @Override
+ public List<HasContainer> getHasContainers() {
+ return this.hasContainers;
+ }
+
+ @Override
+ public void addHasContainer(final HasContainer hasContainer) {
+ this.hasContainers.add(hasContainer);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
new file mode 100644
index 0000000..9a1832a
--- /dev/null
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
@@ -0,0 +1,74 @@
+/*
+ * 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.tinkergraph.process.traversal.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.step.sideEffect.TinkerGraphStep;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
+
+ private static final TinkerGraphStepStrategy INSTANCE = new TinkerGraphStepStrategy();
+
+ private TinkerGraphStepStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getEngine().isComputer())
+ return;
+
+ final Step<?, ?> startStep = traversal.getStartStep();
+ if (startStep instanceof GraphStep) {
+ final GraphStep<?> originalGraphStep = (GraphStep) startStep;
+ final TinkerGraphStep<?> tinkerGraphStep = new TinkerGraphStep<>(originalGraphStep);
+ TraversalHelper.replaceStep(startStep, (Step) tinkerGraphStep, traversal);
+
+ Step<?, ?> currentStep = tinkerGraphStep.getNextStep();
+ while (true) {
+ if (currentStep instanceof HasContainerHolder) {
+ tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
+ if (currentStep.getLabel().isPresent()) {
+ final IdentityStep identityStep = new IdentityStep<>(traversal);
+ identityStep.setLabel(currentStep.getLabel().get());
+ TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
+ }
+ traversal.removeStep(currentStep);
+ } else if (currentStep instanceof IdentityStep) {
+ // do nothing
+ } else {
+ break;
+ }
+ currentStep = currentStep.getNextStep();
+ }
+ }
+ }
+
+ public static TinkerGraphStepStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
index a1916b4..47cc99a 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.tinkergraph.structure;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
index d630f8e..3179a40 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
@@ -18,12 +18,12 @@
*/
package org.apache.tinkerpop.gremlin.tinkergraph.structure;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaFlatMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaFlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
index 75c2979..ea6e3cc 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
@@ -31,7 +31,7 @@ import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphView;
-import org.apache.tinkerpop.gremlin.tinkergraph.process.graph.traversal.strategy.TinkerGraphStepStrategy;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.optimization.TinkerGraphStepStrategy;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.util.Collections;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
index 58de000..aad20ea 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.tinkergraph.process;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+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 org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphProvider;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index bd24fab..7cab9ec 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
import org.apache.commons.io.FileUtils;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
@@ -50,7 +50,7 @@ import java.util.List;
import java.util.Set;
import java.util.function.Supplier;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
[20/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
deleted file mode 100644
index 213aa4d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
+++ /dev/null
@@ -1,78 +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.util.metric;
-
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.Collection;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Contains the Metrics gathered for a Traversal as the result of the .profile()-step.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public interface TraversalMetrics {
- /**
- * The side-effect key used to store and retrieve the TraversalMetrics for a given Traversal.
- */
- public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
-
- /**
- * The MetricsId used to obtain the element count via Metrics.getCount(String countKey)
- */
- public static final String ELEMENT_COUNT_ID = "elementCount";
-
- /**
- * The MetricsId used to obtain the traverser count via Metrics.getCount(String countKey)
- */
- public static final String TRAVERSER_COUNT_ID = "traverserCount";
-
- /**
- * The annotation key used to obtain the percent duration via Metrics.getAnnotation(String key)
- */
- public static final String PERCENT_DURATION_KEY = "percentDur";
-
- /**
- * Get the total duration taken by the Traversal.
- *
- * @param unit
- * @return total duration taken by the Traversal.
- */
- public long getDuration(TimeUnit unit);
-
- /**
- * Get an individual Metrics object by the index of the profiled Step.
- *
- * @param stepIndex
- * @return an individual Metrics object.
- */
- public Metrics getMetrics(final int stepIndex);
-
- /**
- * Get an individual Metrics object by the id of the profiled Step.
- *
- * @param id
- * @return an individual Metrics object.
- */
- public Metrics getMetrics(final String id);
-
- public Collection<? extends Metrics> getMetrics();
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
deleted file mode 100644
index 41672f7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
+++ /dev/null
@@ -1,102 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyPath implements Path, Serializable {
-
- private static final EmptyPath INSTANCE = new EmptyPath();
-
- private EmptyPath() {
-
- }
-
- @Override
- public int size() {
- return 0;
- }
-
- @Override
- public Path extend(final Object object, final String... labels) {
- return this;
- }
-
- @Override
- public <A> A get(final String label) {
- throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
- }
-
- @Override
- public <A> A get(final int index) {
- return (A) Collections.emptyList().get(index);
- }
-
- @Override
- public boolean hasLabel(final String label) {
- return false;
- }
-
- @Override
- public void addLabel(final String label) {
-
- }
-
- @Override
- public List<Object> objects() {
- return Collections.emptyList();
- }
-
- @Override
- public List<Set<String>> labels() {
- return Collections.emptyList();
- }
-
- @Override
- public boolean isSimple() {
- return true;
- }
-
- @Override
- public EmptyPath clone() {
- return this;
- }
-
- public static Path instance() {
- return INSTANCE;
- }
-
- @Override
- public int hashCode() {
- return -1424379551;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof EmptyPath;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
deleted file mode 100644
index 20916f7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
+++ /dev/null
@@ -1,182 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class ImmutablePath implements Path, Serializable, Cloneable {
-
- private Path previousPath = HeadPath.instance();
- private Object currentObject;
- private Set<String> currentLabels = new HashSet<>();
-
- protected ImmutablePath() {
-
- }
-
- public static Path make() {
- return HeadPath.instance();
- }
-
- @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
- @Override
- public ImmutablePath clone() {
- return this;
- }
-
- private ImmutablePath(final Object currentObject, final String... currentLabels) {
- this(HeadPath.instance(), currentObject, currentLabels);
- }
-
- private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
- this.previousPath = previousPath;
- this.currentObject = currentObject;
- if (currentLabels.length > 0)
- Stream.of(currentLabels).forEach(this.currentLabels::add);
- }
-
- @Override
- public int size() {
- return this.previousPath.size() + 1;
- }
-
- @Override
- public Path extend(final Object object, final String... labels) {
- return new ImmutablePath(this, object, labels);
- }
-
- @Override
- public <A> A get(final int index) {
- return (this.size() - 1) == index ? (A) this.currentObject : this.previousPath.get(index);
- }
-
- @Override
- public boolean hasLabel(final String label) {
- return this.currentLabels.contains(label) || this.previousPath.hasLabel(label);
- }
-
- @Override
- public void addLabel(final String label) {
- this.currentLabels.add(label);
- }
-
- @Override
- public List<Object> objects() {
- final List<Object> objectPath = new ArrayList<>();
- objectPath.addAll(this.previousPath.objects());
- objectPath.add(this.currentObject);
- return Collections.unmodifiableList(objectPath);
- }
-
- @Override
- public List<Set<String>> labels() {
- final List<Set<String>> labelPath = new ArrayList<>();
- labelPath.addAll(this.previousPath.labels());
- labelPath.add(this.currentLabels);
- return Collections.unmodifiableList(labelPath);
- }
-
- @Override
- public String toString() {
- return this.objects().toString();
- }
-
- private static class HeadPath implements Path {
- private static final HeadPath INSTANCE = new HeadPath();
-
- private HeadPath() {
-
- }
-
- @Override
- public int size() {
- return 0;
- }
-
- @Override
- public Path extend(final Object object, final String... labels) {
- return new ImmutablePath(object, labels);
- }
-
- @Override
- public <A> A get(final String label) {
- throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
- }
-
- @Override
- public <A> A get(final int index) {
- return (A) Collections.emptyList().get(index);
- }
-
- @Override
- public boolean hasLabel(final String label) {
- return false;
- }
-
- @Override
- public void addLabel(final String label) {
- throw new UnsupportedOperationException("A head path can not have labels added to it");
- }
-
- @Override
- public List<Object> objects() {
- return Collections.emptyList();
- }
-
- @Override
- public List<Set<String>> labels() {
- return Collections.emptyList();
- }
-
- @Override
- public boolean isSimple() {
- return true;
- }
-
- @Override
- public HeadPath clone() {
- return this;
- }
-
- public static Path instance() {
- return INSTANCE;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof HeadPath;
- }
-
- @Override
- public String toString() {
- return Collections.emptyList().toString();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
deleted file mode 100644
index 2453497..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
+++ /dev/null
@@ -1,107 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class MutablePath implements Path, Serializable {
-
- final protected List<Object> objects;
- final protected List<Set<String>> labels;
-
- protected MutablePath() {
- this(0);
- }
-
- private MutablePath(final int capacity) {
- this.objects = new ArrayList<>(capacity);
- this.labels = new ArrayList<>(capacity);
- }
-
- public static Path make() {
- return new MutablePath();
- }
-
- @Override
- @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
- public MutablePath clone() {
- final MutablePath clone = new MutablePath(this.objects.size());
- // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone.
- /*final MutablePath clone = (MutablePath) super.clone();
- clone.objects = new ArrayList<>();
- clone.labels = new ArrayList<>();*/
- clone.objects.addAll(this.objects);
- clone.labels.addAll(this.labels);
- return clone;
- }
-
-
- @Override
- public int size() {
- return this.objects.size();
- }
-
- @Override
- public Path extend(final Object object, final String... labels) {
- this.objects.add(object);
- this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
- return this;
- }
-
- @Override
- public <A> A get(int index) {
- return (A) this.objects.get(index);
- }
-
- @Override
- public boolean hasLabel(final String label) {
- return this.labels.stream().filter(l -> l.contains(label)).findAny().isPresent();
- }
-
- @Override
- public void addLabel(final String label) {
- this.labels.get(this.labels.size() - 1).add(label);
- }
-
- @Override
- public List<Object> objects() {
- return Collections.unmodifiableList(this.objects);
- }
-
- @Override
- public List<Set<String>> labels() {
- return Collections.unmodifiableList(this.labels);
- }
-
- @Override
- public String toString() {
- return this.objects.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
deleted file mode 100644
index e9e058e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
+++ /dev/null
@@ -1,95 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class SparsePath implements Path, Serializable {
-
- private final Map<String, Object> map = new HashMap<>();
- private Object currentObject = null;
-
- protected SparsePath() {
-
- }
-
- public static SparsePath make() {
- return new SparsePath();
- }
-
- @Override
- public Path extend(final Object object, final String... labels) {
- this.currentObject = object;
- if (labels.length > 0)
- Stream.of(labels).forEach(label -> this.map.put(label, object));
- return this;
- }
-
- @Override
- public void addLabel(final String label) {
- this.map.put(label, this.currentObject);
- }
-
- @Override
- public List<Object> objects() {
- return Collections.unmodifiableList(new ArrayList<>(this.map.values()));
- }
-
- @Override
- public List<Set<String>> labels() {
- final List<Set<String>> labels = new ArrayList<>();
- this.map.forEach((k, v) -> labels.add(Collections.singleton(k)));
- return Collections.unmodifiableList(labels);
- }
-
-
- public <A> A get(final String label) throws IllegalArgumentException {
- final Object object = this.map.get(label);
- if (null == object)
- throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
- return (A) object;
- }
-
- @Override
- public boolean hasLabel(final String label) {
- return this.map.containsKey(label);
- }
-
- @Override
- public Path clone() {
- return this;
- }
-
- @Override
- public int size() {
- return this.map.size();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
index 6e8b414..ea58bd5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
@@ -19,11 +19,11 @@
package org.apache.tinkerpop.gremlin.structure;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
import org.apache.tinkerpop.gremlin.structure.io.DefaultIo;
import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
index 013243b..f2066d2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
@@ -71,7 +71,7 @@ public interface GraphReader {
/**
* Reads a set of vertices from an {@link InputStream} which were written by
- * {@link GraphWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.Traversal)}. This method
+ * {@link GraphWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.traversal.Traversal)}. This method
* will read vertex properties as well as edges given the direction supplied as an argument.
*
* @param inputStream a stream containing a single vertex as defined by the accompanying {@link GraphWriter}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
index c1dc379..d3075f3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.io;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
index 6e0cfb7..e93b804 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.io.graphml;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
index 036ac1d..87ee99d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.io.graphml;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
index 93f9c0d..ec620ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
@@ -26,9 +26,9 @@ import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.StdKeySerializer;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Property;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
index 16f43b1..3ce5445 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
index 16ade88..0a11d45 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.structure.io.graphson;
import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
index e89a3a6..0404fab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
index aba9f97..7540d07 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
@@ -22,8 +22,8 @@ import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
index 449e8b9..fc82fce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
@@ -27,7 +27,7 @@ import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.util.IdentityObjectIntMap;
import com.esotericsoftware.kryo.util.IntMap;
import com.esotericsoftware.kryo.util.ObjectMap;
-import org.apache.tinkerpop.gremlin.process.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Property;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 511891e..bb2d79f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -25,20 +25,20 @@ import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import com.esotericsoftware.kryo.util.DefaultStreamFactory;
import com.esotericsoftware.kryo.util.MapReferenceResolver;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.O_Traverser;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.util.metric.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
index 03bf58a..61d5ea3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.io.gryo;
import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
index 3544009..f1a5826 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
@@ -28,7 +28,7 @@ import java.util.List;
/**
* An {@link InputStream} implementation that can independently process a Gryo file written with
- * {@link GryoWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.Traversal)}.
+ * {@link GryoWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.traversal.Traversal)}.
*
* @author Stephen Mallette (http://stephen.genoprime.com)
*/
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
index adf6f06..cf711ac 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
index 54be5e9..75e9245 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
index 7c76f13..3890e75 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
@@ -18,14 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
index 65ffda0..8b444d3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
index 6056242..75d552a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.structure.strategy;
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Transaction;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
index b2f17ff..b823fc1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
index 403df97..e55c17c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
@@ -18,9 +18,9 @@
*/
package org.apache.tinkerpop.gremlin.structure.strategy.process.graph.step.sideEffect;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.strategy.StrategyEdge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
index a0da186..1d45492 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.util;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -122,11 +122,11 @@ public final class ElementHelper {
}
/**
- * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.T#id} key from the list of arguments.
+ * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} key from the list of arguments.
*
* @param keyValues a list of key/value pairs
- * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.T#id}
- * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.T#id} key is {@code null}
+ * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.traversal.T#id}
+ * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} key is {@code null}
*/
public static Optional<Object> getIdValue(final Object... keyValues) {
for (int i = 0; i < keyValues.length; i = i + 2) {
@@ -216,12 +216,12 @@ public final class ElementHelper {
}
/**
- * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.T#label} key from the list of arguments.
+ * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} key from the list of arguments.
*
* @param keyValues a list of key/value pairs
- * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.T#label}
+ * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.traversal.T#label}
* @throws ClassCastException if the value of the label is not a {@link String}
- * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.T#label} key is {@code null}
+ * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} key is {@code null}
*/
public static Optional<String> getLabelValue(final Object... keyValues) {
for (int i = 0; i < keyValues.length; i = i + 2) {
@@ -234,8 +234,8 @@ public final class ElementHelper {
}
/**
- * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Element}. If the value of {@link org.apache.tinkerpop.gremlin.process.T#id} or
- * {@link org.apache.tinkerpop.gremlin.process.T#label} is in the set of pairs, then they are ignored.
+ * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Element}. If the value of {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} or
+ * {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} is in the set of pairs, then they are ignored.
*
* @param element the graph element to assign the {@code propertyKeyValues}
* @param propertyKeyValues the key/value pairs to assign to the {@code element}
@@ -253,8 +253,8 @@ public final class ElementHelper {
}
/**
- * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Vertex}. If the value of {@link org.apache.tinkerpop.gremlin.process.T#id} or
- * {@link org.apache.tinkerpop.gremlin.process.T#label} is in the set of pairs, then they are ignored.
+ * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Vertex}. If the value of {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} or
+ * {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} is in the set of pairs, then they are ignored.
*
* @param vertex the vertex to assign the {@code propertyKeyValues}
* @param propertyKeyValues the key/value pairs to assign to the {@code vertex}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 e46fb70..18b2aea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.structure.util;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+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.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
index e1552b4..f33da9c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.gremlin.structure.util.batch;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
index 07a9492..a3f60a8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.util.detached;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
index 12c3a73..31e7905 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.util.detached;
-import org.apache.tinkerpop.gremlin.process.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Property;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
index 1709512..4f0aa2b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.structure.util.detached;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Property;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
index f3cf93d..cb2ca02 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.structure.util.detached;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
index a2b163a..98d43eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
@@ -20,8 +20,6 @@ package org.apache.tinkerpop.gremlin.structure.util.empty;
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.util.EmptyGraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Transaction;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
index f524a3b..66b5c7b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.function;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import java.io.Serializable;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
index 56d64f5..dbc47eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
@@ -22,7 +22,7 @@ package org.apache.tinkerpop.gremlin.util.function;
* @author Marko A. Rodriguez (http://markorodriguez.com)
*/
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
import java.io.Serializable;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
index 8373f5a..cd8ff58 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.function;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
index 499b5c7..ff89763 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.function;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
import java.io.Serializable;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
index d28675c..7957f40 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.io.Serializable;
import java.util.Arrays;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
index 5bd1d87..e0a1850 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.io.Serializable;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
index 4d831a1..9175518 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.io.Serializable;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
index c6537c4..ef9bd72 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.util.ArrayList;
import java.util.Collection;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
index 3640f26..82e4cdd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.io.Serializable;
import java.util.ArrayList;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
index 8fc1fd8..fd30ee6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import java.io.Serializable;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
index f18cba3..6abd200 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
@@ -18,7 +18,10 @@
*/
package org.apache.tinkerpop.gremlin.process;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+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.strategy.AbstractTraversalStrategy;
import org.junit.Test;
import java.util.Collections;
@@ -35,7 +38,7 @@ import static org.junit.Assert.*;
public class TraversalStrategiesTest {
/**
- * Tests that {@link org.apache.tinkerpop.gremlin.process.TraversalStrategies#sortStrategies(java.util.List)}
+ * Tests that {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies#sortStrategies(java.util.List)}
* works as advertised. This class defines a bunch of dummy strategies which define an order. It is verified
* that the right order is being returned.
*/
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
index 541511f..b3ac93d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
@@ -18,14 +18,15 @@
*/
package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
import org.apache.tinkerpop.gremlin.structure.Compare;
import org.junit.Test;
import java.util.Iterator;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import static org.junit.Assert.*;
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
index 3513345..d44f197 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
@@ -18,13 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.graph.traversal.strategy;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTraversalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTraversalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Compare;
import org.apache.tinkerpop.gremlin.structure.Contains;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
index 0deb80a..d5004e3 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
@@ -18,11 +18,12 @@
*/
package org.apache.tinkerpop.gremlin.process.graph.traversal.strategy;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TimeLimitedStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
index abbeadb..9b7ef10 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.graph.util;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
import org.junit.Test;
import java.util.AbstractMap;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
index 15fd501..4dfaccc 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
@@ -18,16 +18,16 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Direction;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
index aa6a6e0..662be3d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.junit.Test;
import org.junit.runner.RunWith;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
index 5785dba..fe6967c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
@@ -18,33 +18,22 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.javatuples.Pair;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
index 74766ef..f340383 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.util;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.junit.Test;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
index 19f9d3f..6add61a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
@@ -18,23 +18,20 @@
*/
package org.apache.tinkerpop.gremlin.process.util;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.PropertyType;
import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
import org.junit.Test;
import org.mockito.Mockito;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
import static org.junit.Assert.*;
/**
[09/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
deleted file mode 100644
index a537ae3..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
+++ /dev/null
@@ -1,310 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.*;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SelectTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id);
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX();
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX();
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_asXaX_outXknowsX_asXbX_select() {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Vertex> bindings = traversal.next();
- assertEquals(2, bindings.size());
- assertEquals(convertToVertexId("marko"), (bindings.get("a")).id());
- assertTrue((bindings.get("b")).id().equals(convertToVertexId("vadas")) || bindings.get("b").id().equals(convertToVertexId("josh")));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
- final Traversal<Vertex, Map<String, String>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, String> bindings = traversal.next();
- assertEquals(2, bindings.size());
- assertEquals("marko", bindings.get("a"));
- assertTrue(bindings.get("b").equals("josh") || bindings.get("b").equals("vadas"));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- assertEquals(convertToVertexId("marko"), vertex.id());
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals("marko", traversal.next());
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_asXaX_out_asXbX_select_byXnameX() {
- Arrays.asList(
- get_g_V_asXaX_out_asXbX_select_byXnameX(),
- get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final List<Map<String, String>> expected = makeMapList(2,
- "a", "marko", "b", "lop",
- "a", "marko", "b", "vadas",
- "a", "marko", "b", "josh",
- "a", "josh", "b", "ripple",
- "a", "josh", "b", "lop",
- "a", "peter", "b", "lop");
- checkResults(expected, traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
- Arrays.asList(
- get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final List<Map<String, String>> expected = makeMapList(2,
- "a", "marko", "b", "marko",
- "a", "vadas", "b", "vadas",
- "a", "josh", "b", "josh",
- "a", "ripple", "b", "ripple",
- "a", "lop", "b", "lop",
- "a", "peter", "b", "peter");
- checkResults(expected, traversal);
- });
- }
-
- @Test
- @LoadGraphWith(CREW)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
- printTraversalForm(traversal);
- final List<Map<String, Object>> expected = makeMapList(2,
- "a", 3, "b", "matthias",
- "a", 4, "b", "marko",
- "a", 5, "b", "stephen",
- "a", 5, "b", "daniel");
- checkResults(expected, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXname_isXmarkoXX_asXaX_select() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_isXmarkoXX_asXaX_select();
- printTraversalForm(traversal);
- final List<Map<String, Object>> expected = makeMapList(1, "a", g.V(convertToVertexId("marko")).next());
- checkResults(expected, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_label_groupCount_asXxX_select() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_label_groupCount_asXxX_select();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Object> map1 = traversal.next();
- assertEquals(1, map1.size());
- assertTrue(map1.containsKey("x"));
- final Map<String, Long> map2 = (Map<String, Long>) map1.get("x");
- assertEquals(2, map2.size());
- assertTrue(map2.containsKey("person"));
- assertTrue(map2.containsKey("software"));
- assertEquals(2, map2.get("software").longValue());
- assertEquals(4, map2.get("person").longValue());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @Ignore
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
- printTraversalForm(traversal);
- final Set<String> persons = new HashSet<>();
- for (int i = 0; i < 4; i++) {
- assertTrue(traversal.hasNext());
- final Map<String, Object> map = traversal.next();
- assertEquals(2, map.size());
- assertTrue(map.containsKey("person"));
- assertTrue(map.containsKey("relations"));
- assertTrue(persons.add((String) map.get("person")));
- final Map<String, Long> relations = (Map<String, Long>) map.get("relations");
- switch ((String) map.get("person")) {
- case "marko":
- assertEquals(2, relations.size());
- assertEquals(1, relations.get("created").longValue());
- assertEquals(2, relations.get("knows").longValue());
- break;
- case "vadas":
- assertEquals(1, relations.size());
- assertEquals(1, relations.get("knows").longValue());
- break;
- case "josh":
- assertEquals(2, relations.size());
- assertEquals(2, relations.get("created").longValue());
- assertEquals(1, relations.get("knows").longValue());
- break;
- case "peter":
- assertEquals(1, relations.size());
- assertEquals(1, relations.get("created").longValue());
- break;
- default:
- assertTrue(false);
- break;
- }
- }
- assertFalse(traversal.hasNext());
- assertEquals(4, persons.size());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SelectTest {
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
- return g.V(v1Id).as("a").out("knows").as("b").select();
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id) {
- return g.V(v1Id).as("a").out("knows").as("b").<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
- return g.V(v1Id).as("a").out("knows").as("b").select("a");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id) {
- return g.V(v1Id).as("a").out("knows").as("b").<String>select("a").by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
- return g.V().as("a").out().as("b").<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
- return g.V().as("a").out().aggregate("x").as("b").<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
- return g.V().as("a").values("name").order().as("b").<String>select().by("name").by();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
- return g.V().has("name", "gremlin").inE("uses").order().by("skill", Order.incr).as("a").outV().as("b").select().by("skill").by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
- return g.V().has(values("name").is("marko")).as("a").select();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
- return g.V().label().groupCount().as("x").select();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
- return g.V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select().by("name").by();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
deleted file mode 100644
index 9a08519..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
+++ /dev/null
@@ -1,83 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sum;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class SumTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum();
-
- public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valuesXageX_sum() {
- final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum();
- printTraversalForm(traversal);
- final Number sum = traversal.next();
- assertEquals(123.0, sum);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXsumXlocalXX() {
- final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Number> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(1.0, map.get("ripple"));
- assertEquals(1.0, map.get("lop"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SumTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
- return g.V().values("age").sum();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
- return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(sum(Scope.local));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
deleted file mode 100644
index fe54d73..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
+++ /dev/null
@@ -1,109 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class UnfoldTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold();
-
- public abstract Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_localXoutE_foldX_unfold() {
- final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_foldX_unfold();
- printTraversalForm(traversal);
- int counter = 0;
- final Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- edges.add(traversal.next());
- }
- assertEquals(6, counter);
- assertEquals(6, edges.size());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_valueMap_unfold_mapXkeyX() {
- final Traversal<Vertex, String> traversal = get_g_V_valueMap_unfold_mapXkeyX();
- printTraversalForm(traversal);
- int counter = 0;
- int ageCounter = 0;
- int nameCounter = 0;
- int langCounter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String key = traversal.next();
- if (key.equals("name"))
- nameCounter++;
- else if (key.equals("age"))
- ageCounter++;
- else if (key.equals("lang"))
- langCounter++;
- else
- fail("The provided key is not known: " + key);
- }
- assertEquals(12, counter);
- assertEquals(4, ageCounter);
- assertEquals(2, langCounter);
- assertEquals(6, nameCounter);
- assertEquals(counter, ageCounter + langCounter + nameCounter);
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends UnfoldTest {
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
- return g.V().local(outE().fold()).unfold();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
- return g.V().valueMap().<Map.Entry<String, List>>unfold().map(m -> m.get().getKey());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
deleted file mode 100644
index a2e0107..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
+++ /dev/null
@@ -1,145 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class ValueMapTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMap();
-
- public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX();
-
- public abstract Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valueMap() {
- final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMap();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Map<String, List> values = traversal.next();
- final String name = (String) values.get("name").get(0);
- assertEquals(2, values.size());
- if (name.equals("marko")) {
- assertEquals(29, values.get("age").get(0));
- } else if (name.equals("josh")) {
- assertEquals(32, values.get("age").get(0));
- } else if (name.equals("peter")) {
- assertEquals(35, values.get("age").get(0));
- } else if (name.equals("vadas")) {
- assertEquals(27, values.get("age").get(0));
- } else if (name.equals("lop")) {
- assertEquals("java", values.get("lang").get(0));
- } else if (name.equals("ripple")) {
- assertEquals("java", values.get("lang").get(0));
- } else {
- throw new IllegalStateException("It is not possible to reach here: " + values);
- }
- }
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valueMapXname_ageX() {
- final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMapXname_ageX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Map<String, List> values = traversal.next();
- final String name = (String) values.get("name").get(0);
- if (name.equals("marko")) {
- assertEquals(29, values.get("age").get(0));
- assertEquals(2, values.size());
- } else if (name.equals("josh")) {
- assertEquals(32, values.get("age").get(0));
- assertEquals(2, values.size());
- } else if (name.equals("peter")) {
- assertEquals(35, values.get("age").get(0));
- assertEquals(2, values.size());
- } else if (name.equals("vadas")) {
- assertEquals(27, values.get("age").get(0));
- assertEquals(2, values.size());
- } else if (name.equals("lop")) {
- assertNull(values.get("lang"));
- assertEquals(1, values.size());
- } else if (name.equals("ripple")) {
- assertNull(values.get("lang"));
- assertEquals(1, values.size());
- } else {
- throw new IllegalStateException("It is not possible to reach here: " + values);
- }
- }
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXcreatedX_valueMap() {
- final Traversal<Vertex, Map<String, List<String>>> traversal = get_g_VX1X_outXcreatedX_valueMap(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, List<String>> values = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals("lop", values.get("name").get(0));
- assertEquals("java", values.get("lang").get(0));
- assertEquals(2, values.size());
-
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends ValueMapTest {
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
- return g.V().valueMap();
- }
-
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
- return g.V().valueMap("name", "age");
- }
-
- @Override
- public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
- return g.V(v1Id).out("created").valueMap();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
deleted file mode 100644
index 7c19785..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
+++ /dev/null
@@ -1,617 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://traversalhen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class VertexTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_V();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id);
-
- public abstract Traversal<Edge, Edge> get_g_E();
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV();
-
- public abstract Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name();
-
- public abstract Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_out_out();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id);
-
- // VERTEX ADJACENCY
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V() {
- final Traversal<Vertex, Vertex> traversal = get_g_V();
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- vertices.add(traversal.next());
- }
- assertEquals(6, vertices.size());
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out(convertToVertexId("marko"));
- assert_g_v1_out(traversal);
- }
-
- private void assert_g_v1_out(final Traversal<Vertex, Vertex> traversal) {
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("vadas") ||
- vertex.value("name").equals("josh") ||
- vertex.value("name").equals("lop"));
- }
- assertEquals(3, counter);
- assertEquals(3, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX2X_in() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX2X_in(convertToVertexId("vadas"));
- assert_g_v2_in(traversal);
- }
-
- private void assert_g_v2_in(final Traversal<Vertex, Vertex> traversal) {
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals(traversal.next().value("name"), "marko");
- }
- assertEquals(1, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_both() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX4X_both(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("marko") ||
- vertex.value("name").equals("ripple") ||
- vertex.value("name").equals("lop"));
- }
- assertEquals(3, counter);
- assertEquals(3, vertices.size());
- }
-
- // EDGE ADJACENCY
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_E() {
- final Traversal<Edge, Edge> traversal = get_g_E();
- printTraversalForm(traversal);
- int counter = 0;
- Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- edges.add(traversal.next());
- }
- assertEquals(6, edges.size());
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outE() {
- final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Edge edge = traversal.next();
- edges.add(edge);
- assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
- }
- assertEquals(3, counter);
- assertEquals(3, edges.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX2X_inE() {
- final Traversal<Vertex, Edge> traversal = get_g_VX2X_inE(convertToVertexId("vadas"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals(traversal.next().label(), "knows");
- }
- assertEquals(1, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_bothEXcreatedX() {
- final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothEXcreatedX(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Edge edge = traversal.next();
- edges.add(edge);
- assertTrue(edge.label().equals("created"));
- assertEquals(edge.outVertex().id(), convertToVertexId("josh"));
- }
- assertEquals(2, counter);
- assertEquals(2, edges.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_bothE() {
- final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothE(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Edge edge = traversal.next();
- edges.add(edge);
- assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
- }
- assertEquals(3, counter);
- assertEquals(3, edges.size());
- }
-
- // EDGE/VERTEX ADJACENCY
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outE_inV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_inV(convertToVertexId("marko"));
- this.assert_g_v1_out(traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX2X_inE_outV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX2X_inE_outV(convertToVertexId("vadas"));
- this.assert_g_v2_in(traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_outE_hasXweight_1X_outV() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_outE_hasXweight_1X_outV();
- printTraversalForm(traversal);
- int counter = 0;
- Map<Object, Integer> counts = new HashMap<>();
- while (traversal.hasNext()) {
- final Object id = traversal.next().id();
- int previousCount = counts.getOrDefault(id, 0);
- counts.put(id, previousCount + 1);
- counter++;
- }
- assertEquals(2, counts.size());
- assertEquals(1, counts.get(convertToVertexId("marko")).intValue());
- assertEquals(1, counts.get(convertToVertexId("josh")).intValue());
-
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_outE_inV_inE_inV_both_name() {
- final Traversal<Vertex, String> traversal = get_g_V_out_outE_inV_inE_inV_both_name();
- printTraversalForm(traversal);
- int counter = 0;
- Map<String, Integer> counts = new HashMap<>();
- while (traversal.hasNext()) {
- final String key = traversal.next();
- int previousCount = counts.getOrDefault(key, 0);
- counts.put(key, previousCount + 1);
- counter++;
- }
- assertEquals(3, counts.size());
- assertEquals(4, counts.get("josh").intValue());
- assertEquals(3, counts.get("marko").intValue());
- assertEquals(3, counts.get("peter").intValue());
-
- assertEquals(10, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outEXknowsX_bothV_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_outEXknowsX_bothV_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(4, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("vadas"));
- names.remove("marko");
- assertEquals(3, names.size());
- names.remove("marko");
- assertEquals(2, names.size());
- names.remove("josh");
- assertEquals(1, names.size());
- names.remove("vadas");
- assertEquals(0, names.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outE_otherV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_otherV(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("vadas") ||
- vertex.value("name").equals("josh") ||
- vertex.value("name").equals("lop"));
- }
- assertEquals(3, counter);
- assertEquals(3, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_bothE_otherV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_otherV(convertToVertexId("josh"));
- printTraversalForm(traversal);
- final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(3, vertices.size());
- assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("marko")));
- assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("ripple")));
- assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("lop")));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_bothE_hasXweight_lt_1X_otherV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_hasXweight_lt_1X_otherV(convertToVertexId("josh"));
- printTraversalForm(traversal);
- final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(1, vertices.size());
- assertEquals(vertices.get(0).value("name"), "lop");
- assertFalse(traversal.hasNext());
- }
-
- // VERTEX EDGE LABEL ADJACENCY
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXknowsX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX(convertToVertexId("marko"));
- assert_g_v1_outXknowsX(traversal);
- }
-
- private void assert_g_v1_outXknowsX(Traversal<Vertex, Vertex> traversal) {
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("vadas") ||
- vertex.value("name").equals("josh"));
- }
- assertEquals(2, counter);
- assertEquals(2, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXknows_createdX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknows_createdX(convertToVertexId("marko"));
- this.assert_g_v1_out(traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outEXknowsX_inV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknowsX_inV(convertToVertexId("marko"));
- this.assert_g_v1_outXknowsX(traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outEXknows_createdX_inV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknows_createdX_inV(convertToVertexId("marko"));
- this.assert_g_v1_out(traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_out_out();
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("lop") ||
- vertex.value("name").equals("ripple"));
- }
- assertEquals(2, counter);
- assertEquals(2, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_out_out() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_out_out(convertToVertexId("marko"));
- assertFalse(traversal.hasNext());
- }
-
- // PROPERTY TESTING
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_out_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<String> names = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- String name = traversal.next();
- names.add(name);
- assertTrue(name.equals("vadas") ||
- name.equals("josh") ||
- name.equals("lop"));
- }
- assertEquals(3, counter);
- assertEquals(3, names.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_to_XOUT_knowsX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_to_XOUT_knowsX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- String name = vertex.value("name");
- assertTrue(name.equals("vadas") ||
- name.equals("josh"));
- }
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
-
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends VertexTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_V() {
- return g.V();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
- return g.V(v1Id).out();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
- return g.V(v2Id).in();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
- return g.V(v4Id).both();
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E() {
- return g.E();
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
- return g.V(v1Id).outE();
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
- return g.V(v2Id).inE();
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
- return g.V(v4Id).bothE();
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
- return g.V(v4Id).bothE("created");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
- return g.V(v1Id).outE().inV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
- return g.V(v2Id).inE().outV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
- return g.V().outE().has("weight", 1.0d).outV();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
- return g.V().out().outE().inV().inE().inV().both().values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
- return g.V(v1Id).outE("knows").bothV().values("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
- return g.V(v1Id).out("knows");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
- return g.V(v1Id).out("knows", "created");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
- return g.V(v1Id).outE("knows").inV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
- return g.V(v1Id).outE("knows", "created").inV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
- return g.V(v1Id).outE().otherV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
- return g.V(v4Id).bothE().otherV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(Object v4Id) {
- return g.V(v4Id).bothE().has("weight", Compare.lt, 1d).otherV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_out_out() {
- return g.V().out().out();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
- return g.V(v1Id).out().out().out();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
- return g.V(v1Id).out().values("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
- return g.V(v1Id).to(Direction.OUT, "knows");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
deleted file mode 100644
index 4439033..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
+++ /dev/null
@@ -1,149 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AggregateTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX();
-
- public abstract Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX();
-
- public abstract Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path();
-
- //public abstract Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valueXnameX_aggregateXxX_capXxX() {
- Traversal<Vertex, List<String>> traversal = get_g_V_name_aggregateXxX_capXxX();
- printTraversalForm(traversal);
- final Collection<String> names = traversal.next();
- assertFalse(traversal.hasNext());
- checkListOfNames(names);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_aggregateXxX_byXnameX_capXxX() {
- Traversal<Vertex, List<String>> traversal = get_g_V_aggregateXxX_byXnameX_capXxX();
- printTraversalForm(traversal);
- final Collection<String> names = traversal.next();
- assertFalse(traversal.hasNext());
- checkListOfNames(names);
- }
-
- private void checkListOfNames(Collection<String> names) {
- assertEquals(6, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("peter"));
- assertTrue(names.contains("lop"));
- assertTrue(names.contains("vadas"));
- assertTrue(names.contains("ripple"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_aggregateXaX_path() {
- final Traversal<Vertex, Path> traversal = get_g_V_out_aggregateXaX_path();
- printTraversalForm(traversal);
- int count = 0;
- final Map<String, Long> firstStepCounts = new HashMap<>();
- final Map<String, Long> secondStepCounts = new HashMap<>();
- while (traversal.hasNext()) {
- count++;
- Path path = traversal.next();
- String first = path.get(0).toString();
- String second = path.get(1).toString();
- assertThat(first, not(second));
- MapHelper.incr(firstStepCounts, first, 1l);
- MapHelper.incr(secondStepCounts, second, 1l);
- }
- assertEquals(6, count);
- assertEquals(3, firstStepCounts.size());
- assertEquals(4, secondStepCounts.size());
- assertTrue(firstStepCounts.values().contains(3l));
- assertTrue(firstStepCounts.values().contains(2l));
- assertTrue(firstStepCounts.values().contains(1l));
- assertTrue(secondStepCounts.values().contains(3l));
- assertTrue(secondStepCounts.values().contains(1l));
- }
-
- /*@Test
- @LoadGraphWith(CLASSIC)
- public void g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path() {
- Iterator<Path> traversal = get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(convertToVertexId("marko"));
- System.out.println("Testing: " + traversal);
- final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
- // for OLTP it's a roulette game; the result can change depending on which path is taken first by the traverser (this makes some cool real world use cases possible)
- // Senzari use case: generate a random playlist without artist repetitions
- assertEquals(4, paths.size());
- assertEquals(3, paths.stream().filter(path -> path.size() == 3).count());
- assertEquals(1, paths.stream().filter(path -> path.size() == 5).count());
- assertFalse(traversal.hasNext());
- }*/
-
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends AggregateTest {
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
- return g.V().values("name").aggregate("x").cap("x");
- }
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
- return g.V().aggregate("x").by("name").cap("x");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
- return g.V().out().aggregate("a").path();
- }
-
- /*public Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id) {
- return g.V(1).as("x").bothE().as("e").value("weight").except("w").aggregate("w").back("e").otherV().jump("x", t -> true, t -> true).path();
- }*/
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
deleted file mode 100644
index fbdd0c6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
+++ /dev/null
@@ -1,177 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroupCountTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX();
-
- public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount();
-
- public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX();
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_outXcreatedX_groupCount_byXnameX() {
- Arrays.asList(get_g_V_outXcreatedX_groupCount_byXnameX(), get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertEquals(map.size(), 2);
- assertEquals(Long.valueOf(3l), map.get("lop"));
- assertEquals(Long.valueOf(1l), map.get("ripple"));
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_outXcreatedX_name_groupCount() {
- Arrays.asList(get_g_V_outXcreatedX_name_groupCount(), get_g_V_outXcreatedX_name_groupCountXaX_capXaX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertEquals(map.size(), 2);
- assertEquals(3l, map.get("lop").longValue());
- assertEquals(1l, map.get("ripple").longValue());
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_filterXfalseX_groupCount() {
- Arrays.asList(get_g_V_hasXnoX_groupCount(), get_g_V_hasXnoX_groupCountXaX_capXaX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<Object, Long> map = traversal.next();
- assertEquals(0, map.size());
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
- List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(4, map.size());
- assertEquals(4l, map.get("lop").longValue());
- assertEquals(2l, map.get("ripple").longValue());
- assertEquals(1l, map.get("josh").longValue());
- assertEquals(1l, map.get("vadas").longValue());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
- List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
- traversals.add(get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(2, map.get("marko").longValue());
- assertEquals(2, map.get("java").longValue());
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends GroupCountTest {
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
- return g.V().out("created").<String>groupCount().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
- return g.V().out("created").<String>groupCount("a").by("name").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
- return g.V().out("created").values("name").groupCount();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
- return g.V().out("created").values("name").groupCount("a").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
- return g.V().has("no").groupCount();
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
- return g.V().has("no").groupCount("a").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
- return g.V().repeat(out().groupCount("a").by("name")).times(2).cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
- return g.V().union(
- repeat(out()).times(2).groupCount("m").by("lang"),
- repeat(in()).times(2).groupCount("m").by("name")).cap("m");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
deleted file mode 100644
index a5dc7e2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
+++ /dev/null
@@ -1,171 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.*;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroupTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX();
-
- public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX();
-
- public abstract Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_group_byXnameX() {
- Arrays.asList(get_g_V_group_byXnameX(), get_g_V_groupXaX_byXnameX_capXaX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Collection<Vertex>> map = traversal.next();
- assertEquals(6, map.size());
- map.forEach((key, values) -> {
- assertEquals(1, values.size());
- assertEquals(convertToVertexId(key), values.iterator().next().id());
- });
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
- final Traversal<Vertex, Map<String, Collection<String>>> traversal = get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
- printTraversalForm(traversal);
- final Map<String, Collection<String>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(1, map.size());
- assertTrue(map.containsKey("java"));
- assertEquals(2, map.get("java").size());
- assertTrue(map.get("java").contains("ripple"));
- assertTrue(map.get("java").contains("lop"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXlangX_group_byXlangX_byX1X_byXsizeX() {
- final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertEquals(1, map.size());
- assertTrue(map.containsKey("java"));
- assertEquals(Long.valueOf(2), map.get("java"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXout_groupXaX_byXnameX_byXitX_byXsizeXX_timesX2X_capXaX() {
- List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(4, map.size());
- assertTrue(map.containsKey("vadas"));
- assertEquals(Long.valueOf(1), map.get("vadas"));
- assertTrue(map.containsKey("josh"));
- assertEquals(Long.valueOf(1), map.get("josh"));
- assertTrue(map.containsKey("lop"));
- assertEquals(Long.valueOf(4), map.get("lop"));
- assertTrue(map.containsKey("ripple"));
- assertEquals(Long.valueOf(2), map.get("ripple"));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_group_byXoutE_countX_byXnameX() {
- final Traversal<Vertex, Map<Long, Collection<String>>> traversal = get_g_V_group_byXoutE_countX_byXnameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<Long, Collection<String>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(4, map.size());
- assertTrue(map.containsKey(0l));
- assertTrue(map.containsKey(1l));
- assertTrue(map.containsKey(2l));
- assertTrue(map.containsKey(3l));
- assertEquals(3, map.get(0l).size());
- assertEquals(1, map.get(1l).size());
- assertEquals(1, map.get(2l).size());
- assertEquals(1, map.get(3l).size());
- assertTrue(map.get(0l).contains("lop"));
- assertTrue(map.get(0l).contains("ripple"));
- assertTrue(map.get(0l).contains("vadas"));
- assertTrue(map.get(1l).contains("peter"));
- assertTrue(map.get(2l).contains("josh"));
- assertTrue(map.get(3l).contains("marko"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends GroupTest {
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
- return g.V().<String, Collection<Vertex>>group().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
- return g.V().<String, Collection<Vertex>>group("a").by("name").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
- return g.V().has("lang").group("a").by("lang").by("name").out().cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
- return g.V().has("lang").<String, Long>group().by("lang").by(inject(1)).<Collection>by(count(Scope.local));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
- return g.V().repeat(out().group("a").by("name").by().<Collection>by(count(Scope.local))).times(2).cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
- return g.V().<Long, Collection<String>>group().by(outE().count()).by("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
deleted file mode 100644
index f63697e..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
+++ /dev/null
@@ -1,100 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class InjectTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id);
-
- public abstract Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_injectXv2X_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_out_injectXv2X_name(convertToVertexId("marko"), convertToVertexId("vadas"));
- printTraversalForm(traversal);
- Map<String, Long> counter = new HashMap<>();
- while (traversal.hasNext()) {
- MapHelper.incr(counter, traversal.next(), 1l);
- }
- assertEquals(3, counter.size());
- assertEquals(1l, counter.get("josh").longValue());
- assertEquals(1l, counter.get("lop").longValue());
- assertEquals(2l, counter.get("vadas").longValue());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
- final Traversal<Vertex, Path> traversal = get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Path path = traversal.next();
- if (path.get("a").equals("daniel")) {
- assertEquals(2, path.size());
- assertEquals(6, (int) path.get(1));
- } else {
- assertEquals(4, path.size());
- assertEquals(path.<String>get("a").length(), (int) path.get(3));
- }
- }
- assertEquals(4, counter);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends InjectTest {
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
- return g.V(v1Id).out().inject(g.V(v2Id).next()).values("name");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
- return g.V(v1Id).out().<String>values("name").inject("daniel").as("a").map(t -> t.get().length()).path();
- }
- }
-}
[03/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
new file mode 100644
index 0000000..f7b4d2a
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
@@ -0,0 +1,274 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+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.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
+import static org.junit.Assert.*;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ProfileTest extends AbstractGremlinProcessTest {
+ public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile();
+
+ public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile();
+
+ public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile();
+
+ public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_modern_profile() {
+ final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
+ printTraversalForm(traversal);
+
+ traversal.iterate();
+
+ final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ traversalMetrics.toString(); // ensure no exceptions are thrown
+
+ Metrics metrics = traversalMetrics.getMetrics(0);
+ assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ metrics = traversalMetrics.getMetrics(1);
+ assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ metrics = traversalMetrics.getMetrics(2);
+ assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ double totalPercentDuration = 0;
+ for (Metrics m : traversalMetrics.getMetrics()) {
+ totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+ }
+ assertEquals(100, totalPercentDuration, 0.000001);
+ }
+
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_out_out_grateful_profile() {
+ final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
+ printTraversalForm(traversal);
+
+ traversal.iterate();
+ final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ traversalMetrics.toString(); // ensure no exceptions are thrown
+
+ Metrics metrics = traversalMetrics.getMetrics(0);
+ assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ metrics = traversalMetrics.getMetrics(1);
+ assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ metrics = traversalMetrics.getMetrics(2);
+ assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ double totalPercentDuration = 0;
+ for (Metrics m : traversalMetrics.getMetrics()) {
+ totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+ }
+ assertEquals(100, totalPercentDuration, 0.000001);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_sleep_sleep_profile() {
+ final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_sleep_sleep_profile();
+ printTraversalForm(traversal);
+
+ traversal.iterate();
+
+ assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
+
+ TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ traversalMetrics.toString(); // ensure no exceptions are thrown
+
+ // Grab the second (sideEffect{sleep}) step and check the times.
+ Metrics metrics = traversalMetrics.getMetrics(1);
+ // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation
+ assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+ metrics.getDuration(TimeUnit.MILLISECONDS) >= 60);
+ assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+ metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
+
+ // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
+ metrics = traversalMetrics.getMetrics(2);
+ assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+ metrics.getDuration(TimeUnit.MILLISECONDS) >= 30);
+ assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+ metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
+
+ double totalPercentDuration = 0;
+ for (Metrics m : traversalMetrics.getMetrics()) {
+ totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+ }
+ assertEquals(100, totalPercentDuration, 0.000001);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_repeat_both_modern_profile() {
+ final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_repeat_both_profile();
+ printTraversalForm(traversal);
+
+ traversal.iterate();
+
+ final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ traversalMetrics.toString(); // ensure no exceptions are thrown
+
+ Metrics metrics = traversalMetrics.getMetrics(0);
+ assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ metrics = traversalMetrics.getMetrics(1);
+ assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+ assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ // Test the nested global metrics of the repeat step
+ Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
+ assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+ Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
+ assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+ assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+
+ double totalPercentDuration = 0;
+ for (Metrics m : traversalMetrics.getMetrics()) {
+ totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+ }
+ assertEquals(100, totalPercentDuration, 0.000001);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+ printTraversalForm(traversal);
+
+ traversal.iterate();
+
+ final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ traversalMetrics.toString(); // ensure no exceptions are thrown
+
+ assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
+
+ Metrics metrics = traversalMetrics.getMetrics(0);
+ assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+
+ metrics = traversalMetrics.getMetrics(1);
+ assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+ assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+
+ assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends ProfileTest {
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+ return (Traversal) g.V().out().out().profile();
+ }
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+ return (Traversal) g.V().repeat(both()).times(3).profile();
+ }
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+ return (Traversal) g.V().sideEffect(new Consumer<Traverser<Vertex>>() {
+ @Override
+ public void accept(final Traverser<Vertex> vertexTraverser) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }).sideEffect(new Consumer<Traverser<Vertex>>() {
+ @Override
+ public void accept(final Traverser<Vertex> vertexTraverser) {
+ try {
+ Thread.sleep(5);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ }
+ }).profile();
+ }
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ return (Traversal) g.V().has(__.in("created").count().is(1l)).values("name").profile();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
new file mode 100644
index 0000000..0149831
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Operator;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SackTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
+
+ public abstract Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
+
+ public abstract Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+ final Traversal<Vertex, Double> traversal = get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
+ assertEquals(3.5d, traversal.next(), 0.00001d);
+ assertFalse(traversal.hasNext());
+ }
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+ final Traversal<Vertex, Float> traversal = get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
+ super.checkResults(Arrays.asList(2.0f, 1.4f), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+ final Traversal<Vertex, Map> traversal = get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ final Map map = traversal.next();
+ assertEquals(1, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.get("a").equals("ripple") || map.get("a").equals("lop"));
+ counter++;
+ }
+ assertEquals(2, counter);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SackTest {
+ @Override
+ public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+ return g.V().withSack(0.0f).outE().sack(Operator.sum, "weight").inV().sack().sum();
+ }
+
+ @Override
+ public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+ return g.V().withSack(0.0f).repeat(outE().sack(Operator.sum, "weight").inV()).times(2).sack();
+ }
+
+ @Override
+ public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+ return g.V().<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).out().out().<Map>sack((map, vertex) -> {
+ map.put("a", vertex.value("name"));
+ return map;
+ }).sack();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
new file mode 100644
index 0000000..b7b0fd0
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SideEffectCapTest extends AbstractGremlinProcessTest {
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+ final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
+ printTraversalForm(traversal);
+ Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(map.get("marko"), new Long(1l));
+ assertEquals(map.get("vadas"), new Long(1l));
+ assertEquals(map.get("peter"), new Long(1l));
+ assertEquals(map.get("josh"), new Long(1l));
+ assertEquals(map.size(), 4);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+ final Traversal<Vertex, Map<String, Map<Object, Long>>> traversal = get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ Map<String, Map<Object, Long>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.containsKey("b"));
+ assertEquals(4, map.get("a").size());
+ assertEquals(2, map.get("b").size());
+ assertEquals(1l, map.get("a").get(27).longValue());
+ assertEquals(1l, map.get("a").get(29).longValue());
+ assertEquals(1l, map.get("a").get(32).longValue());
+ assertEquals(1l, map.get("a").get(35).longValue());
+ assertEquals(1l, map.get("b").get("ripple").longValue());
+ assertEquals(1l, map.get("b").get("lop").longValue());
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SideEffectCapTest {
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+ return g.V().has("age").groupCount("a").by("name").out().cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+ return g.V().choose(has(T.label, "person"),
+ values("age").groupCount("a"),
+ values("name").groupCount("b")).cap("a", "b");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
new file mode 100644
index 0000000..0929f89
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SideEffectTest extends AbstractGremlinTest {
+ public abstract Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_sideEffectXstore_aX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_sideEffectXstore_aX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals(traversal.next(), "marko");
+ assertFalse(traversal.hasNext());
+ assertEquals(convertToVertexId("marko"), traversal.asAdmin().getSideEffects().<List<Vertex>>get("a").get(0).id());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_sideEffectXincr_cX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXincr_cX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
+ assertEquals(new Integer(3), traversal.asAdmin().getSideEffects().<List<Integer>>get("c").get(0));
+ }
+
+ private void assert_g_v1_out_sideEffectXincr_cX_valueXnameX(final Iterator<String> traversal) {
+ final List<String> names = new ArrayList<>();
+ while (traversal.hasNext()) {
+ names.add(traversal.next());
+ }
+ assertEquals(3, names.size());
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("lop"));
+ assertTrue(names.contains("vadas"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_sideEffectXX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends SideEffectTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
+ return g.V(v1Id).withSideEffect("a", ArrayList::new).sideEffect(traverser -> {
+ traverser.<List>sideEffects("a").clear();
+ traverser.<List<Vertex>>sideEffects("a").add(traverser.get());
+ }).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
+ return g.V(v1Id).withSideEffect("c", () -> {
+ final List<Integer> list = new ArrayList<>();
+ list.add(0);
+ return list;
+ }).out().sideEffect(traverser -> {
+ Integer temp = traverser.<List<Integer>>sideEffects("c").get(0);
+ traverser.<List<Integer>>sideEffects("c").clear();
+ traverser.<List<Integer>>sideEffects("c").add(temp + 1);
+ }).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
+ return g.V(v1Id).out().sideEffect(traverser -> {
+ }).values("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
new file mode 100644
index 0000000..27a376b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class StoreTest extends AbstractGremlinProcessTest {
+ public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX();
+
+ public abstract Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
+
+ public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_storeXa_nameX_out_capXaX() {
+ final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXnameX_out_capXaX();
+ printTraversalForm(traversal);
+ Collection names = traversal.next();
+ assertEquals(6, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("peter"));
+ assertTrue(names.contains("lop"));
+ assertTrue(names.contains("ripple"));
+ assertTrue(names.contains("vadas"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX() {
+ final Traversal<Vertex, Collection> traversal = get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ Collection names = traversal.next();
+ assertEquals(4, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("vadas"));
+ assertTrue(names.contains("lop"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_withXa_setX_both_name_storeXaX() {
+ final Traversal<Vertex, Set<String>> traversal = get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
+ printTraversalForm(traversal);
+ final Set<String> names = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertFalse(names instanceof BulkSet);
+ assertEquals(6, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("vadas"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("lop"));
+ assertTrue(names.contains("ripple"));
+ assertTrue(names.contains("peter"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX() {
+ final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Collection store = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(8, store.size());
+ assertTrue(store.contains(0L));
+ assertTrue(store.contains(1L));
+ assertTrue(store.contains(2L));
+ assertTrue(store.contains(1.0d));
+ assertFalse(store.isEmpty());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends StoreTest {
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+ return g.V().store("a").by("name").out().cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id) {
+ return g.V(v1Id).store("a").by("name").out().store("a").by("name").values("name").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+ return g.V().withSideEffect("a", HashSetSupplier.instance()).both().<String>values("name").store("a").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+ return g.V().store("a").by(outE("created").count()).out().out().store("a").by(inE("created").values("weight").sum()).cap("a");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
new file mode 100644
index 0000000..14f905b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.commons.configuration.Configuration;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.ElementFeatures.FEATURE_USER_SUPPLIED_IDS;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SubgraphTest extends AbstractGremlinProcessTest {
+ public abstract Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph);
+
+ public abstract Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+ public void g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX() throws Exception {
+ final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
+ graphProvider.clear(config);
+ Graph subgraph = graphProvider.openTestGraph(config);
+ /////
+ Traversal<Vertex, Graph> traversal = get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(convertToVertexId("marko"), subgraph);
+ printTraversalForm(traversal);
+ subgraph = traversal.next();
+ assertVertexEdgeCounts(3, 2).accept(subgraph);
+ subgraph.edges().forEachRemaining(e -> {
+ assertEquals("knows", e.label());
+ assertEquals("marko", e.outVertex().values("name").next());
+ assertEquals(new Integer(29), e.outVertex().<Integer>values("age").next());
+ assertEquals("person", e.outVertex().label());
+
+ final String name = e.inVertex().<String>values("name").next();
+ if (name.equals("vadas"))
+ assertEquals(0.5d, e.value("weight"), 0.0001d);
+ else if (name.equals("josh"))
+ assertEquals(1.0d, e.value("weight"), 0.0001d);
+ else
+ fail("There's a vertex present that should not be in the subgraph");
+ });
+ graphProvider.clear(subgraph, config);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+ public void g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup() throws Exception {
+ final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
+ graphProvider.clear(config);
+ final Graph subgraph = graphProvider.openTestGraph(config);
+ /////
+ Traversal<Vertex, String> traversal = get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(subgraph);
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
+ final Graph subGraph = traversal.asAdmin().getSideEffects().get("sg");
+ assertVertexEdgeCounts(5, 4).accept(subGraph);
+
+ graphProvider.clear(subgraph, config);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends SubgraphTest {
+
+ @Override
+ public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph) {
+ return g.V(v1Id).withSideEffect("sg", () -> subgraph).outE("knows").subgraph("sg").values("name").cap("sg");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph) {
+ return g.V().withSideEffect("sg", () -> subgraph).repeat(bothE("created").subgraph("sg").outV()).times(5).<String>values("name").dedup();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
new file mode 100644
index 0000000..a801c71
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class TreeTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX();
+
+ public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX();
+
+ public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree();
+
+ public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX();
+
+ public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id);
+
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_out_tree_byXnameX() {
+ List<Traversal<Vertex, Tree>> traversals = Arrays.asList(
+ get_g_VX1X_out_out_tree_byXnameX(convertToVertexId("marko")),
+ get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(convertToVertexId("marko")));
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Tree tree = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(1, tree.size());
+ assertTrue(tree.containsKey("marko"));
+ assertEquals(1, ((Map) tree.get("marko")).size());
+ assertTrue(((Map) tree.get("marko")).containsKey("josh"));
+ assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("lop"));
+ assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("ripple"));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_tree_byXidX() {
+ List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree_byXidX(), get_g_V_out_out_treeXaX_byXidX_capXaX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Tree tree = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(1, tree.size());
+ assertTrue(tree.containsKey(convertToVertexId("marko")));
+ assertEquals(1, ((Map) tree.get(convertToVertexId("marko"))).size());
+ assertTrue(((Map) tree.get(convertToVertexId("marko"))).containsKey(convertToVertexId("josh")));
+ assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("lop")));
+ assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("ripple")));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_treeXaX_capXaX() {
+ List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree(), get_g_V_out_out_treeXaX_capXaX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Tree tree = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(1, tree.size());
+ assertTrue(tree.containsKey(convertToVertex(graph, "marko")));
+ assertEquals(1, ((Map) tree.get(convertToVertex(graph, "marko"))).size());
+ assertTrue(((Map) tree.get(convertToVertex(graph, "marko"))).containsKey(convertToVertex(graph, "josh")));
+ assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "lop")));
+ assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "ripple")));
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends TreeTest {
+ @Override
+ public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
+ return (Traversal) g.V(v1Id).out().out().tree().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
+ return g.V(v1Id).out().out().tree("a").by("name").both().both().cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+ return (Traversal) g.V().out().out().tree().by(T.id);
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+ return (Traversal) g.V().out().out().tree("a").by(T.id).cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+ return (Traversal) g.V().out().out().tree();
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+ return (Traversal) g.V().out().out().tree("a").cap("a");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
new file mode 100644
index 0000000..752d2e2
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@UseEngine(TraversalEngine.Type.STANDARD)
+public class PathTest extends AbstractGremlinProcessTest {
+
+ @Test
+ public void shouldHaveStandardSemanticsImplementedCorrectly() {
+ Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+ assertTrue(path.isSimple());
+ assertEquals(0, path.size());
+ path = path.extend(1, "a");
+ path = path.extend(2, "b");
+ path = path.extend(3, "c");
+ assertEquals(3, path.size());
+ assertEquals(Integer.valueOf(1), path.get("a"));
+ assertEquals(Integer.valueOf(2), path.get("b"));
+ assertEquals(Integer.valueOf(3), path.get("c"));
+ path.addLabel("d");
+ assertEquals(3, path.size());
+ assertEquals(Integer.valueOf(1), path.get("a"));
+ assertEquals(Integer.valueOf(2), path.get("b"));
+ assertEquals(Integer.valueOf(3), path.get("c"));
+ assertEquals(Integer.valueOf(3), path.get("d"));
+ assertTrue(path.hasLabel("a"));
+ assertTrue(path.hasLabel("b"));
+ assertTrue(path.hasLabel("c"));
+ assertTrue(path.hasLabel("d"));
+ assertFalse(path.hasLabel("e"));
+ assertTrue(path.isSimple());
+ path = path.extend(3, "e");
+ assertFalse(path.isSimple());
+ assertTrue(path.hasLabel("e"));
+ assertEquals(4, path.size());
+ assertEquals(Integer.valueOf(1), path.get(0));
+ assertEquals(Integer.valueOf(2), path.get(1));
+ assertEquals(Integer.valueOf(3), path.get(2));
+ assertEquals(Integer.valueOf(3), path.get(3));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
+ public void shouldHandleMultiLabelPaths() {
+ Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+ path = path.extend("marko", "a");
+ path = path.extend("stephen", "b");
+ path = path.extend("matthias", "a");
+ assertEquals(3, path.size());
+ assertEquals(3, path.objects().size());
+ assertEquals(3, path.labels().size());
+ assertEquals(2, new HashSet<>(path.labels()).size());
+ assertTrue(path.get("a") instanceof List);
+ assertTrue(path.get("b") instanceof String);
+ assertEquals(2, path.<List<String>>get("a").size());
+ assertTrue(path.<List<String>>get("a").contains("marko"));
+ assertTrue(path.<List<String>>get("a").contains("matthias"));
+ });
+
+ final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
+ assertEquals(3, path.size());
+ assertEquals(3, path.labels().size());
+ assertEquals(2, new HashSet<>(path.labels()).size());
+ assertTrue(path.get("x") instanceof String);
+ assertTrue(path.get("y") instanceof List);
+ assertEquals(2, path.<List<String>>get("y").size());
+ assertTrue(path.<List<String>>get("y").contains("josh"));
+ assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
+ }
+
+ @Test
+ public void shouldExcludeUnlabeledLabelsFromPath() {
+ Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+ path = path.extend("marko", "a");
+ path = path.extend("stephen", "b");
+ path = path.extend("matthias", "c", "d");
+ assertEquals(3, path.size());
+ assertEquals(3, path.objects().size());
+ assertEquals(3, path.labels().size());
+ assertEquals(1, path.labels().get(0).size());
+ assertEquals(1, path.labels().get(1).size());
+ assertEquals("b", path.labels().get(1).iterator().next());
+ assertEquals(2, path.labels().get(2).size());
+ assertTrue(path.labels().get(2).contains("c"));
+ assertTrue(path.labels().get(2).contains("d"));
+ });
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
index cd0e219..61e149b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
index b031db7..a28dac2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
index 11d3bcc..2ecffc3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
@@ -32,8 +32,8 @@ import java.util.NoSuchElementException;
import java.util.function.Predicate;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
new file mode 100644
index 0000000..1b8252e
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class TraversalVerificationStrategyTest extends AbstractGremlinProcessTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends TraversalVerificationStrategyTest {
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldAllowNestedGlobalTraversalToHaveBarriers() {
+ try {
+ g.V().values("age").union(max(), min(), sum()).iterate();
+ } catch (IllegalStateException e) {
+ fail("Nested global traversals can have barrier steps on STANDARD:" + e.getMessage());
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldAllowMidTraversalBarriersOnComputer() {
+ try {
+ g.V().count().sum().iterate();
+ } catch (IllegalStateException e) {
+ fail("Mid-traversal barrier steps are OK on STANDARD: " + e.getMessage());
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
+ try {
+ g.V().local(out().out()).iterate();
+ } catch (IllegalStateException e) {
+ fail("Local traversals leaving the star-graph are OK on STANDARD: " + e.getMessage());
+ }
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends TraversalVerificationStrategyTest {
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldNotAllowNestedGlobalTraversalToHaveBarriers() {
+ try {
+ final GraphTraversal t = g.V().values("age").union(max(), min(), sum()).iterate();
+ fail("Nested global traversals should not be allowed to contain barriers (COMPUTER): " + t);
+ } catch (IllegalStateException e) {
+ assertTrue(true);
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldNotAllowMidTraversalBarriersOnComputer() {
+ try {
+ final GraphTraversal t = g.V().count().sum().iterate();
+ fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
+ } catch (IllegalStateException e) {
+ assertTrue(true);
+ }
+
+ try {
+ final GraphTraversal t = g.V().count().sum().map(x -> x.get() * 19).iterate();
+ fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
+ } catch (IllegalStateException e) {
+ assertTrue(true);
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void shouldNotAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
+ try {
+ final GraphTraversal t = g.V().local(out().out()).iterate();
+ fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
+ } catch (IllegalStateException e) {
+ assertTrue(true);
+ }
+
+ try {
+ final GraphTraversal t = g.V().local(out().values("name")).iterate();
+ fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
+ } catch (IllegalStateException e) {
+ assertTrue(true);
+ }
+
+ try {
+ g.V().local(outE().values("weight")).iterate();
+ g.V().local(out().id()).iterate();
+ g.V().local(outE().inV()).iterate();
+ } catch (IllegalStateException e) {
+ fail("Local traversals on the star-graph are OK on COMPUTER: " + e.getMessage());
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
new file mode 100644
index 0000000..5827b8f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalTest {
+
+ @Test
+ public void shouldCloneTraversalCorrectly() throws CloneNotSupportedException {
+ final DefaultGraphTraversal<?, ?> original = new DefaultGraphTraversal<>(EmptyGraph.instance());
+ original.out().groupCount("m").values("name").count();
+ final DefaultTraversal<?, ?> clone = (DefaultTraversal) original.clone();
+ assertNotEquals(original.hashCode(), clone.hashCode());
+ assertEquals(original.getSteps().size(), clone.getSteps().size());
+
+ for (int i = 0; i < original.steps.size(); i++) {
+ assertNotEquals(original.getSteps().get(i), clone.getSteps().get(i));
+ }
+ assertNotEquals(original.sideEffects, clone.sideEffects);
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
deleted file mode 100644
index 5aab83a..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
+++ /dev/null
@@ -1,124 +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.util;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.path.ImmutablePath;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-@UseEngine(TraversalEngine.Type.STANDARD)
-public class PathTest extends AbstractGremlinProcessTest {
-
- @Test
- public void shouldHaveStandardSemanticsImplementedCorrectly() {
- Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
- assertTrue(path.isSimple());
- assertEquals(0, path.size());
- path = path.extend(1, "a");
- path = path.extend(2, "b");
- path = path.extend(3, "c");
- assertEquals(3, path.size());
- assertEquals(Integer.valueOf(1), path.get("a"));
- assertEquals(Integer.valueOf(2), path.get("b"));
- assertEquals(Integer.valueOf(3), path.get("c"));
- path.addLabel("d");
- assertEquals(3, path.size());
- assertEquals(Integer.valueOf(1), path.get("a"));
- assertEquals(Integer.valueOf(2), path.get("b"));
- assertEquals(Integer.valueOf(3), path.get("c"));
- assertEquals(Integer.valueOf(3), path.get("d"));
- assertTrue(path.hasLabel("a"));
- assertTrue(path.hasLabel("b"));
- assertTrue(path.hasLabel("c"));
- assertTrue(path.hasLabel("d"));
- assertFalse(path.hasLabel("e"));
- assertTrue(path.isSimple());
- path = path.extend(3, "e");
- assertFalse(path.isSimple());
- assertTrue(path.hasLabel("e"));
- assertEquals(4, path.size());
- assertEquals(Integer.valueOf(1), path.get(0));
- assertEquals(Integer.valueOf(2), path.get(1));
- assertEquals(Integer.valueOf(3), path.get(2));
- assertEquals(Integer.valueOf(3), path.get(3));
- });
- }
-
- @Test
- @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
- public void shouldHandleMultiLabelPaths() {
- Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
- path = path.extend("marko", "a");
- path = path.extend("stephen", "b");
- path = path.extend("matthias", "a");
- assertEquals(3, path.size());
- assertEquals(3, path.objects().size());
- assertEquals(3, path.labels().size());
- assertEquals(2, new HashSet<>(path.labels()).size());
- assertTrue(path.get("a") instanceof List);
- assertTrue(path.get("b") instanceof String);
- assertEquals(2, path.<List<String>>get("a").size());
- assertTrue(path.<List<String>>get("a").contains("marko"));
- assertTrue(path.<List<String>>get("a").contains("matthias"));
- });
-
- final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
- assertEquals(3, path.size());
- assertEquals(3, path.labels().size());
- assertEquals(2, new HashSet<>(path.labels()).size());
- assertTrue(path.get("x") instanceof String);
- assertTrue(path.get("y") instanceof List);
- assertEquals(2, path.<List<String>>get("y").size());
- assertTrue(path.<List<String>>get("y").contains("josh"));
- assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
- }
-
- @Test
- public void shouldExcludeUnlabeledLabelsFromPath() {
- Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
- path = path.extend("marko", "a");
- path = path.extend("stephen", "b");
- path = path.extend("matthias", "c", "d");
- assertEquals(3, path.size());
- assertEquals(3, path.objects().size());
- assertEquals(3, path.labels().size());
- assertEquals(1, path.labels().get(0).size());
- assertEquals(1, path.labels().get(1).size());
- assertEquals("b", path.labels().get(1).iterator().next());
- assertEquals(2, path.labels().get(2).size());
- assertTrue(path.labels().get(2).contains("c"));
- assertTrue(path.labels().get(2).contains("d"));
- });
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
index c8bcdbd..c5eaf15 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.util.batch.BatchGraph;
import org.apache.tinkerpop.gremlin.structure.util.batch.Exists;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
index 69dea3c..706c363 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.ExceptionCoverage;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
index 15c799c..996c116 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.GraphManager;
import org.apache.tinkerpop.gremlin.GraphProvider;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.util.StreamFactory;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
index dc69dbb..b99c2f3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
@@ -35,7 +35,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.TestHelper;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexPropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.io.GraphMigrator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
index c0593d0..2d7571a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
@@ -25,8 +25,8 @@ import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoMapper;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
index 92f448b..37a0ac7 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.ExceptionCoverage;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.util.function.FunctionUtils;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
index 79f4b9c..cafcbbd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.GraphManager;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures;
import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexPropertyFeatures;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
index b24e517..7f7ce37 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
[35/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
deleted file mode 100644
index c6990cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
+++ /dev/null
@@ -1,133 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
-
- public MaxGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier(new ConstantSupplier<>(null));
- this.setBiFunction(MaxGlobalBiFunction.<S>instance());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
- return MaxGlobalMapReduce.instance();
- }
-
- /////
-
- private static class MaxGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
- private static final MaxGlobalBiFunction INSTANCE = new MaxGlobalBiFunction();
-
- private MaxGlobalBiFunction() {
-
- }
-
- @Override
- public S apply(final S mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
- }
-
- public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////////
-
- private static class MaxGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
- private static final MaxGlobalMapReduce INSTANCE = new MaxGlobalMapReduce();
-
- private MaxGlobalMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final MapReduce.Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
- vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- if (values.hasNext()) {
- Number max = -Double.MAX_VALUE;
- while (values.hasNext()) {
- final Number value = values.next();
- if (value.doubleValue() > max.doubleValue())
- max = value;
- }
- emitter.emit(max);
- }
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
- return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
- }
-
- public static final MaxGlobalMapReduce instance() {
- return INSTANCE;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
deleted file mode 100644
index dcafe1a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
+++ /dev/null
@@ -1,59 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
- public MaxLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- Number result;
- final Iterator<E> iterator = traverser.get().iterator();
- if (iterator.hasNext()) {
- result = iterator.next();
- while (iterator.hasNext()) {
- final Number curr = iterator.next();
- if (result.doubleValue() < curr.doubleValue()) result = curr;
- }
- } else {
- result = Double.NaN;
- }
- return (E) result;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
deleted file mode 100644
index 51fc509..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
+++ /dev/null
@@ -1,218 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
-
-import java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements MapReducer {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
-
- public MeanGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
- this.setBiFunction((BiFunction) MeanGlobalBiFunction.instance());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- @Override
- public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
- return MeanGlobalMapReduce.instance();
- }
-
- /////
-
- private static class MeanGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
- private static final MeanGlobalBiFunction INSTANCE = new MeanGlobalBiFunction();
-
- private MeanGlobalBiFunction() {
-
- }
-
- @Override
- public S apply(final S mutatingSeed, final Traverser<S> traverser) {
- return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
- }
-
- public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////////
-
- private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
-
- private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
-
- private MeanGlobalMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final MapReduce.Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<Number, Long> emitter) {
- vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
- }
-
- @Override
- public void combine(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
- long counter = 0;
- while (values.hasNext()) {
- counter = counter + values.next();
- }
- emitter.emit(key, counter);
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
- if (keyValues.hasNext()) {
- KeyValue<Number, Long> pair = keyValues.next();
- double result = pair.getKey().doubleValue() * pair.getValue();
- long counter = pair.getValue();
- while (keyValues.hasNext()) {
- pair = keyValues.next();
- result += pair.getKey().doubleValue() * pair.getValue();
- counter += pair.getValue();
- }
- return result / counter;
- }
- return Double.NaN;
- }
-
- public static final MeanGlobalMapReduce instance() {
- return INSTANCE;
- }
- }
-
- ///
-
- public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
-
- private long count;
- private double sum;
-
- public MeanNumber() {
- this(0.0d, 0l);
- }
-
- public MeanNumber(final double number, final long count) {
- this.count = count;
- this.sum = number * count;
- }
-
- public MeanNumber add(final Number amount, final long count) {
- this.count += count;
- this.sum += amount.doubleValue() * count;
- return this;
- }
-
- public MeanNumber add(final MeanNumber other) {
- this.count += other.count;
- this.sum += other.sum;
- return this;
- }
-
- @Override
- public int intValue() {
- return (int) (this.sum / this.count);
- }
-
- @Override
- public long longValue() {
- return (long) (this.sum / this.count);
- }
-
- @Override
- public float floatValue() {
- return (float) (this.sum / this.count);
- }
-
- @Override
- public double doubleValue() {
- return this.sum / this.count;
- }
-
- @Override
- public String toString() {
- return Double.toString(this.doubleValue());
- }
-
- @Override
- public int compareTo(final Number number) {
- return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof Number && Double.valueOf(this.doubleValue()).equals(((Number) object).doubleValue());
- }
-
- @Override
- public int hashCode() {
- return Double.valueOf(this.doubleValue()).hashCode();
- }
-
- @Override
- public Double getFinal() {
- return this.doubleValue();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
deleted file mode 100644
index 6953334..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
+++ /dev/null
@@ -1,59 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, Double> {
-
- public MeanLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Double map(final Traverser.Admin<S> traverser) {
- final Iterator<E> iterator = traverser.get().iterator();
- if (iterator.hasNext()) {
- Long counter = 1L;
- Double result = iterator.next().doubleValue();
- while (iterator.hasNext()) {
- result += iterator.next().doubleValue();
- counter++;
- }
- return result / counter;
- } else {
- return Double.NaN;
- }
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
deleted file mode 100644
index 999ed5e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
+++ /dev/null
@@ -1,133 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
-
- public MinGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier(new ConstantSupplier<>(null));
- this.setBiFunction(MinGlobalBiFunction.instance());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
- return MinGlobalMapReduce.instance();
- }
-
- /////
-
- private static class MinGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
- private static final MinGlobalBiFunction INSTANCE = new MinGlobalBiFunction();
-
- private MinGlobalBiFunction() {
-
- }
-
- @Override
- public S apply(final S mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
- }
-
- public final static <S extends Number> MinGlobalBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////////
-
- private static class MinGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
- private static final MinGlobalMapReduce INSTANCE = new MinGlobalMapReduce();
-
- private MinGlobalMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final MapReduce.Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
- vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- if (values.hasNext()) {
- Number min = Double.MAX_VALUE;
- while (values.hasNext()) {
- final Number value = values.next();
- if (value.doubleValue() < min.doubleValue())
- min = value;
- }
- emitter.emit(min);
- }
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
- return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
- }
-
- public static final MinGlobalMapReduce instance() {
- return INSTANCE;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
deleted file mode 100644
index 2dc970f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
+++ /dev/null
@@ -1,59 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
- public MinLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- Number result;
- final Iterator<E> iterator = traverser.get().iterator();
- if (iterator.hasNext()) {
- result = iterator.next();
- while (iterator.hasNext()) {
- final Number curr = iterator.next();
- if (result.doubleValue() > curr.doubleValue()) result = curr;
- }
- } else {
- result = Double.NaN;
- }
- return (E) result;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
deleted file mode 100644
index acd1f9a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.util.function.ChainedComparator;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S> {
-
- private final List<Comparator<S>> comparators = new ArrayList<>();
-
- public OrderGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- public void barrierConsumer(final TraverserSet<S> traverserSet) {
- traverserSet.sort(this.comparators.isEmpty() ? new ComparatorTraverser(Order.incr) : new ChainedComparator(ComparatorTraverser.convertComparator((List) this.comparators)));
- }
-
- @Override
- public void addComparator(final Comparator<S> comparator) {
- this.comparators.add(comparator);
- }
-
- @Override
- public List<Comparator<S>> getComparators() {
- return this.comparators.isEmpty() ? Arrays.asList((Comparator) Order.incr) : this.comparators;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.comparators);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- /////
-
- private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
-
- private final Comparator<S> comparator;
-
- public ComparatorTraverser(final Comparator<S> comparator) {
- this.comparator = comparator;
- }
-
- @Override
- public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
- return this.comparator.compare(traverserA.get(), traverserB.get());
- }
-
- public static <S> List<ComparatorTraverser<S>> convertComparator(final List<Comparator<S>> comparators) {
- return comparators.stream().map(comparator -> new ComparatorTraverser<>(comparator)).collect(Collectors.toList());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
deleted file mode 100644
index 1bcb26f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
+++ /dev/null
@@ -1,100 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrderLocalStep<S, M> extends MapStep<S, S> implements ComparatorHolder<M> {
-
- private final List<Comparator<M>> comparators = new ArrayList<>();
- private Comparator<M> chainedComparator = null;
-
- public OrderLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected S map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- if (start instanceof Collection)
- return (S) OrderLocalStep.sortCollection((List) start, this.chainedComparator);
- else if (start instanceof Map)
- return (S) OrderLocalStep.sortMap((Map) start, this.chainedComparator);
- else
- return start;
- }
-
- @Override
- public void addComparator(final Comparator<M> comparator) {
- this.comparators.add(comparator);
- this.chainedComparator = this.comparators.stream().reduce((a, b) -> a.thenComparing(b)).get();
- }
-
- @Override
- public List<Comparator<M>> getComparators() {
- return this.comparators;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.comparators);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- /////////////
-
- private static final <A> List<A> sortCollection(final Collection<A> collection, final Comparator<?> comparator) {
- if (collection instanceof List) {
- Collections.sort((List) collection, (Comparator) comparator);
- return (List<A>) collection;
- } else {
- final List<A> list = new ArrayList<>(collection);
- Collections.sort(list, (Comparator) comparator);
- return list;
- }
- }
-
- private static final <K, V> Map<K, V> sortMap(final Map<K, V> map, final Comparator<?> comparator) {
- final List<Map.Entry<K, V>> entries = new ArrayList<>(map.entrySet());
- Collections.sort(entries, (Comparator) comparator);
- final LinkedHashMap<K, V> sortedMap = new LinkedHashMap<>();
- entries.forEach(entry -> sortedMap.put(entry.getKey(), entry.getValue()));
- return sortedMap;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
deleted file mode 100644
index 0f03fab..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PathStep<S> extends MapStep<S, Path> implements TraversalParent {
-
- private TraversalRing<Object, Object> traversalRing;
-
- public PathStep(final Traversal.Admin traversal) {
- super(traversal);
- this.traversalRing = new TraversalRing<>();
- }
-
- @Override
- protected Path map(final Traverser.Admin<S> traverser) {
- final Path path;
- if (this.traversalRing.isEmpty())
- path = traverser.path();
- else {
- path = MutablePath.make();
- traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
- }
- this.traversalRing.reset();
- return path;
- }
-
- @Override
- public PathStep<S> clone() {
- final PathStep<S> clone = (PathStep<S>) super.clone();
- clone.traversalRing = new TraversalRing<>();
- for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
- clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
- }
- return clone;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.traversalRing.reset();
- }
-
- @Override
- public List<Traversal.Admin<Object, Object>> getLocalChildren() {
- return this.traversalRing.getTraversals();
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> pathTraversal) {
- this.traversalRing.addTraversal(this.integrateChild(pathTraversal));
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.traversalRing);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
deleted file mode 100644
index f1360bc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
+++ /dev/null
@@ -1,71 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PropertiesStep<E> extends FlatMapStep<Element, E> {
-
- protected final String[] propertyKeys;
- protected final PropertyType returnType;
-
- public PropertiesStep(final Traversal.Admin traversal, final PropertyType propertyType, final String... propertyKeys) {
- super(traversal);
- this.returnType = propertyType;
- this.propertyKeys = propertyKeys;
- }
-
- @Override
- protected Iterator<E> flatMap(final Traverser.Admin<Element> traverser) {
- return this.returnType.equals(PropertyType.VALUE) ?
- traverser.get().values(this.propertyKeys) :
- (Iterator) traverser.get().properties(this.propertyKeys);
- }
-
- public PropertyType getReturnType() {
- return this.returnType;
- }
-
- public String[] getPropertyKeys() {
- return this.propertyKeys;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
deleted file mode 100644
index 2d425d6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
+++ /dev/null
@@ -1,50 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PropertyElementStep<E> extends MapStep<Property<E>, Element> {
-
- public PropertyElementStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Element map(final Traverser.Admin<Property<E>> traverser) {
- return traverser.get().element();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- // TODO: reverse()
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
deleted file mode 100644
index dcef117..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
+++ /dev/null
@@ -1,91 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PropertyMapStep<E> extends MapStep<Element, Map<String, E>> { // TODO: Map<Object,E> cause of T.
-
- protected final String[] propertyKeys;
- protected final PropertyType returnType;
- protected final boolean includeTokens;
-
- public PropertyMapStep(final Traversal.Admin traversal, final boolean includeTokens, final PropertyType propertyType, final String... propertyKeys) {
- super(traversal);
- this.includeTokens = includeTokens;
- this.propertyKeys = propertyKeys;
- this.returnType = propertyType;
- }
-
- @Override
- protected Map<String, E> map(final Traverser.Admin<Element> traverser) {
- if (this.returnType.equals(PropertyType.VALUE)) {
- final Element element = traverser.get();
- final Map map = traverser.get() instanceof Vertex ?
- (Map) ElementHelper.vertexPropertyValueMap((Vertex) element, propertyKeys) :
- (Map) ElementHelper.propertyValueMap(element, propertyKeys);
- if (includeTokens) {
- if (element instanceof VertexProperty) {
- map.put(T.id, element.id());
- map.put(T.key, ((VertexProperty) element).key());
- map.put(T.value, ((VertexProperty) element).value());
- } else {
- map.put(T.id, element.id());
- map.put(T.label, element.label());
- }
- }
- return map;
-
- } else {
- return traverser.get() instanceof Vertex ?
- (Map) ElementHelper.vertexPropertyMap((Vertex) traverser.get(), propertyKeys) :
- (Map) ElementHelper.propertyMap(traverser.get(), propertyKeys);
- }
- }
-
- public PropertyType getReturnType() {
- return this.returnType;
- }
-
- public String toString() {
- return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
deleted file mode 100644
index 63957cf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PropertyValueStep<E> extends MapStep<Property<E>, E> {
-
- public PropertyValueStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected E map(final Traverser.Admin<Property<E>> traverser) {
- return traverser.get().value();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
deleted file mode 100644
index 86f0cb9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
+++ /dev/null
@@ -1,84 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class RangeLocalStep<S> extends MapStep<S, S> {
-
- private final long low;
- private final long high;
-
- public RangeLocalStep(final Traversal.Admin traversal, final long low, final long high) {
- super(traversal);
- if (low != -1 && high != -1 && low > high) {
- throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
- }
- this.low = low;
- this.high = high;
- }
-
- @Override
- protected S map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- if (start instanceof Map) {
- final Map map = (Map) start;
- final long capacity = (this.high != -1 ? this.high : map.size()) - this.low;
- final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
- long c = 0L;
- for (final Object obj : map.entrySet()) {
- final Map.Entry entry = (Map.Entry) obj;
- if (c >= this.low) {
- if (c < this.high || this.high == -1) {
- result.put(entry.getKey(), entry.getValue());
- } else break;
- }
- c++;
- }
- return (S) result;
- } else if (start instanceof Collection) {
- final Collection collection = (Collection) start;
- final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
- long c = 0L;
- for (final Object item : collection) {
- if (c >= this.low) {
- if (c < this.high || this.high == -1) {
- result.add(item);
- } else break;
- }
- c++;
- }
- return (S) result;
- }
- return start;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
deleted file mode 100644
index d24cbc4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
+++ /dev/null
@@ -1,46 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackStep<S, E> extends MapStep<S, E> {
-
- public SackStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- return traverser.sack();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.SACK);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
deleted file mode 100644
index 6bf09fb..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
+++ /dev/null
@@ -1,112 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class SampleLocalStep<S> extends MapStep<S, S> {
-
- private static final Random RANDOM = new Random();
-
- private final int amountToSample;
-
- public SampleLocalStep(final Traversal.Admin traversal, final int amountToSample) {
- super(traversal);
- this.amountToSample = amountToSample;
- }
-
- @Override
- protected S map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- if (start instanceof Map) {
- return mapMap((Map) start);
- } else if (start instanceof Collection) {
- return mapCollection((Collection) start);
- } else if (RANDOM.nextDouble() > 0.5d) {
- throw FastNoSuchElementException.instance();
- }
- return start;
- }
-
- private S mapCollection(final Collection collection) {
- final int size = collection.size();
- if (size <= this.amountToSample) {
- return (S) collection;
- }
- final double individualWeight = 1.0d / size;
- final Collection result = new BulkSet();
- double runningWeight = 0.0d;
- int runningAmountToSample = 0;
- while (runningAmountToSample < this.amountToSample) {
- for (final Object item : collection) {
- runningWeight = runningWeight + individualWeight;
- if (RANDOM.nextDouble() <= (runningWeight / size)) {
- result.add(item);
- if (++runningAmountToSample == this.amountToSample) {
- break;
- }
- }
- }
- }
- return (S) result;
- }
-
- private S mapMap(final Map map) {
- final int size = map.size();
- if (size <= this.amountToSample) {
- return (S) map;
- }
- final double individualWeight = 1.0d / size;
- final Map result = new HashMap(this.amountToSample);
- double runningWeight = 0.0d;
- while (result.size() < this.amountToSample) {
- for (final Object obj : map.entrySet()) {
- runningWeight = runningWeight + individualWeight;
- final Map.Entry entry = (Map.Entry) obj;
- if (RANDOM.nextDouble() <= (runningWeight / size)) {
- result.put(entry.getKey(), entry.getValue());
- if (result.size() == this.amountToSample) {
- break;
- }
- }
- }
- }
- return (S) result;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
deleted file mode 100644
index 0e4f8d5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
+++ /dev/null
@@ -1,103 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent, EngineDependent {
-
- private final String selectLabel;
- private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
- private boolean requiresPaths = false;
-
- public SelectOneStep(final Traversal.Admin traversal, final String selectLabel) {
- super(traversal);
- this.selectLabel = selectLabel;
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- if (start instanceof Map && ((Map) start).containsKey(this.selectLabel))
- return (E) TraversalUtil.apply(((Map) start).get(this.selectLabel), this.selectTraversal);
- else
- return (E) TraversalUtil.apply(traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- this.requiresPaths = traversalEngine.isComputer() ?
- TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent() :
- TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
- .filter(step -> step instanceof CollectingBarrierStep)
- .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent()
- || (step.getLabel().isPresent() && this.selectLabel.equals(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
- .findAny().isPresent() ||
- TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
- filter(step -> step instanceof TraversalParent).findAny().isPresent();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.selectLabel, this.selectTraversal);
- }
-
- @Override
- public SelectOneStep<S, E> clone() {
- final SelectOneStep<S, E> clone = (SelectOneStep<S, E>) super.clone();
- clone.selectTraversal = this.selectTraversal.clone();
- return clone;
- }
-
- @Override
- public List<Traversal.Admin<Object, Object>> getLocalChildren() {
- return Collections.singletonList(this.selectTraversal);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
- this.selectTraversal = this.integrateChild(selectTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
- if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
- return requirements;
- }
-}
-
-
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
deleted file mode 100644
index 707950e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
+++ /dev/null
@@ -1,130 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements TraversalParent, EngineDependent {
-
- protected TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
- private final List<String> selectLabels;
- private boolean requiresPaths = false;
-
- public SelectStep(final Traversal.Admin traversal, final String... selectLabels) {
- super(traversal);
- this.selectLabels = selectLabels.length == 0 ? TraversalHelper.getLabelsUpTo(this, this.traversal) : Arrays.asList(selectLabels);
- }
-
- @Override
- protected Map<String, E> map(final Traverser.Admin<S> traverser) {
- final S start = traverser.get();
- final Map<String, E> bindings = new LinkedHashMap<>();
-
- ////// PROCESS STEP BINDINGS
- final Path path = traverser.path();
- this.selectLabels.forEach(label -> {
- if (path.hasLabel(label))
- bindings.put(label, (E) TraversalUtil.apply(path.<Object>get(label), this.traversalRing.next()));
- });
-
- ////// PROCESS MAP BINDINGS
- if (start instanceof Map) {
- if (this.selectLabels.isEmpty())
- ((Map<String, Object>) start).forEach((k, v) -> bindings.put(k, (E) TraversalUtil.apply(v, this.traversalRing.next())));
- else
- this.selectLabels.forEach(label -> {
- if (((Map) start).containsKey(label))
- bindings.put(label, (E) TraversalUtil.apply(((Map) start).get(label), this.traversalRing.next()));
- });
- }
-
- this.traversalRing.reset();
- return bindings;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.traversalRing.reset();
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- this.requiresPaths = traversalEngine.isComputer() ?
- TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent() :
- TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
- .filter(step -> step instanceof CollectingBarrierStep)
- .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent()
- || (step.getLabel().isPresent() && this.selectLabels.contains(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
- .findAny().isPresent() ||
- TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
- filter(step -> step instanceof TraversalParent).findAny().isPresent();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.selectLabels, this.traversalRing);
- }
-
- @Override
- public SelectStep<S, E> clone() {
- final SelectStep<S, E> clone = (SelectStep<S, E>) super.clone();
- clone.traversalRing = new TraversalRing<>();
- for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
- clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
- }
- return clone;
- }
-
- @Override
- public List<Traversal.Admin<Object, Object>> getLocalChildren() {
- return this.traversalRing.getTraversals();
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
- this.traversalRing.addTraversal(this.integrateChild(selectTraversal));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
- if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
- return requirements;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
deleted file mode 100644
index 920c18c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
+++ /dev/null
@@ -1,137 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements MapReducer {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.BULK,
- TraverserRequirement.OBJECT
- );
-
- public SumGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier(new ConstantSupplier<>(0.0d));
- this.setBiFunction(SumGlobalBiFunction.instance());
- }
-
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
- return SumGlobalMapReduce.instance();
- }
-
- /////
-
- private static class SumGlobalBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
-
- private static final SumGlobalBiFunction INSTANCE = new SumGlobalBiFunction();
-
- private SumGlobalBiFunction() {
-
- }
-
- @Override
- public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
- }
-
- public final static <S extends Number> SumGlobalBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////////
-
- private static class SumGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
- private static final SumGlobalMapReduce INSTANCE = new SumGlobalMapReduce();
-
- private SumGlobalMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final MapReduce.Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
- vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get().doubleValue() * traverser.bulk())));
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
- if (values.hasNext()) {
- Number sum = values.next();
- while (values.hasNext()) {
- sum = sum.doubleValue() + values.next().doubleValue();
- }
- emitter.emit(sum);
- }
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
- return keyValues.hasNext() ? keyValues.next().getValue() : 0.0d;
- }
-
- public static final SumGlobalMapReduce instance() {
- return INSTANCE;
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
deleted file mode 100644
index d88a209..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
+++ /dev/null
@@ -1,58 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
- public SumLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- Number result;
- final Iterator<E> iterator = traverser.get().iterator();
- if (iterator.hasNext()) {
- result = iterator.next();
- while (iterator.hasNext()) {
- result = result.doubleValue() + iterator.next().doubleValue();
- }
- } else {
- result = 0.0d;
- }
- return (E) result;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
[04/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
new file mode 100644
index 0000000..cf90191
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class PropertiesTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value();
+
+ public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXageX_propertiesXname_ageX_value() {
+ Arrays.asList(get_g_V_hasXageX_propertiesXage_nameX_value(), get_g_V_hasXageX_propertiesXname_ageX_value()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", 29, "vadas", 27, "josh", 32, "peter", 35), traversal);
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends PropertiesTest {
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+ return g.V().has("age").properties("name", "age").value();
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+ return g.V().has("age").properties("age", "name").value();
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
new file mode 100644
index 0000000..cc6de20
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
@@ -0,0 +1,310 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.*;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SelectTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id);
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXaX_outXknowsX_asXbX_select() {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Vertex> bindings = traversal.next();
+ assertEquals(2, bindings.size());
+ assertEquals(convertToVertexId("marko"), (bindings.get("a")).id());
+ assertTrue((bindings.get("b")).id().equals(convertToVertexId("vadas")) || bindings.get("b").id().equals(convertToVertexId("josh")));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
+ final Traversal<Vertex, Map<String, String>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, String> bindings = traversal.next();
+ assertEquals(2, bindings.size());
+ assertEquals("marko", bindings.get("a"));
+ assertTrue(bindings.get("b").equals("josh") || bindings.get("b").equals("vadas"));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ assertEquals(convertToVertexId("marko"), vertex.id());
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals("marko", traversal.next());
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_asXaX_out_asXbX_select_byXnameX() {
+ Arrays.asList(
+ get_g_V_asXaX_out_asXbX_select_byXnameX(),
+ get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final List<Map<String, String>> expected = makeMapList(2,
+ "a", "marko", "b", "lop",
+ "a", "marko", "b", "vadas",
+ "a", "marko", "b", "josh",
+ "a", "josh", "b", "ripple",
+ "a", "josh", "b", "lop",
+ "a", "peter", "b", "lop");
+ checkResults(expected, traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
+ Arrays.asList(
+ get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final List<Map<String, String>> expected = makeMapList(2,
+ "a", "marko", "b", "marko",
+ "a", "vadas", "b", "vadas",
+ "a", "josh", "b", "josh",
+ "a", "ripple", "b", "ripple",
+ "a", "lop", "b", "lop",
+ "a", "peter", "b", "peter");
+ checkResults(expected, traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(CREW)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
+ printTraversalForm(traversal);
+ final List<Map<String, Object>> expected = makeMapList(2,
+ "a", 3, "b", "matthias",
+ "a", 4, "b", "marko",
+ "a", 5, "b", "stephen",
+ "a", 5, "b", "daniel");
+ checkResults(expected, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXname_isXmarkoXX_asXaX_select() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_isXmarkoXX_asXaX_select();
+ printTraversalForm(traversal);
+ final List<Map<String, Object>> expected = makeMapList(1, "a", g.V(convertToVertexId("marko")).next());
+ checkResults(expected, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_label_groupCount_asXxX_select() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_label_groupCount_asXxX_select();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Object> map1 = traversal.next();
+ assertEquals(1, map1.size());
+ assertTrue(map1.containsKey("x"));
+ final Map<String, Long> map2 = (Map<String, Long>) map1.get("x");
+ assertEquals(2, map2.size());
+ assertTrue(map2.containsKey("person"));
+ assertTrue(map2.containsKey("software"));
+ assertEquals(2, map2.get("software").longValue());
+ assertEquals(4, map2.get("person").longValue());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @Ignore
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
+ printTraversalForm(traversal);
+ final Set<String> persons = new HashSet<>();
+ for (int i = 0; i < 4; i++) {
+ assertTrue(traversal.hasNext());
+ final Map<String, Object> map = traversal.next();
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("person"));
+ assertTrue(map.containsKey("relations"));
+ assertTrue(persons.add((String) map.get("person")));
+ final Map<String, Long> relations = (Map<String, Long>) map.get("relations");
+ switch ((String) map.get("person")) {
+ case "marko":
+ assertEquals(2, relations.size());
+ assertEquals(1, relations.get("created").longValue());
+ assertEquals(2, relations.get("knows").longValue());
+ break;
+ case "vadas":
+ assertEquals(1, relations.size());
+ assertEquals(1, relations.get("knows").longValue());
+ break;
+ case "josh":
+ assertEquals(2, relations.size());
+ assertEquals(2, relations.get("created").longValue());
+ assertEquals(1, relations.get("knows").longValue());
+ break;
+ case "peter":
+ assertEquals(1, relations.size());
+ assertEquals(1, relations.get("created").longValue());
+ break;
+ default:
+ assertTrue(false);
+ break;
+ }
+ }
+ assertFalse(traversal.hasNext());
+ assertEquals(4, persons.size());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SelectTest {
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+ return g.V(v1Id).as("a").out("knows").as("b").select();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id) {
+ return g.V(v1Id).as("a").out("knows").as("b").<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+ return g.V(v1Id).as("a").out("knows").as("b").select("a");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id) {
+ return g.V(v1Id).as("a").out("knows").as("b").<String>select("a").by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+ return g.V().as("a").out().as("b").<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
+ return g.V().as("a").out().aggregate("x").as("b").<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+ return g.V().as("a").values("name").order().as("b").<String>select().by("name").by();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+ return g.V().has("name", "gremlin").inE("uses").order().by("skill", Order.incr).as("a").outV().as("b").select().by("skill").by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+ return g.V().has(values("name").is("marko")).as("a").select();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+ return g.V().label().groupCount().as("x").select();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+ return g.V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select().by("name").by();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
new file mode 100644
index 0000000..e3f1912
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sum;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class SumTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum();
+
+ public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valuesXageX_sum() {
+ final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum();
+ printTraversalForm(traversal);
+ final Number sum = traversal.next();
+ assertEquals(123.0, sum);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXsumXlocalXX() {
+ final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Number> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(1.0, map.get("ripple"));
+ assertEquals(1.0, map.get("lop"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SumTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+ return g.V().values("age").sum();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
+ return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(sum(Scope.local));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
new file mode 100644
index 0000000..e15089d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
@@ -0,0 +1,109 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class UnfoldTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold();
+
+ public abstract Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_localXoutE_foldX_unfold() {
+ final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_foldX_unfold();
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ edges.add(traversal.next());
+ }
+ assertEquals(6, counter);
+ assertEquals(6, edges.size());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_valueMap_unfold_mapXkeyX() {
+ final Traversal<Vertex, String> traversal = get_g_V_valueMap_unfold_mapXkeyX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ int ageCounter = 0;
+ int nameCounter = 0;
+ int langCounter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String key = traversal.next();
+ if (key.equals("name"))
+ nameCounter++;
+ else if (key.equals("age"))
+ ageCounter++;
+ else if (key.equals("lang"))
+ langCounter++;
+ else
+ fail("The provided key is not known: " + key);
+ }
+ assertEquals(12, counter);
+ assertEquals(4, ageCounter);
+ assertEquals(2, langCounter);
+ assertEquals(6, nameCounter);
+ assertEquals(counter, ageCounter + langCounter + nameCounter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends UnfoldTest {
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+ return g.V().local(outE().fold()).unfold();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+ return g.V().valueMap().<Map.Entry<String, List>>unfold().map(m -> m.get().getKey());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
new file mode 100644
index 0000000..774aa50
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class ValueMapTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMap();
+
+ public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX();
+
+ public abstract Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valueMap() {
+ final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMap();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Map<String, List> values = traversal.next();
+ final String name = (String) values.get("name").get(0);
+ assertEquals(2, values.size());
+ if (name.equals("marko")) {
+ assertEquals(29, values.get("age").get(0));
+ } else if (name.equals("josh")) {
+ assertEquals(32, values.get("age").get(0));
+ } else if (name.equals("peter")) {
+ assertEquals(35, values.get("age").get(0));
+ } else if (name.equals("vadas")) {
+ assertEquals(27, values.get("age").get(0));
+ } else if (name.equals("lop")) {
+ assertEquals("java", values.get("lang").get(0));
+ } else if (name.equals("ripple")) {
+ assertEquals("java", values.get("lang").get(0));
+ } else {
+ throw new IllegalStateException("It is not possible to reach here: " + values);
+ }
+ }
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valueMapXname_ageX() {
+ final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMapXname_ageX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Map<String, List> values = traversal.next();
+ final String name = (String) values.get("name").get(0);
+ if (name.equals("marko")) {
+ assertEquals(29, values.get("age").get(0));
+ assertEquals(2, values.size());
+ } else if (name.equals("josh")) {
+ assertEquals(32, values.get("age").get(0));
+ assertEquals(2, values.size());
+ } else if (name.equals("peter")) {
+ assertEquals(35, values.get("age").get(0));
+ assertEquals(2, values.size());
+ } else if (name.equals("vadas")) {
+ assertEquals(27, values.get("age").get(0));
+ assertEquals(2, values.size());
+ } else if (name.equals("lop")) {
+ assertNull(values.get("lang"));
+ assertEquals(1, values.size());
+ } else if (name.equals("ripple")) {
+ assertNull(values.get("lang"));
+ assertEquals(1, values.size());
+ } else {
+ throw new IllegalStateException("It is not possible to reach here: " + values);
+ }
+ }
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXcreatedX_valueMap() {
+ final Traversal<Vertex, Map<String, List<String>>> traversal = get_g_VX1X_outXcreatedX_valueMap(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, List<String>> values = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals("lop", values.get("name").get(0));
+ assertEquals("java", values.get("lang").get(0));
+ assertEquals(2, values.size());
+
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends ValueMapTest {
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+ return g.V().valueMap();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+ return g.V().valueMap("name", "age");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+ return g.V(v1Id).out("created").valueMap();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
new file mode 100644
index 0000000..a542a37
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
@@ -0,0 +1,617 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://traversalhen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class VertexTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_V();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id);
+
+ public abstract Traversal<Edge, Edge> get_g_E();
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV();
+
+ public abstract Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name();
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_out_out();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id);
+
+ // VERTEX ADJACENCY
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ vertices.add(traversal.next());
+ }
+ assertEquals(6, vertices.size());
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out(convertToVertexId("marko"));
+ assert_g_v1_out(traversal);
+ }
+
+ private void assert_g_v1_out(final Traversal<Vertex, Vertex> traversal) {
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("vadas") ||
+ vertex.value("name").equals("josh") ||
+ vertex.value("name").equals("lop"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX2X_in() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX2X_in(convertToVertexId("vadas"));
+ assert_g_v2_in(traversal);
+ }
+
+ private void assert_g_v2_in(final Traversal<Vertex, Vertex> traversal) {
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals(traversal.next().value("name"), "marko");
+ }
+ assertEquals(1, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_both() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX4X_both(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("marko") ||
+ vertex.value("name").equals("ripple") ||
+ vertex.value("name").equals("lop"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, vertices.size());
+ }
+
+ // EDGE ADJACENCY
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_E() {
+ final Traversal<Edge, Edge> traversal = get_g_E();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ edges.add(traversal.next());
+ }
+ assertEquals(6, edges.size());
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outE() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Edge edge = traversal.next();
+ edges.add(edge);
+ assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, edges.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX2X_inE() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX2X_inE(convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals(traversal.next().label(), "knows");
+ }
+ assertEquals(1, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_bothEXcreatedX() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothEXcreatedX(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Edge edge = traversal.next();
+ edges.add(edge);
+ assertTrue(edge.label().equals("created"));
+ assertEquals(edge.outVertex().id(), convertToVertexId("josh"));
+ }
+ assertEquals(2, counter);
+ assertEquals(2, edges.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_bothE() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothE(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Edge edge = traversal.next();
+ edges.add(edge);
+ assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, edges.size());
+ }
+
+ // EDGE/VERTEX ADJACENCY
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outE_inV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_inV(convertToVertexId("marko"));
+ this.assert_g_v1_out(traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX2X_inE_outV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX2X_inE_outV(convertToVertexId("vadas"));
+ this.assert_g_v2_in(traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_outE_hasXweight_1X_outV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_outE_hasXweight_1X_outV();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Map<Object, Integer> counts = new HashMap<>();
+ while (traversal.hasNext()) {
+ final Object id = traversal.next().id();
+ int previousCount = counts.getOrDefault(id, 0);
+ counts.put(id, previousCount + 1);
+ counter++;
+ }
+ assertEquals(2, counts.size());
+ assertEquals(1, counts.get(convertToVertexId("marko")).intValue());
+ assertEquals(1, counts.get(convertToVertexId("josh")).intValue());
+
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_outE_inV_inE_inV_both_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_out_outE_inV_inE_inV_both_name();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Map<String, Integer> counts = new HashMap<>();
+ while (traversal.hasNext()) {
+ final String key = traversal.next();
+ int previousCount = counts.getOrDefault(key, 0);
+ counts.put(key, previousCount + 1);
+ counter++;
+ }
+ assertEquals(3, counts.size());
+ assertEquals(4, counts.get("josh").intValue());
+ assertEquals(3, counts.get("marko").intValue());
+ assertEquals(3, counts.get("peter").intValue());
+
+ assertEquals(10, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outEXknowsX_bothV_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_outEXknowsX_bothV_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(4, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("vadas"));
+ names.remove("marko");
+ assertEquals(3, names.size());
+ names.remove("marko");
+ assertEquals(2, names.size());
+ names.remove("josh");
+ assertEquals(1, names.size());
+ names.remove("vadas");
+ assertEquals(0, names.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outE_otherV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_otherV(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("vadas") ||
+ vertex.value("name").equals("josh") ||
+ vertex.value("name").equals("lop"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_bothE_otherV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_otherV(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(3, vertices.size());
+ assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("marko")));
+ assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("ripple")));
+ assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("lop")));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_bothE_hasXweight_lt_1X_otherV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_hasXweight_lt_1X_otherV(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(1, vertices.size());
+ assertEquals(vertices.get(0).value("name"), "lop");
+ assertFalse(traversal.hasNext());
+ }
+
+ // VERTEX EDGE LABEL ADJACENCY
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXknowsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX(convertToVertexId("marko"));
+ assert_g_v1_outXknowsX(traversal);
+ }
+
+ private void assert_g_v1_outXknowsX(Traversal<Vertex, Vertex> traversal) {
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("vadas") ||
+ vertex.value("name").equals("josh"));
+ }
+ assertEquals(2, counter);
+ assertEquals(2, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXknows_createdX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknows_createdX(convertToVertexId("marko"));
+ this.assert_g_v1_out(traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outEXknowsX_inV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknowsX_inV(convertToVertexId("marko"));
+ this.assert_g_v1_outXknowsX(traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outEXknows_createdX_inV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknows_createdX_inV(convertToVertexId("marko"));
+ this.assert_g_v1_out(traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_out_out();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("lop") ||
+ vertex.value("name").equals("ripple"));
+ }
+ assertEquals(2, counter);
+ assertEquals(2, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_out_out() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_out_out(convertToVertexId("marko"));
+ assertFalse(traversal.hasNext());
+ }
+
+ // PROPERTY TESTING
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_out_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<String> names = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ String name = traversal.next();
+ names.add(name);
+ assertTrue(name.equals("vadas") ||
+ name.equals("josh") ||
+ name.equals("lop"));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, names.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_to_XOUT_knowsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_to_XOUT_knowsX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ String name = vertex.value("name");
+ assertTrue(name.equals("vadas") ||
+ name.equals("josh"));
+ }
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends VertexTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V() {
+ return g.V();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+ return g.V(v1Id).out();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+ return g.V(v2Id).in();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+ return g.V(v4Id).both();
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E() {
+ return g.E();
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+ return g.V(v1Id).outE();
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+ return g.V(v2Id).inE();
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+ return g.V(v4Id).bothE();
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+ return g.V(v4Id).bothE("created");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+ return g.V(v1Id).outE().inV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+ return g.V(v2Id).inE().outV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+ return g.V().outE().has("weight", 1.0d).outV();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+ return g.V().out().outE().inV().inE().inV().both().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+ return g.V(v1Id).outE("knows").bothV().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+ return g.V(v1Id).out("knows");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+ return g.V(v1Id).out("knows", "created");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+ return g.V(v1Id).outE("knows").inV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+ return g.V(v1Id).outE("knows", "created").inV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+ return g.V(v1Id).outE().otherV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+ return g.V(v4Id).bothE().otherV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(Object v4Id) {
+ return g.V(v4Id).bothE().has("weight", Compare.lt, 1d).otherV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_out_out() {
+ return g.V().out().out();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+ return g.V(v1Id).out().out().out();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+ return g.V(v1Id).out().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+ return g.V(v1Id).to(Direction.OUT, "knows");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
new file mode 100644
index 0000000..19e632f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
@@ -0,0 +1,149 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class AggregateTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX();
+
+ public abstract Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX();
+
+ public abstract Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path();
+
+ //public abstract Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valueXnameX_aggregateXxX_capXxX() {
+ Traversal<Vertex, List<String>> traversal = get_g_V_name_aggregateXxX_capXxX();
+ printTraversalForm(traversal);
+ final Collection<String> names = traversal.next();
+ assertFalse(traversal.hasNext());
+ checkListOfNames(names);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_aggregateXxX_byXnameX_capXxX() {
+ Traversal<Vertex, List<String>> traversal = get_g_V_aggregateXxX_byXnameX_capXxX();
+ printTraversalForm(traversal);
+ final Collection<String> names = traversal.next();
+ assertFalse(traversal.hasNext());
+ checkListOfNames(names);
+ }
+
+ private void checkListOfNames(Collection<String> names) {
+ assertEquals(6, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("peter"));
+ assertTrue(names.contains("lop"));
+ assertTrue(names.contains("vadas"));
+ assertTrue(names.contains("ripple"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_aggregateXaX_path() {
+ final Traversal<Vertex, Path> traversal = get_g_V_out_aggregateXaX_path();
+ printTraversalForm(traversal);
+ int count = 0;
+ final Map<String, Long> firstStepCounts = new HashMap<>();
+ final Map<String, Long> secondStepCounts = new HashMap<>();
+ while (traversal.hasNext()) {
+ count++;
+ Path path = traversal.next();
+ String first = path.get(0).toString();
+ String second = path.get(1).toString();
+ assertThat(first, not(second));
+ MapHelper.incr(firstStepCounts, first, 1l);
+ MapHelper.incr(secondStepCounts, second, 1l);
+ }
+ assertEquals(6, count);
+ assertEquals(3, firstStepCounts.size());
+ assertEquals(4, secondStepCounts.size());
+ assertTrue(firstStepCounts.values().contains(3l));
+ assertTrue(firstStepCounts.values().contains(2l));
+ assertTrue(firstStepCounts.values().contains(1l));
+ assertTrue(secondStepCounts.values().contains(3l));
+ assertTrue(secondStepCounts.values().contains(1l));
+ }
+
+ /*@Test
+ @LoadGraphWith(CLASSIC)
+ public void g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path() {
+ Iterator<Path> traversal = get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(convertToVertexId("marko"));
+ System.out.println("Testing: " + traversal);
+ final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
+ // for OLTP it's a roulette game; the result can change depending on which path is taken first by the traverser (this makes some cool real world use cases possible)
+ // Senzari use case: generate a random playlist without artist repetitions
+ assertEquals(4, paths.size());
+ assertEquals(3, paths.stream().filter(path -> path.size() == 3).count());
+ assertEquals(1, paths.stream().filter(path -> path.size() == 5).count());
+ assertFalse(traversal.hasNext());
+ }*/
+
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends AggregateTest {
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+ return g.V().values("name").aggregate("x").cap("x");
+ }
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+ return g.V().aggregate("x").by("name").cap("x");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+ return g.V().out().aggregate("a").path();
+ }
+
+ /*public Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id) {
+ return g.V(1).as("x").bothE().as("e").value("weight").except("w").aggregate("w").back("e").otherV().jump("x", t -> true, t -> true).path();
+ }*/
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
new file mode 100644
index 0000000..eda73f7
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
@@ -0,0 +1,177 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroupCountTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX();
+
+ public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount();
+
+ public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX();
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_outXcreatedX_groupCount_byXnameX() {
+ Arrays.asList(get_g_V_outXcreatedX_groupCount_byXnameX(), get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertEquals(map.size(), 2);
+ assertEquals(Long.valueOf(3l), map.get("lop"));
+ assertEquals(Long.valueOf(1l), map.get("ripple"));
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_outXcreatedX_name_groupCount() {
+ Arrays.asList(get_g_V_outXcreatedX_name_groupCount(), get_g_V_outXcreatedX_name_groupCountXaX_capXaX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertEquals(map.size(), 2);
+ assertEquals(3l, map.get("lop").longValue());
+ assertEquals(1l, map.get("ripple").longValue());
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_filterXfalseX_groupCount() {
+ Arrays.asList(get_g_V_hasXnoX_groupCount(), get_g_V_hasXnoX_groupCountXaX_capXaX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<Object, Long> map = traversal.next();
+ assertEquals(0, map.size());
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+ List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(4, map.size());
+ assertEquals(4l, map.get("lop").longValue());
+ assertEquals(2l, map.get("ripple").longValue());
+ assertEquals(1l, map.get("josh").longValue());
+ assertEquals(1l, map.get("vadas").longValue());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+ List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(2, map.get("marko").longValue());
+ assertEquals(2, map.get("java").longValue());
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends GroupCountTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+ return g.V().out("created").<String>groupCount().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+ return g.V().out("created").<String>groupCount("a").by("name").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+ return g.V().out("created").values("name").groupCount();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+ return g.V().out("created").values("name").groupCount("a").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+ return g.V().has("no").groupCount();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+ return g.V().has("no").groupCount("a").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+ return g.V().repeat(out().groupCount("a").by("name")).times(2).cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+ return g.V().union(
+ repeat(out()).times(2).groupCount("m").by("lang"),
+ repeat(in()).times(2).groupCount("m").by("name")).cap("m");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
new file mode 100644
index 0000000..3b59720
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.*;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroupTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX();
+
+ public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX();
+
+ public abstract Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_group_byXnameX() {
+ Arrays.asList(get_g_V_group_byXnameX(), get_g_V_groupXaX_byXnameX_capXaX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Collection<Vertex>> map = traversal.next();
+ assertEquals(6, map.size());
+ map.forEach((key, values) -> {
+ assertEquals(1, values.size());
+ assertEquals(convertToVertexId(key), values.iterator().next().id());
+ });
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+ final Traversal<Vertex, Map<String, Collection<String>>> traversal = get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
+ printTraversalForm(traversal);
+ final Map<String, Collection<String>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(1, map.size());
+ assertTrue(map.containsKey("java"));
+ assertEquals(2, map.get("java").size());
+ assertTrue(map.get("java").contains("ripple"));
+ assertTrue(map.get("java").contains("lop"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXlangX_group_byXlangX_byX1X_byXsizeX() {
+ final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertEquals(1, map.size());
+ assertTrue(map.containsKey("java"));
+ assertEquals(Long.valueOf(2), map.get("java"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXout_groupXaX_byXnameX_byXitX_byXsizeXX_timesX2X_capXaX() {
+ List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(4, map.size());
+ assertTrue(map.containsKey("vadas"));
+ assertEquals(Long.valueOf(1), map.get("vadas"));
+ assertTrue(map.containsKey("josh"));
+ assertEquals(Long.valueOf(1), map.get("josh"));
+ assertTrue(map.containsKey("lop"));
+ assertEquals(Long.valueOf(4), map.get("lop"));
+ assertTrue(map.containsKey("ripple"));
+ assertEquals(Long.valueOf(2), map.get("ripple"));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_group_byXoutE_countX_byXnameX() {
+ final Traversal<Vertex, Map<Long, Collection<String>>> traversal = get_g_V_group_byXoutE_countX_byXnameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<Long, Collection<String>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(4, map.size());
+ assertTrue(map.containsKey(0l));
+ assertTrue(map.containsKey(1l));
+ assertTrue(map.containsKey(2l));
+ assertTrue(map.containsKey(3l));
+ assertEquals(3, map.get(0l).size());
+ assertEquals(1, map.get(1l).size());
+ assertEquals(1, map.get(2l).size());
+ assertEquals(1, map.get(3l).size());
+ assertTrue(map.get(0l).contains("lop"));
+ assertTrue(map.get(0l).contains("ripple"));
+ assertTrue(map.get(0l).contains("vadas"));
+ assertTrue(map.get(1l).contains("peter"));
+ assertTrue(map.get(2l).contains("josh"));
+ assertTrue(map.get(3l).contains("marko"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends GroupTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+ return g.V().<String, Collection<Vertex>>group().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+ return g.V().<String, Collection<Vertex>>group("a").by("name").cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+ return g.V().has("lang").group("a").by("lang").by("name").out().cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+ return g.V().has("lang").<String, Long>group().by("lang").by(inject(1)).<Collection>by(count(Scope.local));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+ return g.V().repeat(out().group("a").by("name").by().<Collection>by(count(Scope.local))).times(2).cap("a");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+ return g.V().<Long, Collection<String>>group().by(outE().count()).by("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
new file mode 100644
index 0000000..6c67d72
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class InjectTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id);
+
+ public abstract Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_injectXv2X_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_out_injectXv2X_name(convertToVertexId("marko"), convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ Map<String, Long> counter = new HashMap<>();
+ while (traversal.hasNext()) {
+ MapHelper.incr(counter, traversal.next(), 1l);
+ }
+ assertEquals(3, counter.size());
+ assertEquals(1l, counter.get("josh").longValue());
+ assertEquals(1l, counter.get("lop").longValue());
+ assertEquals(2l, counter.get("vadas").longValue());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
+ final Traversal<Vertex, Path> traversal = get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Path path = traversal.next();
+ if (path.get("a").equals("daniel")) {
+ assertEquals(2, path.size());
+ assertEquals(6, (int) path.get(1));
+ } else {
+ assertEquals(4, path.size());
+ assertEquals(path.<String>get("a").length(), (int) path.get(3));
+ }
+ }
+ assertEquals(4, counter);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends InjectTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
+ return g.V(v1Id).out().inject(g.V(v2Id).next()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
+ return g.V(v1Id).out().<String>values("name").inject("daniel").as("a").map(t -> t.get().length()).path();
+ }
+ }
+}
[36/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
deleted file mode 100644
index de505ec..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Randall Barnhart (random pi)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class TimeLimitStep<S> extends FilterStep<S> {
-
- private AtomicLong startTime = new AtomicLong(-1);
- private final long timeLimit;
- private AtomicBoolean timedOut = new AtomicBoolean(false);
-
-
- public TimeLimitStep(final Traversal.Admin traversal, final long timeLimit) {
- super(traversal);
- this.timeLimit = timeLimit;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- if (this.startTime.get() == -1l)
- this.startTime.set(System.currentTimeMillis());
- if ((System.currentTimeMillis() - this.startTime.get()) >= this.timeLimit) {
- this.timedOut.set(true);
- throw FastNoSuchElementException.instance();
- }
- return true;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.timeLimit);
- }
-
- @Override
- public void reset() {
- super.reset();
- this.startTime.set(-1l);
- this.timedOut.set(false);
- }
-
- public boolean getTimedOut() {
- return this.timedOut.get();
- }
-
- @Override
- public TimeLimitStep<S> clone() {
- final TimeLimitStep<S> clone = (TimeLimitStep<S>) super.clone();
- clone.timedOut = new AtomicBoolean(this.timedOut.get());
- clone.startTime = new AtomicLong(this.startTime.get());
- return clone;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
deleted file mode 100644
index 1477d11..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
+++ /dev/null
@@ -1,132 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.MarkerIdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiPredicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class WhereStep<E> extends FilterStep<Map<String, E>> implements TraversalParent {
-
- private final String firstKey;
- private final String secondKey;
- private final BiPredicate biPredicate;
- private Traversal.Admin constraint;
-
-
- public WhereStep(final Traversal.Admin traversal, final String firstKey, final String secondKey, final BiPredicate<E, E> biPredicate) {
- super(traversal);
- this.firstKey = firstKey;
- this.secondKey = secondKey;
- this.biPredicate = biPredicate;
- this.constraint = null;
- }
-
- public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
- super(traversal);
- this.firstKey = null;
- this.secondKey = null;
- this.biPredicate = null;
- this.constraint = this.integrateChild(constraint);
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
- if (null == this.constraint) {
- final Map<String, E> map = traverser.get();
- if (!map.containsKey(this.firstKey))
- throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
- if (!map.containsKey(this.secondKey))
- throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
- return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
- } else {
- final Step<?, ?> startStep = this.constraint.getStartStep();
- Step<?, ?> endStep = this.constraint.getEndStep();
- if (endStep instanceof MarkerIdentityStep) // DAH!
- endStep = endStep.getPreviousStep();
-
- final Map<String, E> map = traverser.get();
- if (!map.containsKey(startStep.getLabel().get()))
- throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabel().get());
- final Object startObject = map.get(startStep.getLabel().get());
- final Object endObject;
- if (endStep.getLabel().isPresent()) {
- if (!map.containsKey(endStep.getLabel().get()))
- throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabel().get());
- endObject = map.get(endStep.getLabel().get());
- } else
- endObject = null;
-
- startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
- if (null == endObject) {
- if (this.constraint.hasNext()) {
- this.constraint.reset();
- return true;
- } else {
- return false;
- }
-
- } else {
- while (this.constraint.hasNext()) {
- if (this.constraint.next().equals(endObject)) {
- this.constraint.reset();
- return true;
- }
- }
- return false;
- }
- }
- }
-
- @Override
- public List<Traversal.Admin> getLocalChildren() {
- return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
- }
-
- @Override
- public WhereStep<E> clone() {
- final WhereStep<E> clone = (WhereStep<E>) super.clone();
- if (null != this.constraint)
- clone.constraint = clone.integrateChild(this.constraint.clone());
- return clone;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
deleted file mode 100644
index 6f493d1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddEdgeByPathStep extends MapStep<Vertex, Edge> implements Mutating {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.PATH,
- TraverserRequirement.OBJECT
- );
-
- // TODO: Weight key based on Traverser.getCount() ?
-
- private final Direction direction;
- private final String edgeLabel;
- private final String stepLabel;
- private final Object[] keyValues;
-
- public AddEdgeByPathStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final String stepLabel, final Object... keyValues) {
- super(traversal);
- this.direction = direction;
- if (this.direction.equals(Direction.BOTH))
- throw new IllegalArgumentException("Only in- and out- directions are supported by " + AddEdgeByPathStep.class.getSimpleName());
- this.edgeLabel = edgeLabel;
- this.stepLabel = stepLabel;
- this.keyValues = keyValues;
- }
-
- public Direction getDirection() {
- return direction;
- }
-
- public String getEdgeLabel() {
- return edgeLabel;
- }
-
- public String getStepLabel() {
- return stepLabel;
- }
-
- public Object[] getKeyValues() {
- return keyValues;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.direction.name(), this.edgeLabel, this.stepLabel);
- }
-
- @Override
- protected Edge map(Traverser.Admin<Vertex> traverser) {
- final Vertex currentVertex = traverser.get();
- final Vertex otherVertex = traverser.path().get(this.stepLabel);
- if (this.direction.equals(Direction.IN))
- return otherVertex.addEdge(this.edgeLabel, currentVertex, this.keyValues);
- else
- return currentVertex.addEdge(this.edgeLabel, otherVertex, this.keyValues);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
deleted file mode 100644
index 6c5dc6d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
+++ /dev/null
@@ -1,86 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddEdgeStep extends FlatMapStep<Vertex, Edge> implements Mutating {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
- private final String edgeLabel;
- private final Object[] keyValues;
- private final List<Vertex> vertices;
- private final Direction direction;
-
- public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Vertex vertex, final Object... keyValues) {
- this(traversal, direction, edgeLabel, IteratorUtils.of(vertex), keyValues);
- }
-
- public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Iterator<Vertex> vertices, final Object... keyValues) {
- super(traversal);
- this.direction = direction;
- this.edgeLabel = edgeLabel;
- this.vertices = IteratorUtils.list(vertices);
- this.keyValues = keyValues;
- }
-
- public Direction getDirection() {
- return direction;
- }
-
- public String getEdgeLabel() {
- return edgeLabel;
- }
-
- public Object[] getKeyValues() {
- return keyValues;
- }
-
- public List<Vertex> getVertices() {
- return vertices;
- }
-
- @Override
- protected Iterator<Edge> flatMap(final Traverser.Admin<Vertex> traverser) {
- return IteratorUtils.map(this.vertices.iterator(), this.direction.equals(Direction.OUT) ?
- vertex -> traverser.get().addEdge(this.edgeLabel, vertex, this.keyValues) :
- vertex -> vertex.addEdge(this.edgeLabel, traverser.get(), this.keyValues));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
deleted file mode 100644
index 363a4bc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
+++ /dev/null
@@ -1,53 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> implements Mutating {
-
- private final Object[] keyValues;
- private boolean first = true;
-
- public AddVertexStartStep(final Traversal.Admin traversal, final Object... keyValues) {
- super(traversal);
- this.keyValues = keyValues;
- }
-
- public Object[] getKeyValues() {
- return keyValues;
- }
-
- @Override
- protected Traverser<Vertex> processNextStart() {
- if (this.first) {
- this.first = false;
- return this.getTraversal().getTraverserGenerator().generate(this.getTraversal().getGraph().get().addVertex(this.keyValues), this, 1l);
- } else
- throw FastNoSuchElementException.instance();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
deleted file mode 100644
index 363a3e6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
+++ /dev/null
@@ -1,49 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddVertexStep<S> extends MapStep<S, Vertex> implements Mutating {
-
- private final Object[] keyValues;
- private final transient Graph graph;
-
- public AddVertexStep(final Traversal.Admin traversal, final Object... keyValues) {
- super(traversal);
- this.keyValues = keyValues;
- this.graph = this.getTraversal().getGraph().get();
- }
-
- public Object[] getKeyValues() {
- return keyValues;
- }
-
- @Override
- protected Vertex map(final Traverser.Admin<S> traverser) {
- return this.graph.addVertex(this.keyValues);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
deleted file mode 100644
index 6a4c4c1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
+++ /dev/null
@@ -1,64 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class BackStep<S, E> extends MapStep<S, E> implements EngineDependent {
-
- private final String stepLabel;
- private boolean requiresPaths = false;
-
- public BackStep(final Traversal.Admin traversal, final String stepLabel) {
- super(traversal);
- this.stepLabel = stepLabel;
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- return traverser.path(this.stepLabel);
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- this.requiresPaths = traversalEngine.isComputer();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- //return this.requiresPaths ? Collections.singleton(TraverserRequirement.PATH) : Collections.singleton(TraverserRequirement.PATH_ACCESS);
- return Collections.singleton(TraverserRequirement.PATH); // TODO: if the traversal isn't nested, path access works
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.stepLabel);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
deleted file mode 100644
index 26f8488..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
+++ /dev/null
@@ -1,86 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements TraversalParent {
-
- private List<Traversal.Admin<S, E>> coalesceTraversals;
-
- @SafeVarargs
- public CoalesceStep(final Traversal.Admin traversal, final Traversal.Admin<S, E>... coalesceTraversals) {
- super(traversal);
- this.coalesceTraversals = Arrays.asList(coalesceTraversals);
- for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
- this.integrateChild(conjunctionTraversal);
- }
- }
-
- @Override
- protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
- for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) {
- coalesceTraversal.reset();
- coalesceTraversal.addStart(traverser.asAdmin().split());
- if (coalesceTraversal.hasNext())
- return coalesceTraversal;
- }
- return EmptyIterator.instance();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements();
- }
-
- @Override
- public List<Traversal.Admin<S, E>> getLocalChildren() {
- return Collections.unmodifiableList(this.coalesceTraversals);
- }
-
- @Override
- public CoalesceStep<S, E> clone() {
- final CoalesceStep<S, E> clone = (CoalesceStep<S, E>) super.clone();
- clone.coalesceTraversals = new ArrayList<>();
- for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
- clone.coalesceTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
- }
- return clone;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.coalesceTraversals);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
deleted file mode 100644
index e54c96f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
+++ /dev/null
@@ -1,134 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
-
- public CountGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier(new ConstantSupplier<>(0L));
- this.setBiFunction(CountBiFunction.<S>instance());
- }
-
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
- return CountGlobalMapReduce.instance();
- }
-
- ///////////
-
- private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
-
- private static final CountBiFunction INSTANCE = new CountBiFunction();
-
- private CountBiFunction() {
-
- }
-
- @Override
- public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
- return mutatingSeed + traverser.bulk();
- }
-
- public final static <S> CountBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////////
-
- private static class CountGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> {
-
- private static CountGlobalMapReduce INSTANCE = new CountGlobalMapReduce();
-
- private CountGlobalMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final MapReduce.Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Long> emitter) {
- vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.bulk())));
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
- long count = 0l;
- while (values.hasNext()) {
- count = count + values.next();
- }
- emitter.emit(count);
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Long generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
- return keyValues.hasNext() ? keyValues.next().getValue() : 0L;
- }
-
- public static final CountGlobalMapReduce instance() {
- return INSTANCE;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
deleted file mode 100644
index 14c2a8c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
+++ /dev/null
@@ -1,51 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class CountLocalStep<S> extends MapStep<S, Long> {
-
- public CountLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Long map(final Traverser.Admin<S> traverser) {
- final S item = traverser.get();
- return (item instanceof Collection) ? ((Collection) item).size()
- : (item instanceof Map) ? ((Map) item).size() : 1L;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
deleted file mode 100644
index bfff34e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
+++ /dev/null
@@ -1,51 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class DedupLocalStep<E, S extends Iterable<E>> extends MapStep<S, Set<E>> {
-
- public DedupLocalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Set<E> map(final Traverser.Admin<S> traverser) {
- final Set<E> result = new LinkedHashSet<>();
- for (final E item : traverser.get()) {
- result.add(item);
- }
- return result;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
deleted file mode 100644
index 7afc504..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
+++ /dev/null
@@ -1,58 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EdgeOtherVertexStep extends MapStep<Edge, Vertex> {
-
- public EdgeOtherVertexStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Vertex map(final Traverser.Admin<Edge> traverser) {
- final List<Object> objects = traverser.path().objects();
- for (int i = objects.size() - 2; i >= 0; i--) {
- if (objects.get(i) instanceof Vertex) {
- return ElementHelper.areEqual((Vertex) objects.get(i), traverser.get().outVertex()) ?
- traverser.get().inVertex() :
- traverser.get().outVertex();
- }
- }
- throw new IllegalStateException("The path history of the traverser does not contain a previous vertex: " + traverser.path());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
deleted file mode 100644
index 5281999..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
+++ /dev/null
@@ -1,67 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EdgeVertexStep extends FlatMapStep<Edge, Vertex> {
-
- private Direction direction;
-
- public EdgeVertexStep(final Traversal.Admin traversal, final Direction direction) {
- super(traversal);
- this.direction = direction;
- }
-
- @Override
- protected Iterator<Vertex> flatMap(final Traverser.Admin<Edge> traverser) {
- return traverser.get().vertices(this.direction);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.direction);
- }
-
- public Direction getDirection() {
- return this.direction;
- }
-
- public void reverseDirection() {
- this.direction = this.direction.opposite();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
deleted file mode 100644
index 60ea9e3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
+++ /dev/null
@@ -1,60 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Collections;
-import java.util.Iterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
-
- private Traverser.Admin<S> head = null;
- private Iterator<E> iterator = EmptyIterator.instance();
-
- public FlatMapStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<E> processNextStart() {
- while (true) {
- if (this.iterator.hasNext()) {
- return this.head.split(this.iterator.next(), this);
- } else {
- this.head = this.starts.next();
- this.iterator = this.flatMap(this.head);
- }
- }
- }
-
- protected abstract Iterator<E> flatMap(final Traverser.Admin<S> traverser);
-
- @Override
- public void reset() {
- super.reset();
- this.iterator = EmptyIterator.instance();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
deleted file mode 100644
index 885c2fe..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ /dev/null
@@ -1,93 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
- public FoldStep(final Traversal.Admin traversal) {
- this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
- }
-
- public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
- super(traversal);
- this.setSeedSupplier(seed);
- this.setBiFunction(new FoldBiFunction<>(foldFunction));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- /////////
-
- private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
-
- private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
-
- private ArrayListBiFunction() {
-
- }
-
- @Override
- public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
- mutatingSeed.add(traverser);
- return mutatingSeed;
- }
-
- public final static <S> ArrayListBiFunction<S> instance() {
- return INSTANCE;
- }
- }
-
- ///////
-
- public static class FoldBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
-
- private final BiFunction<E, S, E> biFunction;
-
- public FoldBiFunction(final BiFunction<E, S, E> biFunction) {
- this.biFunction = biFunction;
- }
-
- @Override
- public E apply(final E seed, final Traverser<S> traverser) {
- return this.biFunction.apply(seed, traverser.get());
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
deleted file mode 100644
index 852869b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
+++ /dev/null
@@ -1,170 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
-
- private Traversal.Admin<S, E> groupTraversal = null;
-
- public GroupCountStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier(HashMapSupplier.instance());
- this.setBiFunction(new GroupCountBiFunction());
- }
-
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
- this.groupTraversal = this.integrateChild(groupTraversal);
- }
-
- @Override
- public List<Traversal.Admin<S, E>> getLocalChildren() {
- return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
- }
-
- @Override
- public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
- return GroupCountMapReduce.instance();
- }
-
- @Override
- public GroupCountStep<S, E> clone() {
- final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
- if (null != this.groupTraversal)
- clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
- return clone;
- }
-
- @Override
- public Traverser<Map<E, Long>> processNextStart() {
- if (this.byPass) {
- final Traverser.Admin<S> traverser = this.starts.next();
- return traverser.asAdmin().split(TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map<E, Long>>) this.groupTraversal), this);
- } else {
- return super.processNextStart();
- }
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.groupTraversal);
- }
-
- ///////////
-
- private class GroupCountBiFunction implements BiFunction<Map<E, Long>, Traverser<S>, Map<E, Long>>, Serializable {
-
- private GroupCountBiFunction() {
-
- }
-
- @Override
- public Map<E, Long> apply(final Map<E, Long> mutatingSeed, final Traverser<S> traverser) {
- MapHelper.incr(mutatingSeed, TraversalUtil.applyNullable(traverser.asAdmin(), GroupCountStep.this.groupTraversal), traverser.bulk());
- return mutatingSeed;
- }
- }
-
- ///////////
-
- public static final class GroupCountMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
-
- private static final GroupCountMapReduce INSTANCE = new GroupCountMapReduce();
-
- private GroupCountMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
- vertex.<TraverserSet<E>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
- }
-
- @Override
- public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
- long counter = 0;
- while (values.hasNext()) {
- counter = counter + values.next();
- }
- emitter.emit(key, counter);
- }
-
- @Override
- public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
- reduce(key, values, emitter);
- }
-
- @Override
- public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
- final Map<E, Long> map = new HashMap<>();
- keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
- return map;
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- public static final <E> GroupCountMapReduce<E> instance() {
- return INSTANCE;
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
deleted file mode 100644
index 5d26384..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
+++ /dev/null
@@ -1,277 +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.graph.traversal.step.map;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupStep<S, K, V, R> extends ReducingBarrierStep<S, Map<K, R>> implements MapReducer, TraversalParent {
-
- private char state = 'k';
-
- private Traversal.Admin<S, K> keyTraversal = null;
- private Traversal.Admin<S, V> valueTraversal = null;
- private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
-
- public GroupStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier((Supplier) new GroupMapSupplier());
- this.setBiFunction((BiFunction) new GroupBiFunction());
- }
-
- @Override
- public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
- final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
- if (null != this.keyTraversal)
- children.add((Traversal.Admin) this.keyTraversal);
- if (null != this.valueTraversal)
- children.add((Traversal.Admin) this.valueTraversal);
- if (null != this.reduceTraversal)
- children.add((Traversal.Admin) this.reduceTraversal);
- return children;
- }
-
- public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
- return this.reduceTraversal;
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
- if ('k' == this.state) {
- this.keyTraversal = this.integrateChild(kvrTraversal);
- this.state = 'v';
- } else if ('v' == this.state) {
- this.valueTraversal = this.integrateChild(kvrTraversal);
- this.state = 'r';
- } else if ('r' == this.state) {
- this.reduceTraversal = this.integrateChild(kvrTraversal);
- this.state = 'x';
- } else {
- throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
- }
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
- }
-
- @Override
- public GroupStep<S, K, V, R> clone() {
- final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
- if (null != this.keyTraversal)
- clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
- if (null != this.valueTraversal)
- clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
- if (null != this.reduceTraversal)
- clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
- return clone;
- }
-
- @Override
- public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
- return new GroupMapReduce<>(this);
- }
-
- @Override
- public Traverser<Map<K, R>> processNextStart() {
- if (this.byPass) {
- final Traverser.Admin<S> traverser = this.starts.next();
- final Object[] kvPair = new Object[]{TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.valueTraversal)};
- return traverser.asAdmin().split(kvPair, (Step) this);
- } else {
- return super.processNextStart();
- }
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
- }
-
- ///////////
-
- private class GroupBiFunction implements BiFunction<Map<K, Collection<V>>, Traverser.Admin<S>, Map<K, Collection<V>>>, Serializable {
-
- private GroupBiFunction() {
-
- }
-
- @Override
- public Map<K, Collection<V>> apply(final Map<K, Collection<V>> mutatingSeed, final Traverser.Admin<S> traverser) {
- final K key = TraversalUtil.applyNullable(traverser, GroupStep.this.keyTraversal);
- final V value = TraversalUtil.applyNullable(traverser, GroupStep.this.valueTraversal);
- Collection<V> values = mutatingSeed.get(key);
- if (null == values) {
- values = new BulkSet<>();
- mutatingSeed.put(key, values);
- }
- TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
- return mutatingSeed;
- }
- }
-
- //////////
-
- private class GroupMap extends HashMap<K, Collection<V>> implements FinalGet<Map<K, R>> {
-
- @Override
- public Map<K, R> getFinal() {
- if (null == GroupStep.this.reduceTraversal)
- return (Map<K, R>) this;
- else {
- final Map<K, R> reduceMap = new HashMap<>();
- this.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, GroupStep.this.reduceTraversal)));
- return reduceMap;
- }
- }
- }
-
- private class GroupMapSupplier implements Supplier<GroupMap>, Serializable {
-
- private GroupMapSupplier() {
- }
-
- @Override
- public GroupMap get() {
- return new GroupMap();
- }
- }
-
- ///////////
-
- public static final class GroupMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
-
- public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
-
- private String groupStepId;
- private Traversal.Admin<Collection<V>, R> reduceTraversal;
-
- private GroupMapReduce() {
-
- }
-
- public GroupMapReduce(final GroupStep<?, K, V, R> step) {
- this.groupStepId = step.getId();
- this.reduceTraversal = step.getReduceTraversal();
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- MapReduce.super.storeState(configuration);
- configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
- final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
- if (!traversal.isLocked())
- traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
- final GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
- this.reduceTraversal = groupStep.getReduceTraversal();
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return !stage.equals(Stage.COMBINE);
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
- vertex.<TraverserSet<Object[]>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> {
- final Object[] objects = traverser.get();
- if (objects[1] instanceof Collection)
- emitter.emit((K) objects[0], (Collection<V>) objects[1]);
- else {
- final List<V> collection = new ArrayList<>();
- collection.add((V) objects[1]);
- emitter.emit((K) objects[0], collection);
- }
- }));
- }
-
- @Override
- public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
- final Set<V> set = new BulkSet<>();
- values.forEachRemaining(set::addAll);
- emitter.emit(key, TraversalUtil.applyNullable(set, this.reduceTraversal));
- }
-
- @Override
- public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
- final Map<K, R> map = new HashMap<>();
- keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
- return map;
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public GroupMapReduce<K, V, R> clone() {
- try {
- final GroupMapReduce<K, V, R> clone = (GroupMapReduce<K, V, R>) super.clone();
- if (null != clone.reduceTraversal)
- clone.reduceTraversal = this.reduceTraversal.clone();
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public String toString() {
- return StringFactory.mapReduceString(this, this.getMemoryKey());
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
deleted file mode 100644
index 17d0fe6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdStep<S extends Element> extends MapStep<S, Object> {
-
- public IdStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Object map(final Traverser.Admin<S> traverser) {
- return traverser.get().id();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
deleted file mode 100644
index 74460a5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class KeyStep extends MapStep<Property, String> {
-
- public KeyStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected String map(final Traverser.Admin<Property> traverser) {
- return traverser.get().key();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
deleted file mode 100644
index e54c07f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LabelStep<S extends Element> extends MapStep<S, String> {
-
- public LabelStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected String map(final Traverser.Admin<S> traverser) {
- return traverser.get().label();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
deleted file mode 100644
index acd6416..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
+++ /dev/null
@@ -1,49 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaFlatMapStep<S, E> extends FlatMapStep<S, E> {
-
- private final Function<Traverser<S>, Iterator<E>> function;
-
- public LambdaFlatMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, Iterator<E>> function) {
- super(traversal);
- this.function = function;
- }
-
- @Override
- protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
- return this.function.apply(traverser);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.function);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
deleted file mode 100644
index d22e630..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
+++ /dev/null
@@ -1,48 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaMapStep<S, E> extends MapStep<S, E> {
-
- private final Function<Traverser<S>, E> function;
-
- public LambdaMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, E> function) {
- super(traversal);
- this.function = function;
- }
-
- @Override
- protected E map(final Traverser.Admin<S> traverser) {
- return this.function.apply(traverser);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.function);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
deleted file mode 100644
index 8f5c0f2..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
+++ /dev/null
@@ -1,53 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MapStep<S, E> extends AbstractStep<S, E> {
-
- public MapStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<E> processNextStart() {
- while (true) {
- final Traverser.Admin<S> traverser = this.starts.next();
- return traverser.split(this.map(traverser), this);
- }
- }
-
- protected abstract E map(final Traverser.Admin<S> traverser);
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH_ACCESS); // TODO: this is bad -- just a hack right now.
- }
-}
-
[31/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
new file mode 100644
index 0000000..642a4ea
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
@@ -0,0 +1,158 @@
+/*
+ * 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.process.traversal.traverser.TraverserRequirement;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * A {@link Step} denotes a unit of computation within a {@link Traversal}.
+ * A step takes an incoming object and yields an outgoing object.
+ * Steps are chained together in a {@link Traversal} to yield a lazy function chain of computation.
+ * <p/>
+ * In the constructor of a Step, never store explicit sideEffect objects in {@link TraversalSideEffects}.
+ * If a sideEffect needs to be registered with the {@link Traversal}, use SideEffects.registerSupplier().
+ *
+ * @param <S> The incoming object type of the step
+ * @param <E> The outgoing object type of the step
+ */
+public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
+
+ /**
+ * Add a iterator of {@link Traverser} objects of type S to the step.
+ *
+ * @param starts The iterator of objects to add
+ */
+ public void addStarts(final Iterator<Traverser<S>> starts);
+
+ /**
+ * Add a single {@link Traverser} to the step.
+ *
+ * @param start The traverser to add
+ */
+ public void addStart(final Traverser<S> start);
+
+ /**
+ * Set the step that is previous to the current step.
+ * Used for linking steps together to form a function chain.
+ *
+ * @param step the previous step of this step
+ */
+ public void setPreviousStep(final Step<?, S> step);
+
+ /**
+ * Get the step prior to the current step.
+ *
+ * @return The previous step
+ */
+ public Step<?, S> getPreviousStep();
+
+ /**
+ * Set the step that is next to the current step.
+ * Used for linking steps together to form a function chain.
+ *
+ * @param step the next step of this step
+ */
+ public void setNextStep(final Step<E, ?> step);
+
+ /**
+ * Get the next step to the current step.
+ *
+ * @return The next step
+ */
+ public Step<E, ?> getNextStep();
+
+ /**
+ * Get the {@link Traversal.Admin} that this step is contained within.
+ *
+ * @param <A> The incoming object type of the traversal
+ * @param <B> The outgoing object type of the traversal
+ * @return The traversal of this step
+ */
+ public <A, B> Traversal.Admin<A, B> getTraversal();
+
+ /**
+ * Set the {@link Traversal} that this step is contained within.
+ *
+ * @param traversal the new traversal for this step
+ */
+ public void setTraversal(final Traversal.Admin<?, ?> traversal);
+
+ /**
+ * Reset the state of the step such that it has no incoming starts.
+ * Internal states are to be reset, but any sideEffect data structures are not to be recreated.
+ */
+ public void reset();
+
+ /**
+ * Cloning is used to duplicate steps for the purpose of traversal optimization and OLTP replication.
+ * When cloning a step, it is important that the steps, the cloned step is equivalent to the state of the step when reset() is called.
+ * Moreover, the previous and next steps should be set to {@link org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep}.
+ *
+ * @return The cloned step
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public Step<S, E> clone();
+
+ /**
+ * Get the label of this step.
+ * If the step is not labeled, then an {@link Optional#empty} is returned.
+ *
+ * @return the optional label of the step
+ */
+ public Optional<String> getLabel();
+
+ /**
+ * Set the label of this step.
+ *
+ * @param label the label for this step
+ */
+ public void setLabel(final String label);
+
+ /**
+ * Get the unique id of the step.
+ * These ids can change when strategies are applied and anonymous traversals are embedded in the parent traversal.
+ * A developer should typically not need to call this method.
+ *
+ * @param id the unique id of the step
+ */
+ public void setId(final String id);
+
+ /**
+ * Get the unique id of this step.
+ *
+ * @return the unique id of the step
+ */
+ public String getId();
+
+ /**
+ * Provide the necessary {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement} that must be met by the traverser in order for the step to function properly.
+ * The provided default implements returns an empty set.
+ *
+ * @return the set of requirements
+ */
+ public default Set<TraverserRequirement> getRequirements() {
+ return Collections.emptySet();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
deleted file mode 100644
index 350dbb1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
+++ /dev/null
@@ -1,57 +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;
-
-import java.io.Serializable;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class StepPosition implements Serializable {
-
- public int x; // step in traversal length
- public int y; // depth in traversal nested tree
- public int z; // breadth in traversal siblings
- public String parentId; // the traversal holder id
-
- private static final String DOT = ".";
- private static final String LEFT_PARENTHESES = "(";
- private static final String RIGHT_PARENTHESES = ")";
- private static final String EMPTY_STRING = "";
-
- private StepPosition(final int x, final int y, final int z, final String parentId) {
- this.x = x;
- this.y = y;
- this.z = z;
- this.parentId = parentId;
- }
-
- public StepPosition() {
- this(0, 0, 0, EMPTY_STRING);
- }
-
- public String nextXId() {
- return this.x++ + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
- }
-
- @Override
- public String toString() {
- return this.x + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
new file mode 100644
index 0000000..9b13759
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
@@ -0,0 +1,114 @@
+/*
+ * 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.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+
+import java.util.function.Function;
+
+/**
+ * A collection of (T)okens which allows for more concise Traversal definitions.
+ * T implements {@link Function} can be used to map an element to its token value.
+ * For example, <code>T.id.apply(element)</code>.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum T implements Function<Element, Object> {
+ /**
+ * Label (representing Element.label())
+ */
+ label {
+ @Override
+ public String getAccessor() {
+ return LABEL;
+ }
+
+ @Override
+ public String apply(final Element element) {
+ return element.label();
+ }
+ },
+ /**
+ * Id (representing Element.id())
+ */
+ id {
+ @Override
+ public String getAccessor() {
+ return ID;
+ }
+
+ @Override
+ public Object apply(final Element element) {
+ return element.id();
+ }
+ },
+ /**
+ * Key (representing Property.key())
+ */
+ key {
+ @Override
+ public String getAccessor() {
+ return KEY;
+ }
+
+ @Override
+ public String apply(final Element element) {
+ return ((VertexProperty) element).key();
+ }
+ },
+ /**
+ * Value (representing Property.value())
+ */
+ value {
+ @Override
+ public String getAccessor() {
+ return VALUE;
+ }
+
+ @Override
+ public Object apply(final Element element) {
+ return ((VertexProperty) element).value();
+ }
+ };
+
+ private static final String LABEL = Graph.Hidden.hide("label");
+ private static final String ID = Graph.Hidden.hide("id");
+ private static final String KEY = Graph.Hidden.hide("key");
+ private static final String VALUE = Graph.Hidden.hide("value");
+
+ public abstract String getAccessor();
+
+ @Override
+ public abstract Object apply(final Element element);
+
+ public static T fromString(final String accessor) {
+ if (accessor.equals(LABEL))
+ return label;
+ else if (accessor.equals(ID))
+ return id;
+ else if (accessor.equals(KEY))
+ return key;
+ else if (accessor.equals(VALUE))
+ return value;
+ else
+ throw new IllegalArgumentException("The following token string is unknown: " + accessor);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..e6e6285
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -0,0 +1,429 @@
+/*
+ * 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.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.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * A {@link Traversal} represents a directed walk over a {@link Graph}.
+ * 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).
+ * 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).
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
+
+ /**
+ * Used for reflection based access to the static "of" method of a Traversal.
+ */
+ public static final String OF = "of";
+
+ /**
+ * Get access to administrative methods of the traversal via its accompanying {@link Traversal.Admin}.
+ *
+ * @return the admin of this traversal
+ */
+ public default Traversal.Admin<S, E> asAdmin() {
+ return (Traversal.Admin<S, E>) this;
+ }
+
+ /**
+ * Return an {@link Optional} of the next E object in the traversal.
+ * If the traversal is empty, then an {@link Optional#empty()} is returned.
+ *
+ * @return an optional of the next object in the traversal
+ */
+ public default Optional<E> tryNext() {
+ return this.hasNext() ? Optional.of(this.next()) : Optional.empty();
+ }
+
+ /**
+ * Get the next n-number of results from the traversal.
+ * If the traversal has less than n-results, then only that number of results are returned.
+ *
+ * @param amount the number of results to get
+ * @return the n-results in a {@link List}
+ */
+ public default List<E> next(final int amount) {
+ final List<E> result = new ArrayList<>();
+ int counter = 0;
+ while (counter++ < amount && this.hasNext()) {
+ result.add(this.next());
+ }
+ return result;
+ }
+
+ /**
+ * Put all the results into an {@link ArrayList}.
+ *
+ * @return the results in a list
+ */
+ public default List<E> toList() {
+ return this.fill(new ArrayList<>());
+ }
+
+ /**
+ * Put all the results into a {@link HashSet}.
+ *
+ * @return the results in a set
+ */
+ public default Set<E> toSet() {
+ return this.fill(new HashSet<>());
+ }
+
+ /**
+ * Put all the results into a {@link BulkSet}.
+ * This can reduce both time and space when aggregating results by ensuring a weighted set.
+ *
+ * @return the results in a bulk set
+ */
+ public default BulkSet<E> toBulkSet() {
+ return this.fill(new BulkSet<>());
+ }
+
+ /**
+ * Add all the results of the traversal to the provided collection.
+ *
+ * @param collection the collection to fill
+ * @return the collection now filled
+ */
+ public default <C extends Collection<E>> C fill(final C collection) {
+ try {
+ if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
+ // use the end step so the results are bulked
+ final Step<?, E> endStep = this.asAdmin().getEndStep();
+ while (true) {
+ final Traverser<E> traverser = endStep.next();
+ TraversalHelper.addToCollection(collection, traverser.get(), traverser.bulk());
+ }
+ } catch (final NoSuchElementException ignored) {
+ }
+ return collection;
+ }
+
+ /**
+ * Iterate all the {@link Traverser} instances in the traversal.
+ * What is returned is the empty traversal.
+ * It is assumed that what is desired from the computation is are the sideEffects yielded by the traversal.
+ *
+ * @return the fully drained traversal
+ */
+ public default <A, B> Traversal<A, B> iterate() {
+ try {
+ if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
+ // use the end step so the results are bulked
+ final Step<?, E> endStep = this.asAdmin().getEndStep();
+ while (true) {
+ endStep.next();
+ }
+ } catch (final NoSuchElementException ignored) {
+ }
+ return (Traversal<A, B>) this;
+ }
+
+ /**
+ * A traversal can be rewritten such that its defined end type E may yield objects of a different type.
+ * This helper method allows for the casting of the output to the known the type.
+ *
+ * @param endType the true output type of the traversal
+ * @param consumer a {@link Consumer} to process each output
+ * @param <E2> the known output type of the traversal
+ */
+ public default <E2> void forEachRemaining(final Class<E2> endType, final Consumer<E2> consumer) {
+ try {
+ while (true) {
+ consumer.accept((E2) next());
+ }
+ } catch (final NoSuchElementException ignore) {
+
+ }
+ }
+
+ @Override
+ public default void forEachRemaining(final Consumer<? super E> action) {
+ try {
+ while (true) {
+ action.accept(next());
+ }
+ } catch (final NoSuchElementException ignore) {
+
+ }
+ }
+
+ /**
+ * A collection of {@link Exception} types associated with Traversal execution.
+ */
+ public static class Exceptions {
+
+ public static IllegalStateException traversalIsLocked() {
+ return new IllegalStateException("The traversal strategies are complete and the traversal can no longer be modulated");
+ }
+
+ public static IllegalStateException traversalIsNotReversible() {
+ return new IllegalStateException("The traversal is not reversible as it contains steps that are not reversible");
+ }
+ }
+
+ public interface Admin<S, E> extends Traversal<S, E> {
+
+ /**
+ * Add an iterator of {@link Traverser} objects to the head/start of the traversal.
+ * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep}.
+ *
+ * @param starts an iterators of traversers
+ */
+ public default void addStarts(final Iterator<Traverser<S>> starts) {
+ if (!this.isLocked()) this.applyStrategies();
+ this.getStartStep().addStarts(starts);
+ }
+
+ /**
+ * Add a single {@link Traverser} object to the head of the traversal.
+ * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep}.
+ *
+ * @param start a traverser to add to the traversal
+ */
+ public default void addStart(final Traverser<S> start) {
+ if (!this.isLocked()) this.applyStrategies();
+ this.getStartStep().addStart(start);
+ }
+
+ /**
+ * Get the {@link Step} instances associated with this traversal.
+ * The steps are ordered according to their linked list structure as defined by {@link Step#getPreviousStep()} and {@link Step#getNextStep()}.
+ *
+ * @return the ordered steps of the traversal
+ */
+ public List<Step> getSteps();
+
+ /**
+ * Add a {@link Step} to the end of the traversal. This method should link the step to its next and previous step accordingly.
+ *
+ * @param step the step to add
+ * @param <E2> the output of the step
+ * @return the updated traversal
+ * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+ */
+ public default <E2> Traversal.Admin<S, E2> addStep(final Step<?, E2> step) throws IllegalStateException {
+ return this.addStep(this.getSteps().size(), step);
+ }
+
+ /**
+ * Add a {@link Step} to an arbitrary point in the traversal.
+ *
+ * @param index the location in the traversal to insert the step
+ * @param step the step to add
+ * @param <S2> the new start type of the traversal (if the added step was a start step)
+ * @param <E2> the new end type of the traversal (if the added step was an end step)
+ * @return the newly modulated traversal
+ * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+ */
+ public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException;
+
+ /**
+ * Remove a {@link Step} from the traversal.
+ *
+ * @param step the step to remove
+ * @param <S2> the new start type of the traversal (if the removed step was a start step)
+ * @param <E2> the new end type of the traversal (if the removed step was an end step)
+ * @return the newly modulated traversal
+ * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+ */
+ public default <S2, E2> Traversal.Admin<S2, E2> removeStep(final Step<?, ?> step) throws IllegalStateException {
+ return this.removeStep(this.getSteps().indexOf(step));
+ }
+
+ /**
+ * Remove a {@link Step} from the traversal.
+ *
+ * @param index the location in the traversal of the step to be evicted
+ * @param <S2> the new start type of the traversal (if the removed step was a start step)
+ * @param <E2> the new end type of the traversal (if the removed step was an end step)
+ * @return the newly modulated traversal
+ * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+ */
+ public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException;
+
+ /**
+ * Get the start/head of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
+ *
+ * @return the start step of the traversal
+ */
+ public default Step<S, ?> getStartStep() {
+ final List<Step> steps = this.getSteps();
+ return steps.isEmpty() ? EmptyStep.instance() : steps.get(0);
+ }
+
+ /**
+ * Get the end/tail of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
+ *
+ * @return the end step of the traversal
+ */
+ public default Step<?, E> getEndStep() {
+ final List<Step> steps = this.getSteps();
+ return steps.isEmpty() ? EmptyStep.instance() : steps.get(steps.size() - 1);
+ }
+
+ /**
+ * Apply the registered {@link TraversalStrategies} to the traversal.
+ * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
+ * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
+ *
+ * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+ */
+ 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}.
+ *
+ * @return the generator of traversers
+ */
+ public default TraverserGenerator getTraverserGenerator() {
+ return this.getStrategies().getTraverserGeneratorFactory().getTraverserGenerator(this);
+ }
+
+ /**
+ * Get the set of all {@link TraverserRequirement}s for this traversal.
+ *
+ * @return the features of a traverser that are required to execute properly in this traversal
+ */
+ public default Set<TraverserRequirement> getTraverserRequirements() {
+ final Set<TraverserRequirement> requirements = this.getSteps().stream()
+ .flatMap(step -> ((Step<?, ?>) step).getRequirements().stream())
+ .collect(Collectors.toSet());
+ if (this.getSideEffects().keys().size() > 0)
+ requirements.add(TraverserRequirement.SIDE_EFFECTS);
+ if (this.getSideEffects().getSackInitialValue().isPresent())
+ requirements.add(TraverserRequirement.SACK);
+ if (this.getEngine().isComputer())
+ requirements.add(TraverserRequirement.BULK);
+ return requirements;
+ }
+
+ /**
+ * Call the {@link Step#reset} method on every step in the traversal.
+ */
+ public default void reset() {
+ this.getSteps().forEach(Step::reset);
+ }
+
+ /**
+ * Set the {@link TraversalSideEffects} of this traversal.
+ *
+ * @param sideEffects the sideEffects to set for this traversal.
+ */
+ public void setSideEffects(final TraversalSideEffects sideEffects);
+
+ /**
+ * Get the {@link TraversalSideEffects} associated with the traversal.
+ *
+ * @return The traversal sideEffects
+ */
+ public TraversalSideEffects getSideEffects();
+
+ /**
+ * Set the {@link TraversalStrategies} to be used by this traversal at evaluation time.
+ *
+ * @param strategies the strategies to use on this traversal
+ */
+ public void setStrategies(final TraversalStrategies strategies);
+
+ /**
+ * Get the {@link TraversalStrategies} associated with this traversal.
+ *
+ * @return the strategies associated with this traversal
+ */
+ public TraversalStrategies getStrategies();
+
+ /**
+ * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
+ * Traversals can be nested and this is the means by which the traversal tree is connected.
+ *
+ * @param step the traversal holder parent step
+ */
+ public void setParent(final TraversalParent step);
+
+ /**
+ * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
+ * Traversals can be nested and this is the means by which the traversal tree is walked.
+ *
+ * @return the traversal holder parent step
+ */
+ public TraversalParent getParent();
+
+ /**
+ * Cloning is used to duplicate the traversal typically in OLAP environments.
+ *
+ * @return The cloned traversal
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public Traversal.Admin<S, E> clone();
+
+ /**
+ * When the traversal has had its {@link TraversalStrategies} applied to it, it is locked.
+ *
+ * @return whether the traversal is locked
+ */
+ public boolean isLocked();
+
+ public Optional<Graph> getGraph();
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
new file mode 100644
index 0000000..0343988
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
@@ -0,0 +1,53 @@
+/*
+ * 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.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalEngine extends Serializable {
+
+ public enum Type {STANDARD, COMPUTER}
+
+ public void processTraversal(final Traversal.Admin<?, ?> traversal);
+
+ public Type getType();
+
+ public Optional<GraphComputer> getGraphComputer();
+
+ public default boolean isStandard() {
+ return this.getType().equals(Type.STANDARD);
+ }
+
+ public default boolean isComputer() {
+ return this.getType().equals(Type.COMPUTER);
+ }
+
+ ///////////
+
+ public interface Builder extends Serializable {
+ public TraversalEngine create(final Graph graph);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
deleted file mode 100644
index 46f6c70..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
+++ /dev/null
@@ -1,66 +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;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A TraversalMatrix provides random, non-linear access to the steps of a traversal by their step id.
- * This is useful in situations where traversers becomes detached from their traversal (and step) and later need to be re-attached.
- * A classic use case is {@link org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram} on {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer}.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalMatrix<S, E> {
-
- private final Map<String, Step<?, ?>> matrix = new HashMap<>();
- private final Traversal.Admin<S, E> traversal;
-
- public TraversalMatrix(final Traversal.Admin<S, E> traversal) {
- this.harvestSteps(this.traversal = traversal);
- }
-
- public <A, B, C extends Step<A, B>> C getStepById(final String stepId) {
- return (C) this.matrix.get(stepId);
- }
-
- public Traversal.Admin<S, E> getTraversal() {
- return this.traversal;
- }
-
- private final void harvestSteps(final Traversal.Admin<?, ?> traversal) {
- for (final Step<?, ?> step : traversal.getSteps()) {
- this.matrix.put(step.getId(), step);
- if (step instanceof TraversalParent) {
- for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
- this.harvestSteps(globalChild);
- }
- /*for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
- this.harvestSteps(localChild);
- }*/
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
new file mode 100644
index 0000000..9ef9b28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
@@ -0,0 +1,225 @@
+/*
+ * 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.Vertex;
+
+import java.io.Serializable;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalSideEffects extends Cloneable, Serializable {
+
+ public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
+
+ /**
+ * Determines if the {@link TraversalSideEffects} contains the respective key.
+ * If the key references a stored {@link java.util.function.Supplier}, then it should return true as it will be dynamically created on get().
+ *
+ * @param key the key to check for
+ * @return whether the key exists in the sideEffects
+ */
+ public default boolean exists(final String key) {
+ return this.keys().contains(key);
+ }
+
+ /**
+ * Set the specified key to the specified value.
+ * If a {@link java.util.function.Supplier} is provided, it is NOT assumed to be a supplier as set by registerSupplier().
+ *
+ * @param key the key
+ * @param value the value
+ */
+ public void set(final String key, final Object value);
+
+ /**
+ * Get the sideEffect associated with the provided key.
+ * If the sideEffect contains an object for the key, return it.
+ * Else if the sideEffect has a registered {@link java.util.function.Supplier} for that key, generate the object, store the object in the sideEffects, and return it.
+ *
+ * @param key the key to get the value for
+ * @param <V> the type of the value to retrieve
+ * @return the value associated with key
+ * @throws IllegalArgumentException if the key does not reference an object or a registered supplier.
+ */
+ public <V> V get(final String key) throws IllegalArgumentException;
+
+ /**
+ * Return the value associated with the key or return the provided otherValue.
+ * The otherValue will not be stored in the sideEffect.
+ *
+ * @param key the key to get the value for
+ * @param otherValue if not value is associated with key, return the other value.
+ * @param <V> the type of the value to get
+ * @return the value associated with the key or the otherValue
+ */
+ public default <V> V orElse(final String key, final V otherValue) {
+ return this.exists(key) ? this.get(key) : otherValue;
+ }
+
+ /**
+ * If a value or registered {@link java.util.function.Supplier} exists for the provided key, consume it with the provided consumer.
+ *
+ * @param key the key to the value
+ * @param consumer the consumer to process the value
+ * @param <V> the type of the value to consume
+ */
+ public default <V> void ifPresent(final String key, final Consumer<V> consumer) {
+ if (this.exists(key)) consumer.accept(this.get(key));
+ }
+
+ /**
+ * Remove both the value and registered {@link java.util.function.Supplier} associated with provided key.
+ *
+ * @param key the key of the value and registered supplier to remove
+ */
+ public void remove(final String key);
+
+ /**
+ * The keys of the sideEffect which includes registered {@link java.util.function.Supplier} keys.
+ * In essence, that which is possible to get().
+ *
+ * @return the keys of the sideEffect
+ */
+ public Set<String> keys();
+
+ ////////////
+
+ /**
+ * Register a {@link java.util.function.Supplier} with the provided key.
+ * When sideEffects get() are called, if no object exists and there exists a registered supplier for the key, the object is generated.
+ * Registered suppliers are used for the lazy generation of sideEffect data.
+ *
+ * @param key the key to register the supplier with
+ * @param supplier the supplier that will generate an object when get() is called if it hasn't already been created
+ */
+ public void registerSupplier(final String key, final Supplier supplier);
+
+ /**
+ * Get the registered {@link java.util.function.Supplier} associated with the specified key.
+ *
+ * @param key the key associated with the supplier
+ * @param <V> The object type of the supplier
+ * @return A non-empty optional if the supplier exists
+ */
+ public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key);
+
+ /**
+ * A helper method to register a {@link java.util.function.Supplier} if it has not already been registered.
+ *
+ * @param key the key of the supplier to register
+ * @param supplier the supplier to register if the key has not already been registered
+ */
+ public default void registerSupplierIfAbsent(final String key, final Supplier supplier) {
+ if (!this.getRegisteredSupplier(key).isPresent())
+ this.registerSupplier(key, supplier);
+ }
+
+ public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator);
+
+ public <S> Optional<Supplier<S>> getSackInitialValue();
+
+ public <S> Optional<UnaryOperator<S>> getSackSplitOperator();
+
+ /**
+ * If the sideEffect contains an object associated with the key, return it.
+ * Else if a "with" supplier exists for the key, generate the object, store it in the sideEffects and return the object.
+ * Else use the provided supplier to generate the object, store it in the sideEffects and return the object.
+ * Note that if the orCreate supplier is used, it is NOT registered as a {@link java.util.function.Supplier}.
+ *
+ * @param key the key of the object to get
+ * @param orCreate if the object doesn't exist as an object or suppliable object, then generate it with the specified supplier
+ * @param <V> the return type of the object
+ * @return the object that is either retrieved, generated, or supplier via orCreate
+ */
+ public default <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
+ if (this.exists(key))
+ return this.<V>get(key);
+ final Optional<Supplier<V>> with = this.getRegisteredSupplier(key);
+ if (with.isPresent()) {
+ final V v = with.get().get();
+ this.set(key, v);
+ return v;
+ } else {
+ final V v = orCreate.get();
+ this.set(key, v);
+ return v;
+ }
+ }
+
+ ////////////
+
+ public default <V> void forEach(final BiConsumer<String, V> biConsumer) {
+ this.keys().forEach(key -> biConsumer.accept(key, this.get(key)));
+ }
+
+ /**
+ * In a distributed {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer} traversal, the sideEffects of the traversal are not a single object within a single JVM.
+ * Instead, the sideEffects are distributed across the graph and the pieces are stored on the computing vertices.
+ * This method is necessary to call when the {@link Traversal} is processing the {@link Traverser}s at a particular {@link org.apache.tinkerpop.gremlin.structure.Vertex}.
+ *
+ * @param vertex the vertex where the traversal is currently executing.
+ */
+ public void setLocalVertex(final Vertex vertex);
+
+ /**
+ * Cloning is used to duplicate the sideEffects typically in OLAP environments.
+ *
+ * @return The cloned sideEffects
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public TraversalSideEffects clone();
+
+ /**
+ * Add the current {@link TraversalSideEffects} data and suppliers to the provided {@link TraversalSideEffects}.
+ *
+ * @param sideEffects the sideEffects to add this traversal's sideEffect data to.
+ */
+ public void mergeInto(final TraversalSideEffects sideEffects);
+
+ public static class Exceptions {
+
+ public static IllegalArgumentException sideEffectKeyCanNotBeEmpty() {
+ return new IllegalArgumentException("Side effect key can not be the empty string");
+ }
+
+ public static IllegalArgumentException sideEffectKeyCanNotBeNull() {
+ return new IllegalArgumentException("Side effect key can not be null");
+ }
+
+ public static IllegalArgumentException sideEffectValueCanNotBeNull() {
+ return new IllegalArgumentException("Side effect value can not be null");
+ }
+
+ public static IllegalArgumentException sideEffectDoesNotExist(final String key) {
+ return new IllegalArgumentException("Side effects do not have a value for provided key: " + key);
+ }
+
+ public static UnsupportedOperationException dataTypeOfSideEffectValueNotSupported(final Object val) {
+ return new UnsupportedOperationException(String.format("Side effect value [%s] is of type %s is not supported", val, val.getClass()));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..6301e27
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
@@ -0,0 +1,48 @@
+/*
+ * 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.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalSource {
+
+ public TraversalSource.Builder asBuilder();
+
+ public Optional<GraphComputer> getGraphComputer();
+
+ public Optional<Graph> getGraph();
+
+ ////////////////
+
+ public interface Builder<C extends TraversalSource> extends Serializable {
+
+ public Builder engine(final TraversalEngine.Builder engine);
+
+ public Builder strategy(final TraversalStrategy strategy);
+
+ public C create(final Graph graph);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..bffce9f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -0,0 +1,195 @@
+/*
+ * 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.process.traversal.strategy.optimization.ComparatorHolderRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ConjunctionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.DedupOptimizerStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EngineDependentStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.LabeledEndStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchWhereStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.tools.MultiMap;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Matthias Broecheler (me@matthiasb.com)
+ */
+public interface TraversalStrategies extends Serializable, Cloneable {
+
+ /**
+ * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
+ */
+ public List<TraversalStrategy> toList();
+
+ /**
+ * 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.
+ *
+ * @param traversal the traversal to apply the strategies to
+ * @param engine the engine that the traversal is going to be executed on
+ */
+ public void applyStrategies(final Traversal.Admin<?, ?> traversal);
+
+ /**
+ * Add all the provided {@link TraversalStrategy} instances to the current collection.
+ * When all the provided strategies have been added, the collection is resorted.
+ *
+ * @param strategies the traversal strategies to add
+ * @return the newly updated/sorted traversal strategies collection
+ */
+ public TraversalStrategies addStrategies(final TraversalStrategy... strategies);
+
+ /**
+ * Remove all the provided {@link TraversalStrategy} classes from the current collection.
+ * When all the provided strategies have been removed, the collection is resorted.
+ *
+ * @param strategyClasses the traversal strategies to remove by their class
+ * @return the newly updated/sorted traversal strategies collection
+ */
+ @SuppressWarnings("unchecked")
+ public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses);
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public TraversalStrategies clone();
+
+ /**
+ * Get the {@link TraverserGeneratorFactory} to use to generate traversers.
+ */
+ public TraverserGeneratorFactory getTraverserGeneratorFactory();
+
+ /**
+ * Set the {@link TraverserGeneratorFactory} to use for determining which {@link Traverser} type to generate for the {@link Traversal}.
+ *
+ * @param traverserGeneratorFactory the factory to use
+ */
+ public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory);
+
+ /**
+ * Sorts the list of provided strategies such that the {@link TraversalStrategy#applyPost()}
+ * and {@link TraversalStrategy#applyPrior()} dependencies are respected.
+ * <p/>
+ * Note, that the order may not be unique.
+ *
+ * @param strategies the traversal strategies to sort
+ */
+ public static void sortStrategies(final List<? extends TraversalStrategy> strategies) {
+ final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap = new HashMap<>();
+ final Set<Class<? extends TraversalStrategy>> strategyClass = new HashSet<>(strategies.size());
+ //Initialize data structure
+ strategies.forEach(s -> strategyClass.add(s.getClass()));
+
+ //Initialize all the dependencies
+ strategies.forEach(strategy -> {
+ strategy.applyPrior().forEach(s -> {
+ if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
+ });
+ strategy.applyPost().forEach(s -> {
+ if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
+ });
+ });
+ //Now, compute transitive closure until convergence
+ boolean updated;
+ do {
+ updated = false;
+ for (final Class<? extends TraversalStrategy> sc : strategyClass) {
+ List<Class<? extends TraversalStrategy>> toAdd = null;
+ for (Class<? extends TraversalStrategy> before : MultiMap.get(dependencyMap, sc)) {
+ final Set<Class<? extends TraversalStrategy>> beforeDep = MultiMap.get(dependencyMap, before);
+ if (!beforeDep.isEmpty()) {
+ if (toAdd == null) toAdd = new ArrayList<>(beforeDep.size());
+ toAdd.addAll(beforeDep);
+ }
+ }
+ if (toAdd != null && MultiMap.putAll(dependencyMap, sc, toAdd)) updated = true;
+ }
+ } while (updated);
+ Collections.sort(strategies, new Comparator<TraversalStrategy>() {
+ @Override
+ public int compare(final TraversalStrategy s1, final TraversalStrategy s2) {
+ boolean s1Before = MultiMap.containsEntry(dependencyMap, s1.getClass(), s2.getClass());
+ boolean s2Before = MultiMap.containsEntry(dependencyMap, s2.getClass(), s1.getClass());
+ if (s1Before && s2Before)
+ throw new IllegalStateException("Cyclic dependency between traversal strategies: ["
+ + s1.getClass().getName() + ", " + s2.getClass().getName() + ']');
+ if (s1Before) return -1;
+ else if (s2Before) return 1;
+ else return 0;
+ }
+ });
+ }
+
+ public static final class GlobalCache {
+
+ private static final Map<Class<? extends Graph>, TraversalStrategies> CACHE = new HashMap<>();
+
+ static {
+ final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
+ coreStrategies.addStrategies(
+ DedupOptimizerStrategy.instance(),
+ RangeByIsCountStrategy.instance(),
+ IdentityRemovalStrategy.instance(),
+ MatchWhereStrategy.instance(),
+ ComparatorHolderRemovalStrategy.instance(),
+ LabeledEndStepStrategy.instance(),
+ EngineDependentStrategy.instance(),
+ ProfileStrategy.instance(),
+ TraversalVerificationStrategy.instance(),
+ ConjunctionStrategy.instance());
+ CACHE.put(Graph.class, coreStrategies.clone());
+ CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
+ }
+
+ public static void registerStrategies(final Class<? extends Graph> graphClass, final TraversalStrategies traversalStrategies) {
+ CACHE.put(graphClass, traversalStrategies);
+ }
+
+ public static TraversalStrategies getStrategies(final Class<? extends Graph> graphClass) {
+ final TraversalStrategies traversalStrategies = CACHE.get(graphClass);
+ if (null == traversalStrategies) {
+ if (EmptyGraph.class.isAssignableFrom(graphClass))
+ return CACHE.get(EmptyGraph.class);
+ else return CACHE.get(Graph.class);
+ }
+ return traversalStrategies;
+ }
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
new file mode 100644
index 0000000..8d8c383
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
@@ -0,0 +1,50 @@
+/*
+ * 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 java.io.Serializable;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * A {@link TraversalStrategy} defines a particular atomic operation for mutating a {@link Traversal} prior to its evaluation.
+ * Traversal strategies are typically used for optimizing a traversal for the particular underlying graph engine.
+ * A TraversalStrategy should not have a public constructor as they should not maintain state between applications.
+ * Make use of a singleton instance() object to reduce object creation on the JVM.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Matthias Broecheler (me@matthiasb.com)
+ */
+public interface TraversalStrategy extends Serializable {
+
+ // A TraversalStrategy should not have a public constructor
+ // Make use of a singleton instance() object to reduce object creation on the JVM
+ // Moreover they are stateless objects.
+
+ public void apply(final Traversal.Admin<?, ?> traversal);
+
+ public default Set<Class<? extends TraversalStrategy>> applyPrior() {
+ return Collections.emptySet();
+ }
+
+ public default Set<Class<? extends TraversalStrategy>> applyPost() {
+ return Collections.emptySet();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
new file mode 100644
index 0000000..e2a63ed
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
@@ -0,0 +1,280 @@
+/*
+ * 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 org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
+
+import java.io.Serializable;
+
+/**
+ * A {@link Traverser} represents the current state of an object flowing through a {@link Traversal}.
+ * A traverser maintains a reference to the current object, a traverser-local "sack", a traversal-global sideEffect, a bulk count, and a path history.
+ * <p/>
+ * Different types of traverser can exist depending on the semantics of the traversal and the desire for
+ * space/time optimizations of the developer.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cloneable {
+
+ /**
+ * Get the object that the traverser is current at.
+ *
+ * @return The current object of the traverser
+ */
+ public T get();
+
+ /**
+ * Get the sack local sack object of this traverser.
+ *
+ * @param <S> the type of the sack object
+ * @return the sack object
+ */
+ public <S> S sack();
+
+ /**
+ * Set the traversers sack object to the provided value ("sack the value").
+ *
+ * @param object the new value of the traverser's sack
+ * @param <S> the type of the object
+ */
+ public <S> void sack(final S object);
+
+ /**
+ * Get the current path of the traverser.
+ *
+ * @return The path of the traverser
+ */
+ public Path path();
+
+ /**
+ * Get the object associated with the specified step-label in the traverser's path history.
+ *
+ * @param stepLabel the step-label in the path to access
+ * @param <A> the type of the object
+ * @return the object associated with that path label (if more than one object occurs at that step, a list is returned)
+ */
+ public default <A> A path(final String stepLabel) {
+ return this.path().get(stepLabel);
+ }
+
+ /**
+ * Return the number of times the traverser has gone through a looping section of a traversal.
+ *
+ * @return The number of times the traverser has gone through a loop
+ */
+ public int loops();
+
+ /**
+ * A traverser may represent a grouping of traversers to allow for more efficient data propagation.
+ *
+ * @return the number of traversers represented in this traverser.
+ */
+ public long bulk();
+
+ /**
+ * Get a particular value from the sideEffects of the traverser.
+ *
+ * @param sideEffectKey the key of the value to get from the sideEffects
+ * @param <A> the type of the returned object
+ * @return the object in the sideEffects of the respective key
+ */
+ public default <A> A sideEffects(final String sideEffectKey) {
+ return this.asAdmin().getSideEffects().get(sideEffectKey);
+ }
+
+ /**
+ * Set a particular value in the sideEffects of the traverser.
+ *
+ * @param sideEffectKey the key of the value to set int the sideEffects
+ * @param sideEffectValue the value to set for the sideEffect key
+ */
+ public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) {
+ this.asAdmin().getSideEffects().set(sideEffectKey, sideEffectValue);
+ }
+
+ /**
+ * If the underlying object of the traverser is comparable, compare it with the other traverser.
+ *
+ * @param other the other traverser that presumably has a comparable internal object
+ * @return the comparison of the two objects of the traversers
+ * @throws ClassCastException if the object of the traverser is not comparable
+ */
+ @Override
+ public default int compareTo(final Traverser<T> other) throws ClassCastException {
+ return ((Comparable) this.get()).compareTo(other.get());
+ }
+
+ /**
+ * Typecast the traverser to a "system traverser" so {@link Traverser.Admin} methods can be accessed.
+ * This is used as a helper method to avoid the awkwardness of <code>((Traverser.Administrative)traverser)</code>.
+ * The default implementation simply returns "this" type casted to {@link Traverser.Admin}.
+ *
+ * @return The type-casted traverser
+ */
+ public default Admin<T> asAdmin() {
+ return (Admin<T>) this;
+ }
+
+ /**
+ * Traverser cloning is important when splitting a traverser at a bifurcation point in a traversal.
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public Traverser<T> clone();
+
+ /**
+ * The methods in System.Traverser are useful to underlying Step and Traversal implementations.
+ * They should not be accessed by the user during lambda-based manipulations.
+ */
+ public interface Admin<T> extends Traverser<T>, Attachable<Admin<T>> {
+
+ public static final String HALT = "halt";
+
+ /**
+ * When two traversers are {@link Traverser#equals} to each other, then they can be merged.
+ * This method is used to merge the traversers into a single traverser.
+ * This is used for optimization where instead of enumerating all traversers, they can be counted.
+ *
+ * @param other the other traverser to merge into this traverser. Once merged, the other can be garbage collected.
+ */
+ public void merge(final Admin<?> other);
+
+ /**
+ * Generate a child traverser of the current traverser for current as step and new object location.
+ * The child has the path history, future, and loop information of the parent.
+ * The child extends that path history with the current as and provided R-object.
+ *
+ * @param r The current object of the child
+ * @param step The step yielding the split
+ * @param <R> The current object type of the child
+ * @return The split traverser
+ */
+ public <R> Admin<R> split(final R r, final Step<T, R> step);
+
+ /**
+ * Generate a sibling traverser of the current traverser with a full copy of all state within the sibling.
+ *
+ * @return The split traverser
+ */
+ public Admin<T> split();
+
+ /**
+ * Set the current object location of the traverser.
+ *
+ * @param t The current object of the traverser
+ */
+ public void set(final T t);
+
+ /**
+ * Increment the number of times the traverser has gone through a looping section of traversal.
+ * The step label is important to create a stack of loop counters when within a nested context.
+ * If the provided label is not the same as the current label on the stack, add a new loop counter.
+ * If the provided label is the same as the current label on the stack, increment the loop counter.
+ *
+ * @param stepLabel the label of the step that is doing the incrementing
+ */
+ public void incrLoops(final String stepLabel);
+
+ /**
+ * Set the number of times the traverser has gone through a loop back to 0.
+ * When a traverser exits a looping construct, this method should be called.
+ * In a nested loop context, the highest stack loop counter should be removed.
+ */
+ public void resetLoops();
+
+ /**
+ * Get the step id of where the traverser is located.
+ * This is typically used in multi-machine systems that require the movement of
+ * traversers between different traversal instances.
+ *
+ * @return The future step for the traverser
+ */
+ public String getStepId();
+
+ /**
+ * Set the step id of where the traverser is located.
+ * If the future is {@link Traverser.Admin#HALT}, then {@link Traverser.Admin#isHalted()} is true.
+ *
+ * @param stepId The future step of the traverser
+ */
+ public void setStepId(final String stepId);
+
+ /**
+ * If the traverser has "no future" then it is done with its lifecycle.
+ * This does not mean that the traverser is "dead," only that it has successfully passed through a {@link Traversal}.
+ *
+ * @return Whether the traverser is done executing or not
+ */
+ public default boolean isHalted() {
+ return getStepId().equals(HALT);
+ }
+
+ /**
+ * Set the number of traversers represented by this traverser.
+ *
+ * @param count the number of traversers
+ */
+ public void setBulk(final long count);
+
+ /**
+ * Prepare the traverser for migration across a JVM boundary.
+ *
+ * @return The deflated traverser
+ */
+ public Admin<T> detach();
+
+ /**
+ * Regenerate the detached traverser given its location at a particular vertex.
+ *
+ * @param hostVertex The vertex that is hosting the traverser
+ * @return The inflated traverser
+ */
+ @Override
+ public Admin<T> attach(final Vertex hostVertex);
+
+ /**
+ * Traversers can not attach to graphs and thus, an {@link UnsupportedOperationException} is thrown.
+ *
+ * @param graph the graph to attach the traverser to, which it can't.
+ * @return nothing as an exception is thrown
+ * @throws UnsupportedOperationException is always thrown as it makes no sense to attach a traverser to a graph
+ */
+ @Override
+ public default Admin<T> attach(final Graph graph) throws UnsupportedOperationException {
+ throw new UnsupportedOperationException("A traverser can only exist at the vertices of the graph, not the graph itself");
+ }
+
+ /**
+ * Set the sideEffects of the {@link Traversal}. Given that traversers can move between machines,
+ * it may be important to re-set this when the traverser crosses machine boundaries.
+ *
+ * @param sideEffects the sideEffects of the traversal.
+ */
+ public void setSideEffects(final TraversalSideEffects sideEffects);
+
+ /**
+ * Get the sideEffects associated with the traversal of the traverser.
+ *
+ * @return the traversal sideEffects of the traverser
+ */
+ public TraversalSideEffects getSideEffects();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
new file mode 100644
index 0000000..bf30b67
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
@@ -0,0 +1,48 @@
+/*
+ * 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.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraverserGenerator {
+
+ public Set<TraverserRequirement> getProvidedRequirements();
+
+ public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk);
+
+ public default <S> Iterator<Traverser.Admin<S>> generateIterator(final Iterator<S> starts, final Step<S, ?> startStep, final long initialBulk) {
+ return new Iterator<Traverser.Admin<S>>() {
+ @Override
+ public boolean hasNext() {
+ return starts.hasNext();
+ }
+
+ @Override
+ public Traverser.Admin<S> next() {
+ return generate(starts.next(), startStep, initialBulk);
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
new file mode 100644
index 0000000..8895edc
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
+
+ public DefaultGraphTraversal(final Graph graph) {
+ super(graph);
+ }
+
+ @Override
+ public GraphTraversal.Admin<S, E> asAdmin() {
+ return this;
+ }
+
+ @Override
+ public GraphTraversal<S, E> iterate() {
+ return GraphTraversal.Admin.super.iterate();
+ }
+
+ @Override
+ public DefaultGraphTraversal<S, E> clone() {
+ return (DefaultGraphTraversal<S, E>) super.clone();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
new file mode 100644
index 0000000..c0fa31e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
@@ -0,0 +1,64 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyGraphTraversal<S, E> extends EmptyTraversal<S, E> implements GraphTraversal.Admin<S, E>, GraphTraversal<S, E> {
+
+ private static final EmptyGraphTraversal INSTANCE = new EmptyGraphTraversal<>();
+
+ public static <A, B> EmptyGraphTraversal<A, B> instance() {
+ return INSTANCE;
+ }
+
+ private EmptyGraphTraversal() {
+
+ }
+
+ @Override
+ public GraphTraversal.Admin<S, E> asAdmin() {
+ return this;
+ }
+
+ @Override
+ public <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
+ return instance();
+ }
+
+ @Override
+ public GraphTraversal<S, E> withPath() {
+ return instance();
+ }
+
+ @Override
+ public GraphTraversal<S, E> iterate() {
+ return this;
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntCallSuperClone")
+ public EmptyGraphTraversal<S, E> clone() {
+ return instance();
+ }
+}
[34/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
deleted file mode 100644
index bead509..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
+++ /dev/null
@@ -1,178 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TreeStep<S> extends ReducingBarrierStep<S, Tree> implements MapReducer, TraversalParent {
-
- private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
-
- public TreeStep(final Traversal.Admin traversal) {
- super(traversal);
- this.setSeedSupplier((Supplier) TreeSupplier.instance());
- this.setBiFunction(new TreeBiFunction());
- }
-
-
- @Override
- public List<Traversal.Admin<Object, Object>> getLocalChildren() {
- return this.traversalRing.getTraversals();
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
- this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> getMapReduce() {
- return TreeMapReduce.instance();
- }
-
- @Override
- public TreeStep<S> clone() {
- final TreeStep<S> clone = (TreeStep<S>) super.clone();
- clone.traversalRing = new TraversalRing<>();
- for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
- clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
- }
- return clone;
- }
-
- @Override
- public Traverser<Tree> processNextStart() {
- if (this.byPass) {
- final Traverser.Admin<S> traverser = this.starts.next();
- return traverser.split(this.reducingBiFunction.apply(new Tree(), traverser), this);
- } else {
- return super.processNextStart();
- }
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.traversalRing);
- }
-
- ///////////
-
- private class TreeBiFunction implements BiFunction<Tree, Traverser<S>, Tree>, Serializable {
-
- private TreeBiFunction() {
-
- }
-
- @Override
- public Tree apply(final Tree mutatingSeed, final Traverser<S> traverser) {
- Tree depth = mutatingSeed;
- final Path path = traverser.path();
- for (int i = 0; i < path.size(); i++) {
- final Object object = TraversalUtil.apply(path.<Object>get(i), TreeStep.this.traversalRing.next());
- if (!depth.containsKey(object))
- depth.put(object, new Tree<>());
- depth = (Tree) depth.get(object);
- }
- TreeStep.this.traversalRing.reset();
- return mutatingSeed;
- }
- }
-
- ///////////
-
- public static final class TreeMapReduce extends StaticMapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> {
-
- private static final TreeMapReduce INSTANCE = new TreeMapReduce();
-
- private TreeMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Tree> emitter) {
- vertex.<TraverserSet<Tree>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
- final Tree tree = new Tree();
- values.forEachRemaining(tree::addTree);
- emitter.emit(tree);
- }
-
- @Override
- public Tree generateFinalResult(final Iterator<KeyValue<NullObject, Tree>> keyValues) {
- final Tree tree = new Tree();
- keyValues.forEachRemaining(keyValue -> tree.addTree(keyValue.getValue()));
- return tree;
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- public static final TreeMapReduce instance() {
- return INSTANCE;
- }
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
deleted file mode 100644
index e9ec148..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
+++ /dev/null
@@ -1,57 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class UnfoldStep<S, E> extends FlatMapStep<S, E> {
-
- public UnfoldStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
- final S s = traverser.get();
- if (s instanceof Iterator)
- return (Iterator) s;
- else if (s instanceof Iterable)
- return ((Iterable) s).iterator();
- else if (s instanceof Map)
- return ((Map) s).entrySet().iterator();
- else
- return IteratorUtils.of((E) s);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
deleted file mode 100644
index 39dfa47..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
+++ /dev/null
@@ -1,82 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> {
-
- private final String[] edgeLabels;
- private Direction direction;
- private final Class<E> returnClass;
-
- public VertexStep(final Traversal.Admin traversal, final Class<E> returnClass, final Direction direction, final String... edgeLabels) {
- super(traversal);
- this.direction = direction;
- this.edgeLabels = edgeLabels;
- this.returnClass = returnClass;
- }
-
- @Override
- protected Iterator<E> flatMap(final Traverser.Admin<Vertex> traverser) {
- return Vertex.class.isAssignableFrom(this.returnClass) ?
- (Iterator<E>) traverser.get().vertices(this.direction, this.edgeLabels) :
- (Iterator<E>) traverser.get().edges(this.direction, this.edgeLabels);
- }
-
- public Direction getDirection() {
- return this.direction;
- }
-
- public String[] getEdgeLabels() {
- return this.edgeLabels;
- }
-
- public Class<E> getReturnClass() {
- return this.returnClass;
- }
-
- public void reverseDirection() {
- this.direction = this.direction.opposite();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.direction, Arrays.asList(this.edgeLabels), this.returnClass.getSimpleName().toLowerCase());
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
deleted file mode 100644
index 44ff69e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
+++ /dev/null
@@ -1,87 +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.graph.traversal.step.map.match;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.function.Function;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class Bindings<T> {
- private final SortedMap<String, T> map = new TreeMap<>();
-
- public Bindings() {
- }
-
- public Bindings(final Map<String, T> map) {
- this.map.putAll(map);
- }
-
- public Bindings<T> put(final String name, final T value) {
- map.put(name, value);
- return this;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder("{");
- boolean first = true;
- for (Map.Entry<String, T> entry : map.entrySet()) {
- if (first) first = false;
- else sb.append(", ");
- sb.append(entry.getKey()).append(':').append(entry.getValue());
- }
- sb.append('}');
- return sb.toString();
- }
-
- public static class BindingsComparator<T> implements Comparator<Bindings<T>> {
- private final Function<T, String> toStringFunction;
-
- public BindingsComparator(Function<T, String> toStringFunction) {
- this.toStringFunction = toStringFunction;
- }
-
- @Override
- public int compare(Bindings<T> left, Bindings<T> right) {
- int cmp = ((Integer) left.map.size()).compareTo(right.map.size());
- if (0 != cmp) return cmp;
-
- Iterator<Map.Entry<String, T>> i1 = left.map.entrySet().iterator();
- Iterator<Map.Entry<String, T>> i2 = right.map.entrySet().iterator();
- while (i1.hasNext()) {
- Map.Entry<String, T> e1 = i1.next();
- Map.Entry<String, T> e2 = i2.next();
-
- cmp = e1.getKey().compareTo(e1.getKey());
- if (0 != cmp) return cmp;
-
- cmp = e1.getValue().toString().compareTo(e2.getValue().toString());
- if (0 != cmp) return cmp;
- }
-
- return 0;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java
deleted file mode 100644
index 3285eaf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.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.graph.traversal.step.map.match;
-
-import java.util.function.BiConsumer;
-
-/**
- * An Enumerator which finds the Cartesian product of two other Enumerators,
- * expanding at the same rate in either dimension.
- * This maximizes the size of the product with respect to the number of expansions of the base Enumerators.
- */
-public class CrossJoinEnumerator<T> implements Enumerator<T> {
-
- private final Enumerator<T> xEnum, yEnum;
-
- public CrossJoinEnumerator(final Enumerator<T> xEnum,
- final Enumerator<T> yEnum) {
- this.xEnum = xEnum;
- this.yEnum = yEnum;
- }
-
- public int size() {
- return xEnum.size() * yEnum.size();
- }
-
- // note: permits random access
- public boolean visitSolution(final int index,
- final BiConsumer<String, T> visitor) {
- int sq = (int) Math.sqrt(index);
-
- // choose x and y such that the solution represented by index
- // remains constant as this Enumerator expands
- int x, y;
-
- if (0 == index) {
- x = y = 0;
- } else {
- int r = index - sq * sq;
- if (r < sq) {
- x = sq;
- y = r;
- } else {
- x = r - sq;
- y = sq;
- }
- }
-
- // expand x if necessary
- if (!hasIndex(xEnum, sq)) {
- if (0 == xEnum.size()) {
- return false;
- }
-
- x = index % xEnum.size();
- y = index / xEnum.size();
- }
-
- // expand y if necessary
- if (!hasIndex(yEnum, y)) {
- int height = yEnum.size();
- if (0 == height) {
- return false;
- }
-
- x = index / height;
- if (!hasIndex(xEnum, x)) {
- return false;
- }
- y = index % height;
- }
-
- // solutions are visited completely (if we have reached this point), else not at all
- return xEnum.visitSolution(x, visitor) && yEnum.visitSolution(y, visitor);
- }
-
- private boolean hasIndex(final Enumerator<T> e,
- final int index) {
- return index < e.size() || e.visitSolution(index, (BiConsumer<String, T>) MatchStep.TRIVIAL_CONSUMER);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
deleted file mode 100644
index 169f76b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
+++ /dev/null
@@ -1,46 +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.graph.traversal.step.map.match;
-
-import java.util.function.BiConsumer;
-
-/**
- * An array of key/value maps accessible by index.
- * The total size of the enumerator may be unknown when it is created;
- * it grows when successive solutions are requested, computing as many as necessary.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public interface Enumerator<T> {
-
- /**
- * @return the number of solutions so far known; the enumerator has at least this many.
- * This should be a relatively cheap operation.
- */
- int size();
-
- /**
- * Provides access to a solution, allowing it to be printed, put into a map, etc.
- *
- * @param index the index of the solution
- * @param visitor a consumer for each key/value pair in the solution
- * @return whether a solution exists at the given index and was visited
- */
- boolean visitSolution(int index, BiConsumer<String, T> visitor);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
deleted file mode 100644
index 6cc3099..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
+++ /dev/null
@@ -1,129 +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.graph.traversal.step.map.match;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiConsumer;
-
-/**
- * An Enumerator which joins the solutions of a base Enumerator according to repeated variables
- * <p/>
- * Note: this Enumerator requires random access to its base Enumerator,
- * as it maintains a list of indices at which valid solutions are found, and visits only those indices.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class InnerJoinEnumerator<T> implements Enumerator<T> {
- private final Enumerator<T> baseEnumerator;
- private Iterator<Integer> iterator;
- private final List<Integer> joinIndices;
-
- private final Map<String, T> map;
- private final BiConsumer<String, T> joinVisitor;
-
- private int joinCount;
-
- public InnerJoinEnumerator(final Enumerator<T> baseEnumerator,
- final Set<String> joinVariables) {
-
- this.baseEnumerator = baseEnumerator;
- this.joinIndices = new ArrayList<>();
-
- map = new HashMap<>();
- // TODO: allow for more than two instances of a variable
- joinVisitor = (name, newValue) -> {
- if (joinVariables.contains(name)) {
- T value = map.get(name);
- if (null == value) {
- map.put(name, newValue);
- } else if (value.equals(newValue)) {
- joinCount++;
- }
- } else {
- map.put(name, newValue);
- }
- };
-
- iterator = new Iterator<Integer>() {
- private int currentIndex = -1;
-
- {
- advanceToNext();
- }
-
- public boolean hasNext() {
- // there are no calls to this method
- return false;
- }
-
- public Integer next() {
- int tmp = currentIndex;
- advanceToNext();
- return tmp;
- }
-
- private void advanceToNext() {
- while (true) {
- map.clear();
- joinCount = 0;
-
- if (!baseEnumerator.visitSolution(++currentIndex, joinVisitor)) {
- iterator = null;
- return;
- }
-
- if (joinVariables.size() == joinCount) {
- joinIndices.add(currentIndex);
- return;
- }
- }
- }
- };
- }
-
- public int size() {
- return joinIndices.size();
- }
-
- public boolean visitSolution(int i, BiConsumer<String, T> visitor) {
- while (i >= joinIndices.size()) {
- if (null == iterator) {
- return false;
- }
-
- iterator.next();
- }
-
- map.clear();
- if (!baseEnumerator.visitSolution(joinIndices.get(i), joinVisitor)) {
- throw new IllegalStateException();
- }
-
- for (Map.Entry<String, T> entry : map.entrySet()) {
- visitor.accept(entry.getKey(), entry.getValue());
- }
-
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
deleted file mode 100644
index f974daf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
+++ /dev/null
@@ -1,67 +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.graph.traversal.step.map.match;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class IteratorEnumerator<T> implements Enumerator<T> {
- private final String name;
- private Iterator<T> iterator;
- private final List<T> memory = new ArrayList<>();
-
- public IteratorEnumerator(final String name,
- final Iterator<T> iterator) {
- this.name = name;
- this.iterator = iterator;
- }
-
- public int size() {
- return memory.size();
- }
-
- public boolean visitSolution(final int index,
- final BiConsumer<String, T> visitor) {
- T value;
-
- if (index < memory.size()) {
- value = memory.get(index);
- } else do {
- if (null == iterator) {
- return false;
- } else if (!iterator.hasNext()) {
- // free up memory as soon as possible
- iterator = null;
- return false;
- }
-
- value = iterator.next();
- memory.add(value);
- } while (index >= memory.size());
-
- MatchStep.visit(name, value, visitor);
-
- return true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
deleted file mode 100644
index e51e21d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
+++ /dev/null
@@ -1,559 +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.graph.traversal.step.map.match;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.Stack;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> implements TraversalParent {
-
- static final BiConsumer<String, Object> TRIVIAL_CONSUMER = (s, t) -> {
- };
-
- private static final String ANON_LABEL_PREFIX = "_";
-
- // optimize before processing each start object, by default
- private static final int DEFAULT_STARTS_PER_OPTIMIZE = 1;
-
- private final String startLabel;
- private final Map<String, List<TraversalWrapper<S, S>>> traversalsByStartAs;
- private final List<Traversal> traversals = new ArrayList<>();
-
- private int startsPerOptimize = DEFAULT_STARTS_PER_OPTIMIZE;
- private int optimizeCounter = -1;
- private int anonLabelCounter = 0;
-
- private Enumerator<S> currentSolution;
- private int currentIndex;
-
- // initial value allows MatchStep to be used as a stand-alone query engine
- private Traverser.Admin<S> currentStart;
-
- public MatchStep(final Traversal.Admin traversal, final String startLabel, final Traversal... traversals) {
- super(traversal);
- this.startLabel = startLabel;
- this.traversalsByStartAs = new HashMap<>();
- this.currentStart = new B_O_PA_S_SE_SL_Traverser<>(null, this);
- for (final Traversal tl : traversals) {
- addTraversalPrivate(tl);
- this.integrateChild(tl.asAdmin());
- this.traversals.add(tl);
- }
- checkSolvability();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.traversalsByStartAs);
- }
-
- /**
- * Adds an individual traversal to an already-constructed MatchStep.
- * The query must be solvable after addition (i.e. should not require the addition of
- * further traversals in order to be solvable)
- * This method should be called before the query is first executed.
- *
- * @param traversal the traversal to add
- */
- public void addTraversal(final Traversal<S, S> traversal) {
- addTraversalPrivate(traversal);
- this.traversals.add(traversal);
- this.integrateChild(traversal.asAdmin());
- checkSolvability();
- }
-
- public void setStartsPerOptimize(final int startsPerOptimize) {
- if (startsPerOptimize < 1) {
- throw new IllegalArgumentException();
- }
- this.startsPerOptimize = startsPerOptimize;
- }
-
- @Override
- protected Traverser<Map<String, E>> processNextStart() throws NoSuchElementException {
- final Map<String, E> map = new HashMap<>();
- final Traverser<Map<String, E>> result = this.currentStart.split(map, this);
- final BiConsumer<String, S> resultSetter = (name, value) -> map.put(name, (E) value);
-
- while (true) { // break out when the current solution is exhausted and there are no more starts
- if (null == this.currentSolution) {
- if (this.starts.hasNext()) {
- this.optimizeCounter = (this.optimizeCounter + 1) % this.startsPerOptimize;
- if (0 == this.optimizeCounter) {
- optimize();
- }
-
- this.currentStart = this.starts.next();
- this.currentSolution = solveFor(IteratorUtils.of(this.currentStart.get()));
- this.currentIndex = 0;
- } else {
- throw FastNoSuchElementException.instance();
- }
- }
-
- map.clear();
- if (this.currentSolution.visitSolution(this.currentIndex++, resultSetter)) {
- return result;
- } else {
- this.currentSolution = null;
- }
- }
- }
-
- /**
- * @return a description of the current state of this step, including the query plan and gathered statistics
- */
- public String summarize() {
- final StringBuilder sb = new StringBuilder("match \"")
- .append(this.startLabel)
- .append("\":\t")
- .append(findCost(this.startLabel))
- .append('\n');
- summarize(this.startLabel, sb, new HashSet<>(), 1);
- return sb.toString();
- }
-
- private void summarize(final String outLabel,
- final StringBuilder sb,
- final Set<String> visited,
- final int indent) {
- if (!visited.contains(outLabel)) {
- visited.add(outLabel);
- final List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outLabel);
- if (null != outs) {
- for (final TraversalWrapper<S, S> w : outs) {
- for (int i = 0; i < indent; i++) sb.append('\t');
- sb.append(outLabel).append("->").append(w.endLabel).append(":\t");
- sb.append(findCost(w));
- sb.append('\t').append(w);
- sb.append('\n');
- summarize(w.endLabel, sb, visited, indent + 1);
- }
- }
- }
- }
-
- private void addTraversalPrivate(final Traversal<S, S> traversal) {
-
- String startAs = traversal.asAdmin().getStartStep().getLabel().orElseThrow(()
- -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
- String endAs = traversal.asAdmin().getEndStep().getLabel().orElse(null);
- checkAs(startAs);
- if (null == endAs) {
- endAs = createAnonymousAs();
- } else {
- checkAs(endAs);
- }
-
- final TraversalWrapper<S, S> wrapper = new TraversalWrapper<>(traversal, startAs, endAs);
- // index all wrapped traversals by their startLabel
- List<TraversalWrapper<S, S>> l2 = this.traversalsByStartAs.get(startAs);
- if (null == l2) {
- l2 = new LinkedList<>();
- this.traversalsByStartAs.put(startAs, l2);
- }
- l2.add(wrapper);
- }
-
- // given all the wrapped traversals, determine bad patterns in the set and throw exceptions if not solvable
- private void checkSolvability() {
- final Set<String> pathSet = new HashSet<>();
- final Stack<String> stack = new Stack<>();
- stack.push(this.startLabel);
- int countTraversals = 0;
- while (!stack.isEmpty()) {
- final String outAs = stack.peek();
- if (pathSet.contains(outAs)) {
- stack.pop();
- pathSet.remove(outAs);
- } else {
- pathSet.add(outAs);
- final List<TraversalWrapper<S, S>> l = traversalsByStartAs.get(outAs);
- if (null != l) {
- for (final TraversalWrapper<S, S> tw : l) {
- countTraversals++;
- if (pathSet.contains(tw.endLabel)) {
- throw new IllegalArgumentException("The provided traversal set contains a cycle due to '"
- + tw.endLabel + '\'');
- }
- stack.push(tw.endLabel);
- }
- }
- }
- }
-
- int totalTraversals = 0;
- for (List<TraversalWrapper<S, S>> l : this.traversalsByStartAs.values()) {
- totalTraversals += l.size();
- }
-
- if (countTraversals < totalTraversals) {
- throw new IllegalArgumentException("The provided traversal set contains unreachable as-label(s)");
- }
- }
-
- private static void checkAs(final String as) {
- // note: this won't happen so long as the anon prefix is the same as Traversal.UNDERSCORE
- if (isAnonymousAs(as)) {
- throw new IllegalArgumentException("The step named '" + as + "' uses reserved prefix '"
- + ANON_LABEL_PREFIX + '\'');
- }
- }
-
- private static boolean isAnonymousAs(final String as) {
- return as.startsWith(ANON_LABEL_PREFIX);
- }
-
- private String createAnonymousAs() {
- return ANON_LABEL_PREFIX + ++this.anonLabelCounter;
- }
-
- /**
- * Directly applies this match query to a sequence of inputs
- *
- * @param inputs a sequence of inputs
- * @return an enumerator over all solutions
- */
- public Enumerator<S> solveFor(final Iterator<S> inputs) {
- return solveFor(startLabel, inputs);
- }
-
- private Enumerator<S> solveFor(final String localStartAs,
- final Iterator<S> inputs) {
- List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
- if (null == outs) {
- // no out-traversals from here; just enumerate the values bound to localStartAs
- return isAnonymousAs(localStartAs)
- ? new SimpleEnumerator<>(localStartAs, inputs)
- : new IteratorEnumerator<>(localStartAs, inputs);
- } else {
- // for each value bound to localStartAs, feed it into all out-traversals in parallel and join the results
- return new SerialEnumerator<>(localStartAs, inputs, o -> {
- Enumerator<S> result = null;
- Set<String> leftLabels = new HashSet<>();
-
- for (TraversalWrapper<S, S> w : outs) {
- TraversalUpdater<S, S> updater
- = new TraversalUpdater<>(w, IteratorUtils.of(o), currentStart, this.getId());
-
- Set<String> rightLabels = new HashSet<>();
- addVariables(w.endLabel, rightLabels);
- Enumerator<S> ie = solveFor(w.endLabel, updater);
- result = null == result ? ie : crossJoin(result, ie, leftLabels, rightLabels);
- leftLabels.addAll(rightLabels);
- }
-
- return result;
- });
- }
- }
-
- private static <T> Enumerator<T> crossJoin(final Enumerator<T> left,
- final Enumerator<T> right,
- final Set<String> leftLabels,
- final Set<String> rightLabels) {
- Set<String> shared = new HashSet<>();
- for (String s : rightLabels) {
- if (leftLabels.contains(s)) {
- shared.add(s);
- }
- }
-
- Enumerator<T> cj = new CrossJoinEnumerator<>(left, right);
- return shared.size() > 0 ? new InnerJoinEnumerator<>(cj, shared) : cj;
- }
-
- // recursively add all non-anonymous variables from a starting point in the query
- private void addVariables(final String localStartAs,
- final Set<String> variables) {
- if (!isAnonymousAs(localStartAs)) {
- variables.add(localStartAs);
- }
-
- List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
- if (null != outs) {
- for (TraversalWrapper<S, S> w : outs) {
- String endAs = w.endLabel;
- if (!variables.contains(endAs)) {
- addVariables(endAs, variables);
- }
- }
- }
- }
-
- // applies a visitor, skipping anonymous variables
- static <T> void visit(final String name,
- final T value,
- final BiConsumer<String, T> visitor) {
- if (!isAnonymousAs(name)) {
- visitor.accept(name, value);
- }
- }
-
- /**
- * Computes and applies a new query plan based on gathered statistics about traversal inputs and outputs.
- */
- // note: optimize() is never called from within a solution iterator, as it changes the query plan
- public void optimize() {
- optimizeAt(startLabel);
- }
-
- private void optimizeAt(final String outAs) {
- List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
- if (null != outs) {
- for (TraversalWrapper<S, S> t : outs) {
- optimizeAt(t.endLabel);
- updateOrderingFactor(t);
- }
- Collections.sort(outs);
- }
- }
-
- private double findCost(final TraversalWrapper<S, S> root) {
- double bf = root.findBranchFactor();
- return bf + findCost(root.endLabel, root.findBranchFactor());
- }
-
- private double findCost(final String outAs,
- final double branchFactor) {
- double bf = branchFactor;
-
- double cost = 0;
-
- List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
- if (null != outs) {
- for (TraversalWrapper<S, S> child : outs) {
- cost += bf * findCost(child);
- bf *= child.findBranchFactor();
- }
- }
-
- return cost;
- }
-
- /**
- * @param outLabel the out-label of one or more traversals in the query
- * @return the expected cost, in the current query plan, of applying the branch of the query plan at
- * the given out-label to one start value
- */
- public double findCost(final String outLabel) {
- return findCost(outLabel, 1.0);
- }
-
- private void updateOrderingFactor(final TraversalWrapper<S, S> w) {
- w.orderingFactor = ((w.findBranchFactor() - 1) / findCost(w));
- }
-
- @Override
- public List<Traversal> getLocalChildren() {
- return this.traversals;
- }
-
- /**
- * A wrapper for a traversal in a query which maintains statistics about the traversal as
- * it consumes inputs and produces outputs.
- * The "branch factor" of the traversal is an important factor in determining its place in the query plan.
- */
- // note: input and output counts are never "refreshed".
- // The position of a traversal in a query never changes, although its priority / likelihood of being executed does.
- // Priority in turn affects branch factor.
- // However, with sufficient inputs and optimizations,the branch factor is expected to converge on a stable value.
- public static class TraversalWrapper<A, B> implements Comparable<TraversalWrapper<A, B>> {
- private final Traversal<A, B> traversal;
- private final String startLabel, endLabel;
- private int totalInputs = 0;
- private int totalOutputs = 0;
- private double orderingFactor;
-
- public TraversalWrapper(final Traversal<A, B> traversal,
- final String startLabel,
- final String endLabel) {
- this.traversal = traversal;
- this.startLabel = startLabel;
- this.endLabel = endLabel;
- }
-
- public void incrementInputs() {
- this.totalInputs++;
- }
-
- public void incrementOutputs(int outputs) {
- this.totalOutputs += outputs;
- }
-
- // TODO: take variance into account, to avoid penalizing traversals for early encounters with super-inputs,
- // or simply for never having been tried
- public double findBranchFactor() {
- return 0 == this.totalInputs ? 1 : this.totalOutputs / ((double) this.totalInputs);
- }
-
- @Override
- public int compareTo(final TraversalWrapper<A, B> other) {
- return ((Double) this.orderingFactor).compareTo(other.orderingFactor);
- }
-
- public Traversal<A, B> getTraversal() {
- return this.traversal;
- }
-
- public void reset() {
- this.traversal.asAdmin().reset();
- }
-
- @Override
- public String toString() {
- return this.traversal.toString();
- //return "[" + this.startLabel + "->" + this.endLabel + "," + findBranchFactor() + ","
- // + this.totalInputs + "," + this.totalOutputs + "," + this.traversal + "]";
- }
- }
-
- /**
- * A helper object which wraps a traversal, submitting starts and counting results per start
- */
- public static class TraversalUpdater<A, B> implements Iterator<B> {
- private final TraversalWrapper<A, B> w;
- private int outputs = -1;
-
- public TraversalUpdater(final TraversalWrapper<A, B> w,
- final Iterator<A> inputs,
- final Traverser<A> start,
- final String as) {
- this.w = w;
-
- Iterator<A> seIter = new SideEffectIterator<>(inputs, ignored -> {
- // only increment traversal input and output counts once an input
- // has been completely processed by the traversal
- if (-1 != outputs) {
- w.incrementInputs();
- w.incrementOutputs(outputs);
- }
- outputs = 0;
- });
- Iterator<Traverser<A>> starts = new MapIterator<>(seIter,
- o -> {
- final Traverser.Admin<A> traverser = ((Traverser.Admin<A>) start).split();
- traverser.set((A) o);
- return traverser;
- });
-
- w.reset();
-
- // with the traversal "empty" and ready for re-use, add new starts
- w.traversal.asAdmin().addStarts(starts);
- }
-
- // note: may return true after first returning false (inheriting this behavior from e.g. DefaultTraversal)
- @Override
- public boolean hasNext() {
- return w.traversal.hasNext();
- }
-
- @Override
- public B next() {
- outputs++;
- B b = w.traversal.next();
-
- // immediately check hasNext(), possibly updating the traverser's statistics
- // even if we otherwise abandon the iterator
- w.traversal.hasNext();
-
- return b;
- }
- }
-
- // an iterator which executes a side-effect the first time hasNext() is called before a next()
- private static class SideEffectIterator<T> implements Iterator<T> {
- private final Consumer onHasNext;
- private final Iterator<T> baseIterator;
- private boolean ready = true;
-
- private SideEffectIterator(final Iterator<T> baseIterator,
- final Consumer onHasNext) {
- this.onHasNext = onHasNext;
- this.baseIterator = baseIterator;
- }
-
- @Override
- public boolean hasNext() {
- if (this.ready) {
- this.onHasNext.accept(null);
- this.ready = false;
- }
- return this.baseIterator.hasNext();
- }
-
- @Override
- public T next() {
- T value = this.baseIterator.next();
- this.ready = true;
- return value;
- }
- }
-
- private static class MapIterator<A, B> implements Iterator<B> {
- private final Function<A, B> map;
- private final Iterator<A> baseIterator;
-
- public MapIterator(final Iterator<A> baseIterator, final Function<A, B> map) {
- this.map = map;
- this.baseIterator = baseIterator;
- }
-
- @Override
- public boolean hasNext() {
- return this.baseIterator.hasNext();
- }
-
- @Override
- public B next() {
- return this.map.apply(this.baseIterator.next());
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
deleted file mode 100644
index ce0739d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
+++ /dev/null
@@ -1,119 +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.graph.traversal.step.map.match;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-
-/**
- * An enumerator which consumes values from an iterator and maps each value to a secondary enumerator
- * (for example, a join)
- * Enumerated indices cover all solutions in the secondary enumerators,
- * in ascending order according to the value iterator and the enumerators' own indices.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class SerialEnumerator<T> implements Enumerator<T> {
- private final String name;
- private Iterator<T> iterator;
- private final Function<T, Enumerator<T>> constructor;
- private final List<Enumerator<T>> memory = new ArrayList<>();
- private final List<T> values = new ArrayList<>();
-
- // TODO: this only assigned, not accessed until the efficient implementation of size() is restored
- private int completedEnumsSize = 0;
-
- public SerialEnumerator(final String name,
- final Iterator<T> iterator,
- final Function<T, Enumerator<T>> constructor) {
- this.name = name;
- this.iterator = iterator;
- this.constructor = constructor;
- }
-
- public int size() {
- // TODO: restore the more efficient implementation of size() while taking into account that
- // traversal iterators such as DefaultTraversal may return hasNext=true after first returning hasNext=false
- /*
- int size = completedEnumsSize;
- if (!sideEffects.isEmpty()) {
- size += sideEffects.get(sideEffects.size() - 1).size();
- }
- return size;
- */
-
- //*
- int size = 0;
- for (Enumerator<T> e : memory) size += e.size();
- return size;
- //*/
- }
-
- // note: *not* intended for random access; use binary search if this is ever needed
- public boolean visitSolution(final int index,
- final BiConsumer<String, T> visitor) {
- int totalSize = 0;
- int memIndex = 0;
- while (true) {
- if (memIndex < memory.size()) {
- Enumerator<T> e = memory.get(memIndex);
-
- if (e.visitSolution(index - totalSize, visitor)) {
- // additionally, bind the value stored in this enumerator
- MatchStep.visit(name, values.get(memIndex), visitor);
-
- return true;
- } else {
- totalSize += e.size();
- memIndex++;
- }
- } else {
- if (null == iterator) {
- return false;
- } else if (!iterator.hasNext()) {
- // free up memory as soon as possible
- iterator = null;
- return false;
- }
-
- if (!memory.isEmpty()) {
- int lastSize = memory.get(memIndex - 1).size();
-
- // first remove the head enumeration if it exists and is empty
- // (only the head will ever be empty, avoiding wasted space)
- if (0 == lastSize) {
- memIndex--;
- memory.remove(memIndex);
- values.remove(memIndex);
- } else {
- completedEnumsSize += lastSize;
- }
- }
-
- T value = iterator.next();
- values.add(value);
- Enumerator<T> e = constructor.apply(value);
- memory.add(memory.size(), e);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
deleted file mode 100644
index 37443f4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
+++ /dev/null
@@ -1,66 +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.graph.traversal.step.map.match;
-
-import java.util.Iterator;
-import java.util.function.BiConsumer;
-
-/**
- * An enumerator of at most one element
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class SimpleEnumerator<T> implements Enumerator<T> {
-
- private final String name;
- private Iterator<T> iterator;
- private T element;
-
- public SimpleEnumerator(final String name,
- final Iterator<T> iterator) {
- this.name = name;
- this.iterator = iterator;
- }
-
- @Override
- public int size() {
- return null == element ? 0 : 1;
- }
-
- @Override
- public boolean visitSolution(int index, BiConsumer<String, T> visitor) {
- if (0 != index) {
- return false;
- }
-
- if (null != iterator) {
- if (iterator.hasNext()) {
- element = iterator.next();
- }
- iterator = null;
- }
-
- if (null != element) {
- MatchStep.visit(name, element, visitor);
- return true;
- }
-
- return false;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
deleted file mode 100644
index e1914dc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
+++ /dev/null
@@ -1,54 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
- private final String key;
- private final Object value;
-
- public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value) {
- super(traversal);
- this.key = key;
- this.value = value;
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- traverser.get().property(this.key, this.value);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
deleted file mode 100644
index 3c88312..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
+++ /dev/null
@@ -1,160 +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.graph.traversal.step.sideEffect;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
- private Traversal.Admin<S, Object> aggregateTraversal = null;
- private String sideEffectKey;
-
- public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey, this.aggregateTraversal);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
- return new AggregateMapReduce(this);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> aggregateTraversal) {
- this.aggregateTraversal = this.integrateChild(aggregateTraversal);
- }
-
- @Override
- public List<Traversal.Admin<S, Object>> getLocalChildren() {
- return null == this.aggregateTraversal ? Collections.emptyList() : Collections.singletonList(this.aggregateTraversal);
- }
-
- @Override
- public void barrierConsumer(final TraverserSet<S> traverserSet) {
- traverserSet.forEach(traverser ->
- TraversalHelper.addToCollection(
- traverser.getSideEffects().get(this.sideEffectKey),
- TraversalUtil.applyNullable(traverser, this.aggregateTraversal),
- traverser.bulk()));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
- }
-
- @Override
- public AggregateStep<S> clone() {
- final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
- if (null != this.aggregateTraversal)
- clone.aggregateTraversal = clone.integrateChild(this.aggregateTraversal.clone());
- return clone;
- }
-
- ////////
-
- public static final class AggregateMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
- public static final String AGGREGATE_STEP_SIDE_EFFECT_KEY = "gremlin.aggregateStep.sideEffectKey";
-
- private String sideEffectKey;
- private Supplier<Collection> collectionSupplier;
-
- private AggregateMapReduce() {
-
- }
-
- public AggregateMapReduce(final AggregateStep step) {
- this.sideEffectKey = step.getSideEffectKey();
- this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- super.storeState(configuration);
- configuration.setProperty(AGGREGATE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.sideEffectKey = configuration.getString(AGGREGATE_STEP_SIDE_EFFECT_KEY);
- this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return stage.equals(Stage.MAP);
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
- VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
- }
-
- @Override
- public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
- final Collection collection = this.collectionSupplier.get();
- keyValues.forEachRemaining(keyValue -> collection.add(keyValue.getValue()));
- return collection;
- }
-
- @Override
- public String getMemoryKey() {
- return this.sideEffectKey;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
deleted file mode 100644
index e36ea37..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ /dev/null
@@ -1,99 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GraphStep<S extends Element> extends StartStep<S> implements EngineDependent {
-
- protected final Class<S> returnClass;
- protected Object[] ids;
- protected transient Supplier<Iterator<S>> iteratorSupplier;
-
- public GraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
- super(traversal);
- this.returnClass = returnClass;
- this.ids = ids;
- for (int i = 0; i < this.ids.length; i++) {
- if (this.ids[i] instanceof Element)
- this.ids[i] = ((Element) this.ids[i]).id();
- }
- this.iteratorSupplier = () -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ?
- this.getTraversal().getGraph().get().vertices(this.ids) :
- this.getTraversal().getGraph().get().edges(this.ids));
- }
-
- public String toString() {
- return TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.returnClass.getSimpleName().toLowerCase());
- }
-
- public boolean returnsVertices() {
- return Vertex.class.isAssignableFrom(this.returnClass);
- }
-
- public boolean returnsEdges() {
- return Edge.class.isAssignableFrom(this.returnClass);
- }
-
- public Class<S> getReturnClass() {
- return this.returnClass;
- }
-
- public void setIteratorSupplier(final Supplier<Iterator<S>> iteratorSupplier) {
- this.iteratorSupplier = iteratorSupplier;
- }
-
- public Object[] getIds() {
- return this.ids;
- }
-
- public void clearIds() {
- this.ids = new Object[0];
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- if (traversalEngine.isComputer()) {
- this.iteratorSupplier = Collections::emptyIterator;
- }
- }
-
- @Override
- protected Traverser<S> processNextStart() {
- if (this.first)
- this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
- return super.processNextStart();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
deleted file mode 100644
index 997d1db..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
+++ /dev/null
@@ -1,171 +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.graph.traversal.step.sideEffect;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupCountSideEffectStep<S, E> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<E, Long, E, Long, Map<E, Long>> {
-
- private Traversal.Admin<S, E> groupTraversal = null;
- private String sideEffectKey;
-
- public GroupCountSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- final Map<Object, Long> groupCountMap = traverser.sideEffects(this.sideEffectKey);
- MapHelper.incr(groupCountMap, TraversalUtil.applyNullable(traverser.asAdmin(), this.groupTraversal), traverser.bulk());
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
- return new GroupCountSideEffectMapReduce<>(this);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey, this.groupTraversal);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
- this.groupTraversal = this.integrateChild(groupTraversal);
- }
-
- @Override
- public List<Traversal.Admin<S, E>> getLocalChildren() {
- return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
- }
-
- @Override
- public GroupCountSideEffectStep<S, E> clone() {
- final GroupCountSideEffectStep<S, E> clone = (GroupCountSideEffectStep<S, E>) super.clone();
- if (null != this.groupTraversal)
- clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
- return clone;
- }
-
- ///////
-
- public static final class GroupCountSideEffectMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
-
- public static final String GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupCountSideEffectStep.sideEffectKey";
-
- private String sideEffectKey;
- private Supplier<Map<E, Long>> mapSupplier;
-
- private GroupCountSideEffectMapReduce() {
-
- }
-
- public GroupCountSideEffectMapReduce(final GroupCountSideEffectStep step) {
- this.sideEffectKey = step.getSideEffectKey();
- this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- super.storeState(configuration);
- configuration.setProperty(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.sideEffectKey = configuration.getString(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
- this.mapSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return true;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
- VertexTraversalSideEffects.of(vertex).<Map<E, Number>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach((k, v) -> emitter.emit(k, v.longValue()));
- }
-
- @Override
- public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
- long counter = 0;
- while (values.hasNext()) {
- counter = counter + values.next();
- }
- emitter.emit(key, counter);
- }
-
- @Override
- public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
- reduce(key, values, emitter);
- }
-
- @Override
- public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
- final Map<E, Long> map = this.mapSupplier.get();
- keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
- return map;
- }
-
- @Override
- public String getMemoryKey() {
- return this.sideEffectKey;
- }
- }
-}
[37/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
deleted file mode 100644
index f55814a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
+++ /dev/null
@@ -1,166 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements TraversalOptionParent<M, S, E> {
-
- protected Traversal.Admin<S, M> branchTraversal;
- protected Map<M, List<Traversal.Admin<S, E>>> traversalOptions = new HashMap<>();
- private boolean first = true;
-
- public BranchStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- public void setBranchTraversal(final Traversal.Admin<S, M> branchTraversal) {
- this.branchTraversal = this.integrateChild(branchTraversal);
- }
-
- @Override
- public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
- if (this.traversalOptions.containsKey(pickToken))
- this.traversalOptions.get(pickToken).add(traversalOption);
- else
- this.traversalOptions.put(pickToken, new ArrayList<>(Collections.singletonList(traversalOption)));
- traversalOption.addStep(new EndStep(traversalOption));
- this.integrateChild(traversalOption);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements();
- }
-
- @Override
- public List<Traversal.Admin<S, E>> getGlobalChildren() {
- return Collections.unmodifiableList(this.traversalOptions.values().stream()
- .flatMap(list -> list.stream())
- .collect(Collectors.toList()));
- }
-
- @Override
- public List<Traversal.Admin<S, M>> getLocalChildren() {
- return Collections.singletonList(this.branchTraversal);
- }
-
- @Override
- protected Iterator<Traverser<E>> standardAlgorithm() {
- while (true) {
- if (!this.first) {
- for (final List<Traversal.Admin<S, E>> options : this.traversalOptions.values()) {
- for (final Traversal.Admin<S, E> option : options) {
- if (option.hasNext())
- return option.getEndStep();
- }
- }
- }
- this.first = false;
- ///
- final Traverser.Admin<S> start = this.starts.next();
- final M choice = TraversalUtil.apply(start, this.branchTraversal);
- final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
- if (null != branch) {
- branch.forEach(traversal -> {
- traversal.reset();
- traversal.addStart(start.split());
- });
- }
- if (choice != Pick.any) {
- final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
- if (null != anyBranch)
- anyBranch.forEach(traversal -> {
- traversal.reset();
- traversal.addStart(start.split());
- });
- }
- }
- }
-
- @Override
- protected Iterator<Traverser<E>> computerAlgorithm() {
- final List<Traverser<E>> ends = new ArrayList<>();
- final Traverser.Admin<S> start = this.starts.next();
- final M choice = TraversalUtil.apply(start, this.branchTraversal);
- final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
- if (null != branch) {
- branch.forEach(traversal -> {
- final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
- split.setStepId(traversal.getStartStep().getId());
- ends.add(split);
- });
- }
- if (choice != Pick.any) {
- final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
- if (null != anyBranch) {
- anyBranch.forEach(traversal -> {
- final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
- split.setStepId(traversal.getStartStep().getId());
- ends.add(split);
- });
- }
- }
- return ends.iterator();
- }
-
- @Override
- public BranchStep<S, E, M> clone() {
- final BranchStep<S, E, M> clone = (BranchStep<S, E, M>) super.clone();
- clone.traversalOptions = new HashMap<>(this.traversalOptions.size());
- for (final Map.Entry<M, List<Traversal.Admin<S, E>>> entry : this.traversalOptions.entrySet()) {
- final List<Traversal.Admin<S, E>> traversals = entry.getValue();
- if (traversals.size() > 0) {
- final List<Traversal.Admin<S, E>> clonedTraversals = clone.traversalOptions.compute(entry.getKey(), (k, v) ->
- (v == null) ? new ArrayList<>(traversals.size()) : v);
- for (final Traversal.Admin<S, E> traversal : traversals) {
- final Traversal.Admin<S, E> clonedTraversal = traversal.clone();
- clonedTraversals.add(clonedTraversal);
- clone.integrateChild(clonedTraversal);
- }
- }
- }
- clone.branchTraversal = this.branchTraversal.clone();
- clone.integrateChild(clone.branchTraversal);
- return clone;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.branchTraversal, this.traversalOptions);
- }
-
- @Override
- public void reset() {
- super.reset();
- this.first = true;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
deleted file mode 100644
index d692b47..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
+++ /dev/null
@@ -1,51 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.HasNextTraversal;
-
-/**
- * A step which offers a choice of two or more Traversals to take.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ChooseStep<S, E, M> extends BranchStep<S, E, M> {
-
- public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, M> choiceTraversal) {
- super(traversal);
- this.setBranchTraversal(choiceTraversal);
- }
-
- public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> predicateTraversal, final Traversal.Admin<S, E> trueChoice, final Traversal.Admin<S, E> falseChoice) {
- this(traversal, new HasNextTraversal(predicateTraversal));
- this.addGlobalChildOption((M) Boolean.TRUE, trueChoice);
- this.addGlobalChildOption((M) Boolean.FALSE, falseChoice);
- }
-
- @Override
- public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
- if (Pick.any.equals(pickToken))
- throw new IllegalArgumentException("Choose step can not have an any-option as only one option per traverser is allowed");
- if (this.traversalOptions.containsKey(pickToken))
- throw new IllegalArgumentException("Choose step can only have one traversal per pick token: " + pickToken);
- super.addGlobalChildOption(pickToken, traversalOption);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
deleted file mode 100644
index 3c84d5d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
+++ /dev/null
@@ -1,87 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LocalStep<S, E> extends AbstractStep<S, E> implements TraversalParent {
-
- private Traversal.Admin<S, E> localTraversal;
- private boolean first = true;
-
- public LocalStep(final Traversal.Admin traversal, final Traversal.Admin<S, E> localTraversal) {
- super(traversal);
- this.localTraversal = this.integrateChild(localTraversal);
- }
-
- @Override
- public LocalStep<S, E> clone() {
- final LocalStep<S, E> clone = (LocalStep<S, E>) super.clone();
- clone.localTraversal = clone.integrateChild(this.localTraversal.clone());
- clone.first = true;
- return clone;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.localTraversal);
- }
-
- @Override
- public List<Traversal.Admin<S, E>> getLocalChildren() {
- return Collections.singletonList(this.localTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.localTraversal.getTraverserRequirements();
- }
-
- @Override
- protected Traverser<E> processNextStart() throws NoSuchElementException {
- if (this.first) {
- this.first = false;
- this.localTraversal.addStart(this.starts.next());
- }
- while (true) {
- if (this.localTraversal.hasNext())
- return this.localTraversal.getEndStep().next();
- else if (this.starts.hasNext()) {
- this.localTraversal.reset();
- this.localTraversal.addStart(this.starts.next());
- } else {
- throw FastNoSuchElementException.instance();
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
deleted file mode 100644
index c317048..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
+++ /dev/null
@@ -1,263 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements TraversalParent {
-
- private Traversal.Admin<S, S> repeatTraversal = null;
- private Traversal.Admin<S, ?> untilTraversal = null;
- private Traversal.Admin<S, ?> emitTraversal = null;
- public boolean untilFirst = false;
- public boolean emitFirst = false;
-
- public RepeatStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.BULK);
- if (requirements.contains(TraverserRequirement.SINGLE_LOOP))
- requirements.add(TraverserRequirement.NESTED_LOOP);
- requirements.add(TraverserRequirement.SINGLE_LOOP);
- return requirements;
- }
-
- @SuppressWarnings("unchecked")
- public void setRepeatTraversal(final Traversal.Admin<S, S> repeatTraversal) {
- this.repeatTraversal = repeatTraversal; // .clone();
- this.repeatTraversal.addStep(new RepeatEndStep(this.repeatTraversal));
- this.integrateChild(this.repeatTraversal);
- }
-
- public void setUntilTraversal(final Traversal.Admin<S, ?> untilTraversal) {
- if (null == this.repeatTraversal) this.untilFirst = true;
- this.untilTraversal = this.integrateChild(untilTraversal);
- }
-
- public void setEmitTraversal(final Traversal.Admin<S, ?> emitTraversal) {
- if (null == this.repeatTraversal) this.emitFirst = true;
- this.emitTraversal = this.integrateChild(emitTraversal);
- }
-
- public List<Traversal.Admin<S, S>> getGlobalChildren() {
- return null == this.repeatTraversal ? Collections.emptyList() : Collections.singletonList(this.repeatTraversal);
- }
-
- public List<Traversal.Admin<S, ?>> getLocalChildren() {
- final List<Traversal.Admin<S, ?>> list = new ArrayList<>();
- if (null != this.untilTraversal)
- list.add(this.untilTraversal);
- if (null != this.emitTraversal)
- list.add(this.emitTraversal);
- return list;
- }
-
- public final boolean doUntil(final Traverser.Admin<S> traverser, boolean utilFirst) {
- return utilFirst == this.untilFirst && null != this.untilTraversal && TraversalUtil.test(traverser, this.untilTraversal);
- }
-
- public final boolean doEmit(final Traverser.Admin<S> traverser, boolean emitFirst) {
- return emitFirst == this.emitFirst && null != this.emitTraversal && TraversalUtil.test(traverser, this.emitTraversal);
- }
-
- @Override
- public String toString() {
- if (this.untilFirst && this.emitFirst)
- return TraversalHelper.makeStepString(this, untilString(), emitString(), this.repeatTraversal);
- else if (this.emitFirst)
- return TraversalHelper.makeStepString(this, emitString(), this.repeatTraversal, untilString());
- else if (this.untilFirst)
- return TraversalHelper.makeStepString(this, untilString(), this.repeatTraversal, emitString());
- else
- return TraversalHelper.makeStepString(this, this.repeatTraversal, untilString(), emitString());
- }
-
- private final String untilString() {
- return null == this.untilTraversal ? "until(false)" : "until(" + this.untilTraversal + ')';
- }
-
- private final String emitString() {
- return null == this.emitTraversal ? "emit(false)" : "emit(" + this.emitTraversal + ')';
- }
-
- /////////////////////////
-
- @Override
- public RepeatStep<S> clone() {
- final RepeatStep<S> clone = (RepeatStep<S>) super.clone();
- clone.repeatTraversal = clone.integrateChild(this.repeatTraversal.clone());
- if (null != this.untilTraversal)
- clone.untilTraversal = clone.integrateChild(this.untilTraversal.clone());
- if (null != this.emitTraversal)
- clone.emitTraversal = clone.integrateChild(this.emitTraversal.clone());
- return clone;
- }
-
- @Override
- protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
- while (true) {
- if (this.repeatTraversal.getEndStep().hasNext()) {
- return this.repeatTraversal.getEndStep();
- } else {
- final Traverser.Admin<S> start = this.starts.next();
- if (doUntil(start, true)) {
- start.resetLoops();
- return IteratorUtils.of(start);
- }
- this.repeatTraversal.addStart(start);
- if (doEmit(start, true)) {
- final Traverser.Admin<S> emitSplit = start.split();
- emitSplit.resetLoops();
- return IteratorUtils.of(emitSplit);
- }
- }
- }
- }
-
- @Override
- protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
- final Traverser.Admin<S> start = this.starts.next();
- if (doUntil(start, true)) {
- start.resetLoops();
- start.setStepId(this.getNextStep().getId());
- return IteratorUtils.of(start);
- } else {
- start.setStepId(this.repeatTraversal.getStartStep().getId());
- if (doEmit(start, true)) {
- final Traverser.Admin<S> emitSplit = start.split();
- emitSplit.resetLoops();
- emitSplit.setStepId(this.getNextStep().getId());
- return IteratorUtils.of(start, emitSplit);
- } else {
- return IteratorUtils.of(start);
- }
- }
- }
-
- /////////////////////////
-
- public static <A, B, C extends Traversal<A, B>> C addRepeatToTraversal(final C traversal, final Traversal.Admin<B, B> repeatTraversal) {
- final Step<?, B> step = traversal.asAdmin().getEndStep();
- if (step instanceof RepeatStep && null == ((RepeatStep) step).repeatTraversal) {
- ((RepeatStep<B>) step).setRepeatTraversal(repeatTraversal);
- } else {
- final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
- repeatStep.setRepeatTraversal(repeatTraversal);
- traversal.asAdmin().addStep(repeatStep);
- }
- return traversal;
- }
-
- public static <A, B, C extends Traversal<A, B>> C addUntilToTraversal(final C traversal, final Traversal.Admin<B, ?> untilPredicate) {
- final Step<?, B> step = traversal.asAdmin().getEndStep();
- if (step instanceof RepeatStep && null == ((RepeatStep) step).untilTraversal) {
- ((RepeatStep<B>) step).setUntilTraversal(untilPredicate);
- } else {
- final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
- repeatStep.setUntilTraversal(untilPredicate);
- traversal.asAdmin().addStep(repeatStep);
- }
- return traversal;
- }
-
- public static <A, B, C extends Traversal<A, B>> C addEmitToTraversal(final C traversal, final Traversal.Admin<B, ?> emitPredicate) {
- final Step<?, B> step = traversal.asAdmin().getEndStep();
- if (step instanceof RepeatStep && null == ((RepeatStep) step).emitTraversal) {
- ((RepeatStep<B>) step).setEmitTraversal(emitPredicate);
- } else {
- final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
- repeatStep.setEmitTraversal(emitPredicate);
- traversal.asAdmin().addStep(repeatStep);
- }
- return traversal;
- }
-
- ///////////////////////////////////
-
- public class RepeatEndStep extends ComputerAwareStep<S, S> {
-
- public RepeatEndStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
- while (true) {
- final Traverser.Admin<S> start = this.starts.next();
- start.incrLoops(this.getId());
- if (doUntil(start, false)) {
- start.resetLoops();
- return IteratorUtils.of(start);
- } else {
- if (!RepeatStep.this.untilFirst && !RepeatStep.this.emitFirst)
- RepeatStep.this.repeatTraversal.addStart(start);
- else
- RepeatStep.this.addStart(start);
- if (doEmit(start, false)) {
- final Traverser.Admin<S> emitSplit = start.split();
- emitSplit.resetLoops();
- return IteratorUtils.of(emitSplit);
- }
- }
- }
- }
-
- @Override
- protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
- final Traverser.Admin<S> start = this.starts.next();
- start.incrLoops(RepeatStep.this.getId());
- if (doUntil(start, false)) {
- start.resetLoops();
- start.setStepId(RepeatStep.this.getNextStep().getId());
- return IteratorUtils.of(start);
- } else {
- start.setStepId(RepeatStep.this.getId());
- if (doEmit(start, false)) {
- final Traverser.Admin<S> emitSplit = start.split();
- emitSplit.resetLoops();
- emitSplit.setStepId(RepeatStep.this.getNextStep().getId());
- return IteratorUtils.of(start, emitSplit);
- }
- return IteratorUtils.of(start);
- }
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
deleted file mode 100644
index fb31ac8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
+++ /dev/null
@@ -1,52 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Collections;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParent.Pick> {
-
- public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
- super(traversal);
- this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
- for (final Traversal.Admin<?, E> union : unionTraversals) {
- this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
- }
- }
-
- @Override
- public void addGlobalChildOption(final Pick pickToken, final Traversal.Admin<S, E> traversalOption) {
- if (Pick.any != pickToken)
- throw new IllegalArgumentException("Union step only supports the any token: " + pickToken);
- super.addGlobalChildOption(pickToken, traversalOption);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.traversalOptions.getOrDefault(Pick.any, Collections.emptyList()));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
deleted file mode 100644
index 9044b4c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
+++ /dev/null
@@ -1,39 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AndStep<S> extends ConjunctionStep<S> implements TraversalParent {
-
- public AndStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... andTraversals) {
- super(traversal, andTraversals);
-
- }
-
- public static final class AndMarker<S> extends ConjunctionMarker<S> {
- public AndMarker(final Traversal.Admin traversal) {
- super(traversal);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
deleted file mode 100644
index 0390283..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
+++ /dev/null
@@ -1,64 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CoinStep<S> extends FilterStep<S> {
-
- private static final Random RANDOM = new Random();
- private final double probability;
-
- public CoinStep(final Traversal.Admin traversal, final double probability) {
- super(traversal);
- this.probability = probability;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- long newBulk = 0l;
- for (int i = 0; i < traverser.bulk(); i++) {
- if (this.probability >= RANDOM.nextDouble())
- newBulk++;
- }
- if (0 == newBulk) return false;
- traverser.setBulk(newBulk);
- return true;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.probability);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.BULK);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
deleted file mode 100644
index 83e76e7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
+++ /dev/null
@@ -1,193 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ConjunctionStep<S> extends AbstractStep<S, S> implements TraversalParent {
-
- private List<Traversal.Admin<S, ?>> conjunctionTraversals;
- private final boolean isAnd;
-
- public ConjunctionStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... conjunctionTraversals) {
- super(traversal);
- this.isAnd = this.getClass().equals(AndStep.class);
- this.conjunctionTraversals = Arrays.asList(conjunctionTraversals);
- for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
- this.integrateChild(conjunctionTraversal);
- }
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- while (true) {
- final Traverser.Admin<S> start = this.starts.next();
- boolean found = false;
- for (final Traversal.Admin<S, ?> traversal : this.conjunctionTraversals) {
- traversal.addStart(start.split());
- found = traversal.hasNext();
- traversal.reset();
- if (this.isAnd) {
- if (!found)
- break;
- } else if (found)
- break;
- }
- if (found) return start;
- }
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements();
- }
-
- @Override
- public List<Traversal.Admin<S, ?>> getLocalChildren() {
- return Collections.unmodifiableList(this.conjunctionTraversals);
- }
-
- @Override
- public ConjunctionStep<S> clone() {
- final ConjunctionStep<S> clone = (ConjunctionStep<S>) super.clone();
- clone.conjunctionTraversals = new ArrayList<>();
- for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
- clone.conjunctionTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
- }
- return clone;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.conjunctionTraversals);
- }
-
- public boolean isConjunctionHasTree() {
- for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
- for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
- if (step instanceof ConjunctionStep) {
- if (!((ConjunctionStep) step).isConjunctionHasTree())
- return false;
- } else if (!(step instanceof HasStep))
- return false;
- }
- }
- return true;
- }
-
- public ConjunctionTree getConjunctionHasTree() {
- return new ConjunctionTree(this);
- }
-
-
- ////////
-
- public static class ConjunctionMarker<S> extends AbstractStep<S, S> {
-
- public ConjunctionMarker(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- throw new IllegalStateException("This step should have been removed via a strategy: " + this.getClass().getCanonicalName());
- }
- }
-
- ////////
-
- public static class ConjunctionTree implements Iterable<ConjunctionTree.Entry> {
-
- private final List<Entry> tree = new ArrayList<>();
- private final boolean isAnd;
-
- public ConjunctionTree(final ConjunctionStep<?> conjunctionStep) {
- this.isAnd = conjunctionStep.isAnd;
- for (final Traversal.Admin<?, ?> conjunctionTraversal : conjunctionStep.conjunctionTraversals) {
- for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
- if (step instanceof HasStep) {
- (((HasStep<?>) step).getHasContainers()).forEach(container -> this.tree.add(new Entry(HasContainer.class, container)));
- } else if (step instanceof ConjunctionStep) {
- this.tree.add(new Entry(ConjunctionTree.class, ((ConjunctionStep) step).getConjunctionHasTree()));
- } else {
- throw new IllegalArgumentException("This conjunction supports more complex steps than HasStep");
- }
- }
- }
- }
-
- @Override
- public String toString() {
- return (this.isAnd ? "and" : "or") + this.tree.toString();
- }
-
- public boolean isAnd() {
- return this.isAnd;
- }
-
- @Override
- public Iterator<Entry> iterator() {
- return this.tree.iterator();
- }
-
- public static class Entry {
- private Class entryClass;
- private Object entryValue;
-
- public Entry(final Class entryClass, final Object entryValue) {
- this.entryClass = entryClass;
- this.entryValue = entryValue;
- }
-
- public <V> V getValue() {
- return (V) this.entryValue;
- }
-
- public boolean isHasContainer() {
- return this.entryClass.equals(HasContainer.class);
- }
-
- public boolean isConjunctionTree() {
- return this.entryClass.equals(ConjunctionTree.class);
- }
-
- public String toString() {
- return this.entryValue.toString();
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
deleted file mode 100644
index a9c1b17..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
+++ /dev/null
@@ -1,46 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CyclicPathStep<S> extends FilterStep<S> {
-
- public CyclicPathStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- return !traverser.path().isSimple();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
deleted file mode 100644
index 205c492..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
+++ /dev/null
@@ -1,86 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class DedupGlobalStep<S> extends FilterStep<S> implements TraversalParent {
-
- private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
- private Set<Object> duplicateSet = new HashSet<>();
-
- public DedupGlobalStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- traverser.setBulk(1);
- return this.duplicateSet.add(TraversalUtil.apply(traverser, this.dedupTraversal));
- }
-
-
- @Override
- public List<Traversal<S, Object>> getLocalChildren() {
- return Collections.singletonList(this.dedupTraversal);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin dedupTraversal) {
- this.dedupTraversal = this.integrateChild(dedupTraversal);
- }
-
- @Override
- public DedupGlobalStep<S> clone() {
- final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
- clone.duplicateSet = new HashSet<>();
- clone.dedupTraversal = clone.integrateChild(this.dedupTraversal.clone());
- return clone;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.duplicateSet.clear();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.dedupTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
deleted file mode 100644
index 0d1cbd3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
+++ /dev/null
@@ -1,97 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ExceptStep<S> extends FilterStep<S> {
-
- private final String sideEffectKeyOrPathLabel;
- private final Collection<S> exceptCollection;
- private final S exceptObject;
- private final short choice;
-
- public ExceptStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
- this.exceptCollection = null;
- this.exceptObject = null;
- this.choice = 0;
- }
-
- public ExceptStep(final Traversal.Admin traversal, final Collection<S> exceptionCollection) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = null;
- this.exceptCollection = exceptionCollection;
- this.exceptObject = null;
- this.choice = 1;
- }
-
- public ExceptStep(final Traversal.Admin traversal, final S exceptionObject) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = null;
- this.exceptCollection = null;
- this.exceptObject = exceptionObject;
- this.choice = 2;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- switch (this.choice) {
- case 0: {
- final Object except = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
- traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
- traverser.path(this.sideEffectKeyOrPathLabel);
- return except instanceof Collection ?
- !((Collection) except).contains(traverser.get()) :
- !except.equals(traverser.get());
- }
- case 1:
- return !this.exceptCollection.contains(traverser.get());
- default:
- return !this.exceptObject.equals(traverser.get());
- }
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return null == this.sideEffectKeyOrPathLabel ?
- Collections.singleton(TraverserRequirement.OBJECT) :
- Stream.of(TraverserRequirement.OBJECT,
- TraverserRequirement.SIDE_EFFECTS,
- TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
deleted file mode 100644
index 482abf9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.function.Predicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FilterStep<S> extends AbstractStep<S, S> {
-
- public FilterStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() {
- while (true) {
- final Traverser.Admin<S> traverser = this.starts.next();
- if (this.filter(traverser)) {
- return traverser;
- }
- }
- }
-
- protected abstract boolean filter(final Traverser.Admin<S> traverser);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
deleted file mode 100644
index c127727..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
+++ /dev/null
@@ -1,69 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder { // TODO: make final when graph strategies are fixed up
-
- private final HasContainer hasContainer;
-
- public HasStep(final Traversal.Admin traversal, final HasContainer hasContainer) {
- super(traversal);
- this.hasContainer = hasContainer;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- return this.hasContainer.test(traverser.get());
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.hasContainer);
- }
-
- @Override
- public List<HasContainer> getHasContainers() {
- return Collections.singletonList(this.hasContainer);
- }
-
- @Override
- public void addHasContainer(final HasContainer hasContainer) {
- throw new UnsupportedOperationException(this.getClass().getSimpleName() + " does not support adding new HasContainers");
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
deleted file mode 100644
index 0ffe739..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class HasTraversalStep<S> extends AbstractStep<S, S> implements TraversalParent {
-
- private Traversal.Admin<S, ?> hasTraversal;
- private final boolean negate;
-
- public HasTraversalStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> hasTraversal, final boolean negate) {
- super(traversal);
- this.negate = negate;
- this.hasTraversal = this.integrateChild(hasTraversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- while (true) {
- final Traverser.Admin<S> start = this.starts.next();
- if (TraversalUtil.test(start, this.hasTraversal) != this.negate)
- return start;
- }
- }
-
- @Override
- public String toString() {
- final String stepString = TraversalHelper.makeStepString(this, this.hasTraversal);
- return this.negate ? stepString.replaceFirst("\\(", "(!") : stepString;
- }
-
- @Override
- public List<Traversal<S, ?>> getLocalChildren() {
- return Collections.singletonList(this.hasTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements();
- }
-
- @Override
- public HasTraversalStep<S> clone() {
- final HasTraversalStep<S> clone = (HasTraversalStep<S>) super.clone();
- clone.hasTraversal = clone.integrateChild(this.hasTraversal.clone());
- return clone;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
deleted file mode 100644
index 61e743d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
+++ /dev/null
@@ -1,66 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.function.BiPredicate;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class IsStep<S> extends FilterStep<S> {
-
- private final Object value;
- private final BiPredicate<S, Object> biPredicate;
-
- public IsStep(final Traversal.Admin traversal, final BiPredicate<S, Object> biPredicate, final Object value) {
- super(traversal);
- this.value = value;
- this.biPredicate = biPredicate;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- return this.biPredicate.test(traverser.get(), this.value);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.biPredicate, this.value);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.OBJECT);
- }
-
- public Object getValue() {
- return value;
- }
-
- public BiPredicate<S, Object> getPredicate() {
- return biPredicate;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
deleted file mode 100644
index 96ebf75..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
+++ /dev/null
@@ -1,52 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Predicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaFilterStep<S> extends FilterStep<S> {
-
- private final Predicate<Traverser<S>> predicate;
-
- public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
- super(traversal);
- this.predicate = predicate;
- }
-
- public Predicate<Traverser<S>> getPredicate() {
- return predicate;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- return this.predicate.test(traverser);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this,this.predicate);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
deleted file mode 100644
index a5c183e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
+++ /dev/null
@@ -1,39 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrStep<S> extends ConjunctionStep<S> implements TraversalParent {
-
- public OrStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... orTraversals) {
- super(traversal, orTraversals);
-
- }
-
- public static final class OrMarker<S> extends ConjunctionMarker<S> {
- public OrMarker(final Traversal.Admin traversal) {
- super(traversal);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
deleted file mode 100644
index aa2e84d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
+++ /dev/null
@@ -1,113 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Ranging;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging {
-
- private final long low;
- private final long high;
- private AtomicLong counter = new AtomicLong(0l);
-
- public RangeGlobalStep(final Traversal.Admin traversal, final long low, final long high) {
- super(traversal);
- if (low != -1 && high != -1 && low > high) {
- throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
- }
- this.low = low;
- this.high = high;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- if (this.high != -1 && this.counter.get() >= this.high) {
- throw FastNoSuchElementException.instance();
- }
-
- long avail = traverser.bulk();
- if (this.counter.get() + avail <= this.low) {
- // Will not surpass the low w/ this traverser. Skip and filter the whole thing.
- this.counter.getAndAdd(avail);
- return false;
- }
-
- // Skip for the low and trim for the high. Both can happen at once.
-
- long toSkip = 0;
- if (this.counter.get() < this.low) {
- toSkip = this.low - this.counter.get();
- }
-
- long toTrim = 0;
- if (this.high != -1 && this.counter.get() + avail >= this.high) {
- toTrim = this.counter.get() + avail - this.high;
- }
-
- long toEmit = avail - toSkip - toTrim;
- this.counter.getAndAdd(toSkip + toEmit);
- traverser.asAdmin().setBulk(toEmit);
-
- return true;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.counter.set(0l);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.low, this.high);
- }
-
- public long getLowRange() {
- return this.low;
- }
-
- public long getHighRange() {
- return this.high;
- }
-
- @Override
- public RangeGlobalStep<S> clone() {
- final RangeGlobalStep<S> clone = (RangeGlobalStep<S>) super.clone();
- clone.counter = new AtomicLong(0l);
- return clone;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.BULK);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
deleted file mode 100644
index 56d2eec..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
+++ /dev/null
@@ -1,97 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RetainStep<S> extends FilterStep<S> {
-
- private final String sideEffectKeyOrPathLabel;
- private final Collection<S> retainCollection;
- private final S retainObject;
- private final short choice;
-
- public RetainStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
- this.retainCollection = null;
- this.retainObject = null;
- this.choice = 0;
- }
-
- public RetainStep(final Traversal.Admin traversal, final Collection<S> retainCollection) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = null;
- this.retainCollection = retainCollection;
- this.retainObject = null;
- this.choice = 1;
- }
-
- public RetainStep(final Traversal.Admin traversal, final S retainObject) {
- super(traversal);
- this.sideEffectKeyOrPathLabel = null;
- this.retainCollection = null;
- this.retainObject = retainObject;
- this.choice = 2;
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- switch (this.choice) {
- case 0: {
- final Object retain = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
- traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
- traverser.path(this.sideEffectKeyOrPathLabel);
- return retain instanceof Collection ?
- ((Collection) retain).contains(traverser.get()) :
- retain.equals(traverser.get());
- }
- case 1:
- return this.retainCollection.contains(traverser.get());
- default:
- return this.retainObject.equals(traverser.get());
- }
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return null == this.sideEffectKeyOrPathLabel ?
- Collections.singleton(TraverserRequirement.OBJECT) :
- Stream.of(TraverserRequirement.OBJECT,
- TraverserRequirement.SIDE_EFFECTS,
- TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
deleted file mode 100644
index d15ce6c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
+++ /dev/null
@@ -1,117 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SampleGlobalStep<S> extends CollectingBarrierStep<S> implements TraversalParent {
-
- private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
- private final int amountToSample;
- private static final Random RANDOM = new Random();
-
- public SampleGlobalStep(final Traversal.Admin traversal, final int amountToSample) {
- super(traversal);
- this.amountToSample = amountToSample;
- }
-
- @Override
- public List<Traversal.Admin<S, Number>> getLocalChildren() {
- return Collections.singletonList(this.probabilityTraversal);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> probabilityTraversal) {
- this.probabilityTraversal = this.integrateChild(probabilityTraversal);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.amountToSample, this.probabilityTraversal);
- }
-
- @Override
- public void barrierConsumer(final TraverserSet<S> traverserSet) {
- // return the entire traverser set if the set is smaller than the amount to sample
- if (traverserSet.bulkSize() <= this.amountToSample)
- return;
- //////////////// else sample the set
- double totalWeight = 0.0d;
- for (final Traverser<S> s : traverserSet) {
- totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
- }
- ///////
- final TraverserSet<S> sampledSet = new TraverserSet<>();
- int runningAmountToSample = 0;
- while (runningAmountToSample < this.amountToSample) {
- boolean reSample = false;
- double runningWeight = 0.0d;
- for (final Traverser.Admin<S> s : traverserSet) {
- long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
- if (sampleBulk < s.bulk()) {
- final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
- for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
- runningWeight = runningWeight + currentWeight;
- if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
- final Traverser.Admin<S> split = s.asAdmin().split();
- split.asAdmin().setBulk(1l);
- sampledSet.add(split);
- runningAmountToSample++;
- totalWeight = totalWeight - currentWeight;
- reSample = true;
- break;
- }
- }
- if (reSample || (runningAmountToSample >= this.amountToSample))
- break;
- }
- }
- }
- traverserSet.clear();
- traverserSet.addAll(sampledSet);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
- }
-
- @Override
- public SampleGlobalStep<S> clone() {
- final SampleGlobalStep<S> clone = (SampleGlobalStep<S>) super.clone();
- clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone());
- return clone;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
deleted file mode 100644
index a1ae045..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
+++ /dev/null
@@ -1,47 +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.graph.traversal.step.filter;
-
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SimplePathStep<S> extends FilterStep<S> {
-
- public SimplePathStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected boolean filter(final Traverser.Admin<S> traverser) {
- return traverser.path().isSimple();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH);
- }
-}
[08/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
deleted file mode 100644
index a5bc114..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
+++ /dev/null
@@ -1,271 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.both;
-import static org.junit.Assert.*;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ProfileTest extends AbstractGremlinProcessTest {
- public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile();
-
- public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile();
-
- public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile();
-
- public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_modern_profile() {
- final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
- printTraversalForm(traversal);
-
- traversal.iterate();
-
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- Metrics metrics = traversalMetrics.getMetrics(0);
- assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- metrics = traversalMetrics.getMetrics(1);
- assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- metrics = traversalMetrics.getMetrics(2);
- assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- double totalPercentDuration = 0;
- for (Metrics m : traversalMetrics.getMetrics()) {
- totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
- }
- assertEquals(100, totalPercentDuration, 0.000001);
- }
-
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_out_out_grateful_profile() {
- final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
- printTraversalForm(traversal);
-
- traversal.iterate();
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- Metrics metrics = traversalMetrics.getMetrics(0);
- assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- metrics = traversalMetrics.getMetrics(1);
- assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- metrics = traversalMetrics.getMetrics(2);
- assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- double totalPercentDuration = 0;
- for (Metrics m : traversalMetrics.getMetrics()) {
- totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
- }
- assertEquals(100, totalPercentDuration, 0.000001);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_sleep_sleep_profile() {
- final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_sleep_sleep_profile();
- printTraversalForm(traversal);
-
- traversal.iterate();
-
- assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
-
- TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- // Grab the second (sideEffect{sleep}) step and check the times.
- Metrics metrics = traversalMetrics.getMetrics(1);
- // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation
- assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
- metrics.getDuration(TimeUnit.MILLISECONDS) >= 60);
- assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
- metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
-
- // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
- metrics = traversalMetrics.getMetrics(2);
- assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
- metrics.getDuration(TimeUnit.MILLISECONDS) >= 30);
- assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
- metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
-
- double totalPercentDuration = 0;
- for (Metrics m : traversalMetrics.getMetrics()) {
- totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
- }
- assertEquals(100, totalPercentDuration, 0.000001);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_repeat_both_modern_profile() {
- final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_repeat_both_profile();
- printTraversalForm(traversal);
-
- traversal.iterate();
-
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- Metrics metrics = traversalMetrics.getMetrics(0);
- assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- metrics = traversalMetrics.getMetrics(1);
- assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
- assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- // Test the nested global metrics of the repeat step
- Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
- assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
-
- Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
- assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
- assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-
- double totalPercentDuration = 0;
- for (Metrics m : traversalMetrics.getMetrics()) {
- totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
- }
- assertEquals(100, totalPercentDuration, 0.000001);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
- final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
- printTraversalForm(traversal);
-
- traversal.iterate();
-
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
-
- Metrics metrics = traversalMetrics.getMetrics(0);
- assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-
- metrics = traversalMetrics.getMetrics(1);
- assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
- assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-
- assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends ProfileTest {
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
- return (Traversal) g.V().out().out().profile();
- }
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
- return (Traversal) g.V().repeat(both()).times(3).profile();
- }
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
- return (Traversal) g.V().sideEffect(new Consumer<Traverser<Vertex>>() {
- @Override
- public void accept(final Traverser<Vertex> vertexTraverser) {
- try {
- Thread.sleep(10);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).sideEffect(new Consumer<Traverser<Vertex>>() {
- @Override
- public void accept(final Traverser<Vertex> vertexTraverser) {
- try {
- Thread.sleep(5);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).profile();
- }
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
- return (Traversal) g.V().has(__.in("created").count().is(1l)).values("name").profile();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
deleted file mode 100644
index fdd7a53..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
+++ /dev/null
@@ -1,105 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Operator;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SackTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
-
- public abstract Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
-
- public abstract Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
- final Traversal<Vertex, Double> traversal = get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
- assertEquals(3.5d, traversal.next(), 0.00001d);
- assertFalse(traversal.hasNext());
- }
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
- final Traversal<Vertex, Float> traversal = get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
- super.checkResults(Arrays.asList(2.0f, 1.4f), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
- final Traversal<Vertex, Map> traversal = get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
- int counter = 0;
- while (traversal.hasNext()) {
- final Map map = traversal.next();
- assertEquals(1, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.get("a").equals("ripple") || map.get("a").equals("lop"));
- counter++;
- }
- assertEquals(2, counter);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SackTest {
- @Override
- public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
- return g.V().withSack(0.0f).outE().sack(Operator.sum, "weight").inV().sack().sum();
- }
-
- @Override
- public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
- return g.V().withSack(0.0f).repeat(outE().sack(Operator.sum, "weight").inV()).times(2).sack();
- }
-
- @Override
- public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
- return g.V().<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).out().out().<Map>sack((map, vertex) -> {
- map.put("a", vertex.value("name"));
- return map;
- }).sack();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
deleted file mode 100644
index a713ced..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SideEffectCapTest extends AbstractGremlinProcessTest {
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
-
- public abstract Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
- final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
- printTraversalForm(traversal);
- Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(map.get("marko"), new Long(1l));
- assertEquals(map.get("vadas"), new Long(1l));
- assertEquals(map.get("peter"), new Long(1l));
- assertEquals(map.get("josh"), new Long(1l));
- assertEquals(map.size(), 4);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
- final Traversal<Vertex, Map<String, Map<Object, Long>>> traversal = get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- Map<String, Map<Object, Long>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.containsKey("b"));
- assertEquals(4, map.get("a").size());
- assertEquals(2, map.get("b").size());
- assertEquals(1l, map.get("a").get(27).longValue());
- assertEquals(1l, map.get("a").get(29).longValue());
- assertEquals(1l, map.get("a").get(32).longValue());
- assertEquals(1l, map.get("a").get(35).longValue());
- assertEquals(1l, map.get("b").get("ripple").longValue());
- assertEquals(1l, map.get("b").get("lop").longValue());
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SideEffectCapTest {
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
- return g.V().has("age").groupCount("a").by("name").out().cap("a");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
- return g.V().choose(has(T.label, "person"),
- values("age").groupCount("a"),
- values("name").groupCount("b")).cap("a", "b");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
deleted file mode 100644
index d60abaf..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
+++ /dev/null
@@ -1,116 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SideEffectTest extends AbstractGremlinTest {
- public abstract Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_sideEffectXstore_aX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_sideEffectXstore_aX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals(traversal.next(), "marko");
- assertFalse(traversal.hasNext());
- assertEquals(convertToVertexId("marko"), traversal.asAdmin().getSideEffects().<List<Vertex>>get("a").get(0).id());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_sideEffectXincr_cX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXincr_cX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
- assertEquals(new Integer(3), traversal.asAdmin().getSideEffects().<List<Integer>>get("c").get(0));
- }
-
- private void assert_g_v1_out_sideEffectXincr_cX_valueXnameX(final Iterator<String> traversal) {
- final List<String> names = new ArrayList<>();
- while (traversal.hasNext()) {
- names.add(traversal.next());
- }
- assertEquals(3, names.size());
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("lop"));
- assertTrue(names.contains("vadas"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_sideEffectXX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends SideEffectTest {
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
- return g.V(v1Id).withSideEffect("a", ArrayList::new).sideEffect(traverser -> {
- traverser.<List>sideEffects("a").clear();
- traverser.<List<Vertex>>sideEffects("a").add(traverser.get());
- }).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
- return g.V(v1Id).withSideEffect("c", () -> {
- final List<Integer> list = new ArrayList<>();
- list.add(0);
- return list;
- }).out().sideEffect(traverser -> {
- Integer temp = traverser.<List<Integer>>sideEffects("c").get(0);
- traverser.<List<Integer>>sideEffects("c").clear();
- traverser.<List<Integer>>sideEffects("c").add(temp + 1);
- }).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
- return g.V(v1Id).out().sideEffect(traverser -> {
- }).values("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
deleted file mode 100644
index 8f1f8cf..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
+++ /dev/null
@@ -1,137 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.inE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class StoreTest extends AbstractGremlinProcessTest {
- public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX();
-
- public abstract Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id);
-
- public abstract Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
-
- public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_storeXa_nameX_out_capXaX() {
- final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXnameX_out_capXaX();
- printTraversalForm(traversal);
- Collection names = traversal.next();
- assertEquals(6, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("peter"));
- assertTrue(names.contains("lop"));
- assertTrue(names.contains("ripple"));
- assertTrue(names.contains("vadas"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX() {
- final Traversal<Vertex, Collection> traversal = get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- Collection names = traversal.next();
- assertEquals(4, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("vadas"));
- assertTrue(names.contains("lop"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_withXa_setX_both_name_storeXaX() {
- final Traversal<Vertex, Set<String>> traversal = get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
- printTraversalForm(traversal);
- final Set<String> names = traversal.next();
- assertFalse(traversal.hasNext());
- assertFalse(names instanceof BulkSet);
- assertEquals(6, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("vadas"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("lop"));
- assertTrue(names.contains("ripple"));
- assertTrue(names.contains("peter"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX() {
- final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Collection store = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(8, store.size());
- assertTrue(store.contains(0L));
- assertTrue(store.contains(1L));
- assertTrue(store.contains(2L));
- assertTrue(store.contains(1.0d));
- assertFalse(store.isEmpty());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends StoreTest {
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
- return g.V().store("a").by("name").out().cap("a");
- }
-
- @Override
- public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id) {
- return g.V(v1Id).store("a").by("name").out().store("a").by("name").values("name").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
- return g.V().withSideEffect("a", HashSetSupplier.instance()).both().<String>values("name").store("a").cap("a");
- }
-
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
- return g.V().store("a").by(outE("created").count()).out().out().store("a").by(inE("created").values("weight").sum()).cap("a");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
deleted file mode 100644
index 537f4fa..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
+++ /dev/null
@@ -1,116 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.commons.configuration.Configuration;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.ElementFeatures.FEATURE_USER_SUPPLIED_IDS;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SubgraphTest extends AbstractGremlinProcessTest {
- public abstract Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph);
-
- public abstract Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph);
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
- public void g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX() throws Exception {
- final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
- graphProvider.clear(config);
- Graph subgraph = graphProvider.openTestGraph(config);
- /////
- Traversal<Vertex, Graph> traversal = get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(convertToVertexId("marko"), subgraph);
- printTraversalForm(traversal);
- subgraph = traversal.next();
- assertVertexEdgeCounts(3, 2).accept(subgraph);
- subgraph.edges().forEachRemaining(e -> {
- assertEquals("knows", e.label());
- assertEquals("marko", e.outVertex().values("name").next());
- assertEquals(new Integer(29), e.outVertex().<Integer>values("age").next());
- assertEquals("person", e.outVertex().label());
-
- final String name = e.inVertex().<String>values("name").next();
- if (name.equals("vadas"))
- assertEquals(0.5d, e.value("weight"), 0.0001d);
- else if (name.equals("josh"))
- assertEquals(1.0d, e.value("weight"), 0.0001d);
- else
- fail("There's a vertex present that should not be in the subgraph");
- });
- graphProvider.clear(subgraph, config);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
- public void g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup() throws Exception {
- final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
- graphProvider.clear(config);
- final Graph subgraph = graphProvider.openTestGraph(config);
- /////
- Traversal<Vertex, String> traversal = get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(subgraph);
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
- final Graph subGraph = traversal.asAdmin().getSideEffects().get("sg");
- assertVertexEdgeCounts(5, 4).accept(subGraph);
-
- graphProvider.clear(subgraph, config);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends SubgraphTest {
-
- @Override
- public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph) {
- return g.V(v1Id).withSideEffect("sg", () -> subgraph).outE("knows").subgraph("sg").values("name").cap("sg");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph) {
- return g.V().withSideEffect("sg", () -> subgraph).repeat(bothE("created").subgraph("sg").outV()).times(5).<String>values("name").dedup();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
deleted file mode 100644
index 7f46632..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
+++ /dev/null
@@ -1,139 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class TreeTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX();
-
- public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX();
-
- public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree();
-
- public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX();
-
- public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id);
-
- @Test
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_out_tree_byXnameX() {
- List<Traversal<Vertex, Tree>> traversals = Arrays.asList(
- get_g_VX1X_out_out_tree_byXnameX(convertToVertexId("marko")),
- get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(convertToVertexId("marko")));
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Tree tree = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(1, tree.size());
- assertTrue(tree.containsKey("marko"));
- assertEquals(1, ((Map) tree.get("marko")).size());
- assertTrue(((Map) tree.get("marko")).containsKey("josh"));
- assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("lop"));
- assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("ripple"));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_tree_byXidX() {
- List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree_byXidX(), get_g_V_out_out_treeXaX_byXidX_capXaX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Tree tree = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(1, tree.size());
- assertTrue(tree.containsKey(convertToVertexId("marko")));
- assertEquals(1, ((Map) tree.get(convertToVertexId("marko"))).size());
- assertTrue(((Map) tree.get(convertToVertexId("marko"))).containsKey(convertToVertexId("josh")));
- assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("lop")));
- assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("ripple")));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_treeXaX_capXaX() {
- List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree(), get_g_V_out_out_treeXaX_capXaX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Tree tree = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(1, tree.size());
- assertTrue(tree.containsKey(convertToVertex(graph, "marko")));
- assertEquals(1, ((Map) tree.get(convertToVertex(graph, "marko"))).size());
- assertTrue(((Map) tree.get(convertToVertex(graph, "marko"))).containsKey(convertToVertex(graph, "josh")));
- assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "lop")));
- assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "ripple")));
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends TreeTest {
- @Override
- public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
- return (Traversal) g.V(v1Id).out().out().tree().by("name");
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
- return g.V(v1Id).out().out().tree("a").by("name").both().both().cap("a");
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
- return (Traversal) g.V().out().out().tree().by(T.id);
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
- return (Traversal) g.V().out().out().tree("a").by(T.id).cap("a");
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
- return (Traversal) g.V().out().out().tree();
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
- return (Traversal) g.V().out().out().tree("a").cap("a");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
deleted file mode 100644
index f5bdefc..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
+++ /dev/null
@@ -1,58 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class TraversalSideEffectsTest extends AbstractGremlinProcessTest {
- public abstract TraversalSideEffects get_g_V_asAdmin_getSideEffects();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_sideEffects() {
- final TraversalSideEffects sideEffects = get_g_V_asAdmin_getSideEffects();
- try {
- assertFalse(sideEffects.get("a"));
- } catch (IllegalArgumentException e) {
- assertEquals(TraversalSideEffects.Exceptions.sideEffectDoesNotExist("a").getMessage(), e.getMessage());
- }
- assertEquals(StringFactory.traversalSideEffectsString(sideEffects), sideEffects.toString());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends TraversalSideEffectsTest {
- @Override
- public TraversalSideEffects get_g_V_asAdmin_getSideEffects() {
- return g.V().asAdmin().getSideEffects();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
deleted file mode 100644
index 4268ba6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
+++ /dev/null
@@ -1,131 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class TraversalVerificationStrategyTest extends AbstractGremlinProcessTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends TraversalVerificationStrategyTest {
- @Test
- @LoadGraphWith(MODERN)
- public void shouldAllowNestedGlobalTraversalToHaveBarriers() {
- try {
- g.V().values("age").union(max(), min(), sum()).iterate();
- } catch (IllegalStateException e) {
- fail("Nested global traversals can have barrier steps on STANDARD:" + e.getMessage());
- }
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void shouldAllowMidTraversalBarriersOnComputer() {
- try {
- g.V().count().sum().iterate();
- } catch (IllegalStateException e) {
- fail("Mid-traversal barrier steps are OK on STANDARD: " + e.getMessage());
- }
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void shouldAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
- try {
- g.V().local(out().out()).iterate();
- } catch (IllegalStateException e) {
- fail("Local traversals leaving the star-graph are OK on STANDARD: " + e.getMessage());
- }
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends TraversalVerificationStrategyTest {
-
- @Test
- @LoadGraphWith(MODERN)
- public void shouldNotAllowNestedGlobalTraversalToHaveBarriers() {
- try {
- final GraphTraversal t = g.V().values("age").union(max(), min(), sum()).iterate();
- fail("Nested global traversals should not be allowed to contain barriers (COMPUTER): " + t);
- } catch (IllegalStateException e) {
- assertTrue(true);
- }
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void shouldNotAllowMidTraversalBarriersOnComputer() {
- try {
- final GraphTraversal t = g.V().count().sum().iterate();
- fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
- } catch (IllegalStateException e) {
- assertTrue(true);
- }
-
- try {
- final GraphTraversal t = g.V().count().sum().map(x -> x.get() * 19).iterate();
- fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
- } catch (IllegalStateException e) {
- assertTrue(true);
- }
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void shouldNotAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
- try {
- final GraphTraversal t = g.V().local(out().out()).iterate();
- fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
- } catch (IllegalStateException e) {
- assertTrue(true);
- }
-
- try {
- final GraphTraversal t = g.V().local(out().values("name")).iterate();
- fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
- } catch (IllegalStateException e) {
- assertTrue(true);
- }
-
- try {
- g.V().local(outE().values("weight")).iterate();
- g.V().local(out().id()).iterate();
- g.V().local(outE().inV()).iterate();
- } catch (IllegalStateException e) {
- fail("Local traversals on the star-graph are OK on COMPUTER: " + e.getMessage());
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index 9e39071..16b1fc3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -22,11 +22,9 @@ import org.apache.tinkerpop.gremlin.ExceptionCoverage;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -41,7 +39,7 @@ import java.util.Random;
import java.util.Set;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS;
import static org.junit.Assert.*;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
deleted file mode 100644
index 7218ff2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
+++ /dev/null
@@ -1,50 +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;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalTest {
-
- @Test
- public void shouldCloneTraversalCorrectly() throws CloneNotSupportedException {
- final DefaultGraphTraversal<?, ?> original = new DefaultGraphTraversal<>(EmptyGraph.instance());
- original.out().groupCount("m").values("name").count();
- final DefaultTraversal<?, ?> clone = (DefaultTraversal) original.clone();
- assertNotEquals(original.hashCode(), clone.hashCode());
- assertEquals(original.getSteps().size(), clone.getSteps().size());
-
- for (int i = 0; i < original.steps.size(); i++) {
- assertNotEquals(original.getSteps().get(i), clone.getSteps().get(i));
- }
- assertNotEquals(original.sideEffects, clone.sideEffects);
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
new file mode 100644
index 0000000..16bf2fe
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class TraversalSideEffectsTest extends AbstractGremlinProcessTest {
+ public abstract TraversalSideEffects get_g_V_asAdmin_getSideEffects();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_sideEffects() {
+ final TraversalSideEffects sideEffects = get_g_V_asAdmin_getSideEffects();
+ try {
+ assertFalse(sideEffects.get("a"));
+ } catch (IllegalArgumentException e) {
+ assertEquals(TraversalSideEffects.Exceptions.sideEffectDoesNotExist("a").getMessage(), e.getMessage());
+ }
+ assertEquals(StringFactory.traversalSideEffectsString(sideEffects), sideEffects.toString());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends TraversalSideEffectsTest {
+ @Override
+ public TraversalSideEffects get_g_V_asAdmin_getSideEffects() {
+ return g.V().asAdmin().getSideEffects();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
new file mode 100644
index 0000000..4149fb5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.label;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class BranchTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+
+ public abstract Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+ Traversal<Vertex, Object> traversal = get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+ Traversal<Vertex, Object> traversal = get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends BranchTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+ return g.V().branch(v -> v.get().label().equals("person") ? "a" : "b")
+ .option("a", values("age"))
+ .option("b", values("lang"))
+ .option("b", values("name"));
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+ return g.V().branch(label().is("person").count())
+ .option(1L, values("age"))
+ .option(0L, values("lang"))
+ .option(0L, values("name"));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
new file mode 100644
index 0000000..be5e192
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class ChooseTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+ final Traversal<Vertex, Object> traversal = get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
+ printTraversalForm(traversal);
+ Map<String, Long> counts = new HashMap<>();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ MapHelper.incr(counts, traversal.next().toString(), 1l);
+ counter++;
+ }
+ assertFalse(traversal.hasNext());
+ assertEquals(2, counter);
+ assertEquals(2, counts.size());
+ assertEquals(Long.valueOf(1), counts.get("{name=[marko], age=[29]}"));
+ assertEquals(Long.valueOf(1), counts.get("josh"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends ChooseTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+ return g.V().choose(out().count())
+ .option(2L, values("name"))
+ .option(3L, valueMap());
+ }
+ }
+}
\ No newline at end of file
[32/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
deleted file mode 100644
index 44ce828..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
+++ /dev/null
@@ -1,43 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractTraversalStrategy implements TraversalStrategy {
-
- @Override
- public String toString() {
- return StringFactory.traversalStrategyString(this);
- }
-
- @Override
- public int hashCode() {
- return this.getClass().hashCode();
- }
-
- @Override
- public boolean equals(final Object object) {
- return this.getClass().equals(object.getClass());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
deleted file mode 100644
index 6ea93a8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
+++ /dev/null
@@ -1,54 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy {
-
- private static final ComparatorHolderRemovalStrategy INSTANCE = new ComparatorHolderRemovalStrategy();
-
- private ComparatorHolderRemovalStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getEngine().isStandard())
- return;
-
- if (TraversalHelper.hasStepOfAssignableClass(ComparatorHolder.class, traversal)) {
- final Step endStep = traversal.getEndStep();
- TraversalHelper.getStepsOfAssignableClass(ComparatorHolder.class, traversal)
- .stream()
- .filter(step -> step != endStep)
- .forEach(step -> traversal.removeStep((Step)step));
- }
- }
-
- public static ComparatorHolderRemovalStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
deleted file mode 100644
index 8b10fb7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
+++ /dev/null
@@ -1,83 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ConjunctionStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ConjunctionStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
- private static final ConjunctionStrategy INSTANCE = new ConjunctionStrategy();
-
- private ConjunctionStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- processConjunctionMarker(AndStep.AndMarker.class, traversal);
- processConjunctionMarker(OrStep.OrMarker.class, traversal);
- }
-
- private static final boolean legalCurrentStep(final Step<?, ?> step) {
- return !(step instanceof EmptyStep || step instanceof OrStep.OrMarker || step instanceof AndStep.AndMarker || step instanceof StartStep);
- }
-
- private static final void processConjunctionMarker(final Class<? extends ConjunctionStep.ConjunctionMarker> markerClass, final Traversal.Admin<?, ?> traversal) {
- TraversalHelper.getStepsOfClass(markerClass, traversal).forEach(markerStep -> {
- Step<?, ?> currentStep = markerStep.getNextStep();
- final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> nextStep = currentStep.getNextStep();
- rightTraversal.addStep(currentStep);
- traversal.removeStep(currentStep);
- currentStep = nextStep;
- }
-
- currentStep = markerStep.getPreviousStep();
- final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
- while (legalCurrentStep(currentStep)) {
- final Step<?, ?> previousStep = currentStep.getPreviousStep();
- leftTraversal.addStep(0, currentStep);
- traversal.removeStep(currentStep);
- currentStep = previousStep;
- }
- TraversalHelper.replaceStep(markerStep,
- markerClass.equals(AndStep.AndMarker.class) ?
- new AndStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal) :
- new OrStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal),
- traversal);
- });
- }
-
- public static ConjunctionStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java
deleted file mode 100644
index 22935da..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java
+++ /dev/null
@@ -1,74 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class DedupOptimizerStrategy extends AbstractTraversalStrategy {
-
- private static final DedupOptimizerStrategy INSTANCE = new DedupOptimizerStrategy();
-
- private DedupOptimizerStrategy() {
- }
-
- private static final List<Class<? extends Step>> BIJECTIVE_PIPES = Arrays.asList(IdentityStep.class, OrderGlobalStep.class);
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.hasStepOfClass(DedupGlobalStep.class, traversal))
- return;
-
- boolean done = false;
- while (!done) {
- done = true;
- for (int i = 0; i < traversal.getSteps().size(); i++) {
- final Step step1 = traversal.getSteps().get(i);
- if (step1 instanceof DedupGlobalStep && !(((DedupGlobalStep) step1).getLocalChildren().get(0) instanceof IdentityTraversal)) {
- for (int j = i; j >= 0; j--) {
- final Step step2 = traversal.getSteps().get(j);
- if (BIJECTIVE_PIPES.stream().filter(c -> c.isAssignableFrom(step2.getClass())).findAny().isPresent()) {
- traversal.removeStep(step1);
- traversal.addStep(j, step1);
- done = false;
- break;
- }
- }
- }
- if (!done)
- break;
- }
- }
- }
-
- public static DedupOptimizerStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
deleted file mode 100644
index ea51480..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
+++ /dev/null
@@ -1,46 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EngineDependentStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
- private static final EngineDependentStrategy INSTANCE = new EngineDependentStrategy();
-
- private EngineDependentStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- traversal.getSteps().stream()
- .filter(step -> step instanceof EngineDependent)
- .forEach(step -> ((EngineDependent) step).onEngine(traversal.getEngine()));
- }
-
- public static EngineDependentStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
deleted file mode 100644
index c81c1e5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
+++ /dev/null
@@ -1,49 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
-
- private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
-
- private IdentityRemovalStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.hasStepOfClass(IdentityStep.class, traversal))
- return;
-
- TraversalHelper.getStepsOfClass(IdentityStep.class, traversal).stream()
- .filter(step -> !step.getLabel().isPresent())
- .forEach(traversal::removeStep);
- }
-
- public static IdentityRemovalStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
deleted file mode 100644
index 3f091e8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
+++ /dev/null
@@ -1,50 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.MarkerIdentityStep;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LabeledEndStepStrategy extends AbstractTraversalStrategy {
-
- private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
-
- private LabeledEndStepStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getEndStep().getLabel().isPresent())
- traversal.addStep(new MarkerIdentityStep<>(traversal));
- }
-
- public static LabeledEndStepStrategy instance() {
- return INSTANCE;
- }
-
- @Override
- public String toString() {
- return StringFactory.traversalStrategyString(this);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
deleted file mode 100644
index fa33567..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
+++ /dev/null
@@ -1,90 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
- private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
- private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
-
- static {
- PRIORS.add(IdentityRemovalStrategy.class);
- }
-
- private MatchWhereStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!TraversalHelper.hasStepOfClass(MatchStep.class, traversal))
- return;
-
- final List<MatchStep> matchSteps = TraversalHelper.getStepsOfClass(MatchStep.class, traversal);
- for (final MatchStep matchStep : matchSteps) {
- boolean foundWhereWithNoTraversal = false;
- Step currentStep = matchStep.getNextStep();
- while (currentStep instanceof WhereStep || currentStep instanceof SelectStep || currentStep instanceof SelectOneStep || currentStep instanceof IdentityStep) {
- if (currentStep instanceof WhereStep) {
- if (!((WhereStep) currentStep).getLocalChildren().isEmpty()) {
- matchStep.addTraversal(((WhereStep<?>) currentStep).getLocalChildren().get(0));
- traversal.removeStep(currentStep);
- } else {
- foundWhereWithNoTraversal = true;
- }
- } else if (currentStep instanceof SelectStep) {
- if (!((SelectStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
- break;
- } else if (currentStep instanceof SelectOneStep) {
- if (!((SelectOneStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
- break;
- }
- // else is the identity step
- currentStep = currentStep.getNextStep();
- }
- }
- }
-
- public static MatchWhereStrategy instance() {
- return INSTANCE;
- }
-
- @Override
- public Set<Class<? extends TraversalStrategy>> applyPrior() {
- return PRIORS;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
deleted file mode 100644
index 79c229b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
+++ /dev/null
@@ -1,111 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileStrategy extends AbstractTraversalStrategy {
-
-
- private static final ProfileStrategy INSTANCE = new ProfileStrategy();
- private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
-
- static {
- // Ensure that this strategy is applied last.
- PRIORS.add(ComparatorHolderRemovalStrategy.class);
- PRIORS.add(ConjunctionStrategy.class);
- PRIORS.add(DedupOptimizerStrategy.class);
- PRIORS.add(EngineDependentStrategy.class);
- PRIORS.add(IdentityRemovalStrategy.class);
- PRIORS.add(LabeledEndStepStrategy.class);
- PRIORS.add(MatchWhereStrategy.class);
- PRIORS.add(RangeByIsCountStrategy.class);
- }
-
- private ProfileStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (!(traversal.getParent() instanceof EmptyStep)) {
- // This strategy is applied to the top-level traversal only
- return;
- }
-
- if (!TraversalHelper.hasStepOfClass(ProfileStep.class, traversal)) {
- // No ProfileStep present
- return;
- }
-
- prepTraversalForProfiling(traversal);
- }
-
- // Walk the traversal steps and inject the .profile()-steps.
- private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
- // Remove user-specified .profile() steps
- final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
- for (ProfileStep step : profileSteps) {
- traversal.removeStep(step);
- }
-
- // Add .profile() step after every pre-existing step.
- final List<Step> steps = traversal.getSteps();
- final int numSteps = steps.size();
- for (int ii = 0; ii < numSteps; ii++) {
- // Get the original step
- Step step = steps.get(ii * 2);
-
- // Create and inject ProfileStep
- ProfileStep profileStep = new ProfileStep(traversal);
- traversal.addStep((ii * 2) + 1, profileStep);
-
- // Handle nested traversal
- if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- prepTraversalForProfiling(t);
- }
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- prepTraversalForProfiling(t);
- }
- }
- }
- }
-
- @Override
- public Set<Class<? extends TraversalStrategy>> applyPrior() {
- return PRIORS;
- }
-
- public static ProfileStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
deleted file mode 100644
index 28832e6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
+++ /dev/null
@@ -1,90 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-
-import java.util.*;
-import java.util.function.BiPredicate;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
- private static final Map<BiPredicate, Long> RANGE_PREDICATES = new HashMap<BiPredicate, Long>() {{
- put(Compare.inside, 0L);
- put(Compare.outside, 1L);
- put(Contains.within, 1L);
- put(Contains.without, 0L);
- }};
- private static final Set<Compare> INCREASED_OFFSET_SCALAR_PREDICATES =
- EnumSet.of(Compare.eq, Compare.neq, Compare.lte, Compare.gt);
-
- private static final RangeByIsCountStrategy INSTANCE = new RangeByIsCountStrategy();
-
- private RangeByIsCountStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- final int size = traversal.getSteps().size();
- Step prev = null;
- for (int i = 0; i < size; i++) {
- final Step curr = traversal.getSteps().get(i);
- if (curr instanceof CountGlobalStep && i < size - 1) {
- final Step next = traversal.getSteps().get(i + 1);
- if (next instanceof IsStep && !(prev instanceof RangeGlobalStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
- final IsStep isStep = (IsStep) next;
- final Object value = isStep.getValue();
- final BiPredicate predicate = isStep.getPredicate();
- if (value instanceof Number) {
- final long highRangeOffset = INCREASED_OFFSET_SCALAR_PREDICATES.contains(predicate) ? 1L : 0L;
- final long highRange = ((Number) value).longValue() + highRangeOffset;
- TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
- i++;
- } else {
- final Long highRangeOffset = RANGE_PREDICATES.get(predicate);
- if (value instanceof Collection && highRangeOffset != null) {
- final Object high = Collections.max((Collection) value);
- if (high instanceof Number) {
- final long highRange = ((Number) high).longValue() + highRangeOffset;
- TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
- i++;
- }
- }
- }
- }
- }
- prev = curr;
- }
- }
-
- public static RangeByIsCountStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
deleted file mode 100644
index 03c2507..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
+++ /dev/null
@@ -1,48 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-
-/**
- * A {@link org.apache.tinkerpop.gremlin.process.TraversalStrategy} that prevents a traversal from running beyond
- * a pre-configured time.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class TimeLimitedStrategy extends AbstractTraversalStrategy {
- private final long timeLimit;
-
- public TimeLimitedStrategy(final long timeLimit) {
- this.timeLimit = timeLimit;
- }
-
- public long getTimeLimit() {
- return timeLimit;
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getEndStep().getClass().equals(TimeLimitStep.class))
- return;
-
- traversal.addStep(new TimeLimitStep<>(traversal, timeLimit));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
deleted file mode 100644
index 3aeb166..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
+++ /dev/null
@@ -1,71 +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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalVerificationStrategy extends AbstractTraversalStrategy {
-
- private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
-
- private TraversalVerificationStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getEngine().isStandard())
- return;
-
- Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
- ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
- traversal.getEndStep();
- if (endStep instanceof ComputerResultStep) // TODO: this is not needed anymore (delete when you prove it)
- endStep = endStep.getPreviousStep();
-
- for (final Step<?, ?> step : traversal.getSteps()) {
- if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
- throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
- }
- if (step instanceof TraversalParent) {
- final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
- .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
- .findAny();
- if (traversalOptional.isPresent())
- throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
- }
- }
- }
-
- public static TraversalVerificationStrategy instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
deleted file mode 100644
index c959922..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
+++ /dev/null
@@ -1,66 +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.graph.traversal.util;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyGraphTraversal<S, E> extends EmptyTraversal<S, E> implements GraphTraversal.Admin<S, E>, GraphTraversal<S, E> {
-
- private static final EmptyGraphTraversal INSTANCE = new EmptyGraphTraversal<>();
-
- public static <A, B> EmptyGraphTraversal<A, B> instance() {
- return INSTANCE;
- }
-
- private EmptyGraphTraversal() {
-
- }
-
- @Override
- public GraphTraversal.Admin<S, E> asAdmin() {
- return this;
- }
-
- @Override
- public <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
- return instance();
- }
-
- @Override
- public GraphTraversal<S, E> withPath() {
- return instance();
- }
-
- @Override
- public GraphTraversal<S, E> iterate() {
- return this;
- }
-
- @Override
- @SuppressWarnings("CloneDoesntCallSuperClone")
- public EmptyGraphTraversal<S, E> clone() {
- return instance();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
deleted file mode 100644
index 1edf474..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
+++ /dev/null
@@ -1,113 +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.graph.util;
-
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiPredicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class HasContainer implements Serializable {
-
- public String key;
- public BiPredicate predicate;
- public Object value;
-
- public HasContainer(final String key, final BiPredicate predicate, final Object value) {
- this.key = key;
- this.predicate = predicate;
- this.value = value;
- if (null == this.value && !(this.predicate instanceof Contains)) {
- throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
- }
- }
-
- public HasContainer(final String key, final Contains contains) {
- this(key, contains, null);
- }
-
- public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
- this(accessor.getAccessor(), predicate, value);
- }
-
- public HasContainer(final T accessor, final Contains contains) {
- this(accessor.getAccessor(), contains, null);
- }
-
- public boolean test(final Element element) {
- if (null != this.value) {
- if (this.key.equals(T.id.getAccessor()))
- return this.predicate.test(element.id(), this.value);
- else if (this.key.equals(T.label.getAccessor()))
- return this.predicate.test(element.label(), this.value);
- else if (element instanceof VertexProperty && this.key.equals(T.value.getAccessor()))
- return this.predicate.test(((VertexProperty) element).value(), this.value);
- else if (element instanceof VertexProperty && this.key.equals(T.key.getAccessor()))
- return this.predicate.test(((VertexProperty) element).key(), this.value);
- else {
- if (element instanceof Vertex) {
- final Iterator<? extends Property> itty = element.properties(this.key);
- while (itty.hasNext()) {
- if (this.predicate.test(itty.next().value(), this.value))
- return true;
- }
- return false;
- } else {
- final Property property = element.property(this.key);
- return property.isPresent() && this.predicate.test(property.value(), this.value);
- }
- }
- } else {
- return Contains.within.equals(this.predicate) ?
- element.property(this.key).isPresent() :
- !element.property(this.key).isPresent();
- }
- }
-
- public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
- if (hasContainers.size() == 0)
- return true;
- else {
- for (final HasContainer hasContainer : hasContainers) {
- if (!hasContainer.test(element))
- return false;
- }
- return true;
- }
- }
-
- // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
- public String toString() {
- return this.value == null ?
- (this.predicate == Contains.within ?
- '[' + this.key + ']' :
- "[!" + this.key + ']') :
- '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
deleted file mode 100644
index bfb225a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
+++ /dev/null
@@ -1,134 +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.graph.util;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class Tree<T> extends HashMap<T, Tree<T>> implements Serializable {
-
- public Tree() {
- super();
- }
-
- @SafeVarargs
- public Tree(final T... children) {
- this();
- for (final T t : children) {
- this.put(t, new Tree<>());
- }
- }
-
- @SafeVarargs
- public Tree(final Map.Entry<T, Tree<T>>... children) {
- this();
- for (final Map.Entry<T, Tree<T>> entry : children) {
- this.put(entry.getKey(), entry.getValue());
- }
- }
-
-
- public List<Tree<T>> getTreesAtDepth(final int depth) {
- List<Tree<T>> currentDepth = Collections.singletonList(this);
- for (int i = 0; i < depth; i++) {
- if (i == depth - 1) {
- return currentDepth;
- } else {
- final List<Tree<T>> temp = new ArrayList<Tree<T>>();
- for (final Tree<T> t : currentDepth) {
- temp.addAll(t.values());
- }
- currentDepth = temp;
- }
- }
- return Collections.emptyList();
- }
-
- public List<T> getObjectsAtDepth(final int depth) {
- final List<T> list = new ArrayList<T>();
- for (final Tree<T> t : this.getTreesAtDepth(depth)) {
- list.addAll(t.keySet());
- }
- return list;
- }
-
- public List<Tree<T>> getLeafTrees() {
- final List<Tree<T>> leaves = new ArrayList<>();
- List<Tree<T>> currentDepth = Collections.singletonList(this);
- boolean allLeaves = false;
- while (!allLeaves) {
- allLeaves = true;
- final List<Tree<T>> temp = new ArrayList<>();
- for (final Tree<T> t : currentDepth) {
- if (t.isLeaf()) {
- for (Map.Entry<T, Tree<T>> t2 : t.entrySet()) {
- leaves.add(new Tree<T>(t2));
- }
- } else {
- allLeaves = false;
- temp.addAll(t.values());
- }
- }
- currentDepth = temp;
-
- }
- return leaves;
- }
-
- public List<T> getLeafObjects() {
- final List<T> leaves = new ArrayList<T>();
- for (final Tree<T> t : this.getLeafTrees()) {
- leaves.addAll(t.keySet());
- }
- return leaves;
- }
-
- public boolean isLeaf() {
- final Collection<Tree<T>> values = this.values();
- return values.iterator().next().isEmpty();
-
- }
-
- public void addTree(final Tree<T> tree) {
- tree.forEach((k, t) -> {
- if (this.containsKey(k)) {
- this.get(k).addTree(t);
- } else {
- this.put(k, t);
- }
- });
- }
-
- public List<Tree<T>> splitParents() {
- if (this.keySet().size() == 1) {
- return Collections.singletonList(this);
- } else {
- final List<Tree<T>> parents = new ArrayList<>();
- this.forEach((k, t) -> {
- final Tree<T> parentTree = new Tree<>();
- parentTree.put(k, t);
- parents.add(parentTree);
- });
- return parents;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
deleted file mode 100644
index a8aa67b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
+++ /dev/null
@@ -1,257 +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;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
-
- private E lastEnd = null;
- private long lastEndCount = 0l;
- private Step<?, E> finalEndStep = EmptyStep.instance();
- private final StepPosition stepPosition = new StepPosition();
-
- protected final transient Graph graph;
-
- protected List<Step> steps = new ArrayList<>();
- protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
- protected TraversalStrategies strategies;
- protected TraversalEngine traversalEngine;
-
- protected boolean locked = false;
-
- protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
-
- public DefaultTraversal(final Graph graph) {
- this.graph = graph;
- this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()));
- this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
- }
-
- @Override
- public Traversal.Admin<S, E> asAdmin() {
- return this;
- }
-
- @Override
- public void applyStrategies() throws IllegalStateException {
- if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
- TraversalHelper.reIdSteps(this.stepPosition, this);
- this.strategies.applyStrategies(this);
- for (final Step<?, ?> step : this.getSteps()) {
- if (step instanceof TraversalParent) {
- for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
- globalChild.setStrategies(this.strategies);
- globalChild.setEngine(this.traversalEngine);
- globalChild.applyStrategies();
- }
- for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
- localChild.setStrategies(this.strategies);
- localChild.setEngine(StandardTraversalEngine.instance());
- localChild.applyStrategies();
- }
- }
- }
- this.traversalEngine.processTraversal(this);
- this.finalEndStep = this.getEndStep();
- this.locked = true;
- }
-
- @Override
- public TraversalEngine getEngine() {
- return this.traversalEngine;
- }
-
- @Override
- public void setEngine(final TraversalEngine engine) {
- this.traversalEngine = engine;
- }
-
- @Override
- public List<Step> getSteps() {
- return Collections.unmodifiableList(this.steps);
- }
-
- @Override
- public boolean hasNext() {
- if (!this.locked) this.applyStrategies();
- return this.lastEndCount > 0l || this.finalEndStep.hasNext();
- }
-
- @Override
- public E next() {
- if (!this.locked) this.applyStrategies();
- if (this.lastEndCount > 0l) {
- this.lastEndCount--;
- return this.lastEnd;
- } else {
- final Traverser<E> next = this.finalEndStep.next();
- final long nextBulk = next.bulk();
- if (nextBulk == 1) {
- return next.get();
- } else {
- this.lastEndCount = nextBulk - 1;
- this.lastEnd = next.get();
- return this.lastEnd;
- }
- }
- }
-
- @Override
- public void reset() {
- this.steps.forEach(Step::reset);
- this.lastEndCount = 0l;
- }
-
- @Override
- public void addStart(final Traverser<S> start) {
- if (!this.locked) this.applyStrategies();
- if (!this.steps.isEmpty()) this.steps.get(0).addStart(start);
- }
-
- @Override
- public void addStarts(final Iterator<Traverser<S>> starts) {
- if (!this.locked) this.applyStrategies();
- if (!this.steps.isEmpty()) this.steps.get(0).addStarts(starts);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeTraversalString(this);
- }
-
- @Override
- public Step<S, ?> getStartStep() {
- return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(0);
- }
-
- @Override
- public Step<?, E> getEndStep() {
- return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(this.steps.size() - 1);
- }
-
- @Override
- public DefaultTraversal<S, E> clone() {
- try {
- final DefaultTraversal<S, E> clone = (DefaultTraversal<S, E>) super.clone();
- clone.steps = new ArrayList<>();
- clone.sideEffects = this.sideEffects.clone();
- clone.strategies = this.strategies.clone(); // TODO: does this need to be cloned?
- clone.lastEnd = null;
- clone.lastEndCount = 0l;
- for (final Step<?, ?> step : this.steps) {
- final Step<?, ?> clonedStep = step.clone();
- clonedStep.setTraversal(clone);
- final Step previousStep = clone.steps.isEmpty() ? EmptyStep.instance() : clone.steps.get(clone.steps.size() - 1);
- clonedStep.setPreviousStep(previousStep);
- previousStep.setNextStep(clonedStep);
- clone.steps.add(clonedStep);
- }
- clone.finalEndStep = clone.getEndStep();
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public boolean isLocked() {
- return this.locked;
- }
-
- @Override
- public void setSideEffects(final TraversalSideEffects sideEffects) {
- this.sideEffects = sideEffects;
- }
-
- @Override
- public TraversalSideEffects getSideEffects() {
- return this.sideEffects;
- }
-
- @Override
- public void setStrategies(final TraversalStrategies strategies) {
- this.strategies = strategies.clone();
- }
-
- @Override
- public TraversalStrategies getStrategies() {
- return this.strategies;
- }
-
- @Override
- public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
- if (this.locked) throw Exceptions.traversalIsLocked();
- step.setId(this.stepPosition.nextXId());
- this.steps.add(index, step);
- final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
- final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
- step.setPreviousStep(null != previousStep ? previousStep : EmptyStep.instance());
- step.setNextStep(null != nextStep ? nextStep : EmptyStep.instance());
- if (null != previousStep) previousStep.setNextStep(step);
- if (null != nextStep) nextStep.setPreviousStep(step);
- return (Traversal.Admin<S2, E2>) this;
- }
-
- @Override
- public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException {
- if (this.locked) throw Exceptions.traversalIsLocked();
- final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
- final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
- this.steps.remove(index);
- if (null != previousStep) previousStep.setNextStep(null == nextStep ? EmptyStep.instance() : nextStep);
- if (null != nextStep) nextStep.setPreviousStep(null == previousStep ? EmptyStep.instance() : previousStep);
- return (Traversal.Admin<S2, E2>) this;
- }
-
- @Override
- public void setParent(final TraversalParent step) {
- this.traversalParent = step;
- }
-
- @Override
- public TraversalParent getParent() {
- return this.traversalParent;
- }
-
- @Override
- public Optional<Graph> getGraph() {
- return Optional.ofNullable(this.graph);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
deleted file mode 100644
index c46ce06..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
+++ /dev/null
@@ -1,203 +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;
-
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.util.SideEffectHelper;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalSideEffects implements TraversalSideEffects {
-
- protected Map<String, Object> objectMap = new HashMap<>();
- protected Map<String, Supplier> supplierMap = new HashMap<>();
- protected UnaryOperator sackSplitOperator = null;
- protected Supplier sackInitialValue = null;
-
- public DefaultTraversalSideEffects() {
-
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void registerSupplier(final String key, final Supplier supplier) {
- this.supplierMap.put(key, supplier);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key) {
- return Optional.ofNullable(this.supplierMap.get(key));
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void registerSupplierIfAbsent(final String key, final Supplier supplier) {
- if (!this.supplierMap.containsKey(key))
- this.supplierMap.put(key, supplier);
- }
-
- @Override
- public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator) {
- this.sackInitialValue = initialValue;
- this.sackSplitOperator = splitOperator.orElse(null);
- }
-
- @Override
- public <S> Optional<Supplier<S>> getSackInitialValue() {
- return Optional.ofNullable(this.sackInitialValue);
- }
-
- @Override
- public <S> Optional<UnaryOperator<S>> getSackSplitOperator() {
- return Optional.ofNullable(this.sackSplitOperator);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public boolean exists(final String key) {
- return this.objectMap.containsKey(key) || this.supplierMap.containsKey(key);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void set(final String key, final Object value) {
- SideEffectHelper.validateSideEffect(key, value);
- this.objectMap.put(key, value);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public <V> V get(final String key) throws IllegalArgumentException {
- final V value = (V) this.objectMap.get(key);
- if (null != value)
- return value;
- else {
- if (this.supplierMap.containsKey(key)) {
- final V v = (V) this.supplierMap.get(key).get();
- this.objectMap.put(key, v);
- return v;
- } else {
- throw TraversalSideEffects.Exceptions.sideEffectDoesNotExist(key);
- }
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
- if (this.objectMap.containsKey(key))
- return (V) this.objectMap.get(key);
- else if (this.supplierMap.containsKey(key)) {
- final V value = (V) this.supplierMap.get(key).get();
- this.objectMap.put(key, value);
- return value;
- } else {
- final V value = orCreate.get();
- this.objectMap.put(key, value);
- return value;
- }
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void remove(final String key) {
- this.objectMap.remove(key);
- this.supplierMap.remove(key);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public Set<String> keys() {
- final Set<String> keys = new HashSet<>();
- keys.addAll(this.objectMap.keySet());
- keys.addAll(this.supplierMap.keySet());
- return Collections.unmodifiableSet(keys);
- }
-
- /**
- * {@inheritDoc}
- */
- @Override
- public void setLocalVertex(final Vertex vertex) {
- final Property<Map<String, Object>> property = vertex.property(SIDE_EFFECTS);
- if (property.isPresent()) {
- this.objectMap = property.value();
- } else {
- this.objectMap = new HashMap<>();
- vertex.property(SIDE_EFFECTS, this.objectMap);
- }
- }
-
- @Override
- public void mergeInto(final TraversalSideEffects sideEffects) {
- this.objectMap.forEach(sideEffects::set);
- this.supplierMap.forEach(sideEffects::registerSupplierIfAbsent);
- // TODO: add sack information?
- }
-
- @Override
- public String toString() {
- return StringFactory.traversalSideEffectsString(this);
- }
-
- @Override
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public DefaultTraversalSideEffects clone() {
- try {
- final DefaultTraversalSideEffects sideEffects = (DefaultTraversalSideEffects) super.clone();
- sideEffects.objectMap = new HashMap<>(this.objectMap);
- sideEffects.supplierMap = new HashMap<>(this.supplierMap);
- return sideEffects;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
deleted file mode 100644
index b736265..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
+++ /dev/null
@@ -1,105 +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;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalStrategies implements TraversalStrategies {
-
- protected List<TraversalStrategy> traversalStrategies = new ArrayList<>();
- protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
-
- @Override
- public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
- boolean added = false;
- for (final TraversalStrategy strategy : strategies) {
- if (!this.traversalStrategies.contains(strategy)) {
- this.traversalStrategies.add(strategy);
- added = true;
- }
- }
- if (added) TraversalStrategies.sortStrategies(this.traversalStrategies);
- return this;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses) {
- boolean removed = false;
- for (final Class<? extends TraversalStrategy> strategyClass : strategyClasses) {
- final Optional<TraversalStrategy> strategy = this.traversalStrategies.stream().filter(s -> s.getClass().equals(strategyClass)).findAny();
- if (strategy.isPresent()) {
- this.traversalStrategies.remove(strategy.get());
- removed = true;
- }
- }
- if (removed) TraversalStrategies.sortStrategies(this.traversalStrategies);
- return this;
- }
-
- @Override
- public List<TraversalStrategy> toList() {
- return Collections.unmodifiableList(this.traversalStrategies);
- }
-
- @Override
- public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
- this.traversalStrategies.forEach(traversalStrategy -> traversalStrategy.apply(traversal));
- }
-
- @Override
- public TraverserGeneratorFactory getTraverserGeneratorFactory() {
- return this.traverserGeneratorFactory;
- }
-
- @Override
- public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory) {
- this.traverserGeneratorFactory = traverserGeneratorFactory;
- }
-
- @Override
- public DefaultTraversalStrategies clone() {
- try {
- final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
- clone.traversalStrategies = new ArrayList<>();
- clone.traversalStrategies.addAll(this.traversalStrategies);
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public String toString() {
- return StringFactory.traversalStrategiesString(this);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java
new file mode 100644
index 0000000..1a9eae6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.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 java.util.NoSuchElementException;
+
+/**
+ * Retrieve a singleton, fast {@link java.util.NoSuchElementException} without a stack trace.
+ */
+public final class FastNoSuchElementException extends NoSuchElementException {
+
+ private static final long serialVersionUID = 2303108654138257697L;
+ private static final FastNoSuchElementException INSTANCE = new FastNoSuchElementException();
+
+ private FastNoSuchElementException() {
+ }
+
+ /**
+ * Retrieve a singleton, fast {@link NoSuchElementException} without a stack trace.
+ */
+ public static NoSuchElementException instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public synchronized Throwable fillInStackTrace() {
+ return this;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
new file mode 100644
index 0000000..8fce9d0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -0,0 +1,180 @@
+/*
+ * 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.javatuples.Pair;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ * A Path denotes a particular walk through a {@link org.apache.tinkerpop.gremlin.structure.Graph} as defined by a {@link Traverser}.
+ * In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
+ * The list of labels are the labels of the steps traversed.
+ * The list of objects are the objects traversed.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Path extends Cloneable {
+
+ /**
+ * Get the number of step in the path.
+ *
+ * @return the size of the path
+ */
+ public default int size() {
+ return this.objects().size();
+ }
+
+ /**
+ * Add a new step to the path with an object and any number of associated labels.
+ *
+ * @param object the new head of the path
+ * @param labels the labels at the head of the path
+ * @return the extended path
+ */
+ public Path extend(final Object object, final String... labels);
+
+ /**
+ * Get the object associated with the particular label of the path.
+ * If the path as multiple labels of the type, then return a {@link List} of those objects.
+ *
+ * @param label the label of the path
+ * @param <A> the type of the object associated with the label
+ * @return the object associated with the label of the path
+ * @throws IllegalArgumentException if the path does not contain the label
+ */
+ public default <A> A get(final String label) throws IllegalArgumentException {
+ final List<Object> objects = this.objects();
+ final List<Set<String>> labels = this.labels();
+ Object object = null;
+ for (int i = 0; i < labels.size(); i++) {
+ if (labels.get(i).contains(label)) {
+ if (null == object) {
+ object = objects.get(i);
+ } else if (object instanceof List) {
+ ((List) object).add(objects.get(i));
+ } else {
+ final List list = new ArrayList(2);
+ list.add(object);
+ list.add(objects.get(i));
+ object = list;
+ }
+ }
+ }
+ if (null == object)
+ throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+ return (A) object;
+ }
+
+ /**
+ * Get the object associated with the specified index into the path.
+ *
+ * @param index the index of the path
+ * @param <A> the type of the object associated with the index
+ * @return the object associated with the index of the path
+ */
+ public default <A> A get(final int index) {
+ return (A) this.objects().get(index);
+ }
+
+ /**
+ * Return true if the path has the specified label, else return false.
+ *
+ * @param label the label to search for
+ * @return true if the label exists in the path
+ */
+ public default boolean hasLabel(final String label) {
+ return this.labels().stream().filter(labels -> labels.contains(label)).findAny().isPresent();
+ }
+
+ /**
+ * Add label to the current head of the path.
+ *
+ * @param label the label to add to the head of the path
+ */
+ public void addLabel(final String label);
+
+ /**
+ * An ordered list of the objects in the path.
+ *
+ * @return the objects of the path
+ */
+ public List<Object> objects();
+
+ /**
+ * An ordered list of the labels associated with the path
+ *
+ * @return the labels of the path
+ */
+ public List<Set<String>> labels();
+
+ /**
+ * {@inheritDoc}
+ */
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public Path clone();
+
+ /**
+ * Determines whether the path is a simple or not.
+ * A simple path has no cycles and thus, no repeated objects.
+ *
+ * @return Whether the path is simple or not
+ */
+ public default boolean isSimple() {
+ final List<Object> objects = this.objects();
+ for (int i = 0; i < objects.size() - 1; i++) {
+ for (int j = i + 1; j < objects.size(); j++) {
+ if (objects.get(i).equals(objects.get(j)))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public default void forEach(final Consumer<Object> consumer) {
+ this.objects().forEach(consumer);
+ }
+
+ public default void forEach(final BiConsumer<Object, Set<String>> consumer) {
+ final List<Object> objects = this.objects();
+ final List<Set<String>> labels = this.labels();
+ for (int i = 0; i < objects.size(); i++) {
+ consumer.accept(objects.get(i), labels.get(i));
+ }
+ }
+
+ public default Stream<Pair<Object, Set<String>>> stream() {
+ final List<Set<String>> labels = this.labels();
+ final List<Object> objects = this.objects();
+ return IntStream.range(0, this.size()).mapToObj(i -> Pair.with(objects.get(i), labels.get(i)));
+ }
+
+ public static class Exceptions {
+
+ public static IllegalArgumentException stepWithProvidedLabelDoesNotExist(final String label) {
+ return new IllegalArgumentException("The step with label " + label + " does not exist");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
new file mode 100644
index 0000000..e2965e0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum Scope {
+
+ global, local
+}
[21/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
deleted file mode 100644
index ee601a7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
+++ /dev/null
@@ -1,87 +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.traverser;
-
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractPathTraverser;
-import org.apache.tinkerpop.gremlin.process.util.path.SparsePath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.WeakHashMap;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
-
- protected B_O_PA_S_SE_SL_Traverser() {
- }
-
- public B_O_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
- super(t, step);
- final Optional<String> stepLabel = step.getLabel();
- this.path = stepLabel.isPresent() ?
- getOrCreateFromCache(this.sideEffects).extend(t, stepLabel.get()) :
- getOrCreateFromCache(this.sideEffects).extend(t);
- }
-
- @Override
- public int hashCode() {
- return this.t.hashCode() + this.future.hashCode() + this.loops;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof B_O_PA_S_SE_SL_Traverser
- && ((B_O_PA_S_SE_SL_Traverser) object).get().equals(this.t)
- && ((B_O_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
- && ((B_O_PA_S_SE_SL_Traverser) object).loops() == this.loops()
- && (null == this.sack);
- }
-
- @Override
- public Traverser.Admin<T> attach(final Vertex vertex) {
- super.attach(vertex);
- final Path newSparsePath = getOrCreateFromCache(this.sideEffects);
- this.path.forEach((object, labels) -> newSparsePath.extend(object, labels.toArray(new String[labels.size()])));
- this.path = newSparsePath;
- return this;
- }
-
- //////////////////////
-
- private static final Map<TraversalSideEffects, SparsePath> PATH_CACHE = new WeakHashMap<>();
-
- private static SparsePath getOrCreateFromCache(final TraversalSideEffects sideEffects) {
- SparsePath path = PATH_CACHE.get(sideEffects);
- if (null == path) {
- path = SparsePath.make();
- PATH_CACHE.put(sideEffects, path);
- }
- return path;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
deleted file mode 100644
index 4a2d8e1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
+++ /dev/null
@@ -1,62 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
-
- private static final B_O_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_PA_S_SE_SL_TraverserGenerator();
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.OBJECT,
- TraverserRequirement.BULK,
- TraverserRequirement.SINGLE_LOOP,
- TraverserRequirement.PATH_ACCESS,
- TraverserRequirement.SACK,
- TraverserRequirement.SIDE_EFFECTS);
-
-
- private B_O_PA_S_SE_SL_TraverserGenerator() {
- }
-
- @Override
- public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
- final B_O_PA_S_SE_SL_Traverser<S> traverser = new B_O_PA_S_SE_SL_Traverser<>(start, startStep);
- traverser.setBulk(initialBulk);
- return traverser;
- }
-
- @Override
- public Set<TraverserRequirement> getProvidedRequirements() {
- return REQUIREMENTS;
- }
-
- public static B_O_PA_S_SE_SL_TraverserGenerator instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
deleted file mode 100644
index 4ea4a2f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
+++ /dev/null
@@ -1,58 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractPathTraverser;
-import org.apache.tinkerpop.gremlin.process.util.path.ImmutablePath;
-
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_P_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
-
- protected B_O_P_PA_S_SE_SL_Traverser() {
- }
-
- public B_O_P_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
- super(t, step);
- final Optional<String> stepLabel = step.getLabel();
- this.path = stepLabel.isPresent() ?
- ImmutablePath.make().extend(t, stepLabel.get()) :
- ImmutablePath.make().extend(t);
- }
-
- @Override
- public int hashCode() {
- return super.hashCode() + this.path.hashCode();
- }
-
- @Override
- public boolean equals(final Object object) {
- return (object instanceof B_O_P_PA_S_SE_SL_Traverser)
- && ((B_O_P_PA_S_SE_SL_Traverser) object).path().equals(this.path) // TODO: path equality
- && ((B_O_P_PA_S_SE_SL_Traverser) object).get().equals(this.t)
- && ((B_O_P_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
- && ((B_O_P_PA_S_SE_SL_Traverser) object).loops() == this.loops()
- && (null == this.sack);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
deleted file mode 100644
index caf3ab9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
+++ /dev/null
@@ -1,61 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_P_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
-
- private static final B_O_P_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_P_PA_S_SE_SL_TraverserGenerator();
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.OBJECT,
- TraverserRequirement.BULK,
- TraverserRequirement.SINGLE_LOOP,
- TraverserRequirement.PATH_ACCESS,
- TraverserRequirement.PATH,
- TraverserRequirement.SACK,
- TraverserRequirement.SIDE_EFFECTS);
-
- private B_O_P_PA_S_SE_SL_TraverserGenerator() {
- }
-
- @Override
- public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
- final B_O_P_PA_S_SE_SL_Traverser<S> traverser = new B_O_P_PA_S_SE_SL_Traverser<>(start, startStep);
- traverser.setBulk(initialBulk);
- return traverser;
- }
-
- @Override
- public Set<TraverserRequirement> getProvidedRequirements() {
- return REQUIREMENTS;
- }
-
- public static B_O_P_PA_S_SE_SL_TraverserGenerator instance() {
- return INSTANCE;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
deleted file mode 100644
index 4a2be92..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
+++ /dev/null
@@ -1,70 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_Traverser<T> extends O_Traverser<T> {
-
- protected long bulk = 1l;
- protected String future = HALT;
-
- protected B_O_Traverser() {
- }
-
- public B_O_Traverser(final T t, final long initialBulk) {
- super(t);
- this.bulk = initialBulk;
- }
-
- @Override
- public void setBulk(final long count) {
- this.bulk = count;
- }
-
- @Override
- public long bulk() {
- return this.bulk;
- }
-
- @Override
- public void merge(final Traverser.Admin<?> other) {
- this.bulk = this.bulk + other.bulk();
- }
-
- @Override
- public String getStepId() {
- return this.future;
- }
-
- @Override
- public void setStepId(final String stepId) {
- this.future = stepId;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof B_O_Traverser &&
- ((B_O_Traverser) object).t.equals(this.t) &&
- ((B_O_Traverser) object).future.equals(this.future);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
deleted file mode 100644
index 6c6aa1f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
+++ /dev/null
@@ -1,55 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_TraverserGenerator implements TraverserGenerator {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.OBJECT,
- TraverserRequirement.BULK);
-
- private static final B_O_TraverserGenerator INSTANCE = new B_O_TraverserGenerator();
-
- private B_O_TraverserGenerator() {
- }
-
- @Override
- public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
- return new B_O_Traverser<>(start, initialBulk);
- }
-
- @Override
- public Set<TraverserRequirement> getProvidedRequirements() {
- return REQUIREMENTS;
- }
-
- public static B_O_TraverserGenerator instance() {
- return INSTANCE;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
deleted file mode 100644
index b28d9b8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
+++ /dev/null
@@ -1,35 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractTraverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class O_Traverser<T> extends AbstractTraverser<T> {
-
- protected O_Traverser() {
- }
-
- public O_Traverser(final T t) {
- super(t);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
deleted file mode 100644
index e0c7dd3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
+++ /dev/null
@@ -1,52 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class O_TraverserGenerator implements TraverserGenerator {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = Collections.singleton(TraverserRequirement.OBJECT);
- private static final O_TraverserGenerator INSTANCE = new O_TraverserGenerator();
-
- private O_TraverserGenerator() {
- }
-
- @Override
- public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
- return new O_Traverser<>(start);
- }
-
- @Override
- public Set<TraverserRequirement> getProvidedRequirements() {
- return REQUIREMENTS;
- }
-
- public static O_TraverserGenerator instance() {
- return INSTANCE;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
deleted file mode 100644
index ce29b87..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
+++ /dev/null
@@ -1,33 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.io.Serializable;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraverserGeneratorFactory extends Serializable {
-
- public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?, ?> traversal);
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
deleted file mode 100644
index e37f83d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
+++ /dev/null
@@ -1,39 +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.traverser;
-
-/**
- * A {@link TraverserRequirement} is a list of requirements that a {@link org.apache.tinkerpop.gremlin.process.Traversal} requires of a {@link org.apache.tinkerpop.gremlin.process.Traverser}.
- * The less requirements, the simpler the traverser can be (both in terms of space and time constraints).
- * Every {@link org.apache.tinkerpop.gremlin.process.Step} provides its specific requirements via {@link org.apache.tinkerpop.gremlin.process.Step#getRequirements()}.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum TraverserRequirement {
-
- OBJECT,
- BULK,
- SINGLE_LOOP,
- NESTED_LOOP,
- PATH,
- PATH_ACCESS,
- SACK,
- SIDE_EFFECTS,
- // NESTED_TRAVERSALS
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
deleted file mode 100644
index 82608c0..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
+++ /dev/null
@@ -1,213 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
-
-import java.util.Optional;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractPathTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
- protected T t;
- protected Object sack = null;
- protected String future = HALT;
- protected short loops = 0; // an optimization hack to use a short internally to save bits :)
- protected transient TraversalSideEffects sideEffects;
- protected long bulk = 1l;
- protected Path path;
-
- protected AbstractPathTraverser() {
-
- }
-
- public AbstractPathTraverser(final T t, final Step<T, ?> step) {
- this.t = t;
- this.sideEffects = step.getTraversal().getSideEffects();
- this.sideEffects.getSackInitialValue().ifPresent(supplier -> this.sack = supplier.get());
- }
-
- /////////////////
-
- @Override
- public T get() {
- return this.t;
- }
-
- @Override
- public void set(final T t) {
- this.t = t;
- }
-
- /////////////////
-
- @Override
- public Path path() {
- return this.path;
- }
-
- /////////////////
-
- @Override
- public <S> S sack() {
- return (S) this.sack;
- }
-
- @Override
- public <S> void sack(final S object) {
- this.sack = object;
- }
-
- /////////////////
-
- @Override
- public void setBulk(final long count) {
- this.bulk = count;
- }
-
- @Override
- public long bulk() {
- return this.bulk;
- }
-
- /////////////////
-
- @Override
- public int loops() {
- return this.loops;
- }
-
- @Override
- public void incrLoops(final String stepLabel) {
- this.loops++;
- }
-
- @Override
- public void resetLoops() {
- this.loops = 0;
- }
-
- /////////////////
-
- @Override
- public String getStepId() {
- return this.future;
- }
-
- @Override
- public void setStepId(final String stepId) {
- this.future = stepId;
- }
-
- /////////////////
-
- @Override
- public TraversalSideEffects getSideEffects() {
- return this.sideEffects;
- }
-
-
- @Override
- public void setSideEffects(final TraversalSideEffects sideEffects) {
- this.sideEffects = sideEffects;
- }
-
- /////////////////
-
- @Override
- public Traverser.Admin<T> detach() {
- this.t = DetachedFactory.detach(this.t, false);
- this.path = DetachedFactory.detach(this.path, true);
- return this;
- }
-
- @Override
- public Traverser.Admin<T> attach(final Vertex vertex) {
- if (this.t instanceof DetachedElement)
- this.t = (T) ((DetachedElement) this.t).attach(vertex);
- else if (this.t instanceof DetachedProperty)
- this.t = (T) ((DetachedProperty) this.t).attach(vertex);
- // you do not want to attach a path because it will reference graph objects not at the current vertex
- return this;
- }
-
- /////////////////
-
- @Override
- public void merge(final Traverser.Admin<?> other) {
- this.bulk = this.bulk + other.bulk();
- }
-
- @Override
- public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
- try {
- final AbstractPathTraverser<R> clone = (AbstractPathTraverser<R>) super.clone();
- clone.t = r;
- final Optional<String> stepLabel = step.getLabel();
- clone.path = stepLabel.isPresent() ? clone.path.clone().extend(r, stepLabel.get()) : clone.path.clone().extend(r);
- clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public Traverser.Admin<T> split() {
- try {
- final AbstractPathTraverser<T> clone = (AbstractPathTraverser<T>) super.clone();
- clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- /////////////////
-
- @Override
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public AbstractPathTraverser<T> clone() {
- try {
- return (AbstractPathTraverser<T>) super.clone();
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public int hashCode() {
- return this.t.hashCode() + this.future.hashCode() + this.loops;
- }
-
- @Override
- public String toString() {
- return this.t.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
deleted file mode 100644
index 34022cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
+++ /dev/null
@@ -1,187 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.util.path.EmptyPath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
- protected T t;
-
- protected AbstractTraverser() {
-
- }
-
- public AbstractTraverser(final T t) {
- this.t = t;
- }
-
- /////////////
-
- @Override
- public void merge(final Admin<?> other) {
- throw new UnsupportedOperationException("This traverser does not support merging: " + this.getClass().getCanonicalName());
- }
-
- @Override
- public <R> Admin<R> split(final R r, final Step<T, R> step) {
- try {
- final AbstractTraverser<R> clone = (AbstractTraverser<R>) super.clone();
- clone.t = r;
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public Admin<T> split() {
- try {
- return (AbstractTraverser<T>) super.clone();
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public void set(final T t) {
- this.t = t;
- }
-
- @Override
- public void incrLoops(final String stepLabel) {
-
- }
-
- @Override
- public void resetLoops() {
-
- }
-
- @Override
- public String getStepId() {
- throw new UnsupportedOperationException("This traverser does not support futures: " + this.getClass().getCanonicalName());
- }
-
- @Override
- public void setStepId(final String stepId) {
-
- }
-
- @Override
- public void setBulk(final long count) {
-
- }
-
- @Override
- public Admin<T> detach() {
- this.t = DetachedFactory.detach(this.t, false);
- return this;
- }
-
- @Override
- public Admin<T> attach(final Vertex hostVertex) {
- if (this.t instanceof DetachedElement)
- this.t = (T) ((DetachedElement) this.t).attach(hostVertex);
- else if (this.t instanceof DetachedProperty)
- this.t = (T) ((DetachedProperty) this.t).attach(hostVertex);
- // you do not want to attach a path because it will reference graph objects not at the current vertex
- return this;
- }
-
- @Override
- public void setSideEffects(final TraversalSideEffects sideEffects) {
-
- }
-
- @Override
- public TraversalSideEffects getSideEffects() {
- return EmptyTraversalSideEffects.instance();
- //throw new UnsupportedOperationException("This traverser does not support sideEffects: " + this.getClass().getCanonicalName());
- }
-
- @Override
- public T get() {
- return this.t;
- }
-
- @Override
- public <S> S sack() {
- throw new UnsupportedOperationException("This traverser does not support sacks: " + this.getClass().getCanonicalName());
- }
-
- @Override
- public <S> void sack(final S object) {
-
- }
-
- @Override
- public Path path() {
- return EmptyPath.instance();
- }
-
- @Override
- public int loops() {
- throw new UnsupportedOperationException("This traverser does not support loops: " + this.getClass().getCanonicalName());
- }
-
- @Override
- public long bulk() {
- return 1l;
- }
-
- @Override
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public AbstractTraverser<T> clone() {
- try {
- return (AbstractTraverser<T>) super.clone();
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- ///////////
-
- @Override
- public int hashCode() {
- return this.t.hashCode();
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof AbstractTraverser && ((AbstractTraverser) object).get().equals(this.t);
- }
-
- @Override
- public String toString() {
- return this.t.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
deleted file mode 100644
index 341fcd5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
+++ /dev/null
@@ -1,64 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFactory {
-
- private static DefaultTraverserGeneratorFactory INSTANCE = new DefaultTraverserGeneratorFactory();
-
- public static DefaultTraverserGeneratorFactory instance() {
- return INSTANCE;
- }
-
- private DefaultTraverserGeneratorFactory() {
- }
-
- @Override
- public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?,?> traversal) {
- final Set<TraverserRequirement> requirements = traversal.getTraverserRequirements();
-
- if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
- return O_TraverserGenerator.instance();
-
- if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
- return B_O_TraverserGenerator.instance();
-
- if (B_O_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
- return B_O_PA_S_SE_SL_TraverserGenerator.instance();
-
- if (B_O_P_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
- return B_O_P_PA_S_SE_SL_TraverserGenerator.instance();
-
- throw new IllegalStateException("The provided traverser generator factory does not support the requirements of the traversal: " + this.getClass().getCanonicalName() + requirements);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
deleted file mode 100644
index 2d15ac4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
+++ /dev/null
@@ -1,153 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.util.path.EmptyPath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
- private static final EmptyTraverser INSTANCE = new EmptyTraverser();
-
- public static <R> EmptyTraverser<R> instance() {
- return INSTANCE;
- }
-
- private EmptyTraverser() {
-
- }
-
- @Override
- public void set(final T t) {
-
- }
-
- @Override
- public void incrLoops(final String stepLabel) {
-
- }
-
- @Override
- public void resetLoops() {
-
- }
-
- @Override
- public String getStepId() {
- return HALT;
- }
-
- @Override
- public void setStepId(final String stepId) {
-
- }
-
- @Override
- public void setBulk(long count) {
-
- }
-
- @Override
- public <R> Admin<R> split(final R r, final Step<T, R> step) {
- return INSTANCE;
- }
-
- @Override
- public Admin<T> split() {
- return this;
- }
-
- @Override
- public Admin<T> detach() {
- return this;
- }
-
- @Override
- public Admin<T> attach(final Vertex hostVertex) {
- return this;
- }
-
- @Override
- public void setSideEffects(final TraversalSideEffects sideEffects) {
-
- }
-
- @Override
- public T get() {
- return null;
- }
-
- @Override
- public <S> S sack() {
- return null;
- }
-
- @Override
- public <S> void sack(final S object) {
-
- }
-
- @Override
- public void merge(final Traverser.Admin<?> other) {
-
- }
-
- @Override
- public Path path() {
- return EmptyPath.instance();
- }
-
- @Override
- public int loops() {
- return 0;
- }
-
- @Override
- public long bulk() {
- return 0l;
- }
-
- @Override
- public TraversalSideEffects getSideEffects() {
- return null;
- }
-
- @Override
- public int hashCode() {
- return 380473707;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof EmptyTraverser;
- }
-
- @Override
- @SuppressWarnings("CloneDoesntCallSuperClone")
- public EmptyTraverser<T> clone() {
- return this;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
deleted file mode 100644
index 70be9cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
+++ /dev/null
@@ -1,186 +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.util;
-
-import java.io.Serializable;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.Spliterator;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-
-/**
- * BulkSet is a weighted set (i.e. a multi-set). Objects are added along with a bulk counter the denotes how many times the object was added to the set.
- * Given that count-based compression (vs. enumeration) can yield large sets, methods exist that are long-based (2^64).
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class BulkSet<S> extends AbstractSet<S> implements Set<S>, Serializable {
- private final Map<S, Long> map = new LinkedHashMap<>();
-
- @Override
- public int size() {
- return (int) this.longSize();
- }
-
- public int uniqueSize() {
- return this.map.size();
- }
-
- public long longSize() {
- return this.map.values().stream().collect(Collectors.summingLong(Long::longValue));
- }
-
- @Override
- public boolean isEmpty() {
- return this.map.isEmpty();
- }
-
- @Override
- public boolean contains(final Object s) {
- return this.map.containsKey(s);
- }
-
- @Override
- public boolean add(final S s) {
- return this.add(s, 1l);
- }
-
- @Override
- public boolean addAll(final Collection<? extends S> collection) {
- if (collection instanceof BulkSet) {
- ((BulkSet<S>) collection).map.forEach(this::add);
- } else {
- collection.iterator().forEachRemaining(this::add);
- }
- return true;
- }
-
- public void forEach(final BiConsumer<S, Long> consumer) {
- this.map.forEach(consumer);
- }
-
- public boolean add(final S s, final long bulk) {
- final Long current = this.map.get(s);
- if (current != null) {
- this.map.put(s, current + bulk);
- return false;
- } else {
- this.map.put(s, bulk);
- return true;
- }
- }
-
- public long get(final S s) {
- final Long bulk = this.map.get(s);
- return null == bulk ? 0 : bulk;
- }
-
- /*public void set(final S s, final long bulk) {
- this.map.remove(s);
- this.map.put(s, bulk);
- }*/
-
- @Override
- public boolean remove(final Object s) {
- return this.map.remove(s) != null;
- }
-
- @Override
- public void clear() {
- this.map.clear();
- }
-
- @Override
- public Spliterator<S> spliterator() {
- return this.toList().spliterator();
- }
-
- @Override
- public boolean removeAll(final Collection<?> collection) {
- Objects.requireNonNull(collection);
- boolean modified = false;
- for (final Object object : collection) {
- if (null != this.map.remove(object))
- modified = true;
- }
- return modified;
- }
-
- @Override
- public int hashCode() {
- return this.map.hashCode();
- }
-
- @Override
- public boolean equals(final Object object) {
- return this.map.equals(object);
- }
-
- @Override
- public String toString() {
- return this.map.toString();
- }
-
- private List<S> toList() {
- final List<S> list = new ArrayList<>();
- this.map.forEach((k, v) -> {
- for (long i = 0; i < v; i++) {
- list.add(k);
- }
- });
- return list;
- }
-
- @Override
- public Iterator<S> iterator() {
- return new Iterator<S>() {
- final Iterator<Map.Entry<S, Long>> entryIterator = map.entrySet().iterator();
- S lastObject = null;
- long lastCount = 0l;
-
- public boolean hasNext() {
- return this.lastCount > 0l || this.entryIterator.hasNext();
- }
-
- @Override
- public S next() {
- if (this.lastCount > 0l) {
- this.lastCount--;
- return this.lastObject;
- }
- final Map.Entry<S, Long> entry = entryIterator.next();
- if (entry.getValue() == 1) {
- return entry.getKey();
- } else {
- this.lastObject = entry.getKey();
- this.lastCount = entry.getValue() - 1;
- return this.lastObject;
- }
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
deleted file mode 100644
index 98d3c53..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
+++ /dev/null
@@ -1,48 +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.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MapHelper {
-
- private MapHelper() {
- }
-
- public static <T> void incr(final Map<T, Long> map, final T key, final Long value) {
- map.put(key, value + map.getOrDefault(key, 0l));
- }
-
- public static <T> void incr(final Map<T, Double> map, final T key, final Double value) {
- map.put(key, value + map.getOrDefault(key, 0.0d));
- }
-
- public static <T, U> void incr(final Map<T, List<U>> map, final T key, final U value) {
- map.compute(key, (k, v) -> {
- if (null == v) v = new ArrayList<>();
- v.add(value);
- return v;
- });
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
deleted file mode 100644
index 37fb957..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
+++ /dev/null
@@ -1,143 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-
-import java.io.Serializable;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import java.util.Spliterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TraverserSet<S> extends AbstractSet<Traverser.Admin<S>> implements Set<Traverser.Admin<S>>, Queue<Traverser.Admin<S>>, Serializable {
-
- private final Map<Traverser.Admin<S>, Traverser.Admin<S>> map = new LinkedHashMap<>();
-
- public TraverserSet() {
-
- }
-
- public TraverserSet(final Traverser.Admin<S> traverser) {
- this.map.put(traverser, traverser);
- }
-
- @Override
- public Iterator<Traverser.Admin<S>> iterator() {
- return this.map.values().iterator();
- }
-
- public Traverser.Admin<S> get(final Traverser.Admin<S> traverser) {
- return this.map.get(traverser);
- }
-
- @Override
- public int size() {
- return this.map.size();
- }
-
- public long bulkSize() {
- return this.map.values().stream().map(Traverser::bulk).reduce(0l, (a, b) -> a + b);
- }
-
- @Override
- public boolean isEmpty() {
- return this.map.isEmpty();
- }
-
- @Override
- public boolean contains(final Object traverser) {
- return this.map.containsKey(traverser);
- }
-
- @Override
- public boolean add(final Traverser.Admin<S> traverser) {
- final Traverser.Admin<S> existing = this.map.get(traverser);
- if (null == existing) {
- this.map.put(traverser, traverser);
- return true;
- } else {
- existing.merge(traverser);
- return false;
- }
- }
-
- @Override
- public boolean offer(final Traverser.Admin<S> traverser) {
- return this.add(traverser);
- }
-
- @Override
- public Traverser.Admin<S> remove() { // pop, exception if empty
- return this.map.remove(this.map.values().iterator().next());
- }
-
- @Override
- public Traverser.Admin<S> poll() { // pop, null if empty
- return this.map.isEmpty() ? null : this.remove();
- }
-
- @Override
- public Traverser.Admin<S> element() { // peek, exception if empty
- return this.iterator().next();
- }
-
- @Override
- public Traverser.Admin<S> peek() { // peek, null if empty
- return this.map.isEmpty() ? null : this.iterator().next();
- }
-
- @Override
- public boolean remove(final Object traverser) {
- return this.map.remove(traverser) != null;
- }
-
- @Override
- public void clear() {
- this.map.clear();
- }
-
- @Override
- public Spliterator<Traverser.Admin<S>> spliterator() {
- return this.map.values().spliterator();
- }
-
- @Override
- public String toString() {
- return this.map.keySet().toString();
- }
-
- public void sort(final Comparator<Traverser<S>> comparator) {
- final List<Traverser.Admin<S>> list = new ArrayList<>(this.map.values());
- Collections.sort(list, comparator);
- this.map.clear();
- list.forEach(traverser -> this.map.put(traverser, traverser));
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
deleted file mode 100644
index 7bb5c4d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
+++ /dev/null
@@ -1,59 +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.util.metric;
-
-/**
- * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
- * corrected on-the-fly by subtracting upstream durations on every call to stop().
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public class DependantMutableMetrics extends MutableMetrics {
- private long prevDur = 0L;
- private DependantMutableMetrics upStreamMetrics;
-
- private DependantMutableMetrics() {
- // necessary for gryo serialization
- super();
- }
-
- public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
- super(id, name);
- this.upStreamMetrics = upStreamMetrics;
- }
-
- public void start() {
- super.start();
- }
-
- public void stop() {
- super.stop();
- // root step will not have an upstream metrics
- if (upStreamMetrics != null) {
- // subtract time that is "double counted" by upstream metrics
- super.durationNs -= upStreamMetrics.getAndResetIncrementalDur();
- }
- }
-
- public long getAndResetIncrementalDur() {
- long incrementalDur = super.durationNs - prevDur;
- prevDur = super.durationNs;
- return incrementalDur;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
deleted file mode 100644
index 0bd0c0a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
+++ /dev/null
@@ -1,103 +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.util.metric;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public class ImmutableMetrics implements Metrics, Serializable {
-
- static final TimeUnit SOURCE_UNIT = TimeUnit.NANOSECONDS;
-
- protected String id;
- protected String name;
- protected Map<String, AtomicLong> counts = new HashMap<>();
- protected long durationNs = 0l;
- protected final Map<String, Object> annotations = new HashMap<>();
- protected final Map<String, ImmutableMetrics> nested = new LinkedHashMap<>();
-
- protected ImmutableMetrics() {
- }
-
- @Override
- public long getDuration(TimeUnit unit) {
- return unit.convert(this.durationNs, SOURCE_UNIT);
- }
-
- @Override
- public long getCount(String key) {
- return counts.get(key).get();
- }
-
- @Override
- public Map<String, Long> getCounts() {
- Map<String, Long> ret = new HashMap<>();
- for (Map.Entry<String, AtomicLong> count : counts.entrySet()) {
- ret.put(count.getKey(), count.getValue().get());
- }
- return ret;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- public String getId() {
- return id;
- }
-
- @Override
- public Collection<ImmutableMetrics> getNested() {
- return nested.values();
- }
-
- @Override
- public ImmutableMetrics getNested(String metricsId) {
- return nested.get(metricsId);
- }
-
- @Override
- public Map<String, Object> getAnnotations() {
- return annotations;
- }
-
- @Override
- public Object getAnnotation(final String key) {
- return annotations.get(key);
- }
-
- @Override
- public String toString() {
- return "ImmutableMetrics{" +
- "id='" + id + '\'' +
- ", name='" + name + '\'' +
- ", counts=" + counts +
- ", durationNs=" + durationNs +
- '}';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
deleted file mode 100644
index f6b5002..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
+++ /dev/null
@@ -1,104 +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.util.metric;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Holds metrics data; typically for .profile()-step analysis. Metrics may be nested. Nesting enables the ability to
- * capture explicit metrics for multiple distinct operations. Annotations are used to store miscellaneous notes that
- * might be useful to a developer when examining results, such as index coverage for Steps in a Traversal.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public interface Metrics {
-
-
-
-
- /**
- * Get the duration of execution time taken.
- *
- * @param units
- * @return
- */
- public long getDuration(TimeUnit units);
-
- /**
- * Get the count for the corresponding countKey.
- *
- * @param countKey key for counter to get.
- * @return
- */
- public long getCount(String countKey);
-
- /**
- * Get the map of all counters. This method copies the internal map.
- *
- * @return a Map where the key is the counter ID and the value is the counter value.
- */
- public Map<String, Long> getCounts();
-
- /**
- * Name of this Metrics.
- *
- * @return name of this Metrics.
- */
- public String getName();
-
- /**
- * Id of this Metrics.
- *
- * @return id of this Metrics.
- */
- public String getId();
-
-
- /**
- * Get the nested Metrics objects. Metrics will be ordered in the order they were inserted.
- *
- * @return the nested Metrics objects.
- */
- public Collection<? extends Metrics> getNested();
-
- /**
- * Get a nested Metrics object by Id.
- *
- * @param metricsId
- * @return a nested Metrics object.
- */
- Metrics getNested(String metricsId);
-
- /**
- * Obtain the annotations for this Metrics. Values may be of type String or Number.
- *
- * @return the annotations for this Metrics. Modifications to the returned object are persisted in the original.
- */
- public Map<String, Object> getAnnotations();
-
- /**
- * Obtain the annotation with the specified key. Values may be of type String or Number.
- *
- * @param key key of the annotation to obtain.
- * @return
- */
- public Object getAnnotation(String key);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
deleted file mode 100644
index d84ed40..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
+++ /dev/null
@@ -1,171 +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.util.metric;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public class MutableMetrics extends ImmutableMetrics implements Cloneable {
-
- // Note: if you add new members then you probably need to add them to the copy constructor;
-
- private long tempTime = -1l;
-
- protected MutableMetrics() {
- // necessary for gryo serialization
- }
-
- public MutableMetrics(final String id, final String name) {
- this.id = id;
- this.name = name;
- }
-
-
- public void addNested(MutableMetrics metrics) {
- this.nested.put(metrics.getId(), metrics);
- }
-
- public void start() {
- if (-1 != this.tempTime) {
- throw new IllegalStateException("Internal Error: Concurrent Metrics start. Stop timer before starting timer.");
- }
- this.tempTime = System.nanoTime();
- }
-
- public void stop() {
- if (-1 == this.tempTime)
- throw new IllegalStateException("Internal Error: Metrics has not been started. Start timer before stopping timer");
- this.durationNs = this.durationNs + (System.nanoTime() - this.tempTime);
- this.tempTime = -1;
- }
-
- public void incrementCount(String key, final long incr) {
- AtomicLong count = this.counts.get(key);
- if (count == null) {
- count = new AtomicLong();
- this.counts.put(key, count);
- }
- count.addAndGet(incr);
- }
-
- public void aggregate(MutableMetrics other) {
- this.durationNs += other.durationNs;
- for (Map.Entry<String, AtomicLong> otherCount : other.counts.entrySet()) {
- AtomicLong thisCount = this.counts.get(otherCount.getKey());
- if (thisCount == null) {
- thisCount = new AtomicLong(otherCount.getValue().get());
- this.counts.put(otherCount.getKey(), thisCount);
- } else {
- thisCount.addAndGet(otherCount.getValue().get());
- }
- }
-
- // Merge annotations. If multiple values for a given key are found then append it to a comma-separated list.
- for (Map.Entry<String, Object> p : other.annotations.entrySet()) {
- if (this.annotations.containsKey(p.getKey())) {
- // Strings are concatenated
- Object existingVal = this.annotations.get(p.getKey());
- if (existingVal instanceof String) {
- final List<String> existingValues = Arrays.asList(existingVal.toString().split(","));
- if (!existingValues.contains(p.getValue())) {
- // New value. Append to comma-separated list.
- this.annotations.put(p.getKey(), existingVal.toString() + ',' + p.getValue());
- }
- } else {
- // Numbers are summed
- Number existingNum = (Number) existingVal;
- Number otherNum = (Number) p.getValue();
- Number newVal;
- if (existingNum instanceof Double || existingNum instanceof Float) {
- newVal =
- existingNum.doubleValue() + otherNum.doubleValue();
- } else {
- newVal = existingNum.longValue() + otherNum.longValue();
- }
- this.annotations.put(p.getKey(), newVal);
- }
- } else {
- this.annotations.put(p.getKey(), p.getValue());
- }
- }
- this.annotations.putAll(other.annotations);
-
- // Merge nested Metrics
- other.nested.values().forEach(nested -> {
- MutableMetrics thisNested = (MutableMetrics) this.nested.get(nested.getId());
- if (thisNested == null) {
- thisNested = new MutableMetrics(nested.getId(), nested.getName());
- this.nested.put(thisNested.getId(), thisNested);
- }
- thisNested.aggregate((MutableMetrics) nested);
- });
- }
-
- /**
- * Set an annotation value. Support exists for Strings and Numbers only. During a merge, Strings are concatenated
- * into a "," (comma) separated list of distinct values (duplicates are ignored), and Numbers are summed.
- *
- * @param key
- * @param value
- */
- public void setAnnotation(String key, Object value) {
- if (!(value instanceof String) && !(value instanceof Number)) {
- throw new IllegalArgumentException("Metrics annotations only support String and Number values.");
- }
- annotations.put(key, value);
- }
-
- @Override
- public MutableMetrics getNested(String metricsId) {
- return (MutableMetrics) nested.get(metricsId);
- }
-
- public ImmutableMetrics getImmutableClone() {
- final ImmutableMetrics clone = new ImmutableMetrics();
- copyMembers(clone);
- this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).getImmutableClone()));
- return clone;
- }
-
- private void copyMembers(final ImmutableMetrics clone) {
- clone.id = this.id;
- clone.name = this.name;
- clone.durationNs = this.durationNs;
- for (Map.Entry<String, AtomicLong> c : this.counts.entrySet()) {
- clone.counts.put(c.getKey(), new AtomicLong(c.getValue().get()));
- }
- for (Map.Entry<String, Object> a : this.annotations.entrySet()) {
- clone.annotations.put(a.getKey(), a.getValue());
- }
- }
-
- @Override
- public MutableMetrics clone() {
- final MutableMetrics clone = new MutableMetrics();
- copyMembers(clone);
- this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).clone()));
- return clone;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
deleted file mode 100644
index 4431004..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
+++ /dev/null
@@ -1,204 +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.util.metric;
-
-import org.apache.commons.lang.StringUtils;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
- // toString() specific headers
- private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
-
- private boolean dirty = true;
- private final Map<String, MutableMetrics> metrics = new HashMap<>();
- private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
- private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
-
- /*
- The following are computed values upon the completion of profiling in order to report the results back to the user
- */
- private long totalStepDuration;
- private Map<String, ImmutableMetrics> computedMetrics;
-
- public StandardTraversalMetrics() {
- }
-
- public void start(final String metricsId) {
- dirty = true;
- if (allMetrics.get(metricsId) == null) {
- System.out.println();
- }
- allMetrics.get(metricsId).start();
- }
-
- public void stop(final String metricsId) {
- dirty = true;
- allMetrics.get(metricsId).stop();
- }
-
- public void finish(final String metricsId, final long bulk) {
- dirty = true;
- final MutableMetrics metrics = allMetrics.get(metricsId);
- metrics.stop();
- metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 1);
- metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, bulk);
- }
-
- @Override
- public long getDuration(final TimeUnit unit) {
- computeTotals();
- return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
- }
-
- @Override
- public Metrics getMetrics(final int index) {
- computeTotals();
- // adjust index to account for the injected profile steps
- return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
- }
-
- @Override
- public Metrics getMetrics(final String id) {
- computeTotals();
- return computedMetrics.get(id);
- }
-
- @Override
- public Collection<ImmutableMetrics> getMetrics() {
- computeTotals();
- return computedMetrics.values();
- }
-
- @Override
- public String toString() {
- computeTotals();
-
- // Build a pretty table of metrics data.
-
- // Append headers
- final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
- .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
-
- sb.append("\n=============================================================================================================");
-
- appendMetrics(computedMetrics.values(), sb, 0);
-
- // Append total duration
- sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
- ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
-
- return sb.toString();
- }
-
- private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
- // Append each StepMetric's row. indexToLabelMap values are ordered by index.
- for (Metrics m : metrics) {
- String rowName = m.getName();
- for (int ii = 0; ii < indent; ii++) {
- rowName = " " + rowName;
- }
- rowName = StringUtils.abbreviate(rowName, 50);
- final long itemCount = m.getCount(TraversalMetrics.ELEMENT_COUNT_ID);
- final long traverserCount = m.getCount(TraversalMetrics.TRAVERSER_COUNT_ID);
-
- Double percentDur = (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
- if (percentDur != null) {
- sb.append(String.format("%n%-50s %21d %11d %15.3f %8.2f",
- rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0, percentDur));
- } else {
- sb.append(String.format("%n%-50s %21d %11d %15.3f",
- rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
- }
- appendMetrics(m.getNested(), sb, indent + 1);
- }
- }
-
- private void computeTotals() {
- if (!dirty) {
- // already good to go
- return;
- }
-
- // Create temp list of ordered metrics
- List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
- for (String label : indexToLabelMap.values()) {
- // The indexToLabelMap is sorted by index (key)
- tempMetrics.add(metrics.get(label).clone());
- }
-
- // Calculate total duration
- this.totalStepDuration = 0;
- tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
-
- // Assign %'s
- tempMetrics.forEach(m -> {
- double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
- m.setAnnotation(TraversalMetrics.PERCENT_DURATION_KEY, dur);
- });
-
- // Store immutable instances of the calculated metrics
- computedMetrics = new LinkedHashMap<>(metrics.size());
- tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
-
- dirty = false;
- }
-
- public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
- final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
-
- // iterate the incoming TraversalMetrics
- toMerge.forEachRemaining(inTraversalMetrics -> {
- // aggregate the internal Metrics
- inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
-
- MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
- if (null == aggregateMetrics) {
- // need to create a Metrics to aggregate into
- aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
-
- newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
- // Set the index of the Metrics
- for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
- if (metricsId.equals(entry.getValue())) {
- newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
- break;
- }
- }
- }
- aggregateMetrics.aggregate(toAggregate);
- });
- });
- return newTraversalMetrics;
- }
-
- public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
- if (isTopLevel) {
- // The index is necessary to ensure that step order is preserved after a merge.
- indexToLabelMap.put(index, id);
- metrics.put(id, newMetrics);
- }
- allMetrics.put(profileStepId, newMetrics);
- }
-}
[24/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
new file mode 100644
index 0000000..a423512
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
@@ -0,0 +1,182 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TreeSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<Object, Tree, Object, Tree, Tree> {
+
+ private TraversalRing<Object, Object> traversalRing;
+ private String sideEffectKey;
+
+ public TreeSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.traversalRing = new TraversalRing<>();
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, TreeSupplier.instance());
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ Tree depth = traverser.sideEffects(this.sideEffectKey);
+ final Path path = traverser.path();
+ for (int i = 0; i < path.size(); i++) {
+ final Object object = TraversalUtil.apply(path.<Object>get(i), this.traversalRing.next());
+ if (!depth.containsKey(object))
+ depth.put(object, new Tree<>());
+ depth = (Tree) depth.get(object);
+ }
+ this.traversalRing.reset();
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public MapReduce<Object, Tree, Object, Tree, Tree> getMapReduce() {
+ return new TreeSideEffectMapReduce(this);
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.traversalRing.reset();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey, this.traversalRing);
+ }
+
+ @Override
+ public TreeSideEffectStep<S> clone() {
+ final TreeSideEffectStep<S> clone = (TreeSideEffectStep<S>) super.clone();
+ clone.traversalRing = new TraversalRing<>();
+ for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+ clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+ return this.traversalRing.getTraversals();
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
+ this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
+ }
+
+ ////////////////
+
+ public static final class TreeSideEffectMapReduce extends StaticMapReduce<Object, Tree, Object, Tree, Tree> {
+
+ public static final String TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.treeSideEffectStep.sideEffectKey";
+
+ private String sideEffectKey;
+
+ private TreeSideEffectMapReduce() {
+
+ }
+
+ public TreeSideEffectMapReduce(final TreeSideEffectStep step) {
+ this.sideEffectKey = step.getSideEffectKey();
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ super.storeState(configuration);
+ configuration.setProperty(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.sideEffectKey = configuration.getString(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return stage.equals(Stage.MAP);
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<Object, Tree> emitter) {
+ VertexTraversalSideEffects.of(vertex).<Tree<?>>ifPresent(this.sideEffectKey, tree -> tree.splitParents().forEach(branches -> emitter.emit(branches.keySet().iterator().next(), branches)));
+ }
+
+ /*
+ @Override
+ public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+ final Tree tree = new Tree();
+ values.forEachRemaining(tree::addTree);
+ emitter.emit(tree);
+ }
+ */
+
+ @Override
+ public Tree generateFinalResult(final Iterator<KeyValue<Object, Tree>> keyValues) {
+ final Tree result = new Tree();
+ keyValues.forEachRemaining(keyValue -> result.addTree(keyValue.getValue()));
+ return result;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return this.sideEffectKey;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
new file mode 100644
index 0000000..14c3b36
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -0,0 +1,183 @@
+/*
+ * 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.step.util;
+
+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.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractStep<S, E> implements Step<S, E> {
+
+ protected String label = null;
+ protected String id = Traverser.Admin.HALT;
+ protected Traversal.Admin traversal;
+ protected ExpandableStepIterator<S> starts;
+ protected Traverser<E> nextEnd = null;
+ protected boolean traverserStepIdSetByChild = false; // TODO: Step.teleport(traverser, step)
+
+ protected Step<?, S> previousStep = EmptyStep.instance();
+ protected Step<E, ?> nextStep = EmptyStep.instance();
+
+ public AbstractStep(final Traversal.Admin traversal) {
+ this.traversal = traversal;
+ this.starts = new ExpandableStepIterator<S>((Step) this);
+ }
+
+ @Override
+ public void setId(final String id) {
+ Objects.nonNull(id);
+ this.id = id;
+ }
+
+ @Override
+ public String getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setLabel(final String label) {
+ Objects.nonNull(label);
+ this.label = label;
+ }
+
+ @Override
+ public Optional<String> getLabel() {
+ return Optional.ofNullable(this.label);
+ }
+
+ @Override
+ public void reset() {
+ this.starts.clear();
+ this.nextEnd = null;
+ }
+
+ @Override
+ public void addStarts(final Iterator<Traverser<S>> starts) {
+ this.starts.add((Iterator) starts);
+ }
+
+ @Override
+ public void addStart(final Traverser<S> start) {
+ this.starts.add((Traverser.Admin<S>) start);
+ }
+
+ @Override
+ public void setPreviousStep(final Step<?, S> step) {
+ this.previousStep = step;
+ }
+
+ @Override
+ public Step<?, S> getPreviousStep() {
+ return this.previousStep;
+ }
+
+ @Override
+ public void setNextStep(final Step<E, ?> step) {
+ this.nextStep = step;
+ }
+
+ @Override
+ public Step<E, ?> getNextStep() {
+ return this.nextStep;
+ }
+
+ @Override
+ public Traverser<E> next() {
+ if (null != this.nextEnd) {
+ try {
+ return this.prepareTraversalForNextStep(this.nextEnd);
+ } finally {
+ this.nextEnd = null;
+ }
+ } else {
+ while (true) {
+ final Traverser<E> traverser = this.processNextStart();
+ if (0 != traverser.bulk()) {
+ return this.prepareTraversalForNextStep(traverser);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (null != this.nextEnd)
+ return true;
+ else {
+ try {
+ while (true) {
+ this.nextEnd = this.processNextStart();
+ if (0 != this.nextEnd.bulk())
+ return true;
+ else
+ this.nextEnd = null;
+ }
+ } catch (final NoSuchElementException e) {
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public <A, B> Traversal.Admin<A, B> getTraversal() {
+ return this.traversal;
+ }
+
+ @Override
+ public void setTraversal(final Traversal.Admin<?, ?> traversal) {
+ this.traversal = traversal;
+ }
+
+ protected abstract Traverser<E> processNextStart() throws NoSuchElementException;
+
+ public String toString() {
+ return TraversalHelper.makeStepString(this);
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public AbstractStep<S, E> clone() {
+ try {
+ final AbstractStep clone = (AbstractStep) super.clone();
+ clone.starts = new ExpandableStepIterator<S>(clone);
+ clone.previousStep = EmptyStep.instance();
+ clone.nextStep = EmptyStep.instance();
+ clone.nextEnd = null;
+ return clone;
+ } catch (CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
+ if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
+ if (null != this.label) traverser.path().addLabel(this.label);
+ return traverser;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
new file mode 100644
index 0000000..a90b009
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
@@ -0,0 +1,186 @@
+/*
+ * 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.step.util;
+
+import java.io.Serializable;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+/**
+ * BulkSet is a weighted set (i.e. a multi-set). Objects are added along with a bulk counter the denotes how many times the object was added to the set.
+ * Given that count-based compression (vs. enumeration) can yield large sets, methods exist that are long-based (2^64).
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class BulkSet<S> extends AbstractSet<S> implements Set<S>, Serializable {
+ private final Map<S, Long> map = new LinkedHashMap<>();
+
+ @Override
+ public int size() {
+ return (int) this.longSize();
+ }
+
+ public int uniqueSize() {
+ return this.map.size();
+ }
+
+ public long longSize() {
+ return this.map.values().stream().collect(Collectors.summingLong(Long::longValue));
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return this.map.isEmpty();
+ }
+
+ @Override
+ public boolean contains(final Object s) {
+ return this.map.containsKey(s);
+ }
+
+ @Override
+ public boolean add(final S s) {
+ return this.add(s, 1l);
+ }
+
+ @Override
+ public boolean addAll(final Collection<? extends S> collection) {
+ if (collection instanceof BulkSet) {
+ ((BulkSet<S>) collection).map.forEach(this::add);
+ } else {
+ collection.iterator().forEachRemaining(this::add);
+ }
+ return true;
+ }
+
+ public void forEach(final BiConsumer<S, Long> consumer) {
+ this.map.forEach(consumer);
+ }
+
+ public boolean add(final S s, final long bulk) {
+ final Long current = this.map.get(s);
+ if (current != null) {
+ this.map.put(s, current + bulk);
+ return false;
+ } else {
+ this.map.put(s, bulk);
+ return true;
+ }
+ }
+
+ public long get(final S s) {
+ final Long bulk = this.map.get(s);
+ return null == bulk ? 0 : bulk;
+ }
+
+ /*public void set(final S s, final long bulk) {
+ this.map.remove(s);
+ this.map.put(s, bulk);
+ }*/
+
+ @Override
+ public boolean remove(final Object s) {
+ return this.map.remove(s) != null;
+ }
+
+ @Override
+ public void clear() {
+ this.map.clear();
+ }
+
+ @Override
+ public Spliterator<S> spliterator() {
+ return this.toList().spliterator();
+ }
+
+ @Override
+ public boolean removeAll(final Collection<?> collection) {
+ Objects.requireNonNull(collection);
+ boolean modified = false;
+ for (final Object object : collection) {
+ if (null != this.map.remove(object))
+ modified = true;
+ }
+ return modified;
+ }
+
+ @Override
+ public int hashCode() {
+ return this.map.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return this.map.equals(object);
+ }
+
+ @Override
+ public String toString() {
+ return this.map.toString();
+ }
+
+ private List<S> toList() {
+ final List<S> list = new ArrayList<>();
+ this.map.forEach((k, v) -> {
+ for (long i = 0; i < v; i++) {
+ list.add(k);
+ }
+ });
+ return list;
+ }
+
+ @Override
+ public Iterator<S> iterator() {
+ return new Iterator<S>() {
+ final Iterator<Map.Entry<S, Long>> entryIterator = map.entrySet().iterator();
+ S lastObject = null;
+ long lastCount = 0l;
+
+ public boolean hasNext() {
+ return this.lastCount > 0l || this.entryIterator.hasNext();
+ }
+
+ @Override
+ public S next() {
+ if (this.lastCount > 0l) {
+ this.lastCount--;
+ return this.lastObject;
+ }
+ final Map.Entry<S, Long> entry = entryIterator.next();
+ if (entry.getValue() == 1) {
+ return entry.getKey();
+ } else {
+ this.lastObject = entry.getKey();
+ this.lastCount = entry.getValue() - 1;
+ return this.lastObject;
+ }
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
new file mode 100644
index 0000000..83907fa
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -0,0 +1,67 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
+ private TraverserSet<S> traverserSet = new TraverserSet<>();
+
+ public CollectingBarrierStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.BULK);
+ }
+
+ @Override
+ public Traverser<S> processNextStart() {
+ if (this.starts.hasNext()) {
+ this.starts.forEachRemaining(this.traverserSet::add);
+ this.barrierConsumer(this.traverserSet);
+ }
+ return this.traverserSet.remove();
+ }
+
+ @Override
+ public CollectingBarrierStep<S> clone() {
+ final CollectingBarrierStep<S> clone = (CollectingBarrierStep<S>) super.clone();
+ clone.traverserSet = new TraverserSet<>();
+ return clone;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.traverserSet.clear();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..7dcdc70
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
@@ -0,0 +1,94 @@
+/*
+ * 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.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.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
+
+ private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
+
+ public ComputerAwareStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<E> processNextStart() throws NoSuchElementException {
+ while (true) {
+ if (this.previousIterator.hasNext())
+ return this.previousIterator.next();
+ this.previousIterator = this.traverserStepIdSetByChild ? this.computerAlgorithm() : this.standardAlgorithm();
+ }
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine engine) {
+ this.traverserStepIdSetByChild = engine.isComputer();
+ }
+
+ @Override
+ public ComputerAwareStep<S, E> clone() {
+ final ComputerAwareStep<S, E> clone = (ComputerAwareStep<S, E>) super.clone();
+ clone.previousIterator = Collections.emptyIterator();
+ return clone;
+ }
+
+ protected abstract Iterator<Traverser<E>> standardAlgorithm() throws NoSuchElementException;
+
+ protected abstract Iterator<Traverser<E>> computerAlgorithm() throws NoSuchElementException;
+
+ //////
+
+ public class EndStep extends AbstractStep<S, S> implements EngineDependent {
+
+ public EndStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ final Traverser.Admin<S> start = this.starts.next();
+ if (this.traverserStepIdSetByChild) start.setStepId(ComputerAwareStep.this.getNextStep().getId());
+ return start;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this);
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine engine) {
+ this.traverserStepIdSetByChild = engine.isComputer();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
new file mode 100644
index 0000000..8e008b0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
@@ -0,0 +1,57 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ElementFunctionComparator<V> implements Comparator<Element>, Serializable {
+
+ private final Function<Element, V> elementFunction;
+ private final Comparator<V> valueComparator;
+
+ public ElementFunctionComparator(final Function<Element, V> elementFunction, final Comparator<V> valueComparator) {
+ this.elementFunction = elementFunction;
+ this.valueComparator = valueComparator;
+ }
+
+ public Function<Element, V> getElementFunction() {
+ return this.elementFunction;
+ }
+
+ public Comparator<V> getValueComparator() {
+ return this.valueComparator;
+ }
+
+ @Override
+ public int compare(final Element elementA, final Element elementB) {
+ return this.valueComparator.compare(this.elementFunction.apply(elementA), this.elementFunction.apply(elementB));
+ }
+
+ @Override
+ public String toString() {
+ return this.valueComparator.toString() + "(" + this.elementFunction + ')';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
new file mode 100644
index 0000000..ba91f94
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
@@ -0,0 +1,56 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ElementValueComparator<V> implements Comparator<Element>, Serializable {
+
+ private final String propertyKey;
+ private final Comparator<V> valueComparator;
+
+ public ElementValueComparator(final String propertyKey, final Comparator<V> valueComparator) {
+ this.propertyKey = propertyKey;
+ this.valueComparator = valueComparator;
+ }
+
+ public String getPropertyKey() {
+ return this.propertyKey;
+ }
+
+ public Comparator<V> getValueComparator() {
+ return this.valueComparator;
+ }
+
+ @Override
+ public int compare(final Element elementA, final Element elementB) {
+ return this.valueComparator.compare(elementA.value(this.propertyKey), elementB.value(this.propertyKey));
+ }
+
+ @Override
+ public String toString() {
+ return this.valueComparator.toString() + '(' + this.propertyKey + ')';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
new file mode 100644
index 0000000..8be354d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
@@ -0,0 +1,102 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyPath implements Path, Serializable {
+
+ private static final EmptyPath INSTANCE = new EmptyPath();
+
+ private EmptyPath() {
+
+ }
+
+ @Override
+ public int size() {
+ return 0;
+ }
+
+ @Override
+ public Path extend(final Object object, final String... labels) {
+ return this;
+ }
+
+ @Override
+ public <A> A get(final String label) {
+ throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+ }
+
+ @Override
+ public <A> A get(final int index) {
+ return (A) Collections.emptyList().get(index);
+ }
+
+ @Override
+ public boolean hasLabel(final String label) {
+ return false;
+ }
+
+ @Override
+ public void addLabel(final String label) {
+
+ }
+
+ @Override
+ public List<Object> objects() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<Set<String>> labels() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public boolean isSimple() {
+ return true;
+ }
+
+ @Override
+ public EmptyPath clone() {
+ return this;
+ }
+
+ public static Path instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public int hashCode() {
+ return -1424379551;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof EmptyPath;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
new file mode 100644
index 0000000..ee6a5d6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
@@ -0,0 +1,143 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+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.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
+
+ private static final EmptyStep INSTANCE = new EmptyStep<>();
+
+ public static <S, E> Step<S, E> instance() {
+ return INSTANCE;
+ }
+
+ private EmptyStep() {
+ }
+
+ @Override
+ public void addStarts(final Iterator<Traverser<S>> starts) {
+
+ }
+
+ @Override
+ public void addStart(final Traverser<S> start) {
+
+ }
+
+ @Override
+ public void setPreviousStep(final Step<?, S> step) {
+
+ }
+
+ @Override
+ public void reset() {
+
+ }
+
+ @Override
+ public Step<?, S> getPreviousStep() {
+ return INSTANCE;
+ }
+
+ @Override
+ public void setNextStep(final Step<E, ?> step) {
+
+ }
+
+ @Override
+ public Step<E, ?> getNextStep() {
+ return INSTANCE;
+ }
+
+ @Override
+ public <A, B> Traversal.Admin<A, B> getTraversal() {
+ return EmptyTraversal.instance();
+ }
+
+ @Override
+ public void setTraversal(final Traversal.Admin<?, ?> traversal) {
+
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntCallSuperClone")
+ public EmptyStep<S, E> clone() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Optional<String> getLabel() {
+ return Optional.empty();
+ }
+
+ @Override
+ public void setLabel(final String label) {
+
+ }
+
+ @Override
+ public void setId(final String id) {
+
+ }
+
+ @Override
+ public String getId() {
+ return Traverser.Admin.HALT;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return false;
+ }
+
+ @Override
+ public Traverser<E> next() {
+ throw FastNoSuchElementException.instance();
+ }
+
+ @Override
+ public int hashCode() {
+ return -1691648095;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof EmptyStep;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.emptySet();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
new file mode 100644
index 0000000..57687c1
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
@@ -0,0 +1,77 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.util.iterator.MultiIterator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
+
+ private final TraverserSet<E> traverserSet = new TraverserSet<>();
+ private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
+ private final Step<?, E> hostStep;
+
+ public ExpandableStepIterator(final Step<?, E> hostStep) {
+ this.hostStep = hostStep;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return !this.traverserSet.isEmpty() || this.hostStep.getPreviousStep().hasNext() || this.traverserIterators.hasNext();
+ }
+
+ @Override
+ public Traverser.Admin<E> next() {
+ if (!this.traverserSet.isEmpty())
+ return this.traverserSet.remove();
+ if (this.traverserIterators.hasNext())
+ return this.traverserIterators.next();
+ /////////////
+ if (this.hostStep.getPreviousStep().hasNext())
+ return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
+ /////////////
+ return this.traverserSet.remove();
+ }
+
+ public void add(final Iterator<Traverser.Admin<E>> iterator) {
+ this.traverserIterators.addIterator(iterator);
+ }
+
+ public void add(final Traverser.Admin<E> traverser) {
+ this.traverserSet.add(traverser);
+ }
+
+ @Override
+ public String toString() {
+ return this.traverserSet.toString();
+ }
+
+ public void clear() {
+ this.traverserIterators.clear();
+ this.traverserSet.clear();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
new file mode 100644
index 0000000..cc98041
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
@@ -0,0 +1,113 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class HasContainer implements Serializable {
+
+ public String key;
+ public BiPredicate predicate;
+ public Object value;
+
+ public HasContainer(final String key, final BiPredicate predicate, final Object value) {
+ this.key = key;
+ this.predicate = predicate;
+ this.value = value;
+ if (null == this.value && !(this.predicate instanceof Contains)) {
+ throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
+ }
+ }
+
+ public HasContainer(final String key, final Contains contains) {
+ this(key, contains, null);
+ }
+
+ public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
+ this(accessor.getAccessor(), predicate, value);
+ }
+
+ public HasContainer(final T accessor, final Contains contains) {
+ this(accessor.getAccessor(), contains, null);
+ }
+
+ public boolean test(final Element element) {
+ if (null != this.value) {
+ if (this.key.equals(T.id.getAccessor()))
+ return this.predicate.test(element.id(), this.value);
+ else if (this.key.equals(T.label.getAccessor()))
+ return this.predicate.test(element.label(), this.value);
+ else if (element instanceof VertexProperty && this.key.equals(T.value.getAccessor()))
+ return this.predicate.test(((VertexProperty) element).value(), this.value);
+ else if (element instanceof VertexProperty && this.key.equals(T.key.getAccessor()))
+ return this.predicate.test(((VertexProperty) element).key(), this.value);
+ else {
+ if (element instanceof Vertex) {
+ final Iterator<? extends Property> itty = element.properties(this.key);
+ while (itty.hasNext()) {
+ if (this.predicate.test(itty.next().value(), this.value))
+ return true;
+ }
+ return false;
+ } else {
+ final Property property = element.property(this.key);
+ return property.isPresent() && this.predicate.test(property.value(), this.value);
+ }
+ }
+ } else {
+ return Contains.within.equals(this.predicate) ?
+ element.property(this.key).isPresent() :
+ !element.property(this.key).isPresent();
+ }
+ }
+
+ public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
+ if (hasContainers.size() == 0)
+ return true;
+ else {
+ for (final HasContainer hasContainer : hasContainers) {
+ if (!hasContainer.test(element))
+ return false;
+ }
+ return true;
+ }
+ }
+
+ // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
+ public String toString() {
+ return this.value == null ?
+ (this.predicate == Contains.within ?
+ '[' + this.key + ']' :
+ "[!" + this.key + ']') :
+ '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
new file mode 100644
index 0000000..608c3f6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
@@ -0,0 +1,182 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ImmutablePath implements Path, Serializable, Cloneable {
+
+ private Path previousPath = HeadPath.instance();
+ private Object currentObject;
+ private Set<String> currentLabels = new HashSet<>();
+
+ protected ImmutablePath() {
+
+ }
+
+ public static Path make() {
+ return HeadPath.instance();
+ }
+
+ @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
+ @Override
+ public ImmutablePath clone() {
+ return this;
+ }
+
+ private ImmutablePath(final Object currentObject, final String... currentLabels) {
+ this(HeadPath.instance(), currentObject, currentLabels);
+ }
+
+ private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
+ this.previousPath = previousPath;
+ this.currentObject = currentObject;
+ if (currentLabels.length > 0)
+ Stream.of(currentLabels).forEach(this.currentLabels::add);
+ }
+
+ @Override
+ public int size() {
+ return this.previousPath.size() + 1;
+ }
+
+ @Override
+ public Path extend(final Object object, final String... labels) {
+ return new ImmutablePath(this, object, labels);
+ }
+
+ @Override
+ public <A> A get(final int index) {
+ return (this.size() - 1) == index ? (A) this.currentObject : this.previousPath.get(index);
+ }
+
+ @Override
+ public boolean hasLabel(final String label) {
+ return this.currentLabels.contains(label) || this.previousPath.hasLabel(label);
+ }
+
+ @Override
+ public void addLabel(final String label) {
+ this.currentLabels.add(label);
+ }
+
+ @Override
+ public List<Object> objects() {
+ final List<Object> objectPath = new ArrayList<>();
+ objectPath.addAll(this.previousPath.objects());
+ objectPath.add(this.currentObject);
+ return Collections.unmodifiableList(objectPath);
+ }
+
+ @Override
+ public List<Set<String>> labels() {
+ final List<Set<String>> labelPath = new ArrayList<>();
+ labelPath.addAll(this.previousPath.labels());
+ labelPath.add(this.currentLabels);
+ return Collections.unmodifiableList(labelPath);
+ }
+
+ @Override
+ public String toString() {
+ return this.objects().toString();
+ }
+
+ private static class HeadPath implements Path {
+ private static final HeadPath INSTANCE = new HeadPath();
+
+ private HeadPath() {
+
+ }
+
+ @Override
+ public int size() {
+ return 0;
+ }
+
+ @Override
+ public Path extend(final Object object, final String... labels) {
+ return new ImmutablePath(object, labels);
+ }
+
+ @Override
+ public <A> A get(final String label) {
+ throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+ }
+
+ @Override
+ public <A> A get(final int index) {
+ return (A) Collections.emptyList().get(index);
+ }
+
+ @Override
+ public boolean hasLabel(final String label) {
+ return false;
+ }
+
+ @Override
+ public void addLabel(final String label) {
+ throw new UnsupportedOperationException("A head path can not have labels added to it");
+ }
+
+ @Override
+ public List<Object> objects() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public List<Set<String>> labels() {
+ return Collections.emptyList();
+ }
+
+ @Override
+ public boolean isSimple() {
+ return true;
+ }
+
+ @Override
+ public HeadPath clone() {
+ return this;
+ }
+
+ public static Path instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof HeadPath;
+ }
+
+ @Override
+ public String toString() {
+ return Collections.emptyList().toString();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
new file mode 100644
index 0000000..261742c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
@@ -0,0 +1,48 @@
+/*
+ * 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.step.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MapHelper {
+
+ private MapHelper() {
+ }
+
+ public static <T> void incr(final Map<T, Long> map, final T key, final Long value) {
+ map.put(key, value + map.getOrDefault(key, 0l));
+ }
+
+ public static <T> void incr(final Map<T, Double> map, final T key, final Double value) {
+ map.put(key, value + map.getOrDefault(key, 0.0d));
+ }
+
+ public static <T, U> void incr(final Map<T, List<U>> map, final T key, final U value) {
+ map.compute(key, (k, v) -> {
+ if (null == v) v = new ArrayList<>();
+ v.add(value);
+ return v;
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
new file mode 100644
index 0000000..b62370f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MarkerIdentityStep<S> extends AbstractStep<S, S> {
+
+ public MarkerIdentityStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ return this.starts.next();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
new file mode 100644
index 0000000..d458bfb
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
@@ -0,0 +1,107 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class MutablePath implements Path, Serializable {
+
+ final protected List<Object> objects;
+ final protected List<Set<String>> labels;
+
+ protected MutablePath() {
+ this(0);
+ }
+
+ private MutablePath(final int capacity) {
+ this.objects = new ArrayList<>(capacity);
+ this.labels = new ArrayList<>(capacity);
+ }
+
+ public static Path make() {
+ return new MutablePath();
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
+ public MutablePath clone() {
+ final MutablePath clone = new MutablePath(this.objects.size());
+ // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone.
+ /*final MutablePath clone = (MutablePath) super.clone();
+ clone.objects = new ArrayList<>();
+ clone.labels = new ArrayList<>();*/
+ clone.objects.addAll(this.objects);
+ clone.labels.addAll(this.labels);
+ return clone;
+ }
+
+
+ @Override
+ public int size() {
+ return this.objects.size();
+ }
+
+ @Override
+ public Path extend(final Object object, final String... labels) {
+ this.objects.add(object);
+ this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
+ return this;
+ }
+
+ @Override
+ public <A> A get(int index) {
+ return (A) this.objects.get(index);
+ }
+
+ @Override
+ public boolean hasLabel(final String label) {
+ return this.labels.stream().filter(l -> l.contains(label)).findAny().isPresent();
+ }
+
+ @Override
+ public void addLabel(final String label) {
+ this.labels.get(this.labels.size() - 1).add(label);
+ }
+
+ @Override
+ public List<Object> objects() {
+ return Collections.unmodifiableList(this.objects);
+ }
+
+ @Override
+ public List<Set<String>> labels() {
+ return Collections.unmodifiableList(this.labels);
+ }
+
+ @Override
+ public String toString() {
+ return this.objects.toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
new file mode 100644
index 0000000..ef26d9e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathIdentityStep<S> extends AbstractStep<S, S> {
+
+ public PathIdentityStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ return this.starts.next();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..e709741
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
@@ -0,0 +1,179 @@
+/*
+ * 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.step.util;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+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.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+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.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Iterator;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, EngineDependent {
+
+ public static final String REDUCING = Graph.Hidden.hide("reducing");
+
+ protected Supplier<E> seedSupplier;
+ protected BiFunction<E, Traverser<S>, E> reducingBiFunction;
+ private boolean done = false;
+ protected boolean byPass = false;
+
+ public ReducingBarrierStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ public void setSeedSupplier(final Supplier<E> seedSupplier) {
+ this.seedSupplier = seedSupplier;
+ }
+
+ public void setBiFunction(final BiFunction<E, Traverser<S>, E> reducingBiFunction) {
+ this.reducingBiFunction = reducingBiFunction;
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ this.byPass = traversalEngine.isComputer();
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.done = false;
+ }
+
+ @Override
+ public Traverser<E> processNextStart() {
+ if (this.byPass) {
+ return (Traverser<E>) this.starts.next();
+ } else {
+ if (this.done)
+ throw FastNoSuchElementException.instance();
+ E seed = this.seedSupplier.get();
+ while (this.starts.hasNext())
+ seed = this.reducingBiFunction.apply(seed, this.starts.next());
+ this.done = true;
+ return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
+ }
+ }
+
+ @Override
+ public ReducingBarrierStep<S, E> clone() {
+ final ReducingBarrierStep<S, E> clone = (ReducingBarrierStep<S, E>) super.clone();
+ clone.done = false;
+ return clone;
+ }
+
+ @Override
+ public MapReduce getMapReduce() {
+ return new DefaultMapReduce(this.seedSupplier, this.reducingBiFunction);
+ }
+
+ ///////
+
+ public static class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
+
+ private static final String REDUCING_BARRIER_STEP_SEED_SUPPLIER = "gremlin.reducingBarrierStep.seedSupplier";
+ private static final String REDUCING_BARRIER_STEP_BI_FUNCTION = "gremlin.reducingBarrierStep.biFunction";
+
+ private BiFunction biFunction;
+ private Supplier seedSupplier;
+
+ private DefaultMapReduce() {
+ }
+
+ public DefaultMapReduce(final Supplier seedSupplier, final BiFunction biFunction) {
+ this.seedSupplier = seedSupplier;
+ this.biFunction = biFunction;
+
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ super.storeState(configuration);
+ VertexProgramHelper.serialize(this.seedSupplier, configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
+ VertexProgramHelper.serialize(this.biFunction, configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
+
+ }
+
+ public void loadState(final Configuration configuration) {
+ this.seedSupplier = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
+ this.biFunction = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return !stage.equals(Stage.COMBINE);
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Object generateFinalResult(final Iterator keyValues) {
+ return ((KeyValue) keyValues.next()).getValue();
+
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
+ vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(emitter::emit));
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
+ Object mutatingSeed = this.seedSupplier.get();
+ while (values.hasNext()) {
+ mutatingSeed = this.biFunction.apply(mutatingSeed, values.next());
+ }
+ emitter.emit(FinalGet.tryFinalGet(mutatingSeed));
+ }
+ }
+
+ /////
+
+ public interface FinalGet<A> {
+
+ public A getFinal();
+
+ public static <A> A tryFinalGet(final Object object) {
+ return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
new file mode 100644
index 0000000..2f55759
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
@@ -0,0 +1,95 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class SparsePath implements Path, Serializable {
+
+ private final Map<String, Object> map = new HashMap<>();
+ private Object currentObject = null;
+
+ protected SparsePath() {
+
+ }
+
+ public static SparsePath make() {
+ return new SparsePath();
+ }
+
+ @Override
+ public Path extend(final Object object, final String... labels) {
+ this.currentObject = object;
+ if (labels.length > 0)
+ Stream.of(labels).forEach(label -> this.map.put(label, object));
+ return this;
+ }
+
+ @Override
+ public void addLabel(final String label) {
+ this.map.put(label, this.currentObject);
+ }
+
+ @Override
+ public List<Object> objects() {
+ return Collections.unmodifiableList(new ArrayList<>(this.map.values()));
+ }
+
+ @Override
+ public List<Set<String>> labels() {
+ final List<Set<String>> labels = new ArrayList<>();
+ this.map.forEach((k, v) -> labels.add(Collections.singleton(k)));
+ return Collections.unmodifiableList(labels);
+ }
+
+
+ public <A> A get(final String label) throws IllegalArgumentException {
+ final Object object = this.map.get(label);
+ if (null == object)
+ throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+ return (A) object;
+ }
+
+ @Override
+ public boolean hasLabel(final String label) {
+ return this.map.containsKey(label);
+ }
+
+ @Override
+ public Path clone() {
+ return this;
+ }
+
+ @Override
+ public int size() {
+ return this.map.size();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
new file mode 100644
index 0000000..42f4394
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
@@ -0,0 +1,63 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> {
+
+ private boolean done = false;
+
+ public SupplyingBarrierStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ public abstract E supply();
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.done = false;
+ }
+
+ @Override
+ public Traverser<E> processNextStart() {
+ if (this.done)
+ throw FastNoSuchElementException.instance();
+ while (this.starts.hasNext())
+ this.starts.next();
+ this.done = true;
+ return this.getTraversal().asAdmin().getTraverserGenerator().generate(this.supply(), (Step) this, 1l);
+ }
+
+ @Override
+ public SupplyingBarrierStep<S, E> clone() {
+ final SupplyingBarrierStep<S, E> clone = (SupplyingBarrierStep<S, E>) super.clone();
+ clone.done = false;
+ return clone;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
new file mode 100644
index 0000000..2fe164b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
@@ -0,0 +1,57 @@
+/*
+ * 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.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalComparator<S, E> implements Comparator<S>, Serializable, Cloneable {
+
+ private Traversal.Admin<S, E> traversal;
+ private final Comparator<E> comparator;
+
+ public TraversalComparator(final Traversal.Admin<S, E> traversal, final Comparator<E> comparator) {
+ this.traversal = traversal;
+ this.comparator = comparator;
+ }
+
+ @Override
+ public String toString() {
+ return this.comparator.toString() + "(" + this.traversal + ")";
+ }
+
+ @Override
+ public int compare(final S start1, final S start2) {
+ return this.comparator.compare(TraversalUtil.apply(start1, this.traversal), TraversalUtil.apply(start2, this.traversal));
+ }
+
+ @Override
+ public TraversalComparator clone() throws CloneNotSupportedException {
+ final TraversalComparator clone = (TraversalComparator) super.clone();
+ clone.traversal = this.traversal.clone();
+ return clone;
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
new file mode 100644
index 0000000..be60a27
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
@@ -0,0 +1,134 @@
+/*
+ * 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.step.util;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Tree<T> extends HashMap<T, Tree<T>> implements Serializable {
+
+ public Tree() {
+ super();
+ }
+
+ @SafeVarargs
+ public Tree(final T... children) {
+ this();
+ for (final T t : children) {
+ this.put(t, new Tree<>());
+ }
+ }
+
+ @SafeVarargs
+ public Tree(final Map.Entry<T, Tree<T>>... children) {
+ this();
+ for (final Map.Entry<T, Tree<T>> entry : children) {
+ this.put(entry.getKey(), entry.getValue());
+ }
+ }
+
+
+ public List<Tree<T>> getTreesAtDepth(final int depth) {
+ List<Tree<T>> currentDepth = Collections.singletonList(this);
+ for (int i = 0; i < depth; i++) {
+ if (i == depth - 1) {
+ return currentDepth;
+ } else {
+ final List<Tree<T>> temp = new ArrayList<Tree<T>>();
+ for (final Tree<T> t : currentDepth) {
+ temp.addAll(t.values());
+ }
+ currentDepth = temp;
+ }
+ }
+ return Collections.emptyList();
+ }
+
+ public List<T> getObjectsAtDepth(final int depth) {
+ final List<T> list = new ArrayList<T>();
+ for (final Tree<T> t : this.getTreesAtDepth(depth)) {
+ list.addAll(t.keySet());
+ }
+ return list;
+ }
+
+ public List<Tree<T>> getLeafTrees() {
+ final List<Tree<T>> leaves = new ArrayList<>();
+ List<Tree<T>> currentDepth = Collections.singletonList(this);
+ boolean allLeaves = false;
+ while (!allLeaves) {
+ allLeaves = true;
+ final List<Tree<T>> temp = new ArrayList<>();
+ for (final Tree<T> t : currentDepth) {
+ if (t.isLeaf()) {
+ for (Map.Entry<T, Tree<T>> t2 : t.entrySet()) {
+ leaves.add(new Tree<T>(t2));
+ }
+ } else {
+ allLeaves = false;
+ temp.addAll(t.values());
+ }
+ }
+ currentDepth = temp;
+
+ }
+ return leaves;
+ }
+
+ public List<T> getLeafObjects() {
+ final List<T> leaves = new ArrayList<T>();
+ for (final Tree<T> t : this.getLeafTrees()) {
+ leaves.addAll(t.keySet());
+ }
+ return leaves;
+ }
+
+ public boolean isLeaf() {
+ final Collection<Tree<T>> values = this.values();
+ return values.iterator().next().isEmpty();
+
+ }
+
+ public void addTree(final Tree<T> tree) {
+ tree.forEach((k, t) -> {
+ if (this.containsKey(k)) {
+ this.get(k).addTree(t);
+ } else {
+ this.put(k, t);
+ }
+ });
+ }
+
+ public List<Tree<T>> splitParents() {
+ if (this.keySet().size() == 1) {
+ return Collections.singletonList(this);
+ } else {
+ final List<Tree<T>> parents = new ArrayList<>();
+ this.forEach((k, t) -> {
+ final Tree<T> parentTree = new Tree<>();
+ parentTree.put(k, t);
+ parents.add(parentTree);
+ });
+ return parents;
+ }
+ }
+}
[07/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
new file mode 100644
index 0000000..f88ff13
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
@@ -0,0 +1,255 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class LocalTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
+
+ public abstract Traversal<Vertex, Long> get_g_V_localXoutE_countX();
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
+
+ public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id);
+
+ public abstract Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name();
+
+ @Test
+ @LoadGraphWith(CREW)
+ public void g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+ final Traversal<Vertex, String> traversal = get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("brussels", "san diego", "centreville", "dulles", "baltimore", "bremen", "aachen", "kaiserslautern"), traversal);
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_by() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ final Map<String, Object> map = traversal.next();
+ counter++;
+ assertEquals(2, map.size());
+ if (map.get("a").equals("marko")) {
+ assertEquals(convertToVertexId("lop"), map.get("b"));
+ } else if (map.get("a").equals("josh")) {
+ assertTrue(convertToVertexId("lop").equals(map.get("b")) || convertToVertexId("ripple").equals(map.get("b")));
+ } else if (map.get("a").equals("peter")) {
+ assertEquals(convertToVertexId("lop"), map.get("b"));
+ } else {
+ fail("The following map should not have been returned: " + map);
+ }
+ }
+ assertEquals(4, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_localXoutE_countX() {
+ final Traversal<Vertex, Long> traversal = get_g_V_localXoutE_countX();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(3l, 0l, 0l, 0l, 1l, 2l), traversal);
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_localXbothEXknows_createdX_limitX1XX() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEXknows_createdX_limitX1XX(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ final Edge edge = traversal.next();
+ assertTrue(edge.label().equals("created") || edge.label().equals("knows"));
+ assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_localXbothE_limitX1XX_otherV_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX1XX_otherV_name(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next();
+ assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
+ }
+ assertEquals(1, counter);
+ assertFalse(traversal.hasNext());
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_localXbothE_limitX2XX_otherV_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX2XX_otherV_name(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next();
+ assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
+ }
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_localXinEXknowsX_limitX2XX_outV_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_localXinEXknowsX_limitX2XX_outV_name();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals(traversal.next(), "marko");
+ }
+ assertFalse(traversal.hasNext());
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_localXbothEX1_createdX_limitX1XX() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEX1_createdX_limitX1XX(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ final Edge edge = traversal.next();
+ assertEquals("created", edge.label());
+ assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_localXoutEXknowsX_limitX1XX_inV_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final String name = traversal.next();
+ assertTrue(name.equals("vadas") || name.equals("josh"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next();
+ assertTrue(name.equals("marko") || name.equals("lop") || name.equals("josh") || name.equals("ripple") || name.equals("peter"));
+ }
+ assertEquals(5, counter);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends LocalTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+ return g.V().local(properties("location").order().by(T.value, Order.incr).range(0, 2)).value();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+ return g.V().has(T.label, "person").as("a").local(out("created").as("b")).select("a", "b").by("name").by(T.id);
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+ return g.V().local(outE().count());
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+ return g.V(v1Id).local(outE("knows").limit(1)).inV().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+ return g.V().local(bothE("created").limit(1)).otherV().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+ return g.V(v4Id).local(bothE("created").limit(1));
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+ return g.V(v4Id).local(bothE("knows", "created").limit(1));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+ return g.V(v4Id).local(bothE().limit(1)).otherV().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+ return g.V(v4Id).local(bothE().limit(2)).otherV().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+ return g.V().local(inE("knows").limit(2)).outV().values("name");
+ }
+
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
new file mode 100644
index 0000000..1d26d88
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
@@ -0,0 +1,272 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class RepeatTest extends AbstractGremlinProcessTest {
+
+ // DO/WHILE
+
+ public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path();
+
+ public abstract Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit();
+
+ // WHILE/DO
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path();
+
+ public abstract Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path();
+
+ public abstract Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id);
+
+ // SIDE-EFFECTS
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX();
+
+ // TODO:
+ /*
+ gremlin> g.V(1).repeat(out()).until(outE().count().cap().filter{it.get() == 0}).path().by('name') (3)
+ ==>[marko, lop]
+ ==>[marko, vadas]
+ ==>[marko, josh, ripple]
+ ==>[marko, josh, lop]
+ */
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXoutX_timesX2X_emit_path() {
+ final List<Traversal<Vertex, Path>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXoutX_timesX2X_emit_path());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<Integer, Long> pathLengths = new HashMap<>();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ MapHelper.incr(pathLengths, traversal.next().size(), 1l);
+ }
+ assertEquals(2, pathLengths.size());
+ assertEquals(8, counter);
+ assertEquals(new Long(6), pathLengths.get(2));
+ assertEquals(new Long(2), pathLengths.get(3));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+ final List<Traversal<Vertex, String>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "marko"), traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXoutX_timesX2X() {
+ final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXoutX_timesX2X());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ assertTrue(vertex.value("name").equals("lop") || vertex.value("name").equals("ripple"));
+ }
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXoutX_timesX2X_emit() {
+ final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
+ traversals.add(get_g_V_repeatXoutX_timesX2X_emit());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ Map<String, Long> map = new HashMap<>();
+ while (traversal.hasNext()) {
+ Vertex vertex = traversal.next();
+ MapHelper.incr(map, vertex.value("name"), 1l);
+ }
+ assertEquals(4, map.size());
+ assertTrue(map.containsKey("vadas"));
+ assertTrue(map.containsKey("josh"));
+ assertTrue(map.containsKey("ripple"));
+ assertTrue(map.containsKey("lop"));
+ assertEquals(new Long(1), map.get("vadas"));
+ assertEquals(new Long(1), map.get("josh"));
+ assertEquals(new Long(2), map.get("ripple"));
+ assertEquals(new Long(4), map.get("lop"));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_timesX2X_repeatXoutX_name() {
+ final List<Traversal<Vertex, String>> traversals = Arrays.asList(
+ get_g_VX1X_timesX2X_repeatXoutX_name(convertToVertexId("marko")));
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("lop", "ripple"), traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_emit_timesX2X_repeatXoutX_path() {
+ final List<Traversal<Vertex, Path>> traversals = Arrays.asList(
+ get_g_V_emit_timesX2X_repeatXoutX_path(),
+ get_g_V_emit_repeatXoutX_timesX2X_path());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ int path1 = 0;
+ int path2 = 0;
+ int path3 = 0;
+ while (traversal.hasNext()) {
+ final Path path = traversal.next();
+ if (path.size() == 1) {
+ path1++;
+ } else if (path.size() == 2) {
+ path2++;
+ } else if (path.size() == 3) {
+ path3++;
+ } else {
+ fail("Only path lengths of 1, 2, or 3 should be seen");
+ }
+ }
+ assertEquals(6, path1);
+ assertEquals(6, path2);
+ assertEquals(2, path3);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_emitXhasXlabel_personXX_repeatXoutX_name() {
+ final List<Traversal<Vertex, String>> traversals = Arrays.asList(get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(convertToVertexId("marko")));
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "josh", "vadas"), traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+ final List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ //[ripple:2, peter:1, vadas:2, josh:2, lop:4, marko:1]
+ assertEquals(6, map.size());
+ assertEquals(1l, map.get("marko").longValue());
+ assertEquals(2l, map.get("vadas").longValue());
+ assertEquals(2l, map.get("josh").longValue());
+ assertEquals(4l, map.get("lop").longValue());
+ assertEquals(2l, map.get("ripple").longValue());
+ assertEquals(1l, map.get("peter").longValue());
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends RepeatTest {
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+ return g.V().repeat(out()).times(2).emit().path();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+ return g.V().repeat(out()).times(2).repeat(in()).times(2).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+ return g.V().repeat(out()).times(2);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+ return g.V().repeat(out()).times(2).emit();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+ return g.V(v1Id).times(2).repeat(out()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+ return g.V().emit().repeat(out()).times(2).path();
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+ return g.V().emit().times(2).repeat(out()).path();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+ return g.V(v1Id).emit(has(T.label, "person")).repeat(out()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+ return g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
new file mode 100644
index 0000000..6c90288
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class UnionTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_unionXout__inX_name();
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
+
+ public abstract Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_unionXout__inX_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_unionXout__inX_name();
+ printTraversalForm(traversal);
+ checkResults(new HashMap<String, Long>() {{
+ put("marko", 3l);
+ put("lop", 3l);
+ put("peter", 1l);
+ put("ripple", 1l);
+ put("josh", 3l);
+ put("vadas", 1l);
+ }}, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_unionXrepeatXoutX_timesX2X__outX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ checkResults(new HashMap<String, Long>() {{
+ put("lop", 2l);
+ put("ripple", 1l);
+ put("josh", 1l);
+ put("vadas", 1l);
+ }}, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX() {
+ final Traversal<Vertex, String> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
+ printTraversalForm(traversal);
+ checkResults(new HashMap<String, Long>() {{
+ put("lop", 3l);
+ put("ripple", 1l);
+ put("java", 4l);
+ put("josh", 1l);
+ put("vadas", 1l);
+ put("person", 4l);
+ }}, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+ final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
+ printTraversalForm(traversal);
+ final Map<String, Long> groupCount = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(3l, groupCount.get("lop").longValue());
+ assertEquals(1l, groupCount.get("ripple").longValue());
+ assertEquals(4l, groupCount.get("java").longValue());
+ assertEquals(1l, groupCount.get("josh").longValue());
+ assertEquals(1l, groupCount.get("vadas").longValue());
+ assertEquals(4l, groupCount.get("person").longValue());
+ assertEquals(6, groupCount.size());
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+ final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
+ printTraversalForm(traversal);
+ final Map<String, Long> groupCount = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(12l, groupCount.get("software").longValue());
+ assertEquals(20l, groupCount.get("person").longValue());
+ assertEquals(2, groupCount.size());
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX() {
+ final Traversal<Vertex, Number> traversal = get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(convertToVertexId("marko"), convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Number startNumber = traversal.next();
+ assertTrue(traversal.hasNext());
+ if (startNumber.longValue() == 3l) {
+ assertEquals(0l, traversal.next().longValue());
+ assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
+ //
+ assertEquals(0l, traversal.next().longValue());
+ assertEquals(1l, traversal.next().longValue());
+ assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
+ } else {
+ assertEquals(1l, traversal.next().longValue());
+ assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
+ //
+ assertEquals(3l, traversal.next().longValue());
+ assertEquals(0l, traversal.next().longValue());
+ assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
+ }
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends UnionTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+ return g.V().union(out(), in()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+ return g.V(v1Id).union(repeat(out()).times(2), out()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+ return g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label());
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+ return (Traversal) g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label()).groupCount();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+ return (Traversal) g.V().union(
+ repeat(union(
+ out("created"),
+ in("created"))).times(2),
+ repeat(union(
+ in("created"),
+ out("created"))).times(2)).label().groupCount();
+ }
+
+ @Override
+ public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id) {
+ return g.V(v1Id, v2Id).union(outE().count(), inE().count(), (Traversal) outE().values("weight").sum());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
new file mode 100644
index 0000000..baf5e4f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AndTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
+
+ public abstract Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "josh"), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_andXout__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("josh", "peter"), traversal);
+ }
+
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends AndTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+ return g.V().and(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+ return g.V().and(outE(), has(T.label, "person").and().has("age", Compare.gte, 32)).values("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
new file mode 100644
index 0000000..40a8eb2
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CoinTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_coinX1X();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_coinX0X();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_coinX1X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_coinX1X();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ traversal.next();
+ }
+ assertEquals(6, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_coinX0X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_coinX0X();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ traversal.next();
+ }
+ assertEquals(0, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends CoinTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+ return g.V().coin(1.0d);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+ return g.V().coin(0.0d);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
new file mode 100644
index 0000000..6dce036
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CyclicPathTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1);
+
+ public abstract Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ assertEquals("marko", vertex.<String>value("name"));
+ }
+ assertEquals(1, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path() {
+ final Traversal<Vertex, Path> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Path path = traversal.next();
+ assertFalse(path.isSimple());
+ }
+ assertEquals(1, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends CyclicPathTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
+ return g.V(v1Id).out("created").in("created").cyclicPath();
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
+ return g.V(v1Id).out("created").in("created").cyclicPath().path();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
new file mode 100644
index 0000000..fd199c5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.dedup;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class DedupTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_both_dedup_name();
+
+ public abstract Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
+
+ public abstract Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup();
+
+ public abstract Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_both_dedup_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_both_dedup_name();
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(6, names.size());
+ assertTrue(names.contains("marko"));
+ assertTrue(names.contains("vadas"));
+ assertTrue(names.contains("lop"));
+ assertTrue(names.contains("josh"));
+ assertTrue(names.contains("ripple"));
+ assertTrue(names.contains("peter"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(1, names.size());
+ assertTrue(names.contains("lop") || names.contains("ripple"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_both_name_orderXa_bX_dedup() {
+ final Traversal<Vertex, String> traversal = get_g_V_both_name_orderXa_bX_dedup();
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(6, names.size());
+ assertEquals("josh", names.get(0));
+ assertEquals("lop", names.get(1));
+ assertEquals("marko", names.get(2));
+ assertEquals("peter", names.get(3));
+ assertEquals("ripple", names.get(4));
+ assertEquals("vadas", names.get(5));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+ final Traversal<Vertex, Map<String, Set<Double>>> traversal =
+ get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Set<Double>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(3, map.get("software").size());
+ assertEquals(4, map.get("person").size());
+ assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 1.0)), map.get("software"));
+ assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 0.5, 1.0)), map.get("person"));
+ }
+
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends DedupTest {
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_dedup_name() {
+ return g.V().both().dedup().values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+ return g.V().both().has(T.label, "software").dedup().by("lang").values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+ return g.V().both().<String>properties("name").order().by((a, b) -> a.value().compareTo(b.value())).dedup().value();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+ return g.V().<String, Set<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(dedup(Scope.local));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
new file mode 100644
index 0000000..c7bce37
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class ExceptTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_exceptXX();
+
+ public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_exceptXg_v2X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_exceptXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("lop"));
+ }
+ assertEquals(2, counter);
+ assertEquals(2, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_aggregateXxX_out_exceptXxX() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_exceptXxX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals("ripple", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name() {
+ Traversal<Vertex, String> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ List<String> names = Arrays.asList(traversal.next(), traversal.next());
+ assertFalse(traversal.hasNext());
+ assertEquals(2, names.size());
+ assertTrue(names.contains("peter"));
+ assertTrue(names.contains("josh"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_exceptXg_V_toListX() {
+ Traversal<Vertex, Vertex> traversal = get_g_V_exceptXg_V_toListX();
+ printTraversalForm(traversal);
+ final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(0, vertices.size());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_exceptXX() {
+ Traversal<Vertex, Vertex> traversal = get_g_V_exceptXX();
+ printTraversalForm(traversal);
+ final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(6, vertices.size());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path() {
+ Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(4, paths.size());
+ assertEquals(1, paths.stream().filter(path -> path.size() == 3).count());
+ assertEquals(2, paths.stream().filter(path -> path.size() == 5).count());
+ assertEquals(1, paths.stream().filter(path -> path.size() == 7).count());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("peter", "josh"), traversal);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class StandardTest extends ExceptTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+ return g.V(v1Id).out().except(g.V(v2Id).next());
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+ return g.V(v1Id).out().aggregate("x").out().except("x");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+ return g.V(v1Id).out("created").in("created").except(g.V(v1Id).next()).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+ return g.V().except(g.V().toList());
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+ return g.V().except(Collections.emptyList());
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
+ return g.V(v1Id).repeat(bothE("created").except("e").aggregate("e").otherV()).emit().path();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+ return g.V(v1Id).as("a").out("created").in("created").except("a").values("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
new file mode 100644
index 0000000..eff88b8
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
@@ -0,0 +1,221 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class FilterTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_filterXfalseX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_filterXtrueX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+
+ public abstract Traversal<Edge, Edge> get_g_E_filterXfalseX();
+
+ public abstract Traversal<Edge, Edge> get_g_E_filterXtrueX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_filterXfalseX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_filterXfalseX();
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_filterXtrueX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_filterXtrueX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ vertices.add(traversal.next());
+ }
+ assertEquals(6, counter);
+ assertEquals(6, vertices.size());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_filterXlang_eq_javaX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_filterXlang_eq_javaX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("ripple") ||
+ vertex.value("name").equals("lop"));
+ }
+ assertEquals(2, counter);
+ assertEquals(2, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_filterXage_gt_30X() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_filterXage_gt_30X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_filterXage_gt_30X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ vertices.add(vertex);
+ assertTrue(vertex.value("name").equals("marko") ||
+ vertex.value("name").equals("peter"));
+ }
+ assertEquals(counter, 2);
+ assertEquals(vertices.size(), 2);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_E_filterXfalseX() {
+ final Traversal<Edge, Edge> traversal = get_g_E_filterXfalseX();
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_E_filterXtrueX() {
+ final Traversal<Edge, Edge> traversal = get_g_E_filterXtrueX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Set<Edge> edges = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ edges.add(traversal.next());
+ }
+ assertEquals(6, counter);
+ assertEquals(6, edges.size());
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends FilterTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+ return g.V().filter(v -> false);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+ return g.V().filter(v -> true);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+ return g.V().filter(v -> v.get().<String>property("lang").orElse("none").equals("java"));
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+ return g.V(v1Id).filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+ return g.V(v1Id).out().filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+ return g.V().filter(v -> {
+ final String name = v.get().value("name");
+ return name.startsWith("m") || name.startsWith("p");
+ });
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+ return g.E().filter(e -> false);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+ return g.E().filter(e -> true);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
new file mode 100644
index 0000000..e7b5b8b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class HasNotTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey);
+
+ public abstract Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_hasNotXprop() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "circumference");
+ printTraversalForm(traversal);
+ assertEquals("marko", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "name");
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasNotXprop() {
+ Traversal<Vertex, Vertex> traversal = get_g_V_hasNotXprop("circumference");
+ printTraversalForm(traversal);
+ final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(6, list.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasNotXoutXcreatedXX() {
+ Traversal<Vertex, String> traversal = get_g_V_hasNotXoutXcreatedXX();
+ checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends HasNotTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+ return g.V(v1Id).hasNot(propertyKey);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+ return g.V().hasNot(propertyKey);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+ return g.V().hasNot(__.out("created")).values("name");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
new file mode 100644
index 0000000..ad5db85
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.assumeTrue;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class HasTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_blahX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasXblahX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X();
+
+ public abstract Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id);
+
+ public abstract Traversal<Edge, Edge> get_g_E_hasLabelXknowsX();
+
+ public abstract Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_outXknowsX_hasXoutXcreatedXX_valuesXnameX() {
+ Traversal<Vertex, String> traversal = get_g_V_outXknowsX_hasXoutXcreatedXX_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("josh"), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_hasXkeyX() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "name");
+ printTraversalForm(traversal);
+ assertEquals("marko", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ //
+ traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "circumference");
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_hasXname_markoX() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals("marko", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXname_markoX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX();
+ printTraversalForm(traversal);
+ assertEquals("marko", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXname_blahX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_blahX();
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXage_gt_30X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasXage_gt_30X();
+ printTraversalForm(traversal);
+ final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(2, list.size());
+ for (final Element v : list) {
+ assertTrue(v.<Integer>value("age") > 30);
+ }
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_hasXage_gt_30X() {
+ Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_hasXid_2X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_hasIdX2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals(convertToVertexId("vadas"), traversal.next().id());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXblahX() {
+ assumeTrue(graphMeetsTestRequirements());
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasXblahX();
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_EX7X_hasXlabelXknowsX() {
+ //System.out.println(convertToEdgeId("marko", "knows", "vadas"));
+ Traversal<Edge, Edge> traversal = get_g_EX7X_hasLabelXknowsX(convertToEdgeId("marko", "knows", "vadas"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals("knows", traversal.next().label());
+ }
+ assertEquals(1, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_E_hasXlabelXknowsX() {
+ final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXknowsX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals("knows", traversal.next().label());
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(CREW)
+ public void g_E_hasXlabelXuses_traversesX() {
+ final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXuses_traversesX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String label = traversal.next().label();
+ assertTrue(label.equals("uses") || label.equals("traverses"));
+ }
+ assertEquals(9, counter);
+ }
+
+ @Test
+ @LoadGraphWith(CREW)
+ public void g_V_hasXlabelXperson_software_blahX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_hasLabelXperson_software_blahX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String label = traversal.next().label();
+ assertTrue(label.equals("software") || label.equals("person"));
+ }
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXperson_name_markoX_age() {
+ final Traversal<Vertex, Integer> traversal = get_g_V_hasXperson_name_markoX_age();
+ printTraversalForm(traversal);
+ assertEquals(29, traversal.next().intValue());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outE_hasXweight_inside_0_06X_inV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_hasXweight_inside_0_06X_inV(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ while (traversal.hasNext()) {
+ Vertex vertex = traversal.next();
+ assertTrue(vertex.value("name").equals("vadas") || vertex.value("name").equals("lop"));
+ }
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends HasTest {
+ @Override
+ public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+ return g.V().out("knows").has(out("created")).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+ return g.V(v1Id).has(key);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+ return g.V(v1Id).has("name", "marko");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+ return g.V().has("name", "marko");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+ return g.V().has("name", "blah");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+ return g.V().has("blah");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+ return g.V(v1Id).has("age", Compare.gt, 30);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+ return g.V(v1Id).out().hasId(v2Id);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+ return g.V().has("age", Compare.gt, 30);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+ return g.E(e7Id).hasLabel("knows");
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+ return g.E().hasLabel("knows");
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+ return g.E().hasLabel("uses", "traverses");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+ return g.V().hasLabel("person", "software", "blah");
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+ return g.V().has("person", "name", "marko").values("age");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+ return g.V(v1Id).outE().has("weight", Compare.inside, Arrays.asList(0.0d, 0.6d)).inV();
+ }
+ }
+}
\ No newline at end of file
[05/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
new file mode 100644
index 0000000..5061b55
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class MapTest extends AbstractGremlinProcessTest {
+ public abstract Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX();
+
+ public abstract Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_mapXnameX() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_mapXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals(traversal.next(), "marko");
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outE_label_mapXlengthX() {
+ final Traversal<Vertex, Integer> traversal = get_g_VX1X_outE_label_mapXlengthX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ List<Integer> lengths = traversal.toList();
+ assertTrue(lengths.contains("created".length()));
+ assertTrue(lengths.contains("knows".length()));
+ assertEquals(lengths.size(), 3);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_mapXnameX_mapXlengthX() {
+ final Traversal<Vertex, Integer> traversal = get_g_VX1X_out_mapXnameX_mapXlengthX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final List<Integer> lengths = traversal.toList();
+ assertTrue(lengths.contains("josh".length()));
+ assertTrue(lengths.contains("vadas".length()));
+ assertTrue(lengths.contains("lop".length()));
+ assertEquals(lengths.size(), 3);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_asXaX_out_mapXa_nameX() {
+ int marko = 0;
+ int peter = 0;
+ int josh = 0;
+ int other = 0;
+
+ final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_mapXa_nameX();
+ printTraversalForm(traversal);
+ while (traversal.hasNext()) {
+ final String name = traversal.next();
+ if (name.equals("marko")) marko++;
+ else if (name.equals("peter")) peter++;
+ else if (name.equals("josh")) josh++;
+ else other++;
+ }
+ assertEquals(marko, 3);
+ assertEquals(josh, 2);
+ assertEquals(peter, 1);
+ assertEquals(other, 0);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
+ final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_out_mapXa_name_it_nameX();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String doubleName = traversal.next();
+ assertTrue("markoripple".equals(doubleName) || "markolop".equals(doubleName));
+ }
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends MapTest {
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+ return g.V(v1Id).<String>map(v -> v.get().value("name"));
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+ return g.V(v1Id).outE().label().map(l -> l.get().length());
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+ return g.V(v1Id).out().map(v -> v.get().value("name")).map(n -> n.get().toString().length());
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+ return g.V().as("a").out().<String>map(v -> v.<Vertex>path("a").value("name"));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+ return g.V().as("a").out().out().map(v -> v.<Vertex>path("a").<String>value("name") + v.get().<String>value("name"));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
new file mode 100644
index 0000000..b60506d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -0,0 +1,931 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+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.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Bindings;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.CrossJoinEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Enumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.InnerJoinEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.IteratorEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MatchTest extends AbstractGremlinProcessTest {
+
+ // very basic query
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX();
+
+ // query with selection
+ public abstract Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX();
+
+ // linked traversals
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX();
+
+ // a basic tree with two leaves
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX();
+
+ // a tree with three leaves
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
+
+ // illustrates early deduplication in "predicate" traversals
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX();
+
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX();
+
+ public abstract Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
+
+ // contains a cycle
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX();
+
+ // contains an unreachable label
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX();
+
+ // nested match()
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
+
+ // contains a pair of traversals which connect the same labels, together with a predicate traversal
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
+
+ // contains an identical pair of sets of traversals, up to variable names and has() conditions
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
+
+ // forms a non-trivial DAG
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX();
+
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX();
+
+ // inclusion of where
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
+
+ //TODO: with Traversal.reverse()
+ //public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
+
+ //TODO: with Traversal.reverse()
+ // public abstract Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_out_bX() throws Exception {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_out_bX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "lop")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "ripple")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "lop")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "peter")).put("b", convertToVertex(graph, "lop")));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_out_bX_selectXb_idX() throws Exception {
+ final Traversal<Vertex, Object> traversal = get_g_V_matchXa_out_bX_selectXb_idX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Object vadasId = convertToVertexId("vadas");
+ final Object joshId = convertToVertexId("josh");
+ final Object lopId = convertToVertexId("lop");
+ final Object rippleId = convertToVertexId("ripple");
+ Map<Object, Long> idCounts = new HashMap<>();
+ while (traversal.hasNext()) {
+ counter++;
+ MapHelper.incr(idCounts, traversal.next(), 1l);
+ }
+ assertFalse(traversal.hasNext());
+ assertEquals(idCounts.get(vadasId), Long.valueOf(1l));
+ assertEquals(idCounts.get(lopId), Long.valueOf(3l));
+ assertEquals(idCounts.get(joshId), Long.valueOf(1l));
+ assertEquals(idCounts.get(rippleId), Long.valueOf(1l));
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_knows_b__b_created_cX() throws Exception {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__b_created_cX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_knows_b__a_created_cX() throws Exception {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__a_created_cX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")).put("c", convertToVertex(graph, "lop")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() throws Exception {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+ new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() throws Exception {
+ final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertResults(Function.identity(), traversal, new Bindings<String>().put("a", "marko").put("b", "lop"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() throws Exception {
+ final List<Traversal<Vertex, Map<String, String>>> traversals = Arrays.asList(
+ get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX(),
+ get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ assertResults(Function.identity(), traversal,
+ new Bindings<String>().put("a", "marko").put("b", "lop").put("c", "marko"),
+ new Bindings<String>().put("a", "josh").put("b", "lop").put("c", "marko"),
+ new Bindings<String>().put("a", "peter").put("b", "lop").put("c", "marko"));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() throws Exception {
+ final Traversal<Vertex, String> traversal = get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
+ printTraversalForm(traversal);
+ assertEquals("lop", traversal.next());
+ assertEquals("lop", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_created_b__b_0created_aX() {
+ get_g_V_matchXa_created_b__b_0created_aX();
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_knows_b__c_knows_bX() {
+ get_g_V_matchXa_knows_b__c_knows_bX();
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() throws Exception {
+ final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
+ printTraversalForm(traversal);
+ assertResults(Function.identity(), traversal,
+ new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"),
+ new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"), // expected duplicate: two paths to this solution
+ new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "marko"),
+ new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "peter"));
+ }
+
+ /* TODO: this test requires Traversal.reverse()
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_created_b__c_created_bX_selectXnameX() throws Exception {
+ final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Long> countMap = new HashMap<>();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Map<String, String> bindings = traversal.next();
+ // TODO: c is not being bound
+ // assertEquals(3, bindings.size());
+ assertEquals("lop", bindings.get("b"));
+ MapHelper.incr(countMap, bindings.get("a") + ":" + bindings.get("c"), 1l);
+ }
+ // TODO: without 'c' binding, cant check results
+ // assertEquals(Long.valueOf(1), countMap.get("marko:marko"));
+ //assertEquals(Long.valueOf(1), countMap.get("marko:josh"));
+ //assertEquals(Long.valueOf(1), countMap.get("marko:peter"));
+ //assertEquals(Long.valueOf(1), countMap.get("josh:marko"));
+ //assertEquals(Long.valueOf(1), countMap.get("josh:josh"));
+ //assertEquals(Long.valueOf(1), countMap.get("josh:peter"));
+ //assertEquals(Long.valueOf(1), countMap.get("peter:marko"));
+ //assertEquals(Long.valueOf(1), countMap.get("peter:josh"));
+ //assertEquals(Long.valueOf(1), countMap.get("peter:peter"));
+ //assertEquals(countMap.size(), 9);
+ //assertEquals(9, counter);
+ assertFalse(traversal.hasNext());
+ }
+ */
+
+ /* TODO: this test requires Traversal.reverse()
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() throws Exception {
+ // TODO: Doesn't work, only bindings to 'a' in binding set.
+ final Traversal<Vertex, String> traversal = get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final List<String> results = traversal.toList();
+ assertEquals(2, results.size());
+ assertTrue(results.contains("josh"));
+ assertTrue(results.contains("vadas"));
+ }
+ */
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() throws Exception {
+ Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CREAM PUFF WAR")),
+ new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT")));
+ }
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() throws Exception {
+ Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Garcia"))
+ .put("b", convertToVertex(graph, "I WANT TO TELL YOU"))
+ .put("c", convertToVertex(graph, "STIR IT UP"))
+ .put("d", convertToVertex(graph, "George_Harrison"))
+ .put("e", convertToVertex(graph, "Bob_Marley")));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() throws Exception {
+ Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
+ assertResults(Function.identity(), traversal,
+ new Bindings<String>().put("a", "marko").put("c", "josh"),
+ new Bindings<String>().put("a", "marko").put("c", "peter"),
+ new Bindings<String>().put("a", "josh").put("c", "marko"),
+ new Bindings<String>().put("a", "josh").put("c", "peter"),
+ new Bindings<String>().put("a", "peter").put("c", "marko"),
+ new Bindings<String>().put("a", "peter").put("c", "josh"));
+ }
+
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() throws Exception {
+ final List<Traversal<Vertex, Map<String, Vertex>>> traversals = Arrays.asList(
+ get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX(),
+ get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX());
+
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ assertResults(vertexToStr, traversal,
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Garcia"))
+ .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
+ .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
+ .put("d", convertToVertex(graph, "Garcia")),
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Garcia"))
+ .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
+ .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+ .put("d", convertToVertex(graph, "Garcia")),
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Garcia"))
+ .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+ .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
+ .put("d", convertToVertex(graph, "Garcia")),
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Garcia"))
+ .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+ .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+ .put("d", convertToVertex(graph, "Garcia")),
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Grateful_Dead"))
+ .put("b", convertToVertex(graph, "CANT COME DOWN"))
+ .put("c", convertToVertex(graph, "DOWN SO LONG"))
+ .put("d", convertToVertex(graph, "Garcia")),
+ new Bindings<Vertex>()
+ .put("a", convertToVertex(graph, "Grateful_Dead"))
+ .put("b", convertToVertex(graph, "THE ONLY TIME IS NOW"))
+ .put("c", convertToVertex(graph, "DOWN SO LONG"))
+ .put("d", convertToVertex(graph, "Garcia")));
+ });
+ }
+
+
+ /* TODO: is it necessary to implement each of these traversals three times?
+ @Test
+ @LoadGraphWith(MODERN)
+ public void testTraversalUpdater() throws Exception {
+ assertBranchFactor(
+ 2.0,
+ as("a").out("knows").as("b"),
+ new SingleIterator<>(g.V(1)));
+
+ assertBranchFactor(
+ 0.0,
+ as("a").out("foo").as("b"),
+ new SingleIterator<>(g.V(1)));
+
+ assertBranchFactor(
+ 7.0,
+ as("a").both().both().as("b"),
+ new SingleIterator<>(g.V(1)));
+
+ assertBranchFactor(
+ 0.5,
+ as("a").outV().has("name", "marko").as("b"),
+ g.E());
+ }
+ */
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void testOptimization() throws Exception {
+ MatchStep<Object, Object> query;
+ Iterator iter;
+
+ query = new MatchStep<>(g.V().asAdmin(), "d",
+ as("d").in("knows").as("a"),
+ as("d").has("name", "vadas"),
+ as("a").out("knows").as("b"),
+ as("b").out("created").as("c"));
+ iter = g.V();
+ query.optimize();
+ //System.out.println(query.summarize());
+
+ // c costs nothing (no outgoing traversals)
+ assertEquals(0.0, query.findCost("c"), 0);
+ // b-created->c has a cost equal to its branch factor, 1.0
+ // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
+ assertEquals(1.0, query.findCost("b"), 0);
+ // the cost of a-knows->b is its branch factor (1.0) plus the branch factor times the cost of b-created->c (1.0), so 2.0
+ // a has only one outgoing traversal, a-knows->b, so its total cost is 2.0
+ assertEquals(2.0, query.findCost("a"), 0);
+ // the cost of d<-knows-a is its branch factor (1.0) plus the branch factor times the cost of a-knows->b (2.0), so 3.0
+ // the cost of d->has(name,vadas) is its branch factor (1.0)
+ // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
+ // or 3.0 + 1.0*1.0 = 4.0
+ assertEquals(4.0, query.findCost("d"), 0);
+
+ // apply the query to the graph, gathering non-trivial branch factors
+ assertResults(query.solveFor(iter),
+ new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+ new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+ query.optimize();
+ //System.out.println(query.summarize());
+
+ // c still costs nothing (no outgoing traversals)
+ assertEquals(0.0, query.findCost("c"), 0);
+ // b-created->c still has a branch factor of 1.0, as we have put two items in (josh and vadas) and gotten two out (lop and ripple)
+ // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
+ /* TODO: adjust and restore
+ assertEquals(1.0, query.findCost("b"), 0);
+ // a-knows->b now has a branch factor of 2.0 -- we put in marko and got out josh and vadas
+ // the cost of a-knows->b is its branch factor (2.0) plus the branch factor times the cost of b-created->c (1.0), so 4.0
+ // a has only one outgoing traversal, a-knows->b, so its total cost is 4.0
+ assertEquals(4.0, query.findCost("a"), 0);
+ // d<-knows-a has a branch factor of 1/6 -- we put in all six vertices and got out marko
+ // we get out marko only once, because d-name->"vadas" is tried first and rules out all but one "d"
+ // the cost of d<-knows-a is its branch factor (1/6) plus the branch factor times the cost of a-knows->b (4.0), so 5/6
+ // since we optimized to put the has step first (it immediately eliminates most vertices),
+ // the cost of d->has(name,vadas) is 1/6 -- we put in all six vertices and got out one
+ // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
+ // or 1/6 + 1/6*5/6 = 11/36
+ */
+ }
+
+ // TODO: uncomment when query cycles are supported
+ /*
+ @Test
+ @LoadGraphWith(MODERN)
+ public void testCyclicPatterns() throws Exception {
+ MatchStep<Object, Object> query;
+ Iterator iter;
+
+ iter = g.V();
+ query = new MatchStep<>(g.V(), "a",
+ as("a").out("uses").as("b"),
+ as("b").out("dependsOn").as("c"),
+ as("c").in("created").as("a"));
+
+ assertResults(query.solve(iter),
+ new Bindings<>().put("a", "v[1]").put("b", "v[10]").put("c", "v[11]"));
+ }
+ */
+
+ @Test
+ public void testIteratorEnumerator() throws Exception {
+ IteratorEnumerator<String> ie;
+ final Map<String, String> map = new HashMap<>();
+ BiConsumer<String, String> visitor = map::put;
+
+ ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
+ add("foo");
+ add("bar");
+ }}.iterator());
+ assertEquals(0, ie.size());
+ assertTrue(ie.visitSolution(0, visitor));
+ assertEquals(1, ie.size());
+ assertEquals(1, map.size());
+ assertEquals("foo", map.get("a"));
+ map.clear();
+ assertTrue(ie.visitSolution(1, visitor));
+ assertEquals(2, ie.size());
+ assertEquals(1, map.size());
+ assertEquals("bar", map.get("a"));
+ map.clear();
+ assertFalse(ie.visitSolution(2, visitor));
+ assertEquals(2, ie.size());
+ assertEquals(0, map.size());
+ // revisit previous solutions at random
+ assertTrue(ie.visitSolution(1, visitor));
+ assertEquals(2, ie.size());
+ assertEquals(1, map.size());
+ assertEquals("bar", map.get("a"));
+
+ // empty enumerator
+ ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
+ }}.iterator());
+ map.clear();
+ assertEquals(0, ie.size());
+ assertFalse(ie.visitSolution(0, visitor));
+ assertEquals(0, ie.size());
+ assertEquals(0, map.size());
+ }
+
+ @Test
+ public void testCrossJoin() throws Exception {
+ String[] a1 = new String[]{"a", "b", "c"};
+ String[] a2 = new String[]{"1", "2", "3", "4"};
+ String[] a3 = new String[]{"@", "#"};
+
+ Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
+ Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
+ Enumerator<String> e3 = new IteratorEnumerator<>("punc", Arrays.asList(a3).iterator());
+
+ Enumerator<String> e1e2 = new CrossJoinEnumerator<>(e1, e2);
+ Enumerator<String> e2e1 = new CrossJoinEnumerator<>(e2, e1);
+ BiConsumer<String, String> visitor = (name, value) -> {
+ System.out.println("\t" + name + ":\t" + value);
+ };
+ Enumerator<String> e1e2e3 = new CrossJoinEnumerator<>(e1e2, e3);
+
+ Enumerator<String> result;
+
+ result = e1e2;
+ assertEquals(12, exhaust(result));
+ assertEquals(12, result.size());
+
+ result = e2e1;
+ assertEquals(12, exhaust(result));
+ assertEquals(12, result.size());
+
+ result = e1e2e3;
+ assertEquals(24, exhaust(result));
+ assertEquals(24, result.size());
+
+ /*
+ int i = 0;
+ while (result.visitSolution(i, visitor)) {
+ System.out.println("solution #" + (i + 1) + "^^");
+ i++;
+ }
+ */
+ }
+
+ /* TODO: uncomment when optimized cross-joins are available
+ @Test
+ public void testCrossJoinLaziness() throws Exception {
+ List<Integer> value = new LinkedList<>();
+ for (int j = 0; j < 1000; j++) {
+ value.add(j);
+ }
+
+ int base = 3;
+ List<Enumerator<Integer>> enums = new LinkedList<>();
+ for (int k = 0; k < base; k++) {
+ List<Integer> lNew = new LinkedList<>();
+ lNew.addAll(value);
+ Enumerator<Integer> ek = new IteratorEnumerator<>("" + (char) ('a' + k), lNew.iterator());
+ enums.add(ek);
+ }
+
+ Enumerator<Integer> e = new NewCrossJoinEnumerator<>(enums);
+
+ // we now have an enumerator of 5^3^10 elements
+ EnumeratorIterator<Integer> iter = new EnumeratorIterator<>(e);
+
+ int count = 0;
+ // each binding set is unique
+ Set<String> values = new HashSet<>();
+ String s;
+ s = iter.next().toString();
+ values.add(s);
+ assertEquals(++count, values.size());
+ // begin at the head of all iterators
+ assertEquals("{a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0}", s);
+ int lim0 = (int) Math.pow(1, base);
+ // first 2^10 results are binary (0's and 1's)
+ int lim1 = (int) Math.pow(2, base);
+ for (int i = lim0; i < lim1; i++) {
+ s = iter.next().toString();
+ System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
+ assertTrue(s.contains("1"));
+ assertFalse(s.contains("2"));
+ values.add(s);
+ assertEquals(++count, values.size());
+ }
+ int lim2 = (int) Math.pow(3, base);
+ for (int i = lim1; i < lim2; i++) {
+ s = iter.next().toString();
+ System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
+
+ if (!s.contains("2")) {
+ findMissing(null, 0, base, "abcdefghij".getBytes(), values);
+ }
+
+
+ assertTrue(s.contains("2"));
+ assertFalse(s.contains("3"));
+ values.add(s);
+ assertEquals(++count, values.size());
+ }
+ }
+ */
+
+ @Test
+ public void testInnerJoin() throws Exception {
+ String[] a1 = new String[]{"a", "b", "c"};
+ String[] a2 = new String[]{"1", "2", "3", "4"};
+ String[] a3 = new String[]{"2", "4", "6", "8", "10"};
+
+ Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
+ Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
+ Enumerator<String> e3 = new IteratorEnumerator<>("number", Arrays.asList(a3).iterator());
+
+ Enumerator<String> e4 = new CrossJoinEnumerator<>(e1, e3);
+ Enumerator<String> e5 = new CrossJoinEnumerator<>(e2, e4);
+
+ // without AND semantics, we have all 60 combinations, including two "number" bindings per solution
+ exhaust(e5);
+ assertEquals(60, e5.size());
+
+ // with AND semantics, we have only those six solutions for which a2 and a3 align
+ Enumerator<String> join = new InnerJoinEnumerator<>(e5, new HashSet<String>() {{
+ add("number");
+ }});
+ exhaust(join);
+ assertEquals(6, join.size());
+
+ assertResults(join,
+ new Bindings<String>().put("letter", "a").put("number", "2"),
+ new Bindings<String>().put("letter", "a").put("number", "4"),
+ new Bindings<String>().put("letter", "b").put("number", "2"),
+ new Bindings<String>().put("letter", "b").put("number", "4"),
+ new Bindings<String>().put("letter", "c").put("number", "2"),
+ new Bindings<String>().put("letter", "c").put("number", "4"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends MatchTest {
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
+ return g.V().match("a", as("a").out().as("b"));
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
+ return g.V().match("a", as("a").out().as("b")).select("b").by(T.id);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
+ return g.V().match("a",
+ as("a").out("knows").as("b"),
+ as("b").out("created").as("c"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
+ return g.V().match("a",
+ as("a").out("knows").as("b"),
+ as("a").out("created").as("c"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
+ return g.V().match("d",
+ as("d").in("knows").as("a"),
+ as("d").has("name", "vadas"),
+ as("a").out("knows").as("b"),
+ as("b").out("created").as("c"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
+ return g.V().match("a",
+ as("a").out("created").as("b"),
+ __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select("a", "b").by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
+ return g.V().match("a",
+ as("a").out("created").has("name", "lop").as("b"),
+ as("b").in("created").has("age", 29).as("c"),
+ __.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
+ return g.V().match("a",
+ as("a").out("created").has("name", "lop").as("b"),
+ as("b").in("created").has("age", 29).as("c"))
+ .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
+ return g.V().out().out().match("a",
+ as("a").in("created").as("b"),
+ as("b").in("knows").as("c")).select("c").out("created").values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
+ return g.V().match("a",
+ as("a").out("created").as("b"),
+ as("b").in("created").as("a"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
+ return g.V().match("a", as("a").out("knows").as("b"),
+ as("c").out("knows").as("b"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
+ return g.V().match("a",
+ as("a").out("knows").as("b"),
+ as("b").out("created").has("name", "lop"),
+ as("b").match("a1",
+ as("a1").out("created").as("b1"),
+ as("b1").in("created").as("c1")).select("c1").as("c")).<String>select().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
+ return g.V().match("a",
+ as("a").has("name", "Garcia"),
+ as("a").in("writtenBy").as("b"),
+ as("a").in("sungBy").as("b"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
+ return g.V().match("a",
+ as("a").in("sungBy").as("b"),
+ as("a").in("sungBy").as("c"),
+ as("b").out("writtenBy").as("d"),
+ as("c").out("writtenBy").as("e"),
+ as("d").has("name", "George_Harrison"),
+ as("e").has("name", "Bob_Marley"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
+ return g.V().match("a",
+ as("a").in("sungBy").as("b"),
+ as("a").in("writtenBy").as("c"),
+ as("b").out("writtenBy").as("d"),
+ as("c").out("sungBy").as("d"),
+ as("d").has("name", "Garcia"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
+ return g.V().match("a",
+ as("a").in("sungBy").as("b"),
+ as("a").in("writtenBy").as("c"),
+ as("b").out("writtenBy").as("d"))
+ .where(as("c").out("sungBy").as("d"))
+ .where(as("d").has("name", "Garcia"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
+ return g.V().match("a",
+ as("a").out("created").as("b"),
+ as("b").in("created").as("c"))
+ .where("a", Compare.neq, "c")
+ .<String>select("a", "c").by("name");
+ }
+
+ /*@Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
+ return g.V().match("a",
+ as("a").out("created").as("b"),
+ as("c").out("created").as("b")).select(v -> ((Vertex) v).value("name"));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
+ return g.V().out().out().match("a",
+ as("b").out("created").as("a"),
+ as("c").out("knows").as("b")).select("c").out("knows").value("name");
+ }*/
+
+ }
+
+ private static final Function<Vertex, String> vertexToStr = v -> v.id().toString();
+
+ private <S, E> void assertResults(final Function<E, String> toStringFunction,
+ final Traversal<S, Map<String, E>> actual,
+ final Bindings<E>... expected) {
+ Comparator<Bindings<E>> comp = new Bindings.BindingsComparator<>(toStringFunction);
+
+ List<Bindings<E>> actualList = toBindings(actual);
+ List<Bindings<E>> expectedList = new LinkedList<>();
+ Collections.addAll(expectedList, expected);
+
+ if (expectedList.size() > actualList.size()) {
+ fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
+ } else if (actualList.size() > expectedList.size()) {
+ fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
+ }
+
+ Collections.sort(actualList, comp);
+ Collections.sort(expectedList, comp);
+
+ for (int j = 0; j < actualList.size(); j++) {
+ Bindings<E> a = actualList.get(j);
+ Bindings<E> e = expectedList.get(j);
+
+ if (0 != comp.compare(a, e)) {
+ fail("unexpected result(s), including " + a);
+ }
+ }
+ assertFalse(actual.hasNext());
+ }
+
+ private static final Function<Object, String> simpleToStringFunction = Object::toString;
+
+ private <T> void assertResults(final Enumerator<T> actual,
+ final Bindings<T>... expected) {
+ Comparator<Bindings<T>> comp = new Bindings.BindingsComparator<>((Function<T, String>) simpleToStringFunction);
+
+ List<Bindings<T>> actualList = toBindings(actual);
+ List<Bindings<T>> expectedList = new LinkedList<>();
+ Collections.addAll(expectedList, expected);
+
+ Collections.sort(actualList, comp);
+ Collections.sort(expectedList, comp);
+
+ for (int j = 0; j < actualList.size(); j++) {
+ if (j == expectedList.size()) {
+ fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
+ }
+
+ Bindings<T> a = actualList.get(j);
+ Bindings<T> e = expectedList.get(j);
+
+ if (0 != comp.compare(a, e)) {
+ fail("unexpected result(s), including " + a);
+ }
+ }
+ if (expectedList.size() > actualList.size()) {
+ fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
+ }
+ }
+
+ private <S, E> List<Bindings<E>> toBindings(final Traversal<S, Map<String, E>> traversal) {
+ List<Bindings<E>> result = new LinkedList<>();
+ traversal.forEachRemaining(o -> {
+ result.add(new Bindings<>(o));
+ });
+ return result;
+ }
+
+ private <T> List<Bindings<T>> toBindings(final Enumerator<T> enumerator) {
+ List<Bindings<T>> bindingsList = new LinkedList<>();
+ int i = 0;
+ bindingsList.add(new Bindings<>());
+ while (enumerator.visitSolution(i++, (name, value) -> {
+ bindingsList.get(bindingsList.size() - 1).put(name, value);
+ })) {
+ bindingsList.add(new Bindings<>());
+ }
+ bindingsList.remove(bindingsList.size() - 1);
+
+ return bindingsList;
+ }
+
+ private void assertBranchFactor(final double branchFactor,
+ final Traversal t,
+ final Iterator inputs) {
+ Traverser start = new B_O_PA_S_SE_SL_Traverser(null, null);
+ MatchStep.TraversalWrapper w = new MatchStep.TraversalWrapper(t, "a", "b");
+ MatchStep.TraversalUpdater updater = new MatchStep.TraversalUpdater<>(w, inputs, start, "x");
+ while (updater.hasNext()) {
+ updater.next();
+ }
+ assertEquals(branchFactor, w.findBranchFactor(), 0);
+ }
+
+ private <T> int exhaust(Enumerator<T> enumerator) {
+ BiConsumer<String, T> visitor = (s, t) -> {
+ };
+ int i = 0;
+ while (enumerator.visitSolution(i, visitor)) i++;
+ return i;
+ }
+
+ private void findMissing(String s, final int i, final int n, final byte[] names, final Set<String> actual) {
+ if (0 == i) {
+ s = "{";
+ } else {
+ s += ", ";
+ }
+
+ s += (char) names[i];
+ s += "=";
+ String tmp = s;
+ for (int j = 0; j < 3; j++) {
+ s += j;
+
+ if (n - 1 == i) {
+ s += "}";
+ if (!actual.contains(s)) {
+ fail("not in set: " + s);
+ }
+ } else {
+ findMissing(s, i + 1, n, names, actual);
+ }
+
+ s = tmp;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
new file mode 100644
index 0000000..dca94e7
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MaxTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Integer> get_g_V_age_max();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max();
+
+ public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_age_max() {
+ final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
+ get_g_V_age_max(),
+ get_g_V_repeatXbothX_timesX5X_age_max());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(35), traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmaxXlocalXX() {
+ final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Number> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(1.0, map.get("ripple"));
+ assertEquals(0.4, map.get("lop"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends MaxTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_max() {
+ return g.V().values("age").max();
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+ return g.V().repeat(both()).times(5).values("age").max();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
+ return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(max(Scope.local));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
new file mode 100644
index 0000000..ace1c55
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.mean;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MeanTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Double> get_g_V_age_mean();
+
+ public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_age_mean() {
+ final List<Traversal<Vertex, Double>> traversals = Arrays.asList(get_g_V_age_mean());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ final Double mean = traversal.next();
+ assertEquals(30.75, mean, 0.05);
+ assertFalse(traversal.hasNext());
+
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmeanXlocalXX() {
+ final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Number> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(1.0, map.get("ripple"));
+ assertEquals(1.0 / 3, map.get("lop"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends MeanTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_age_mean() {
+ return g.V().values("age").mean();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
+ return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(mean(Scope.local));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
new file mode 100644
index 0000000..1c55532
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MinTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Integer> get_g_V_age_min();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min();
+
+ public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_age_min() {
+ final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
+ get_g_V_age_min(),
+ get_g_V_repeatXbothX_timesX5X_age_min());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(27), traversal);
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXminXlocalXX() {
+ final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Number> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(1.0, map.get("ripple"));
+ assertEquals(0.2, map.get("lop"));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends MinTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_min() {
+ return g.V().values("age").min();
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+ return g.V().repeat(both()).times(5).values("age").min();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
+ return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(min(Scope.local));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
new file mode 100644
index 0000000..3b690a5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
@@ -0,0 +1,288 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class OrderTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_name_order();
+
+ public abstract Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X();
+
+ public abstract Traversal<Vertex, String> get_g_V_order_byXname_incrX_name();
+
+ public abstract Traversal<Vertex, String> get_g_V_order_byXnameX_name();
+
+ public abstract Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight();
+
+ public abstract Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
+
+ public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
+
+ public abstract Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_name_order() {
+
+ final Traversal<Vertex, String> traversal = get_g_V_name_order();
+ printTraversalForm(traversal);
+ final List<String> names = traversal.toList();
+ assertEquals(names.size(), 6);
+ assertEquals("josh", names.get(0));
+ assertEquals("lop", names.get(1));
+ assertEquals("marko", names.get(2));
+ assertEquals("peter", names.get(3));
+ assertEquals("ripple", names.get(4));
+ assertEquals("vadas", names.get(5));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
+ final Traversal<Vertex, String> traversal = get_g_V_name_order_byXa1_b1X_byXb2_a2X();
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(names.size(), 6);
+ assertEquals("marko", names.get(0));
+ assertEquals("vadas", names.get(1));
+ assertEquals("peter", names.get(2));
+ assertEquals("ripple", names.get(3));
+ assertEquals("josh", names.get(4));
+ assertEquals("lop", names.get(5));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_order_byXname_incrX_name() {
+ Arrays.asList(get_g_V_order_byXname_incrX_name(), get_g_V_order_byXnameX_name()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(names.size(), 6);
+ assertEquals("josh", names.get(0));
+ assertEquals("lop", names.get(1));
+ assertEquals("marko", names.get(2));
+ assertEquals("peter", names.get(3));
+ assertEquals("ripple", names.get(4));
+ assertEquals("vadas", names.get(5));
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_outE_order_byXweight_decrX_weight() {
+ final Traversal<Vertex, Double> traversal = get_g_V_outE_order_byXweight_decrX_weight();
+ printTraversalForm(traversal);
+ final List<Double> weights = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(6, weights.size());
+ assertEquals(Double.valueOf(1.0d), weights.get(0));
+ assertEquals(Double.valueOf(1.0d), weights.get(1));
+ assertEquals(Double.valueOf(0.5d), weights.get(2));
+ assertEquals(Double.valueOf(0.4d), weights.get(3));
+ assertEquals(Double.valueOf(0.4d), weights.get(4));
+ assertEquals(Double.valueOf(0.2d), weights.get(5));
+
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
+ printTraversalForm(traversal);
+ final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(names.size(), 6);
+ assertEquals("marko", names.get(0));
+ assertEquals("vadas", names.get(1));
+ assertEquals("peter", names.get(2));
+ assertEquals("ripple", names.get(3));
+ assertEquals("josh", names.get(4));
+ assertEquals("lop", names.get(5));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+ final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
+ printTraversalForm(traversal);
+ int counter = 0;
+ int markoCounter = 0;
+ int joshCounter = 0;
+ int peterCounter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Vertex> bindings = traversal.next();
+ assertEquals(2, bindings.size());
+ if (bindings.get("a").id().equals(convertToVertexId("marko"))) {
+ assertEquals(convertToVertexId("lop"), bindings.get("b").id());
+ markoCounter++;
+ } else if (bindings.get("a").id().equals(convertToVertexId("josh"))) {
+ assertTrue((bindings.get("b")).id().equals(convertToVertexId("lop")) || bindings.get("b").id().equals(convertToVertexId("ripple")));
+ joshCounter++;
+ } else if (bindings.get("a").id().equals(convertToVertexId("peter"))) {
+ assertEquals(convertToVertexId("lop"), bindings.get("b").id());
+ peterCounter++;
+ } else {
+ fail("This state should not have been reachable");
+ }
+
+
+ }
+ assertEquals(4, markoCounter + joshCounter + peterCounter);
+ assertEquals(1, markoCounter);
+ assertEquals(1, peterCounter);
+ assertEquals(2, joshCounter);
+ assertEquals(4, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX() {
+ final Traversal<Vertex, Map<Integer, Integer>> traversal = get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final Map<Integer, Integer> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(4, map.size());
+ final Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
+ Map.Entry<Integer, Integer> entry = iterator.next();
+ assertEquals(3, entry.getKey().intValue());
+ assertEquals(87, entry.getValue().intValue());
+ entry = iterator.next();
+ assertEquals(2, entry.getKey().intValue());
+ assertEquals(58, entry.getValue().intValue());
+ entry = iterator.next();
+ assertEquals(1, entry.getKey().intValue());
+ assertEquals(29, entry.getValue().intValue());
+ entry = iterator.next();
+ assertEquals(4, entry.getKey().intValue());
+ assertEquals(29, entry.getValue().intValue());
+ assertFalse(iterator.hasNext());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_order_byXoutE_count__decrX() {
+ Arrays.asList(get_g_V_order_byXoutE_count__decrX()).forEach(traversal -> {
+ printTraversalForm(traversal);
+ final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+ assertEquals(vertices.size(), 6);
+ assertEquals("marko", vertices.get(0).value("name"));
+ assertEquals("josh", vertices.get(1).value("name"));
+ assertEquals("peter", vertices.get(2).value("name"));
+ assertTrue(vertices.get(3).value("name").equals("vadas") || vertices.get(3).value("name").equals("ripple") || vertices.get(3).value("name").equals("lop"));
+ assertTrue(vertices.get(4).value("name").equals("vadas") || vertices.get(4).value("name").equals("ripple") || vertices.get(4).value("name").equals("lop"));
+ assertTrue(vertices.get(5).value("name").equals("vadas") || vertices.get(5).value("name").equals("ripple") || vertices.get(5).value("name").equals("lop"));
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends OrderTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order() {
+ return g.V().<String>values("name").order();
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+ return g.V().<String>values("name").order().by((a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).by((a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3)));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+ return g.V().order().by("name", Order.incr).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+ return g.V().order().by("name", Order.incr).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+ return g.V().outE().order().by("weight", Order.decr).values("weight");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+ return g.V().order().
+ <String>by("name", (a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).
+ <String>by("name", (a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3))).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+ return g.V().as("a").out("created").as("b").order().by(Order.shuffle).select();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id) {
+ return g.V(v1Id).map(v -> {
+ final Map<Integer, Integer> map = new HashMap<>();
+ map.put(1, (int) v.get().value("age"));
+ map.put(2, (int) v.get().value("age") * 2);
+ map.put(3, (int) v.get().value("age") * 3);
+ map.put(4, (int) v.get().value("age"));
+ return map;
+ }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+ return g.V().order().by(outE().count(), Order.decr);
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
new file mode 100644
index 0000000..a8a6f2b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class PathTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id);
+
+ public abstract Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
+
+ public abstract Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX();
+
+ public abstract Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_name_path() {
+ final Traversal<Vertex, Path> traversal = get_g_VX1X_name_path(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final Path path = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, path.size());
+ assertEquals(convertToVertexId("marko"), ((Vertex) path.get(0)).<String>id());
+ assertEquals("marko", path.<String>get(1));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_path_byXageX_byXnameX() {
+ final Traversal<Vertex, Path> traversal = get_g_VX1X_out_path_byXageX_byXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Set<String> names = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ final Path path = traversal.next();
+ assertEquals(Integer.valueOf(29), path.<Integer>get(0));
+ assertTrue(path.get(1).equals("josh") || path.get(1).equals("vadas") || path.get(1).equals("lop"));
+ names.add(path.get(1));
+ }
+ assertEquals(3, counter);
+ assertEquals(3, names.size());
+ }
+
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
+ final Traversal<Vertex, Path> traversal = get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Path path = traversal.next();
+ assertEquals(3, path.size());
+ assertEquals("marko", ((Vertex) path.get(0)).<String>value("name"));
+ assertEquals("josh", path.<String>get(1));
+ assertEquals("java", path.<String>get(2));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @LoadGraphWith(MODERN)
+ public void g_V_out_out_path_byXnameX_byXageX() {
+ final Traversal<Vertex, Path> traversal = get_g_V_out_out_path_byXnameX_byXageX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Path path = traversal.next();
+ assertEquals(3, path.size());
+ assertEquals("marko", path.<String>get(0));
+ assertEquals(Integer.valueOf(32), path.<Integer>get(1));
+ assertTrue(path.get(2).equals("lop") || path.get(2).equals("ripple"));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+ final Traversal<Vertex, Path> traversal = get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
+ printTraversalForm(traversal);
+ final Path path = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(1, path.size());
+ assertTrue(path.hasLabel("a"));
+ assertTrue(path.hasLabel("b"));
+ assertTrue(path.hasLabel("c"));
+ assertEquals(1, path.labels().size());
+ assertEquals(3, path.labels().get(0).size());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends PathTest {
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+ return g.V(v1Id).values("name").path();
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
+ return g.V(v1Id).out().path().by("age").by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+ return g.V().repeat(out()).times(2).path().by().by("name").by("lang");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+ return g.V().out().out().path().by("name").by("age");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+ return g.V().as("a").has("name", "marko").as("b").has("age", 29).as("c").path();
+ }
+ }
+}
\ No newline at end of file
[17/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
deleted file mode 100644
index 29d3ac9..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
+++ /dev/null
@@ -1,115 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyPathTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends PathTest {
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
- g.V(v1Id).identity.name.path
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
- g.V(v1Id).out.path.by('age').by('name');
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
- g.V.repeat(__.out).times(2).path.by.by('name').by('lang');
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
- g.V.out.out.path.by('name').by('age');
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
- g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path;
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends PathTest {
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).identity.name.path", g);
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_out_path_byXageX_byXnameX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_out_out_path_byXnameX_byXageX() {
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
- ComputerTestHelper.compute("g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path", g);
- }
-
- @Override
- Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
deleted file mode 100644
index 1332e1e..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
+++ /dev/null
@@ -1,61 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyPropertiesTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends PropertiesTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
- g.V.has('age').properties('name', 'age').value;
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
- g.V.has('age').properties('age', 'name').value;
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends PropertiesTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
- ComputerTestHelper.compute("g.V.has('age').properties('name', 'age').value", g);
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
- ComputerTestHelper.compute("g.V.has('age').properties('age', 'name').value", g);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
deleted file mode 100644
index d953e72..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
+++ /dev/null
@@ -1,208 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySelectTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SelectTest {
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
- g.V(v1Id).as('a').out('knows').as('b').select()
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(
- final Object v1Id) {
- g.V(v1Id).as('a').out('knows').as('b').select.by('name')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
- g.V(v1Id).as('a').out('knows').as('b').select('a')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(
- final Object v1Id) {
- g.V(v1Id).as('a').out('knows').as('b').select('a').by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
- g.V.as('a').out.as('b').select.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
- g.V.as('a').out.aggregate('x').as('b').select.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
- g.V().as('a').name.order().as('b').select.by('name').by
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
- g.V.has('name', 'gremlin').inE('uses').order.by('skill', Order.incr).as('a').outV.as('b').select.by('skill').by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
- return g.V.has(values('name').is('marko')).as('a').select
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
- return g.V().label().groupCount().as('x').select()
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
- return g.V().hasLabel('person').as('person').local(__.bothE().label().groupCount()).as('relations').select().by('name').by()
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SelectTest {
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select()", g);
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select('a')", g);
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_asXaX_out_asXbX_select_byXnameX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
- ComputerTestHelper.compute("g.V.has(values('name').is('marko')).as('a').select", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_label_groupCount_asXxX_select() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
- }
-
- @Override
- Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
deleted file mode 100644
index 03545a5..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
+++ /dev/null
@@ -1,63 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sum
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovySumTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SumTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
- g.V().values('age').sum()
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
- g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SumTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
- ComputerTestHelper.compute("g.V.age.sum", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
- ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))", g)
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
deleted file mode 100644
index 5822898..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
+++ /dev/null
@@ -1,63 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyUnfoldTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends UnfoldTest {
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
- g.V.local(__.outE.fold).unfold
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
- g.V.valueMap.unfold.map { it.key }
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends UnfoldTest {
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
- ComputerTestHelper.compute("g.V.local(__.outE.fold).unfold", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
- ComputerTestHelper.compute("g.V.valueMap.unfold.map { it.key }", g)
- }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
deleted file mode 100644
index 4bb6941..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
+++ /dev/null
@@ -1,68 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyValueMapTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends ValueMapTest {
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
- g.V.valueMap
- }
-
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
- g.V.valueMap('name', 'age')
- }
-
- @Override
- public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
- g.V(v1Id).out('created').valueMap
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends ValueMapTest {
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
- ComputerTestHelper.compute("g.V.valueMap", g);
- }
-
- @Override
- public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
- ComputerTestHelper.compute("g.V.valueMap('name', 'age')", g);
- }
-
- @Override
- public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out('created').valueMap", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
deleted file mode 100644
index 25fb5a1..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
+++ /dev/null
@@ -1,294 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Direction
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyVertexTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends VertexTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V() {
- g.V
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
- g.V(v1Id).out
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
- g.V(v2Id).in
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
- g.V(v4Id).both
- }
-
-
- @Override
- public Traversal<Edge, Edge> get_g_E() {
- g.E
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
- g.V(v1Id).outE
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
- g.V(v2Id).inE
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
- g.V(v4Id).bothE
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
- g.V(v4Id).bothE('created')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
- g.V(v1Id).outE.inV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
- g.V(v2Id).inE.outV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
- g.V.outE.has('weight', 1.0d).outV
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
- g.V.out.outE.inV.inE.inV.both.name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
- g.V(v1Id).outE('knows').bothV.name
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
- g.V(v1Id).out('knows')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
- g.V(v1Id).out('knows', 'created')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
- g.V(v1Id).outE('knows').inV()
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
- g.V(v1Id).outE('knows', 'created').inV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_out_out() {
- g.V().out().out()
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
- g.V(v1Id).out.out.out
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
- g.V(v1Id).out.name
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
- g.V(v1Id).outE.otherV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
- g.V(v4Id).bothE.otherV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
- g.V(v4Id).bothE.has('weight', Compare.lt, 1.0d).otherV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
- g.V(v1Id).to(Direction.OUT, 'knows');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends VertexTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V() {
- ComputerTestHelper.compute("g.V", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
- ComputerTestHelper.compute("g.V(${v2Id}).in", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).both", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E() {
- ComputerTestHelper.compute("g.E", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
- ComputerTestHelper.compute("g.V(${v2Id}).inE", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).bothE", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).bothE('created')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE.inV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
- ComputerTestHelper.compute("g.V(${v2Id}).inE.outV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
- ComputerTestHelper.compute("g.V.outE.has('weight', 1.0d).outV", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
- ComputerTestHelper.compute("g.V.out.outE.inV.inE.inV.both.name", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').bothV.name", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out('knows')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out('knows', 'created')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').inV()", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows', 'created').inV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_out_out() {
- ComputerTestHelper.compute("g.V().out().out()", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.out.out", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.name", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE.otherV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).bothE.otherV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).bothE.has('weight', Compare.lt, 1.0d).otherV", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).to(Direction.OUT, 'knows')", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
deleted file mode 100644
index 3edd991..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
+++ /dev/null
@@ -1,71 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAggregateTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends AggregateTest {
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
- g.V.name.aggregate('x').cap('x')
- }
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
- g.V.aggregate('x').by('name').cap('x')
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
- g.V.out.aggregate('a').path;
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends AggregateTest {
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
- ComputerTestHelper.compute("g.V.name.aggregate('x').cap('x')", g)
- }
-
- @Override
- public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
- ComputerTestHelper.compute("g.V.aggregate('x').by('name').cap('x')", g)
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
- ComputerTestHelper.compute("g.V.out.aggregate('a').path", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
deleted file mode 100644
index 6505384..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
+++ /dev/null
@@ -1,126 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyGroupCountTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends GroupCountTest {
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
- g.V.out('created').groupCount.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
- g.V.out('created').groupCount('a').by('name').cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
- g.V.out('created').name.groupCount
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
- g.V.out('created').name.groupCount('a').cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
- g.V.has('no').groupCount;
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
- g.V.has('no').groupCount('a').cap('a');
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
- g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
- g.V.union(
- __.repeat(__.out).times(2).groupCount('m').by('lang'),
- __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends GroupCountTest {
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
- ComputerTestHelper.compute("g.V.out('created').groupCount.by('name')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
- ComputerTestHelper.compute("g.V.out('created').groupCount('a').by('name').cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
- ComputerTestHelper.compute("g.V.out('created').name.groupCount", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
- ComputerTestHelper.compute("g.V.out('created').name.groupCount('a').cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
- ComputerTestHelper.compute("g.V.has('no').groupCount", g)
- }
-
- @Override
- public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
- ComputerTestHelper.compute("g.V.has('no').groupCount('a').cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
- ComputerTestHelper.compute("g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
- ComputerTestHelper.compute("""
- g.V.union(
- __.repeat(__.out).times(2).groupCount('m').by('lang'),
- __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
- """, g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
deleted file mode 100644
index db721de..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
+++ /dev/null
@@ -1,97 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyGroupTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends GroupTest {
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
- g.V.group.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
- g.V.group('a').by('name').cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
- g.V.has('lang').group('a').by('lang').by('name').out.cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
- g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
- g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
- g.V.group.by(__.outE.count).by('name')
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends GroupTest {
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
- ComputerTestHelper.compute("g.V.group.by('name')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
- ComputerTestHelper.compute("g.V.group('a').by('name').cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
- ComputerTestHelper.compute("g.V.has('lang').group('a').by('lang').by('name').out.cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
- ComputerTestHelper.compute("g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local))", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
- ComputerTestHelper.compute("g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
- ComputerTestHelper.compute("g.V.group.by(__.outE.count).by('name')", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
deleted file mode 100644
index df30874..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
+++ /dev/null
@@ -1,74 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyInjectTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends InjectTest {
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
- g.V(v1Id).out.inject(g.V(v2Id).next()).name
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
- g.V(v1Id).out().name.inject('daniel').as('a').map { it.length() }.path
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends InjectTest {
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_VX1X_out_injectXv2X_name() {
- super.g_VX1X_out_injectXv2X_name()
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
- super.g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path()
- }
-
- @Override
- Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(Object v1Id, Object v2Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
deleted file mode 100644
index ba3bfd1..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.junit.Ignore
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyProfileTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends ProfileTest {
-
- @Override
- Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
- g.V.out.out.profile();
- }
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
- g.V.repeat(__.both()).times(3).profile();
- }
-
- @Override
- Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
- g.V().has(__.in("created").count().is(1l)).values("name").profile();
- }
-
- @org.junit.Ignore
- @Override
- void g_V_sleep_sleep_profile() {
- }
-
- @Override
- Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
- return null
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends ProfileTest {
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
- ComputerTestHelper.compute("g.V.out.out.profile()", g);
- }
-
-
- @Override
- public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
- ComputerTestHelper.compute("g.V.repeat(__.both()).times(3).profile()", g);
- }
-
- @Override
- Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
- ComputerTestHelper.compute(" g.V().has(__.in('created').count().is(1l)).values('name').profile()", g);
- }
-
- @Override
- @org.junit.Ignore
- void g_V_sleep_sleep_profile() {
- }
-
- @Override
- Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
- return null
- }
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
deleted file mode 100644
index d2c3aa5..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
+++ /dev/null
@@ -1,72 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.structure.Operator.sum
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySackTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SackTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
- g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()
- }
-
- @Override
- public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
- g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack
- }
-
- @Override
- public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
- g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SackTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
- ComputerTestHelper.compute("g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()", g);
- }
-
- @Override
- public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
- ComputerTestHelper.compute("g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack", g)
- }
-
- @Override
- public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
- ComputerTestHelper.compute("g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
deleted file mode 100644
index 02d7896..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
+++ /dev/null
@@ -1,65 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySideEffectCapTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SideEffectCapTest {
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
- g.V.has('age').groupCount('a').by('name').out.cap('a')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
- g.V.choose(__.has(T.label, 'person'),
- __.age.groupCount('a'),
- __.values("name").groupCount('b')).cap('a', 'b')
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SideEffectCapTest {
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
- ComputerTestHelper.compute("g.V.has('age').groupCount('a').by('name').out.cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
- ComputerTestHelper.compute("""
- g.V.choose(__.has(T.label, 'person'),
- __.age.groupCount('a'),
- __.values("name").groupCount('b')).cap('a', 'b')
- """, g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
deleted file mode 100644
index 7ef92d6..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
+++ /dev/null
@@ -1,57 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySideEffectTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SideEffectTest {
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
- g.V(v1Id).withSideEffect('a') { [] }.sideEffect {
- it.sideEffects('a').clear();
- it.sideEffects('a').add(it.get());
- }.name;
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
- g.V(v1Id).withSideEffect('c') { [0] }.out.sideEffect {
- def temp = it.sideEffects('c')[0];
- it.sideEffects('c').clear();
- it.sideEffects('c').add(temp + 1);
- }.name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
- g.V(v1Id).out().sideEffect {}.name
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
deleted file mode 100644
index e2c4b1a..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
+++ /dev/null
@@ -1,84 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyStoreTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends StoreTest {
-
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
- g.V().store('a').by('name').out().cap('a');
- }
-
- @Override
- public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
- final Object v1Id) {
- g.V(v1Id).store('a').by('name').out().store('a').by('name').name.cap('a');
- }
-
- @Override
- public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
- g.V.withSideEffect('a') { [] as Set }.both.name.store('a').cap('a')
- }
-
-
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
- g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends StoreTest {
-
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
- ComputerTestHelper.compute("g.V().store('a').by('name').out().cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
- final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).store('a').by('name').out().store('a').by('name').name.cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
- ComputerTestHelper.compute("g.V.withSideEffect('a'){[] as Set}.both.name.store('a').cap('a')", g);
- }
-
- @Override
- public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
- ComputerTestHelper.compute("g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a')", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
deleted file mode 100644
index 40e62e0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
+++ /dev/null
@@ -1,49 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphTest
-import org.apache.tinkerpop.gremlin.structure.Graph
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySubgraphTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SubgraphTest {
-
- @Override
- public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(
- final Object v1Id, final Graph subgraph) {
- g.V(v1Id).withSideEffect('sg') { subgraph }.outE('knows').subgraph('sg').name.cap('sg')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(
- final Graph subgraph) {
- g.V.withSideEffect('sg') { subgraph }.repeat(__.bothE('created').subgraph('sg').outV).times(5).name.dedup
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
deleted file mode 100644
index 337d2ba..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
+++ /dev/null
@@ -1,105 +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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyTreeTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends TreeTest {
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
- g.V.out.out.tree.by(T.id);
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
- g.V.out.out.tree('a').by(T.id).cap('a');
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
- g.V(v1Id).out.out.tree.by('name');
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
- g.V(v1Id).out.out.tree('a').by('name').both.both.cap('a');
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
- g.V.out.out.tree();
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
- g.V.out.out.tree('a').cap('a');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends TreeTest {
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
- ComputerTestHelper.compute("g.V.out.out.tree.by(id)", g)
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
- ComputerTestHelper.compute("g.V.out.out.tree('a').by(id).cap('a')", g)
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
- ComputerTestHelper.compute("g.V.out.out.tree()", g)
- }
-
- @Override
- public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
- ComputerTestHelper.compute("g.V.out.out.tree('a').cap('a')", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_VX1X_out_out_tree_byXnameX() {
-
- }
-
- @Override
- Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(Object v1Id) {
- return null
- }
-
- @Override
- Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(Object v1Id) {
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
new file mode 100644
index 0000000..d1671a4
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
@@ -0,0 +1,80 @@
+/*
+ * 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.step.branch
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyBranchTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends BranchTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+ g.V.branch(__.label.is('person').count)
+ .option(1L, __.age)
+ .option(0L, __.lang)
+ .option(0L, __.name)
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+ g.V.branch(__.label)
+ .option('person', __.age)
+ .option('software', __.lang)
+ .option('software', __.name);
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends BranchTest {
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+ super.g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+ ComputerTestHelper.compute("g.V.branch(__.label.is('person').count).option(1L, __.age).option(0L, __.lang).option(0L,__.name)", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+ ComputerTestHelper.compute("""
+ g.V.branch(__.label)
+ .option('person', __.age)
+ .option('software', __.lang)
+ .option('software', __.name)
+ """, g)
+ }
+ }
+}
[27/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
new file mode 100644
index 0000000..d43d694
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
@@ -0,0 +1,170 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
+
+ private Traversal.Admin<S, E> groupTraversal = null;
+
+ public GroupCountStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier(HashMapSupplier.instance());
+ this.setBiFunction(new GroupCountBiFunction());
+ }
+
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
+ this.groupTraversal = this.integrateChild(groupTraversal);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, E>> getLocalChildren() {
+ return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+ }
+
+ @Override
+ public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
+ return GroupCountMapReduce.instance();
+ }
+
+ @Override
+ public GroupCountStep<S, E> clone() {
+ final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
+ if (null != this.groupTraversal)
+ clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+ return clone;
+ }
+
+ @Override
+ public Traverser<Map<E, Long>> processNextStart() {
+ if (this.byPass) {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ return traverser.asAdmin().split(TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map<E, Long>>) this.groupTraversal), this);
+ } else {
+ return super.processNextStart();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.groupTraversal);
+ }
+
+ ///////////
+
+ private class GroupCountBiFunction implements BiFunction<Map<E, Long>, Traverser<S>, Map<E, Long>>, Serializable {
+
+ private GroupCountBiFunction() {
+
+ }
+
+ @Override
+ public Map<E, Long> apply(final Map<E, Long> mutatingSeed, final Traverser<S> traverser) {
+ MapHelper.incr(mutatingSeed, TraversalUtil.applyNullable(traverser.asAdmin(), GroupCountStep.this.groupTraversal), traverser.bulk());
+ return mutatingSeed;
+ }
+ }
+
+ ///////////
+
+ public static final class GroupCountMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
+
+ private static final GroupCountMapReduce INSTANCE = new GroupCountMapReduce();
+
+ private GroupCountMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
+ vertex.<TraverserSet<E>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
+ }
+
+ @Override
+ public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+ long counter = 0;
+ while (values.hasNext()) {
+ counter = counter + values.next();
+ }
+ emitter.emit(key, counter);
+ }
+
+ @Override
+ public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+ reduce(key, values, emitter);
+ }
+
+ @Override
+ public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
+ final Map<E, Long> map = new HashMap<>();
+ keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+ return map;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ public static final <E> GroupCountMapReduce<E> instance() {
+ return INSTANCE;
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
new file mode 100644
index 0000000..2dc1be6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
@@ -0,0 +1,277 @@
+/*
+ * 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.step.map;
+
+import org.apache.commons.configuration.Configuration;
+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.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupStep<S, K, V, R> extends ReducingBarrierStep<S, Map<K, R>> implements MapReducer, TraversalParent {
+
+ private char state = 'k';
+
+ private Traversal.Admin<S, K> keyTraversal = null;
+ private Traversal.Admin<S, V> valueTraversal = null;
+ private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+
+ public GroupStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier((Supplier) new GroupMapSupplier());
+ this.setBiFunction((BiFunction) new GroupBiFunction());
+ }
+
+ @Override
+ public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
+ final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
+ if (null != this.keyTraversal)
+ children.add((Traversal.Admin) this.keyTraversal);
+ if (null != this.valueTraversal)
+ children.add((Traversal.Admin) this.valueTraversal);
+ if (null != this.reduceTraversal)
+ children.add((Traversal.Admin) this.reduceTraversal);
+ return children;
+ }
+
+ public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
+ return this.reduceTraversal;
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
+ if ('k' == this.state) {
+ this.keyTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'v';
+ } else if ('v' == this.state) {
+ this.valueTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'r';
+ } else if ('r' == this.state) {
+ this.reduceTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'x';
+ } else {
+ throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
+ }
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+ }
+
+ @Override
+ public GroupStep<S, K, V, R> clone() {
+ final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
+ if (null != this.keyTraversal)
+ clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+ if (null != this.valueTraversal)
+ clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
+ if (null != this.reduceTraversal)
+ clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
+ return clone;
+ }
+
+ @Override
+ public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
+ return new GroupMapReduce<>(this);
+ }
+
+ @Override
+ public Traverser<Map<K, R>> processNextStart() {
+ if (this.byPass) {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ final Object[] kvPair = new Object[]{TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.valueTraversal)};
+ return traverser.asAdmin().split(kvPair, (Step) this);
+ } else {
+ return super.processNextStart();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+ }
+
+ ///////////
+
+ private class GroupBiFunction implements BiFunction<Map<K, Collection<V>>, Traverser.Admin<S>, Map<K, Collection<V>>>, Serializable {
+
+ private GroupBiFunction() {
+
+ }
+
+ @Override
+ public Map<K, Collection<V>> apply(final Map<K, Collection<V>> mutatingSeed, final Traverser.Admin<S> traverser) {
+ final K key = TraversalUtil.applyNullable(traverser, GroupStep.this.keyTraversal);
+ final V value = TraversalUtil.applyNullable(traverser, GroupStep.this.valueTraversal);
+ Collection<V> values = mutatingSeed.get(key);
+ if (null == values) {
+ values = new BulkSet<>();
+ mutatingSeed.put(key, values);
+ }
+ TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+ return mutatingSeed;
+ }
+ }
+
+ //////////
+
+ private class GroupMap extends HashMap<K, Collection<V>> implements FinalGet<Map<K, R>> {
+
+ @Override
+ public Map<K, R> getFinal() {
+ if (null == GroupStep.this.reduceTraversal)
+ return (Map<K, R>) this;
+ else {
+ final Map<K, R> reduceMap = new HashMap<>();
+ this.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, GroupStep.this.reduceTraversal)));
+ return reduceMap;
+ }
+ }
+ }
+
+ private class GroupMapSupplier implements Supplier<GroupMap>, Serializable {
+
+ private GroupMapSupplier() {
+ }
+
+ @Override
+ public GroupMap get() {
+ return new GroupMap();
+ }
+ }
+
+ ///////////
+
+ public static final class GroupMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
+
+ public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
+
+ private String groupStepId;
+ private Traversal.Admin<Collection<V>, R> reduceTraversal;
+
+ private GroupMapReduce() {
+
+ }
+
+ public GroupMapReduce(final GroupStep<?, K, V, R> step) {
+ this.groupStepId = step.getId();
+ this.reduceTraversal = step.getReduceTraversal();
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ MapReduce.super.storeState(configuration);
+ configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
+ final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
+ if (!traversal.isLocked())
+ traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+ final GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
+ this.reduceTraversal = groupStep.getReduceTraversal();
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return !stage.equals(Stage.COMBINE);
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
+ vertex.<TraverserSet<Object[]>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> {
+ final Object[] objects = traverser.get();
+ if (objects[1] instanceof Collection)
+ emitter.emit((K) objects[0], (Collection<V>) objects[1]);
+ else {
+ final List<V> collection = new ArrayList<>();
+ collection.add((V) objects[1]);
+ emitter.emit((K) objects[0], collection);
+ }
+ }));
+ }
+
+ @Override
+ public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
+ final Set<V> set = new BulkSet<>();
+ values.forEachRemaining(set::addAll);
+ emitter.emit(key, TraversalUtil.applyNullable(set, this.reduceTraversal));
+ }
+
+ @Override
+ public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
+ final Map<K, R> map = new HashMap<>();
+ keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+ return map;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public GroupMapReduce<K, V, R> clone() {
+ try {
+ final GroupMapReduce<K, V, R> clone = (GroupMapReduce<K, V, R>) super.clone();
+ if (null != clone.reduceTraversal)
+ clone.reduceTraversal = this.reduceTraversal.clone();
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.mapReduceString(this, this.getMemoryKey());
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java
new file mode 100644
index 0000000..018c91e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdStep<S extends Element> extends MapStep<S, Object> {
+
+ public IdStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Object map(final Traverser.Admin<S> traverser) {
+ return traverser.get().id();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java
new file mode 100644
index 0000000..1666c6c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class KeyStep extends MapStep<Property, String> {
+
+ public KeyStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected String map(final Traverser.Admin<Property> traverser) {
+ return traverser.get().key();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java
new file mode 100644
index 0000000..2b2313f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LabelStep<S extends Element> extends MapStep<S, String> {
+
+ public LabelStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected String map(final Traverser.Admin<S> traverser) {
+ return traverser.get().label();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
new file mode 100644
index 0000000..3a039c3
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
@@ -0,0 +1,49 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaFlatMapStep<S, E> extends FlatMapStep<S, E> {
+
+ private final Function<Traverser<S>, Iterator<E>> function;
+
+ public LambdaFlatMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, Iterator<E>> function) {
+ super(traversal);
+ this.function = function;
+ }
+
+ @Override
+ protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+ return this.function.apply(traverser);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.function);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
new file mode 100644
index 0000000..4d505b7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaMapStep<S, E> extends MapStep<S, E> {
+
+ private final Function<Traverser<S>, E> function;
+
+ public LambdaMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, E> function) {
+ super(traversal);
+ this.function = function;
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ return this.function.apply(traverser);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.function);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
new file mode 100644
index 0000000..4d1dc9d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
@@ -0,0 +1,53 @@
+/*
+ * 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.step.map;
+
+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;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MapStep<S, E> extends AbstractStep<S, E> {
+
+ public MapStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<E> processNextStart() {
+ while (true) {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ return traverser.split(this.map(traverser), this);
+ }
+ }
+
+ protected abstract E map(final Traverser.Admin<S> traverser);
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH_ACCESS); // TODO: this is bad -- just a hack right now.
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
new file mode 100644
index 0000000..c59ef33
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -0,0 +1,133 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
+
+ public MaxGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier(new ConstantSupplier<>(null));
+ this.setBiFunction(MaxGlobalBiFunction.<S>instance());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+ return MaxGlobalMapReduce.instance();
+ }
+
+ /////
+
+ private static class MaxGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MaxGlobalBiFunction INSTANCE = new MaxGlobalBiFunction();
+
+ private MaxGlobalBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ }
+
+ public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////////
+
+ private static class MaxGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+ private static final MaxGlobalMapReduce INSTANCE = new MaxGlobalMapReduce();
+
+ private MaxGlobalMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
+ vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ if (values.hasNext()) {
+ Number max = -Double.MAX_VALUE;
+ while (values.hasNext()) {
+ final Number value = values.next();
+ if (value.doubleValue() > max.doubleValue())
+ max = value;
+ }
+ emitter.emit(max);
+ }
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+ return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
+ }
+
+ public static final MaxGlobalMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
new file mode 100644
index 0000000..6d2a228
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+ public MaxLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ Number result;
+ final Iterator<E> iterator = traverser.get().iterator();
+ if (iterator.hasNext()) {
+ result = iterator.next();
+ while (iterator.hasNext()) {
+ final Number curr = iterator.next();
+ if (result.doubleValue() < curr.doubleValue()) result = curr;
+ }
+ } else {
+ result = Double.NaN;
+ }
+ return (E) result;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
new file mode 100644
index 0000000..7f2b39d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -0,0 +1,218 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements MapReducer {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
+
+ public MeanGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
+ this.setBiFunction((BiFunction) MeanGlobalBiFunction.instance());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ @Override
+ public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
+ return MeanGlobalMapReduce.instance();
+ }
+
+ /////
+
+ private static class MeanGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MeanGlobalBiFunction INSTANCE = new MeanGlobalBiFunction();
+
+ private MeanGlobalBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
+ }
+
+ public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////////
+
+ private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
+
+ private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
+
+ private MeanGlobalMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<Number, Long> emitter) {
+ vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
+ }
+
+ @Override
+ public void combine(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
+ long counter = 0;
+ while (values.hasNext()) {
+ counter = counter + values.next();
+ }
+ emitter.emit(key, counter);
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
+ if (keyValues.hasNext()) {
+ KeyValue<Number, Long> pair = keyValues.next();
+ double result = pair.getKey().doubleValue() * pair.getValue();
+ long counter = pair.getValue();
+ while (keyValues.hasNext()) {
+ pair = keyValues.next();
+ result += pair.getKey().doubleValue() * pair.getValue();
+ counter += pair.getValue();
+ }
+ return result / counter;
+ }
+ return Double.NaN;
+ }
+
+ public static final MeanGlobalMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///
+
+ public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+
+ private long count;
+ private double sum;
+
+ public MeanNumber() {
+ this(0.0d, 0l);
+ }
+
+ public MeanNumber(final double number, final long count) {
+ this.count = count;
+ this.sum = number * count;
+ }
+
+ public MeanNumber add(final Number amount, final long count) {
+ this.count += count;
+ this.sum += amount.doubleValue() * count;
+ return this;
+ }
+
+ public MeanNumber add(final MeanNumber other) {
+ this.count += other.count;
+ this.sum += other.sum;
+ return this;
+ }
+
+ @Override
+ public int intValue() {
+ return (int) (this.sum / this.count);
+ }
+
+ @Override
+ public long longValue() {
+ return (long) (this.sum / this.count);
+ }
+
+ @Override
+ public float floatValue() {
+ return (float) (this.sum / this.count);
+ }
+
+ @Override
+ public double doubleValue() {
+ return this.sum / this.count;
+ }
+
+ @Override
+ public String toString() {
+ return Double.toString(this.doubleValue());
+ }
+
+ @Override
+ public int compareTo(final Number number) {
+ return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof Number && Double.valueOf(this.doubleValue()).equals(((Number) object).doubleValue());
+ }
+
+ @Override
+ public int hashCode() {
+ return Double.valueOf(this.doubleValue()).hashCode();
+ }
+
+ @Override
+ public Double getFinal() {
+ return this.doubleValue();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
new file mode 100644
index 0000000..e2db6af
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, Double> {
+
+ public MeanLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Double map(final Traverser.Admin<S> traverser) {
+ final Iterator<E> iterator = traverser.get().iterator();
+ if (iterator.hasNext()) {
+ Long counter = 1L;
+ Double result = iterator.next().doubleValue();
+ while (iterator.hasNext()) {
+ result += iterator.next().doubleValue();
+ counter++;
+ }
+ return result / counter;
+ } else {
+ return Double.NaN;
+ }
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
new file mode 100644
index 0000000..ef28d79
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -0,0 +1,133 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
+
+ public MinGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier(new ConstantSupplier<>(null));
+ this.setBiFunction(MinGlobalBiFunction.instance());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+ return MinGlobalMapReduce.instance();
+ }
+
+ /////
+
+ private static class MinGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+ private static final MinGlobalBiFunction INSTANCE = new MinGlobalBiFunction();
+
+ private MinGlobalBiFunction() {
+
+ }
+
+ @Override
+ public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+ }
+
+ public final static <S extends Number> MinGlobalBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////////
+
+ private static class MinGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+ private static final MinGlobalMapReduce INSTANCE = new MinGlobalMapReduce();
+
+ private MinGlobalMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
+ vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ if (values.hasNext()) {
+ Number min = Double.MAX_VALUE;
+ while (values.hasNext()) {
+ final Number value = values.next();
+ if (value.doubleValue() < min.doubleValue())
+ min = value;
+ }
+ emitter.emit(min);
+ }
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+ return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
+ }
+
+ public static final MinGlobalMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
new file mode 100644
index 0000000..2959285
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+ public MinLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ Number result;
+ final Iterator<E> iterator = traverser.get().iterator();
+ if (iterator.hasNext()) {
+ result = iterator.next();
+ while (iterator.hasNext()) {
+ final Number curr = iterator.next();
+ if (result.doubleValue() > curr.doubleValue()) result = curr;
+ }
+ } else {
+ result = Double.NaN;
+ }
+ return (E) result;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
new file mode 100644
index 0000000..39d98ef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.util.function.ChainedComparator;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S> {
+
+ private final List<Comparator<S>> comparators = new ArrayList<>();
+
+ public OrderGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ traverserSet.sort(this.comparators.isEmpty() ? new ComparatorTraverser(Order.incr) : new ChainedComparator(ComparatorTraverser.convertComparator((List) this.comparators)));
+ }
+
+ @Override
+ public void addComparator(final Comparator<S> comparator) {
+ this.comparators.add(comparator);
+ }
+
+ @Override
+ public List<Comparator<S>> getComparators() {
+ return this.comparators.isEmpty() ? Arrays.asList((Comparator) Order.incr) : this.comparators;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.comparators);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ /////
+
+ private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
+
+ private final Comparator<S> comparator;
+
+ public ComparatorTraverser(final Comparator<S> comparator) {
+ this.comparator = comparator;
+ }
+
+ @Override
+ public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
+ return this.comparator.compare(traverserA.get(), traverserB.get());
+ }
+
+ public static <S> List<ComparatorTraverser<S>> convertComparator(final List<Comparator<S>> comparators) {
+ return comparators.stream().map(comparator -> new ComparatorTraverser<>(comparator)).collect(Collectors.toList());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
new file mode 100644
index 0000000..cdd8f2b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
@@ -0,0 +1,100 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrderLocalStep<S, M> extends MapStep<S, S> implements ComparatorHolder<M> {
+
+ private final List<Comparator<M>> comparators = new ArrayList<>();
+ private Comparator<M> chainedComparator = null;
+
+ public OrderLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected S map(final Traverser.Admin<S> traverser) {
+ final S start = traverser.get();
+ if (start instanceof Collection)
+ return (S) OrderLocalStep.sortCollection((List) start, this.chainedComparator);
+ else if (start instanceof Map)
+ return (S) OrderLocalStep.sortMap((Map) start, this.chainedComparator);
+ else
+ return start;
+ }
+
+ @Override
+ public void addComparator(final Comparator<M> comparator) {
+ this.comparators.add(comparator);
+ this.chainedComparator = this.comparators.stream().reduce((a, b) -> a.thenComparing(b)).get();
+ }
+
+ @Override
+ public List<Comparator<M>> getComparators() {
+ return this.comparators;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.comparators);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ /////////////
+
+ private static final <A> List<A> sortCollection(final Collection<A> collection, final Comparator<?> comparator) {
+ if (collection instanceof List) {
+ Collections.sort((List) collection, (Comparator) comparator);
+ return (List<A>) collection;
+ } else {
+ final List<A> list = new ArrayList<>(collection);
+ Collections.sort(list, (Comparator) comparator);
+ return list;
+ }
+ }
+
+ private static final <K, V> Map<K, V> sortMap(final Map<K, V> map, final Comparator<?> comparator) {
+ final List<Map.Entry<K, V>> entries = new ArrayList<>(map.entrySet());
+ Collections.sort(entries, (Comparator) comparator);
+ final LinkedHashMap<K, V> sortedMap = new LinkedHashMap<>();
+ entries.forEach(entry -> sortedMap.put(entry.getKey(), entry.getValue()));
+ return sortedMap;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
new file mode 100644
index 0000000..fcb6b9a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathStep<S> extends MapStep<S, Path> implements TraversalParent {
+
+ private TraversalRing<Object, Object> traversalRing;
+
+ public PathStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.traversalRing = new TraversalRing<>();
+ }
+
+ @Override
+ protected Path map(final Traverser.Admin<S> traverser) {
+ final Path path;
+ if (this.traversalRing.isEmpty())
+ path = traverser.path();
+ else {
+ path = MutablePath.make();
+ traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
+ }
+ this.traversalRing.reset();
+ return path;
+ }
+
+ @Override
+ public PathStep<S> clone() {
+ final PathStep<S> clone = (PathStep<S>) super.clone();
+ clone.traversalRing = new TraversalRing<>();
+ for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+ clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.traversalRing.reset();
+ }
+
+ @Override
+ public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+ return this.traversalRing.getTraversals();
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> pathTraversal) {
+ this.traversalRing.addTraversal(this.integrateChild(pathTraversal));
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.traversalRing);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
new file mode 100644
index 0000000..2504e05
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
@@ -0,0 +1,71 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PropertiesStep<E> extends FlatMapStep<Element, E> {
+
+ protected final String[] propertyKeys;
+ protected final PropertyType returnType;
+
+ public PropertiesStep(final Traversal.Admin traversal, final PropertyType propertyType, final String... propertyKeys) {
+ super(traversal);
+ this.returnType = propertyType;
+ this.propertyKeys = propertyKeys;
+ }
+
+ @Override
+ protected Iterator<E> flatMap(final Traverser.Admin<Element> traverser) {
+ return this.returnType.equals(PropertyType.VALUE) ?
+ traverser.get().values(this.propertyKeys) :
+ (Iterator) traverser.get().properties(this.propertyKeys);
+ }
+
+ public PropertyType getReturnType() {
+ return this.returnType;
+ }
+
+ public String[] getPropertyKeys() {
+ return this.propertyKeys;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
new file mode 100644
index 0000000..7cb78e8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
@@ -0,0 +1,50 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PropertyElementStep<E> extends MapStep<Property<E>, Element> {
+
+ public PropertyElementStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Element map(final Traverser.Admin<Property<E>> traverser) {
+ return traverser.get().element();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ // TODO: reverse()
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
new file mode 100644
index 0000000..f63faf8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
@@ -0,0 +1,91 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PropertyMapStep<E> extends MapStep<Element, Map<String, E>> { // TODO: Map<Object,E> cause of T.
+
+ protected final String[] propertyKeys;
+ protected final PropertyType returnType;
+ protected final boolean includeTokens;
+
+ public PropertyMapStep(final Traversal.Admin traversal, final boolean includeTokens, final PropertyType propertyType, final String... propertyKeys) {
+ super(traversal);
+ this.includeTokens = includeTokens;
+ this.propertyKeys = propertyKeys;
+ this.returnType = propertyType;
+ }
+
+ @Override
+ protected Map<String, E> map(final Traverser.Admin<Element> traverser) {
+ if (this.returnType.equals(PropertyType.VALUE)) {
+ final Element element = traverser.get();
+ final Map map = traverser.get() instanceof Vertex ?
+ (Map) ElementHelper.vertexPropertyValueMap((Vertex) element, propertyKeys) :
+ (Map) ElementHelper.propertyValueMap(element, propertyKeys);
+ if (includeTokens) {
+ if (element instanceof VertexProperty) {
+ map.put(T.id, element.id());
+ map.put(T.key, ((VertexProperty) element).key());
+ map.put(T.value, ((VertexProperty) element).value());
+ } else {
+ map.put(T.id, element.id());
+ map.put(T.label, element.label());
+ }
+ }
+ return map;
+
+ } else {
+ return traverser.get() instanceof Vertex ?
+ (Map) ElementHelper.vertexPropertyMap((Vertex) traverser.get(), propertyKeys) :
+ (Map) ElementHelper.propertyMap(traverser.get(), propertyKeys);
+ }
+ }
+
+ public PropertyType getReturnType() {
+ return this.returnType;
+ }
+
+ public String toString() {
+ return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java
new file mode 100644
index 0000000..eab0ea6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PropertyValueStep<E> extends MapStep<Property<E>, E> {
+
+ public PropertyValueStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<Property<E>> traverser) {
+ return traverser.get().value();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
[33/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
deleted file mode 100644
index f135484..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
+++ /dev/null
@@ -1,248 +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.graph.traversal.step.sideEffect;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-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.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupSideEffectStep<S, K, V, R> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, EngineDependent, MapReducer<K, Collection<V>, K, R, Map<K, R>> {
-
- private char state = 'k';
- private Traversal.Admin<S, K> keyTraversal = null;
- private Traversal.Admin<S, V> valueTraversal = null;
- private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
- private String sideEffectKey;
- private boolean onGraphComputer = false;
- private Map<K, Collection<V>> tempGroupByMap;
-
- public GroupSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- final Map<K, Collection<V>> groupMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
- final K key = TraversalUtil.applyNullable(traverser, keyTraversal);
- final V value = TraversalUtil.applyNullable(traverser, valueTraversal);
- Collection<V> values = groupMap.get(key);
- if (null == values) {
- values = new BulkSet<>();
- groupMap.put(key, values);
- }
- TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
- //////// reducer for OLTP
- if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
- this.tempGroupByMap = groupMap;
- final Map<K, R> reduceMap = new HashMap<>();
- groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, this.reduceTraversal)));
- traverser.sideEffects(this.sideEffectKey, reduceMap);
- }
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- this.onGraphComputer = traversalEngine.isComputer();
- }
-
- @Override
- public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
- return new GroupSideEffectMapReduce<>(this);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
- }
-
- @Override
- public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
- final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
- if (null != this.keyTraversal)
- children.add((Traversal.Admin) this.keyTraversal);
- if (null != this.valueTraversal)
- children.add((Traversal.Admin) this.valueTraversal);
- if (null != this.reduceTraversal)
- children.add((Traversal.Admin) this.reduceTraversal);
- return children;
- }
-
- public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
- return this.reduceTraversal;
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
- if ('k' == this.state) {
- this.keyTraversal = this.integrateChild(kvrTraversal);
- this.state = 'v';
- } else if ('v' == this.state) {
- this.valueTraversal = this.integrateChild(kvrTraversal);
- this.state = 'r';
- } else if ('r' == this.state) {
- this.reduceTraversal = this.integrateChild(kvrTraversal);
- this.state = 'x';
- } else {
- throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
- }
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
- }
-
- @Override
- public GroupSideEffectStep<S, K, V, R> clone() {
- final GroupSideEffectStep<S, K, V, R> clone = (GroupSideEffectStep<S, K, V, R>) super.clone();
- if (null != this.keyTraversal)
- clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
- if (null != this.valueTraversal)
- clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
- if (null != this.reduceTraversal)
- clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
- return clone;
- }
-
- ///////////
-
- public static final class GroupSideEffectMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
-
- public static final String GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupSideEffectStep.sideEffectKey";
- public static final String GROUP_SIDE_EFFECT_STEP_STEP_ID = "gremlin.groupSideEffectStep.stepId";
-
- private String sideEffectKey;
- private String groupStepId;
- private Traversal.Admin<Collection<V>, R> reduceTraversal;
- private Supplier<Map<K, R>> mapSupplier;
-
- private GroupSideEffectMapReduce() {
-
- }
-
- public GroupSideEffectMapReduce(final GroupSideEffectStep step) {
- this.groupStepId = step.getId();
- this.sideEffectKey = step.getSideEffectKey();
- this.reduceTraversal = step.getReduceTraversal();
- this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- MapReduce.super.storeState(configuration);
- configuration.setProperty(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
- configuration.setProperty(GROUP_SIDE_EFFECT_STEP_STEP_ID, this.groupStepId);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.sideEffectKey = configuration.getString(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
- this.groupStepId = configuration.getString(GROUP_SIDE_EFFECT_STEP_STEP_ID);
- final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
- if (!traversal.isLocked())
- traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
- final GroupSideEffectStep groupSideEffectStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
- this.reduceTraversal = groupSideEffectStep.getReduceTraversal();
- this.mapSupplier = traversal.getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return !stage.equals(Stage.COMBINE);
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
- VertexTraversalSideEffects.of(vertex).<Map<K, Collection<V>>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach(emitter::emit);
- }
-
- @Override
- public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
- final Set<V> set = new BulkSet<>();
- values.forEachRemaining(set::addAll);
- emitter.emit(key, TraversalUtil.applyNullable(set, this.reduceTraversal));
- }
-
- @Override
- public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
- final Map<K, R> map = this.mapSupplier.get();
- keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
- return map;
- }
-
- @Override
- public String getMemoryKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public GroupSideEffectMapReduce<K, V, R> clone() {
- try {
- final GroupSideEffectMapReduce<K, V, R> clone = (GroupSideEffectMapReduce<K, V, R>) super.clone();
- if (null != clone.reduceTraversal)
- clone.reduceTraversal = this.reduceTraversal.clone();
- return clone;
- } catch (final CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- @Override
- public String toString() {
- return StringFactory.mapReduceString(this, this.getMemoryKey());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
deleted file mode 100644
index d572bc2..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
+++ /dev/null
@@ -1,40 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdentityStep<S> extends AbstractStep<S, S> {
-
- public IdentityStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
deleted file mode 100644
index 2b4a927..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
+++ /dev/null
@@ -1,50 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class InjectStep<S> extends StartStep<S> {
-
- private final S[] injections;
-
- @SafeVarargs
- public InjectStep(final Traversal.Admin traversal, final S... injections) {
- super(traversal);
- this.injections = injections;
- this.start = new ArrayIterator<>(this.injections);
- }
-
- @Override
- public InjectStep<S> clone() {
- final InjectStep<S> clone = (InjectStep<S>) super.clone();
- clone.start = new ArrayIterator<>(clone.injections);
- return clone;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.start = new ArrayIterator<>(this.injections);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
deleted file mode 100644
index 556d8ca..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
+++ /dev/null
@@ -1,48 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Consumer;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaSideEffectStep<S> extends SideEffectStep<S> {
-
- private final Consumer<Traverser<S>> consumer;
-
- public LambdaSideEffectStep(final Traversal.Admin traversal, final Consumer<Traverser<S>> consumer) {
- super(traversal);
- this.consumer = consumer;
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- this.consumer.accept(traverser);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.consumer);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
deleted file mode 100644
index 6f811d7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
+++ /dev/null
@@ -1,219 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.metric.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
-
- // Stored in the Traversal sideEffects but kept here as a reference for convenience.
- private StandardTraversalMetrics traversalMetrics;
-
- public ProfileStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
-
- @Override
- public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
- return ProfileMapReduce.instance();
- }
-
- @Override
- public Traverser<S> next() {
- Traverser<S> ret = null;
- initializeIfNeeded();
- traversalMetrics.start(this.getId());
- try {
- ret = super.next();
- return ret;
- } finally {
- if (ret != null) {
- traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
- } else {
- traversalMetrics.stop(this.getId());
- }
- }
- }
-
- @Override
- public boolean hasNext() {
- initializeIfNeeded();
- traversalMetrics.start(this.getId());
- boolean ret = super.hasNext();
- traversalMetrics.stop(this.getId());
- return ret;
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-
- private void initializeIfNeeded() {
- if (traversalMetrics != null) {
- return;
- }
-
- createTraversalMetricsSideEffectIfNecessary();
-
- // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
- // sideEffects after serialization.
- if (traversalMetrics == null) {
- // look up the TraversalMetrics in the root traversal's sideEffects
- Traversal t = this.getTraversal();
- while (!(t.asAdmin().getParent() instanceof EmptyStep)) {
- t = t.asAdmin().getParent().asStep().getTraversal();
- }
- traversalMetrics = t.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
- }
- }
-
- private void createTraversalMetricsSideEffectIfNecessary() {
- if (this.getTraversal().getSideEffects().exists(TraversalMetrics.METRICS_KEY)) {
- // Already initialized
- return;
- }
-
- if (!(this.getTraversal().getParent() instanceof EmptyStep)) {
- // Initialization is handled at the top-level of the traversal only.
- return;
- }
-
- // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
- // once per thread if using Computer.)
-
- traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
- prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
- }
-
- // Walk the traversal steps and initialize the Metrics timers.
- private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
-
- DependantMutableMetrics prevMetrics = null;
- final List<Step> steps = traversal.getSteps();
- for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
- Step step = steps.get(ii);
- ProfileStep profileStep = (ProfileStep) steps.get(ii + 1);
-
- // Create metrics
- MutableMetrics metrics;
-
- // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
- if (traversal.getEngine().isComputer()) {
- metrics = new MutableMetrics(step.getId(), step.toString());
- } else {
- metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
- prevMetrics = (DependantMutableMetrics) metrics;
- }
-
- // Initialize counters (necessary because some steps might end up being 0)
- metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
- metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
-
- // Add metrics to parent, if necessary
- if (parentMetrics != null) {
- parentMetrics.addNested(metrics);
- }
-
- // The TraversalMetrics sideEffect is shared across all the steps.
- profileStep.traversalMetrics = this.traversalMetrics;
-
- // Add root metrics to traversalMetrics
- this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileStep.getId());
-
- // Handle nested traversal
- if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- prepTraversalForProfiling(t, metrics);
- }
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- prepTraversalForProfiling(t, metrics);
- }
- }
- }
- }
-
- //////////////////
-
- public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
-
- private static ProfileMapReduce INSTANCE = new ProfileMapReduce();
-
- private ProfileMapReduce() {
-
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return true;
- }
-
- @Override
- public String getMemoryKey() {
- return TraversalMetrics.METRICS_KEY;
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
- VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>ifPresent(TraversalMetrics.METRICS_KEY, emitter::emit);
- }
-
- @Override
- public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
- reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
- emitter.emit(StandardTraversalMetrics.merge(values));
- }
-
- @Override
- public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
- return keyValues.next().getValue();
- }
-
- public static ProfileMapReduce instance() {
- return INSTANCE;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
deleted file mode 100644
index 57ba41c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
+++ /dev/null
@@ -1,66 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BinaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackElementValueStep<S extends Element, V> extends SideEffectStep<S> {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.SACK,
- TraverserRequirement.OBJECT
- );
-
- private BinaryOperator<V> operator;
- private final String propertyKey;
-
- public SackElementValueStep(final Traversal.Admin traversal, final BinaryOperator<V> operator, final String propertyKey) {
- super(traversal);
- this.operator = operator;
- this.propertyKey = propertyKey;
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- traverser.get().values(this.propertyKey).forEachRemaining(value -> {
- traverser.sack(this.operator.apply(traverser.sack(), (V) value));
- });
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.operator, this.propertyKey);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
deleted file mode 100644
index 3df89e8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
+++ /dev/null
@@ -1,55 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackObjectStep<S, V> extends SideEffectStep<S> {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.SACK,
- TraverserRequirement.OBJECT
- );
-
- private final BiFunction<V, S, V> operator;
-
- public SackObjectStep(final Traversal.Admin traversal, final BiFunction<V, S, V> operator) {
- super(traversal);
- this.operator = operator;
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- traverser.sack(this.operator.apply(traverser.sack(), traverser.get()));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
deleted file mode 100644
index 800aa58..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.SIDE_EFFECTS,
- TraverserRequirement.OBJECT
- );
-
- private List<String> sideEffectKeys;
-
- public SideEffectCapStep(final Traversal.Admin traversal, final String... sideEffectKeys) {
- super(traversal);
- if (0 == sideEffectKeys.length)
- throw new IllegalArgumentException("At least one sideEffect key must be provided to " + this.getClass().getSimpleName());
- this.sideEffectKeys = Arrays.asList(sideEffectKeys);
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKeys);
- }
-
- public List<String> getSideEffectKeys() {
- return this.sideEffectKeys;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- @Override
- public E supply() {
- return this.sideEffectKeys.size() == 1 ?
- this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
- (E) this.getMapOfSideEffects();
- }
-
- public Map<String, Object> getMapOfSideEffects() {
- final Map<String, Object> sideEffects = new HashMap<>();
- for (final String sideEffectKey : this.sideEffectKeys) {
- sideEffects.put(sideEffectKey, this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey));
- }
- return sideEffects;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
deleted file mode 100644
index 3ec2aa1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
+++ /dev/null
@@ -1,42 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SideEffectStep<S> extends AbstractStep<S, S> {
-
- public SideEffectStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- protected abstract void sideEffect(final Traverser.Admin<S> traverser);
-
- @Override
- protected Traverser<S> processNextStart() {
- final Traverser.Admin<S> traverser = this.starts.next();
- this.sideEffect(traverser);
- return traverser;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
deleted file mode 100644
index e56a7e7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
+++ /dev/null
@@ -1,79 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class StartStep<S> extends AbstractStep<S, S> {
-
- protected Object start;
- protected boolean first = true;
-
- public StartStep(final Traversal.Admin traversal, final Object start) {
- super(traversal);
- this.start = start;
- }
-
- public StartStep(final Traversal.Admin traversal) {
- this(traversal, null);
- }
-
- public <T> T getStart() {
- return (T) this.start;
- }
-
- public boolean startAssignableTo(final Class... assignableClasses) {
- return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
- }
-
- public String toString() {
- return TraversalHelper.makeStepString(this, this.start);
- }
-
- @Override
- protected Traverser<S> processNextStart() {
- if (this.first) {
- if (null != this.start) {
- if (this.start instanceof Iterator)
- this.starts.add(this.getTraversal().getTraverserGenerator().generateIterator((Iterator<S>) this.start, this, 1l));
- else
- this.starts.add(this.getTraversal().getTraverserGenerator().generate((S) this.start, this, 1l));
- }
- this.first = false;
- }
- return this.starts.next();
- }
-
- @Override
- public StartStep<S> clone() {
- final StartStep<S> clone = (StartStep<S>) super.clone();
- clone.first = true;
- clone.start = null;
- return clone;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
deleted file mode 100644
index 71cc96c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
+++ /dev/null
@@ -1,159 +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.graph.traversal.step.sideEffect;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
- private Traversal.Admin<S, Object> storeTraversal = null;
- private String sideEffectKey;
-
- public StoreStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- TraversalHelper.addToCollection(
- traverser.sideEffects(this.sideEffectKey),
- TraversalUtil.applyNullable(traverser.asAdmin(), this.storeTraversal),
- traverser.bulk());
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey, this.storeTraversal);
- }
-
- @Override
- public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
- return new StoreMapReduce(this);
- }
-
- @Override
- public List<Traversal.Admin<S, Object>> getLocalChildren() {
- return null == this.storeTraversal ? Collections.emptyList() : Collections.singletonList(this.storeTraversal);
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> storeTraversal) {
- this.storeTraversal = this.integrateChild(storeTraversal);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
- }
-
- @Override
- public StoreStep<S> clone() {
- final StoreStep<S> clone = (StoreStep<S>) super.clone();
- if (null != this.storeTraversal)
- clone.storeTraversal = clone.integrateChild(this.storeTraversal.clone());
- return clone;
- }
-
- ///////////////
-
- public static final class StoreMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
- public static final String STORE_STEP_SIDE_EFFECT_KEY = "gremlin.storeStep.sideEffectKey";
-
- private String sideEffectKey;
- private Supplier<Collection> collectionSupplier;
-
- private StoreMapReduce() {
-
- }
-
- public StoreMapReduce(final StoreStep step) {
- this.sideEffectKey = step.getSideEffectKey();
- this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- super.storeState(configuration);
- configuration.setProperty(STORE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.sideEffectKey = configuration.getString(STORE_STEP_SIDE_EFFECT_KEY);
- this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return stage.equals(Stage.MAP);
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
- VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
- }
-
- @Override
- public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
- final Collection collection = this.collectionSupplier.get();
- keyValues.forEachRemaining(pair -> collection.add(pair.getValue()));
- return collection;
- }
-
- @Override
- public String getMemoryKey() {
- return this.sideEffectKey;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
deleted file mode 100644
index 5d3b7b3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
+++ /dev/null
@@ -1,122 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-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.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
-
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A side-effect step that produces an edge induced subgraph.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SubgraphStep extends SideEffectStep<Edge> implements SideEffectCapable {
-
- private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
- TraverserRequirement.OBJECT,
- TraverserRequirement.SIDE_EFFECTS
- );
-
- private Graph subgraph;
- private String sideEffectKey;
-
- private static final Map<String, Object> DEFAULT_CONFIGURATION = new HashMap<String, Object>() {{
- put(Graph.GRAPH, "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph"); // hard coded because TinkerGraph is not part of gremlin-core
- }};
-
- // TODO: add support for side-effecting out an edge list.
-
- public SubgraphStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, () -> GraphFactory.open(DEFAULT_CONFIGURATION));
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<Edge> traverser) {
- if (null == this.subgraph) {
- this.subgraph = traverser.sideEffects(this.sideEffectKey);
- if (!this.subgraph.features().vertex().supportsUserSuppliedIds() || !this.subgraph.features().edge().supportsUserSuppliedIds())
- throw new IllegalArgumentException("The provided subgraph must support user supplied ids for vertices and edges: " + this.subgraph);
- }
- SubgraphStep.addEdgeToSubgraph(this.subgraph, traverser.get());
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey);
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return REQUIREMENTS;
- }
-
- @Override
- public SubgraphStep clone() {
- final SubgraphStep clone = (SubgraphStep) super.clone();
- this.subgraph = null;
- return clone;
- }
-
- ///
-
- private static Vertex getOrCreate(final Graph subgraph, final Vertex vertex) {
- final Iterator<Vertex> vertexIterator = subgraph.vertices(vertex.id());
- if (vertexIterator.hasNext()) return vertexIterator.next();
- final Vertex subgraphVertex = subgraph.addVertex(T.id, vertex.id(), T.label, vertex.label());
- vertex.properties().forEachRemaining(vertexProperty -> {
- final VertexProperty<?> subgraphVertexProperty = subgraphVertex.property(vertexProperty.key(), vertexProperty.value(), T.id, vertexProperty.id()); // TODO: demand vertex property id?
- vertexProperty.properties().forEachRemaining(property -> subgraphVertexProperty.<Object>property(property.key(), property.value()));
- });
- return subgraphVertex;
- }
-
- private static void addEdgeToSubgraph(final Graph subgraph, final Edge edge) {
- final Iterator<Edge> edgeIterator = subgraph.edges(edge.id());
- if (edgeIterator.hasNext()) return;
- final Iterator<Vertex> vertexIterator = edge.vertices(Direction.BOTH);
- final Vertex subGraphOutVertex = getOrCreate(subgraph, vertexIterator.next());
- final Vertex subGraphInVertex = getOrCreate(subgraph, vertexIterator.next());
- final Edge subGraphEdge = subGraphOutVertex.addEdge(edge.label(), subGraphInVertex, T.id, edge.id());
- edge.properties().forEachRemaining(property -> subGraphEdge.<Object>property(property.key(), property.value()));
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
deleted file mode 100644
index fbb3425..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
+++ /dev/null
@@ -1,182 +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.graph.traversal.step.sideEffect;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TreeSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<Object, Tree, Object, Tree, Tree> {
-
- private TraversalRing<Object, Object> traversalRing;
- private String sideEffectKey;
-
- public TreeSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
- super(traversal);
- this.sideEffectKey = sideEffectKey;
- this.traversalRing = new TraversalRing<>();
- this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, TreeSupplier.instance());
- }
-
- @Override
- protected void sideEffect(final Traverser.Admin<S> traverser) {
- Tree depth = traverser.sideEffects(this.sideEffectKey);
- final Path path = traverser.path();
- for (int i = 0; i < path.size(); i++) {
- final Object object = TraversalUtil.apply(path.<Object>get(i), this.traversalRing.next());
- if (!depth.containsKey(object))
- depth.put(object, new Tree<>());
- depth = (Tree) depth.get(object);
- }
- this.traversalRing.reset();
- }
-
- @Override
- public String getSideEffectKey() {
- return this.sideEffectKey;
- }
-
- @Override
- public MapReduce<Object, Tree, Object, Tree, Tree> getMapReduce() {
- return new TreeSideEffectMapReduce(this);
- }
-
- @Override
- public void reset() {
- super.reset();
- this.traversalRing.reset();
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this, this.sideEffectKey, this.traversalRing);
- }
-
- @Override
- public TreeSideEffectStep<S> clone() {
- final TreeSideEffectStep<S> clone = (TreeSideEffectStep<S>) super.clone();
- clone.traversalRing = new TraversalRing<>();
- for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
- clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
- }
- return clone;
- }
-
- @Override
- public List<Traversal.Admin<Object, Object>> getLocalChildren() {
- return this.traversalRing.getTraversals();
- }
-
- @Override
- public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
- this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
- }
-
- ////////////////
-
- public static final class TreeSideEffectMapReduce extends StaticMapReduce<Object, Tree, Object, Tree, Tree> {
-
- public static final String TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.treeSideEffectStep.sideEffectKey";
-
- private String sideEffectKey;
-
- private TreeSideEffectMapReduce() {
-
- }
-
- public TreeSideEffectMapReduce(final TreeSideEffectStep step) {
- this.sideEffectKey = step.getSideEffectKey();
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- super.storeState(configuration);
- configuration.setProperty(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
- }
-
- @Override
- public void loadState(final Configuration configuration) {
- this.sideEffectKey = configuration.getString(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return stage.equals(Stage.MAP);
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<Object, Tree> emitter) {
- VertexTraversalSideEffects.of(vertex).<Tree<?>>ifPresent(this.sideEffectKey, tree -> tree.splitParents().forEach(branches -> emitter.emit(branches.keySet().iterator().next(), branches)));
- }
-
- /*
- @Override
- public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
- this.reduce(key, values, emitter);
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
- final Tree tree = new Tree();
- values.forEachRemaining(tree::addTree);
- emitter.emit(tree);
- }
- */
-
- @Override
- public Tree generateFinalResult(final Iterator<KeyValue<Object, Tree>> keyValues) {
- final Tree result = new Tree();
- keyValues.forEachRemaining(keyValue -> result.addTree(keyValue.getValue()));
- return result;
- }
-
- @Override
- public String getMemoryKey() {
- return this.sideEffectKey;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
deleted file mode 100644
index 9b401c4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
+++ /dev/null
@@ -1,68 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
- private TraverserSet<S> traverserSet = new TraverserSet<>();
-
- public CollectingBarrierStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.BULK);
- }
-
- @Override
- public Traverser<S> processNextStart() {
- if (this.starts.hasNext()) {
- this.starts.forEachRemaining(this.traverserSet::add);
- this.barrierConsumer(this.traverserSet);
- }
- return this.traverserSet.remove();
- }
-
- @Override
- public CollectingBarrierStep<S> clone() {
- final CollectingBarrierStep<S> clone = (CollectingBarrierStep<S>) super.clone();
- clone.traverserSet = new TraverserSet<>();
- return clone;
- }
-
- @Override
- public void reset() {
- super.reset();
- this.traverserSet.clear();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
deleted file mode 100644
index 01ecfe0..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
+++ /dev/null
@@ -1,95 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
-
- private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
-
- public ComputerAwareStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<E> processNextStart() throws NoSuchElementException {
- while (true) {
- if (this.previousIterator.hasNext())
- return this.previousIterator.next();
- this.previousIterator = this.traverserStepIdSetByChild ? this.computerAlgorithm() : this.standardAlgorithm();
- }
- }
-
- @Override
- public void onEngine(final TraversalEngine engine) {
- this.traverserStepIdSetByChild = engine.isComputer();
- }
-
- @Override
- public ComputerAwareStep<S, E> clone() {
- final ComputerAwareStep<S, E> clone = (ComputerAwareStep<S, E>) super.clone();
- clone.previousIterator = Collections.emptyIterator();
- return clone;
- }
-
- protected abstract Iterator<Traverser<E>> standardAlgorithm() throws NoSuchElementException;
-
- protected abstract Iterator<Traverser<E>> computerAlgorithm() throws NoSuchElementException;
-
- //////
-
- public class EndStep extends AbstractStep<S, S> implements EngineDependent {
-
- public EndStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- final Traverser.Admin<S> start = this.starts.next();
- if (this.traverserStepIdSetByChild) start.setStepId(ComputerAwareStep.this.getNextStep().getId());
- return start;
- }
-
- @Override
- public String toString() {
- return TraversalHelper.makeStepString(this);
- }
-
- @Override
- public void onEngine(final TraversalEngine engine) {
- this.traverserStepIdSetByChild = engine.isComputer();
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
deleted file mode 100644
index 379fa4e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
+++ /dev/null
@@ -1,40 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MarkerIdentityStep<S> extends AbstractStep<S, S> {
-
- public MarkerIdentityStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
deleted file mode 100644
index 4b39aa6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
+++ /dev/null
@@ -1,49 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.Collections;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PathIdentityStep<S> extends AbstractStep<S, S> {
-
- public PathIdentityStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.singleton(TraverserRequirement.PATH);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
deleted file mode 100644
index 1f48885..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
+++ /dev/null
@@ -1,180 +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.graph.traversal.step.util;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-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.AbstractStep;
-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.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Iterator;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, EngineDependent {
-
- public static final String REDUCING = Graph.Hidden.hide("reducing");
-
- protected Supplier<E> seedSupplier;
- protected BiFunction<E, Traverser<S>, E> reducingBiFunction;
- private boolean done = false;
- protected boolean byPass = false;
-
- public ReducingBarrierStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- public void setSeedSupplier(final Supplier<E> seedSupplier) {
- this.seedSupplier = seedSupplier;
- }
-
- public void setBiFunction(final BiFunction<E, Traverser<S>, E> reducingBiFunction) {
- this.reducingBiFunction = reducingBiFunction;
- }
-
- @Override
- public void onEngine(final TraversalEngine traversalEngine) {
- this.byPass = traversalEngine.isComputer();
- }
-
- @Override
- public void reset() {
- super.reset();
- this.done = false;
- }
-
- @Override
- public Traverser<E> processNextStart() {
- if (this.byPass) {
- return (Traverser<E>) this.starts.next();
- } else {
- if (this.done)
- throw FastNoSuchElementException.instance();
- E seed = this.seedSupplier.get();
- while (this.starts.hasNext())
- seed = this.reducingBiFunction.apply(seed, this.starts.next());
- this.done = true;
- return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
- }
- }
-
- @Override
- public ReducingBarrierStep<S, E> clone() {
- final ReducingBarrierStep<S, E> clone = (ReducingBarrierStep<S, E>) super.clone();
- clone.done = false;
- return clone;
- }
-
- @Override
- public MapReduce getMapReduce() {
- return new DefaultMapReduce(this.seedSupplier, this.reducingBiFunction);
- }
-
- ///////
-
- public static class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
-
- private static final String REDUCING_BARRIER_STEP_SEED_SUPPLIER = "gremlin.reducingBarrierStep.seedSupplier";
- private static final String REDUCING_BARRIER_STEP_BI_FUNCTION = "gremlin.reducingBarrierStep.biFunction";
-
- private BiFunction biFunction;
- private Supplier seedSupplier;
-
- private DefaultMapReduce() {
- }
-
- public DefaultMapReduce(final Supplier seedSupplier, final BiFunction biFunction) {
- this.seedSupplier = seedSupplier;
- this.biFunction = biFunction;
-
- }
-
- @Override
- public void storeState(final Configuration configuration) {
- super.storeState(configuration);
- VertexProgramHelper.serialize(this.seedSupplier, configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
- VertexProgramHelper.serialize(this.biFunction, configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
-
- }
-
- public void loadState(final Configuration configuration) {
- this.seedSupplier = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
- this.biFunction = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
- }
-
- @Override
- public boolean doStage(final Stage stage) {
- return !stage.equals(Stage.COMBINE);
- }
-
- @Override
- public String getMemoryKey() {
- return REDUCING;
- }
-
- @Override
- public Object generateFinalResult(final Iterator keyValues) {
- return ((KeyValue) keyValues.next()).getValue();
-
- }
-
- @Override
- public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
- vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(emitter::emit));
- }
-
- @Override
- public void reduce(final NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
- Object mutatingSeed = this.seedSupplier.get();
- while (values.hasNext()) {
- mutatingSeed = this.biFunction.apply(mutatingSeed, values.next());
- }
- emitter.emit(FinalGet.tryFinalGet(mutatingSeed));
- }
- }
-
- /////
-
- public interface FinalGet<A> {
-
- public A getFinal();
-
- public static <A> A tryFinalGet(final Object object) {
- return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
deleted file mode 100644
index 78d3830..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
+++ /dev/null
@@ -1,64 +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.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> {
-
- private boolean done = false;
-
- public SupplyingBarrierStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- public abstract E supply();
-
- @Override
- public void reset() {
- super.reset();
- this.done = false;
- }
-
- @Override
- public Traverser<E> processNextStart() {
- if (this.done)
- throw FastNoSuchElementException.instance();
- while (this.starts.hasNext())
- this.starts.next();
- this.done = true;
- return this.getTraversal().asAdmin().getTraverserGenerator().generate(this.supply(), (Step) this, 1l);
- }
-
- @Override
- public SupplyingBarrierStep<S, E> clone() {
- final SupplyingBarrierStep<S, E> clone = (SupplyingBarrierStep<S, E>) super.clone();
- clone.done = false;
- return clone;
- }
-
-
-}
[23/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
new file mode 100644
index 0000000..0b5fe96
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.strategy;
+
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractTraversalStrategy implements TraversalStrategy {
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalStrategyString(this);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.getClass().hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return this.getClass().equals(object.getClass());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
index 3df6c2f..81d78be 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
@@ -18,13 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index 793092a..beec866 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -18,19 +18,19 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Contains;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
index bcb2688..a9cc50f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
@@ -18,9 +18,9 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
index 86d44c6..bcf9a3f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
@@ -18,19 +18,19 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+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.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
new file mode 100644
index 0000000..530b495
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
@@ -0,0 +1,54 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy {
+
+ private static final ComparatorHolderRemovalStrategy INSTANCE = new ComparatorHolderRemovalStrategy();
+
+ private ComparatorHolderRemovalStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getEngine().isStandard())
+ return;
+
+ if (TraversalHelper.hasStepOfAssignableClass(ComparatorHolder.class, traversal)) {
+ final Step endStep = traversal.getEndStep();
+ TraversalHelper.getStepsOfAssignableClass(ComparatorHolder.class, traversal)
+ .stream()
+ .filter(step -> step != endStep)
+ .forEach(step -> traversal.removeStep((Step)step));
+ }
+ }
+
+ public static ComparatorHolderRemovalStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
new file mode 100644
index 0000000..6869845
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
@@ -0,0 +1,83 @@
+/*
+ * 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.optimization;
+
+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.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+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.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ConjunctionStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+ private static final ConjunctionStrategy INSTANCE = new ConjunctionStrategy();
+
+ private ConjunctionStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ processConjunctionMarker(AndStep.AndMarker.class, traversal);
+ processConjunctionMarker(OrStep.OrMarker.class, traversal);
+ }
+
+ private static final boolean legalCurrentStep(final Step<?, ?> step) {
+ return !(step instanceof EmptyStep || step instanceof OrStep.OrMarker || step instanceof AndStep.AndMarker || step instanceof StartStep);
+ }
+
+ private static final void processConjunctionMarker(final Class<? extends ConjunctionStep.ConjunctionMarker> markerClass, final Traversal.Admin<?, ?> traversal) {
+ TraversalHelper.getStepsOfClass(markerClass, traversal).forEach(markerStep -> {
+ Step<?, ?> currentStep = markerStep.getNextStep();
+ final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
+ while (legalCurrentStep(currentStep)) {
+ final Step<?, ?> nextStep = currentStep.getNextStep();
+ rightTraversal.addStep(currentStep);
+ traversal.removeStep(currentStep);
+ currentStep = nextStep;
+ }
+
+ currentStep = markerStep.getPreviousStep();
+ final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
+ while (legalCurrentStep(currentStep)) {
+ final Step<?, ?> previousStep = currentStep.getPreviousStep();
+ leftTraversal.addStep(0, currentStep);
+ traversal.removeStep(currentStep);
+ currentStep = previousStep;
+ }
+ TraversalHelper.replaceStep(markerStep,
+ markerClass.equals(AndStep.AndMarker.class) ?
+ new AndStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal) :
+ new OrStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal),
+ traversal);
+ });
+ }
+
+ public static ConjunctionStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
new file mode 100644
index 0000000..1bb4a96
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
@@ -0,0 +1,75 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DedupOptimizerStrategy extends AbstractTraversalStrategy {
+
+ private static final DedupOptimizerStrategy INSTANCE = new DedupOptimizerStrategy();
+
+ private DedupOptimizerStrategy() {
+ }
+
+ private static final List<Class<? extends Step>> BIJECTIVE_PIPES = Arrays.asList(IdentityStep.class, OrderGlobalStep.class);
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (!TraversalHelper.hasStepOfClass(DedupGlobalStep.class, traversal))
+ return;
+
+ boolean done = false;
+ while (!done) {
+ done = true;
+ for (int i = 0; i < traversal.getSteps().size(); i++) {
+ final Step step1 = traversal.getSteps().get(i);
+ if (step1 instanceof DedupGlobalStep && !(((DedupGlobalStep) step1).getLocalChildren().get(0) instanceof IdentityTraversal)) {
+ for (int j = i; j >= 0; j--) {
+ final Step step2 = traversal.getSteps().get(j);
+ if (BIJECTIVE_PIPES.stream().filter(c -> c.isAssignableFrom(step2.getClass())).findAny().isPresent()) {
+ traversal.removeStep(step1);
+ traversal.addStep(j, step1);
+ done = false;
+ break;
+ }
+ }
+ }
+ if (!done)
+ break;
+ }
+ }
+ }
+
+ public static DedupOptimizerStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java
new file mode 100644
index 0000000..3c4bf3d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EngineDependentStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+ private static final EngineDependentStrategy INSTANCE = new EngineDependentStrategy();
+
+ private EngineDependentStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ traversal.getSteps().stream()
+ .filter(step -> step instanceof EngineDependent)
+ .forEach(step -> ((EngineDependent) step).onEngine(traversal.getEngine()));
+ }
+
+ public static EngineDependentStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
new file mode 100644
index 0000000..729e2b9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
@@ -0,0 +1,49 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
+
+ private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
+
+ private IdentityRemovalStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (!TraversalHelper.hasStepOfClass(IdentityStep.class, traversal))
+ return;
+
+ TraversalHelper.getStepsOfClass(IdentityStep.class, traversal).stream()
+ .filter(step -> !step.getLabel().isPresent())
+ .forEach(traversal::removeStep);
+ }
+
+ public static IdentityRemovalStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
new file mode 100644
index 0000000..333ef34
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
@@ -0,0 +1,50 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MarkerIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LabeledEndStepStrategy extends AbstractTraversalStrategy {
+
+ private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
+
+ private LabeledEndStepStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getEndStep().getLabel().isPresent())
+ traversal.addStep(new MarkerIdentityStep<>(traversal));
+ }
+
+ public static LabeledEndStepStrategy instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalStrategyString(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
new file mode 100644
index 0000000..15980d9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
@@ -0,0 +1,90 @@
+/*
+ * 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.optimization;
+
+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.filter.WhereStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+ private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
+ private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
+
+ static {
+ PRIORS.add(IdentityRemovalStrategy.class);
+ }
+
+ private MatchWhereStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (!TraversalHelper.hasStepOfClass(MatchStep.class, traversal))
+ return;
+
+ final List<MatchStep> matchSteps = TraversalHelper.getStepsOfClass(MatchStep.class, traversal);
+ for (final MatchStep matchStep : matchSteps) {
+ boolean foundWhereWithNoTraversal = false;
+ Step currentStep = matchStep.getNextStep();
+ while (currentStep instanceof WhereStep || currentStep instanceof SelectStep || currentStep instanceof SelectOneStep || currentStep instanceof IdentityStep) {
+ if (currentStep instanceof WhereStep) {
+ if (!((WhereStep) currentStep).getLocalChildren().isEmpty()) {
+ matchStep.addTraversal(((WhereStep<?>) currentStep).getLocalChildren().get(0));
+ traversal.removeStep(currentStep);
+ } else {
+ foundWhereWithNoTraversal = true;
+ }
+ } else if (currentStep instanceof SelectStep) {
+ if (!((SelectStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
+ break;
+ } else if (currentStep instanceof SelectOneStep) {
+ if (!((SelectOneStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
+ break;
+ }
+ // else is the identity step
+ currentStep = currentStep.getNextStep();
+ }
+ }
+ }
+
+ public static MatchWhereStrategy instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public Set<Class<? extends TraversalStrategy>> applyPrior() {
+ return PRIORS;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
new file mode 100644
index 0000000..153383f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
@@ -0,0 +1,112 @@
+/*
+ * 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.optimization;
+
+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.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStrategy extends AbstractTraversalStrategy {
+
+
+ private static final ProfileStrategy INSTANCE = new ProfileStrategy();
+ private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
+
+ static {
+ // Ensure that this strategy is applied last.
+ PRIORS.add(ComparatorHolderRemovalStrategy.class);
+ PRIORS.add(ConjunctionStrategy.class);
+ PRIORS.add(DedupOptimizerStrategy.class);
+ PRIORS.add(EngineDependentStrategy.class);
+ PRIORS.add(IdentityRemovalStrategy.class);
+ PRIORS.add(LabeledEndStepStrategy.class);
+ PRIORS.add(MatchWhereStrategy.class);
+ PRIORS.add(RangeByIsCountStrategy.class);
+ }
+
+ private ProfileStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (!(traversal.getParent() instanceof EmptyStep)) {
+ // This strategy is applied to the top-level traversal only
+ return;
+ }
+
+ if (!TraversalHelper.hasStepOfClass(ProfileStep.class, traversal)) {
+ // No ProfileStep present
+ return;
+ }
+
+ prepTraversalForProfiling(traversal);
+ }
+
+ // Walk the traversal steps and inject the .profile()-steps.
+ private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
+ // Remove user-specified .profile() steps
+ final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
+ for (ProfileStep step : profileSteps) {
+ traversal.removeStep(step);
+ }
+
+ // Add .profile() step after every pre-existing step.
+ final List<Step> steps = traversal.getSteps();
+ final int numSteps = steps.size();
+ for (int ii = 0; ii < numSteps; ii++) {
+ // Get the original step
+ Step step = steps.get(ii * 2);
+
+ // Create and inject ProfileStep
+ ProfileStep profileStep = new ProfileStep(traversal);
+ traversal.addStep((ii * 2) + 1, profileStep);
+
+ // Handle nested traversal
+ if (step instanceof TraversalParent) {
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+ prepTraversalForProfiling(t);
+ }
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+ prepTraversalForProfiling(t);
+ }
+ }
+ }
+ }
+
+ @Override
+ public Set<Class<? extends TraversalStrategy>> applyPrior() {
+ return PRIORS;
+ }
+
+ public static ProfileStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
new file mode 100644
index 0000000..9ef6826
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
@@ -0,0 +1,91 @@
+/*
+ * 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.optimization;
+
+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.filter.IsStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+
+import java.util.*;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+ private static final Map<BiPredicate, Long> RANGE_PREDICATES = new HashMap<BiPredicate, Long>() {{
+ put(Compare.inside, 0L);
+ put(Compare.outside, 1L);
+ put(Contains.within, 1L);
+ put(Contains.without, 0L);
+ }};
+ private static final Set<Compare> INCREASED_OFFSET_SCALAR_PREDICATES =
+ EnumSet.of(Compare.eq, Compare.neq, Compare.lte, Compare.gt);
+
+ private static final RangeByIsCountStrategy INSTANCE = new RangeByIsCountStrategy();
+
+ private RangeByIsCountStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ final int size = traversal.getSteps().size();
+ Step prev = null;
+ for (int i = 0; i < size; i++) {
+ final Step curr = traversal.getSteps().get(i);
+ if (curr instanceof CountGlobalStep && i < size - 1) {
+ final Step next = traversal.getSteps().get(i + 1);
+ if (next instanceof IsStep && !(prev instanceof RangeGlobalStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
+ final IsStep isStep = (IsStep) next;
+ final Object value = isStep.getValue();
+ final BiPredicate predicate = isStep.getPredicate();
+ if (value instanceof Number) {
+ final long highRangeOffset = INCREASED_OFFSET_SCALAR_PREDICATES.contains(predicate) ? 1L : 0L;
+ final long highRange = ((Number) value).longValue() + highRangeOffset;
+ TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
+ i++;
+ } else {
+ final Long highRangeOffset = RANGE_PREDICATES.get(predicate);
+ if (value instanceof Collection && highRangeOffset != null) {
+ final Object high = Collections.max((Collection) value);
+ if (high instanceof Number) {
+ final long highRange = ((Number) high).longValue() + highRangeOffset;
+ TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
+ i++;
+ }
+ }
+ }
+ }
+ }
+ prev = curr;
+ }
+ }
+
+ public static RangeByIsCountStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
new file mode 100644
index 0000000..1274a01
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
@@ -0,0 +1,49 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+
+/**
+ * A {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy} that prevents a traversal from running beyond
+ * a pre-configured time.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class TimeLimitedStrategy extends AbstractTraversalStrategy {
+ private final long timeLimit;
+
+ public TimeLimitedStrategy(final long timeLimit) {
+ this.timeLimit = timeLimit;
+ }
+
+ public long getTimeLimit() {
+ return timeLimit;
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getEndStep().getClass().equals(TimeLimitStep.class))
+ return;
+
+ traversal.addStep(new TimeLimitStep<>(traversal, timeLimit));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
new file mode 100644
index 0000000..a47355c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
@@ -0,0 +1,72 @@
+/*
+ * 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.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalVerificationStrategy extends AbstractTraversalStrategy {
+
+ private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
+
+ private TraversalVerificationStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getEngine().isStandard())
+ return;
+
+ Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
+ ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
+ traversal.getEndStep();
+ if (endStep instanceof ComputerResultStep) // TODO: this is not needed anymore (delete when you prove it)
+ endStep = endStep.getPreviousStep();
+
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
+ throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
+ }
+ if (step instanceof TraversalParent) {
+ final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
+ .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
+ .findAny();
+ if (traversalOptional.isPresent())
+ throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
+ }
+ }
+ }
+
+ public static TraversalVerificationStrategy instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..36e78f8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
@@ -0,0 +1,86 @@
+/*
+ * 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.traverser;
+
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractPathTraverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.WeakHashMap;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
+
+ protected B_O_PA_S_SE_SL_Traverser() {
+ }
+
+ public B_O_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+ super(t, step);
+ final Optional<String> stepLabel = step.getLabel();
+ this.path = stepLabel.isPresent() ?
+ getOrCreateFromCache(this.sideEffects).extend(t, stepLabel.get()) :
+ getOrCreateFromCache(this.sideEffects).extend(t);
+ }
+
+ @Override
+ public int hashCode() {
+ return this.t.hashCode() + this.future.hashCode() + this.loops;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof B_O_PA_S_SE_SL_Traverser
+ && ((B_O_PA_S_SE_SL_Traverser) object).get().equals(this.t)
+ && ((B_O_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+ && ((B_O_PA_S_SE_SL_Traverser) object).loops() == this.loops()
+ && (null == this.sack);
+ }
+
+ @Override
+ public Traverser.Admin<T> attach(final Vertex vertex) {
+ super.attach(vertex);
+ final Path newSparsePath = getOrCreateFromCache(this.sideEffects);
+ this.path.forEach((object, labels) -> newSparsePath.extend(object, labels.toArray(new String[labels.size()])));
+ this.path = newSparsePath;
+ return this;
+ }
+
+ //////////////////////
+
+ private static final Map<TraversalSideEffects, SparsePath> PATH_CACHE = new WeakHashMap<>();
+
+ private static SparsePath getOrCreateFromCache(final TraversalSideEffects sideEffects) {
+ SparsePath path = PATH_CACHE.get(sideEffects);
+ if (null == path) {
+ path = SparsePath.make();
+ PATH_CACHE.put(sideEffects, path);
+ }
+ return path;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..dc25bad
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+ private static final B_O_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_PA_S_SE_SL_TraverserGenerator();
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.OBJECT,
+ TraverserRequirement.BULK,
+ TraverserRequirement.SINGLE_LOOP,
+ TraverserRequirement.PATH_ACCESS,
+ TraverserRequirement.SACK,
+ TraverserRequirement.SIDE_EFFECTS);
+
+
+ private B_O_PA_S_SE_SL_TraverserGenerator() {
+ }
+
+ @Override
+ public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+ final B_O_PA_S_SE_SL_Traverser<S> traverser = new B_O_PA_S_SE_SL_Traverser<>(start, startStep);
+ traverser.setBulk(initialBulk);
+ return traverser;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getProvidedRequirements() {
+ return REQUIREMENTS;
+ }
+
+ public static B_O_PA_S_SE_SL_TraverserGenerator instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..71129f0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
@@ -0,0 +1,58 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractPathTraverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_P_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
+
+ protected B_O_P_PA_S_SE_SL_Traverser() {
+ }
+
+ public B_O_P_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+ super(t, step);
+ final Optional<String> stepLabel = step.getLabel();
+ this.path = stepLabel.isPresent() ?
+ ImmutablePath.make().extend(t, stepLabel.get()) :
+ ImmutablePath.make().extend(t);
+ }
+
+ @Override
+ public int hashCode() {
+ return super.hashCode() + this.path.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return (object instanceof B_O_P_PA_S_SE_SL_Traverser)
+ && ((B_O_P_PA_S_SE_SL_Traverser) object).path().equals(this.path) // TODO: path equality
+ && ((B_O_P_PA_S_SE_SL_Traverser) object).get().equals(this.t)
+ && ((B_O_P_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+ && ((B_O_P_PA_S_SE_SL_Traverser) object).loops() == this.loops()
+ && (null == this.sack);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..5eb62cd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,61 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_P_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+ private static final B_O_P_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_P_PA_S_SE_SL_TraverserGenerator();
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.OBJECT,
+ TraverserRequirement.BULK,
+ TraverserRequirement.SINGLE_LOOP,
+ TraverserRequirement.PATH_ACCESS,
+ TraverserRequirement.PATH,
+ TraverserRequirement.SACK,
+ TraverserRequirement.SIDE_EFFECTS);
+
+ private B_O_P_PA_S_SE_SL_TraverserGenerator() {
+ }
+
+ @Override
+ public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+ final B_O_P_PA_S_SE_SL_Traverser<S> traverser = new B_O_P_PA_S_SE_SL_Traverser<>(start, startStep);
+ traverser.setBulk(initialBulk);
+ return traverser;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getProvidedRequirements() {
+ return REQUIREMENTS;
+ }
+
+ public static B_O_P_PA_S_SE_SL_TraverserGenerator instance() {
+ return INSTANCE;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
new file mode 100644
index 0000000..4c64fb0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
@@ -0,0 +1,70 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_Traverser<T> extends O_Traverser<T> {
+
+ protected long bulk = 1l;
+ protected String future = HALT;
+
+ protected B_O_Traverser() {
+ }
+
+ public B_O_Traverser(final T t, final long initialBulk) {
+ super(t);
+ this.bulk = initialBulk;
+ }
+
+ @Override
+ public void setBulk(final long count) {
+ this.bulk = count;
+ }
+
+ @Override
+ public long bulk() {
+ return this.bulk;
+ }
+
+ @Override
+ public void merge(final Traverser.Admin<?> other) {
+ this.bulk = this.bulk + other.bulk();
+ }
+
+ @Override
+ public String getStepId() {
+ return this.future;
+ }
+
+ @Override
+ public void setStepId(final String stepId) {
+ this.future = stepId;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof B_O_Traverser &&
+ ((B_O_Traverser) object).t.equals(this.t) &&
+ ((B_O_Traverser) object).future.equals(this.future);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
new file mode 100644
index 0000000..58a7546
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
@@ -0,0 +1,55 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_TraverserGenerator implements TraverserGenerator {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.OBJECT,
+ TraverserRequirement.BULK);
+
+ private static final B_O_TraverserGenerator INSTANCE = new B_O_TraverserGenerator();
+
+ private B_O_TraverserGenerator() {
+ }
+
+ @Override
+ public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+ return new B_O_Traverser<>(start, initialBulk);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getProvidedRequirements() {
+ return REQUIREMENTS;
+ }
+
+ public static B_O_TraverserGenerator instance() {
+ return INSTANCE;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
new file mode 100644
index 0000000..4fc3f5d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
@@ -0,0 +1,35 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractTraverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class O_Traverser<T> extends AbstractTraverser<T> {
+
+ protected O_Traverser() {
+ }
+
+ public O_Traverser(final T t) {
+ super(t);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
new file mode 100644
index 0000000..373fa8a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
@@ -0,0 +1,52 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class O_TraverserGenerator implements TraverserGenerator {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = Collections.singleton(TraverserRequirement.OBJECT);
+ private static final O_TraverserGenerator INSTANCE = new O_TraverserGenerator();
+
+ private O_TraverserGenerator() {
+ }
+
+ @Override
+ public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+ return new O_Traverser<>(start);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getProvidedRequirements() {
+ return REQUIREMENTS;
+ }
+
+ public static O_TraverserGenerator instance() {
+ return INSTANCE;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
new file mode 100644
index 0000000..4ca721a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.io.Serializable;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraverserGeneratorFactory extends Serializable {
+
+ public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?, ?> traversal);
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
new file mode 100644
index 0000000..00b7d9b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
@@ -0,0 +1,39 @@
+/*
+ * 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.traverser;
+
+/**
+ * A {@link TraverserRequirement} is a list of requirements that a {@link org.apache.tinkerpop.gremlin.process.traversal.Traversal} requires of a {@link org.apache.tinkerpop.gremlin.process.traversal.Traverser}.
+ * The less requirements, the simpler the traverser can be (both in terms of space and time constraints).
+ * Every {@link org.apache.tinkerpop.gremlin.process.traversal.Step} provides its specific requirements via {@link org.apache.tinkerpop.gremlin.process.traversal.Step#getRequirements()}.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum TraverserRequirement {
+
+ OBJECT,
+ BULK,
+ SINGLE_LOOP,
+ NESTED_LOOP,
+ PATH,
+ PATH_ACCESS,
+ SACK,
+ SIDE_EFFECTS,
+ // NESTED_TRAVERSALS
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
new file mode 100644
index 0000000..ff77e77
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
@@ -0,0 +1,213 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+
+import java.util.Optional;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractPathTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+ protected T t;
+ protected Object sack = null;
+ protected String future = HALT;
+ protected short loops = 0; // an optimization hack to use a short internally to save bits :)
+ protected transient TraversalSideEffects sideEffects;
+ protected long bulk = 1l;
+ protected Path path;
+
+ protected AbstractPathTraverser() {
+
+ }
+
+ public AbstractPathTraverser(final T t, final Step<T, ?> step) {
+ this.t = t;
+ this.sideEffects = step.getTraversal().getSideEffects();
+ this.sideEffects.getSackInitialValue().ifPresent(supplier -> this.sack = supplier.get());
+ }
+
+ /////////////////
+
+ @Override
+ public T get() {
+ return this.t;
+ }
+
+ @Override
+ public void set(final T t) {
+ this.t = t;
+ }
+
+ /////////////////
+
+ @Override
+ public Path path() {
+ return this.path;
+ }
+
+ /////////////////
+
+ @Override
+ public <S> S sack() {
+ return (S) this.sack;
+ }
+
+ @Override
+ public <S> void sack(final S object) {
+ this.sack = object;
+ }
+
+ /////////////////
+
+ @Override
+ public void setBulk(final long count) {
+ this.bulk = count;
+ }
+
+ @Override
+ public long bulk() {
+ return this.bulk;
+ }
+
+ /////////////////
+
+ @Override
+ public int loops() {
+ return this.loops;
+ }
+
+ @Override
+ public void incrLoops(final String stepLabel) {
+ this.loops++;
+ }
+
+ @Override
+ public void resetLoops() {
+ this.loops = 0;
+ }
+
+ /////////////////
+
+ @Override
+ public String getStepId() {
+ return this.future;
+ }
+
+ @Override
+ public void setStepId(final String stepId) {
+ this.future = stepId;
+ }
+
+ /////////////////
+
+ @Override
+ public TraversalSideEffects getSideEffects() {
+ return this.sideEffects;
+ }
+
+
+ @Override
+ public void setSideEffects(final TraversalSideEffects sideEffects) {
+ this.sideEffects = sideEffects;
+ }
+
+ /////////////////
+
+ @Override
+ public Traverser.Admin<T> detach() {
+ this.t = DetachedFactory.detach(this.t, false);
+ this.path = DetachedFactory.detach(this.path, true);
+ return this;
+ }
+
+ @Override
+ public Traverser.Admin<T> attach(final Vertex vertex) {
+ if (this.t instanceof DetachedElement)
+ this.t = (T) ((DetachedElement) this.t).attach(vertex);
+ else if (this.t instanceof DetachedProperty)
+ this.t = (T) ((DetachedProperty) this.t).attach(vertex);
+ // you do not want to attach a path because it will reference graph objects not at the current vertex
+ return this;
+ }
+
+ /////////////////
+
+ @Override
+ public void merge(final Traverser.Admin<?> other) {
+ this.bulk = this.bulk + other.bulk();
+ }
+
+ @Override
+ public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
+ try {
+ final AbstractPathTraverser<R> clone = (AbstractPathTraverser<R>) super.clone();
+ clone.t = r;
+ final Optional<String> stepLabel = step.getLabel();
+ clone.path = stepLabel.isPresent() ? clone.path.clone().extend(r, stepLabel.get()) : clone.path.clone().extend(r);
+ clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public Traverser.Admin<T> split() {
+ try {
+ final AbstractPathTraverser<T> clone = (AbstractPathTraverser<T>) super.clone();
+ clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ /////////////////
+
+ @Override
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public AbstractPathTraverser<T> clone() {
+ try {
+ return (AbstractPathTraverser<T>) super.clone();
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public int hashCode() {
+ return this.t.hashCode() + this.future.hashCode() + this.loops;
+ }
+
+ @Override
+ public String toString() {
+ return this.t.toString();
+ }
+}
[18/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
deleted file mode 100644
index 60e46ae..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
+++ /dev/null
@@ -1,198 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRangeTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends RangeTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
- g.V(v1Id).out.limit(2)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
- g.V.local(__.outE.limit(3)).inV.limit(3)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
- g.V(v1Id).out('knows').outE('created')[0].inV()
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
- g.V(v1Id).out('knows').out('created')[0]
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
- g.V(v1Id).out('created').in('created')[1..3]
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
- g.V(v1Id).out('created').inE('created')[1..3].outV
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
- g.V().repeat(__.both).times(3)[5..11];
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
- g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().limit(Scope.local, 1)).as('w').select().by('name').by()
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
- g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().range(Scope.local, 1, 3)).as('w').select().by('name').by()
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends RangeTest {
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_out_limitX2X() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
- // TODO: the traversal should work in computer mode, but throws a ClassCastException
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(Object v1Id) {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
deleted file mode 100644
index 82778c9..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
+++ /dev/null
@@ -1,68 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRetainTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends RetainTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
- g.V(v1Id).out.retain(g.V(v2Id).next())
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
- g.V(v1Id).out.aggregate('x').out.retain('x')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
- g.V(v1Id).as('a').out('created').in('created').retain('a').name
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends RetainTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.retain(g.V($v2Id).next())", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.retain('x')", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').retain('a').name", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
deleted file mode 100644
index dbbc4ae..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
+++ /dev/null
@@ -1,115 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sample
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySampleTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SampleTest {
-
- @Override
- public Traversal<Edge, Edge> get_g_E_sampleX1X() {
- g.E.sample(1)
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
- g.E.sample(2).by('weight')
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
- g.V.local(__.outE.sample(1).by('weight'))
- }
-
- @Override
- Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
- g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))
- }
-
- @Override
- Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
- g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SampleTest {
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_E_sampleX1X() {
- // TODO: makes no sense when its global
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_E_sampleX2X_byXweightX() {
- // TODO: makes no sense when its global
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
- ComputerTestHelper.compute("g.V.local(__.outE.sample(1).by('weight'))", g)
- }
-
- @Override
- Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
- ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))", g)
- }
-
- @Override
- Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
- ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))", g)
- }
-
- @Override
- Traversal<Edge, Edge> get_g_E_sampleX1X() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
deleted file mode 100644
index 7924b71..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
+++ /dev/null
@@ -1,62 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySimplePathTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends SimplePathTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
- g.V(v1Id).out('created').in('created').simplePath
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
- return g.V.repeat(__.both.simplePath).times(3).path()
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends SimplePathTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').simplePath", g);
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
- ComputerTestHelper.compute("g.V.repeat(__.both.simplePath).times(3).path()", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
deleted file mode 100644
index 6107ad0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
+++ /dev/null
@@ -1,98 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyWhereTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends WhereTest {
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
- g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b');
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
- g.V.has('age').as('a').out.in.has('age').as('b').select().where('a',Compare.neq, 'b');
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
- g.V.has('age').as('a').out.in.has('age').as('b').select().where(__.as('b').has('name', 'marko'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
- g.V().has('age').as('a').out.in.has('age').as('b').select().where(__.as('a').out('knows').as('b'));
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends WhereTest {
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
- ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b')", g);
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
- ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.neq, 'b')", g);
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
deleted file mode 100644
index 0207cfb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
+++ /dev/null
@@ -1,51 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAddEdgeTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends AddEdgeTest {
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
- g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a')
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(
- final Object v1Id) {
- g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a', 'weight', 2)
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
- g.V.addOutE('existsWith', g.V, 'time', 'now');
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
deleted file mode 100644
index 0f6f398..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
+++ /dev/null
@@ -1,46 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAddVertexTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends AddVertexTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
- g.V.addV(T.label, 'animal', 'age', 0);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
- g.addV(T.label, 'person', 'name', 'stephen');
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
deleted file mode 100644
index dc97f79..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
+++ /dev/null
@@ -1,147 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyBackTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends BackTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
- g.V(v1Id).as('here').out.back('here')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
- g.V(v4Id).out.as('here').has('lang', 'java').back('here')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
- final Object v4Id) {
- g.V(v4Id).out.as('here').has('lang', 'java').back('here').name
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
- g.V(v1Id).outE.as('here').inV.has('name', 'vadas').back('here')
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- g.V(v1Id).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- g.V(v1Id).outE('knows').as('here').has('weight', 1.0d).inV.has('name', 'josh').back('here')
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- g.V(v1Id).outE("knows").as('here').has('weight', 1.0d).as('fake').inV.has("name", 'josh').back('here')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
- g.V().as("here").out.name.back("here");
- }
-
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
- g.V.out('created')
- .union(__.as('project').in('created').has('name', 'marko').back('project'),
- __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends BackTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).as('here').out.back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
- final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here').name", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE.as('here').inV.has('name', 'vadas').back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).inV.has('name','josh').back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
- final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).as('fake').inV.has('name','josh').back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
- ComputerTestHelper.compute("g.V().as('here').out.name.back('here')", g);
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
- ComputerTestHelper.compute("""
- g.V.out('created')
- .union(__.as('project').in('created').has('name', 'marko').back('project'),
- __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
- """, g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
deleted file mode 100644
index bbebe23..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
+++ /dev/null
@@ -1,104 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-
-/**
- *
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyCoalesceTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends CoalesceTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
- g.V().coalesce(out('foo'), out('bar'));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
- g.V(v1Id).coalesce(out('knows'), out('created')).values('name');
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
- g.V(v1Id).coalesce(out('created'), out('knows')).values('name');
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
- g.V.coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name');
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
- g.V.coalesce(outE('knows'), outE('created')).otherV.path.by('name').by(T.label);
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends CoalesceTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
- ComputerTestHelper.compute("g.V().coalesce(out('foo'), out('bar'))", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('knows'), out('created')).values('name')", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('created'), out('knows')).values('name')", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
- ComputerTestHelper.compute("g.V().coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name')", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
- }
-
- @Override
- Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
deleted file mode 100644
index dfcb05d..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
+++ /dev/null
@@ -1,119 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCountTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends CountTest {
- @Override
- public Traversal<Vertex, Long> get_g_V_count() {
- g.V.count()
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_out_count() {
- g.V.out.count
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_both_both_count() {
- g.V.both.both.count()
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
- g.V().repeat(__.out).times(3).count()
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
- g.V.repeat(__.out).times(8).count()
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
- g.V.has('no').count
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
- return g.V.fold.count(Scope.local);
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends CountTest {
- @Override
- public Traversal<Vertex, Long> get_g_V_count() {
- ComputerTestHelper.compute("g.V.count()", g)
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_out_count() {
- ComputerTestHelper.compute("g.V.out.count", g)
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_both_both_count() {
- ComputerTestHelper.compute("g.V.both.both.count()", g)
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
- ComputerTestHelper.compute("g.V().repeat(__.out).times(3).count()", g);
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
- ComputerTestHelper.compute("g.V.repeat(__.out).times(8).count()", g);
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
- ComputerTestHelper.compute("g.V.has('no').count", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_fold_countXlocalX() {
- }
-
- @Override
- Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
deleted file mode 100644
index 4a0baab..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
+++ /dev/null
@@ -1,79 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldTest
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyFoldTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends FoldTest {
- @Override
- public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
- g.V.fold
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
- g.V.fold.unfold
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
- g.V.age.fold(0) { seed, age -> seed + age };
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends FoldTest {
- @Override
- public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
- ComputerTestHelper.compute("g.V.fold", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_fold_unfold() {
- // Does not work in OLAP cause fold() is not an endstep.
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
- ComputerTestHelper.compute("g.V.age.fold(0) { seed, age -> seed + age }", g);
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
deleted file mode 100644
index aaf44fe..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
+++ /dev/null
@@ -1,129 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroovyMapTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends MapTest {
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
- g.V(v1Id).map { v -> v.name };
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
- g.V(v1Id).outE.label.map { l -> l.length() };
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
- g.V(v1Id).out.map { v -> v.name }.map { n -> n.length() };
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
- g.V.as('a').out.map { v -> v.path('a').name };
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
- g.V().as('a').out.out().map { v -> v.path('a').name + v.name };
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends MapTest {
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_VX1X_mapXnameX() {
- super.g_VX1X_mapXnameX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_VX1X_outE_label_mapXlengthX() {
- super.g_VX1X_outE_label_mapXlengthX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_VX1X_out_mapXnameX_mapXlengthX() {
- super.g_VX1X_out_mapXnameX_mapXlengthX();
- }
-
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).map { v -> v.name }", g);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE.label.map { l -> l.length() }", g);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.map { v -> v.name }.map { n -> n.length() }", g);
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_asXaX_out_mapXa_nameX() {
- // TODO: Doesn't work for graph computer because sideEffects are not accessible
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
- // TODO: Doesn't work for graph computer because sideEffects are not accessible
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
deleted file mode 100644
index ac7cb72..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
+++ /dev/null
@@ -1,187 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMatchTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends MatchTest {
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
- g.V().match('a', __.as('a').out().as('b'));
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
- g.V().match('a', __.as('a').out().as('b')).select('b').by(T.id)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
- g.V().match('a',
- __.as('a').out('knows').as('b'),
- __.as('b').out('created').as('c'))
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
- return g.V().match('a',
- __.as('a').out('knows').as('b'),
- __.as('a').out('created').as('c'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
- return g.V().match('d',
- __.as('d').in('knows').as('a'),
- __.as('d').has('name', 'vadas'),
- __.as('a').out('knows').as('b'),
- __.as('b').out('created').as('c'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
- g.V().match('a',
- __.as('a').out('created').as('b'),
- __.as('a').repeat(__.out).times(2).as('b')).select('a', 'b').by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
- g.V().match('a',
- __.as('a').out('created').has('name', 'lop').as('b'),
- __.as('b').in('created').has('age', 29).as('c'),
- __.as('c').repeat(__.out).times(2)).select.by('name')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
- g.V().out().out().match('a',
- __.as('a').in('created').as('b'),
- __.as('b').in('knows').as('c')).select('c').out('created').name
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
- g.V().match('a',
- __.as('a').out('created').as('b'),
- __.as('b').in('created').as('a'))
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
- return g.V().match('a', __.as('a').out('knows').as('b'),
- __.as('c').out('knows').as('b'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
- g.V().match('a',
- __.as('a').out('knows').as('b'),
- __.as('b').out('created').has('name', 'lop'),
- __.as('b').match('a1',
- __.as('a1').out('created').as('b1'),
- __.as('b1').in('created').as('c1')).select('c1').as('c')).select.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
- g.V().match('a',
- __.as('a').has('name', 'Garcia'),
- __.as('a').in('writtenBy').as('b'),
- __.as('a').in('sungBy').as('b'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
- g.V().match('a',
- __.as('a').in('sungBy').as('b'),
- __.as('a').in('sungBy').as('c'),
- __.as('b').out('writtenBy').as('d'),
- __.as('c').out('writtenBy').as('e'),
- __.as('d').has('name', 'George_Harrison'),
- __.as('e').has('name', 'Bob_Marley'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
- g.V().match('a',
- __.as('a').in('sungBy').as('b'),
- __.as('a').in('writtenBy').as('c'),
- __.as('b').out('writtenBy').as('d'),
- __.as('c').out('sungBy').as('d'),
- __.as('d').has('name', 'Garcia'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
- return g.V().match('a',
- __.as('a').in('sungBy').as('b'),
- __.as('a').in('writtenBy').as('c'),
- __.as('b').out('writtenBy').as('d'))
- .where(__.as('c').out('sungBy').as('d'))
- .where(__.as('d').has('name', 'Garcia'));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
- g.V().match("a",
- __.as("a").out("created").has("name", "lop").as("b"),
- __.as("b").in("created").has("age", 29).as("c"))
- .where(__.as("c").repeat(__.out()).times(2))
- .select.by('name')
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
- g.V().match('a',
- __.as('a').out('created').as('b'),
- __.as('b').in('created').as('c'))
- .where('a', Compare.neq, 'c')
- .select('a', 'c').by('name')
- }
-
- /*@Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
- g.V.match('a',
- __.as('a').out('created').as('b'),
- __.as('c').out('created').as('b')).select { it.value('name') }
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
- g.V.out.out.match('a',
- __.as('b').out('created').as('a'),
- __.as('c').out('knows').as('b')).select('c').out('knows').name
- }*/
- }
-
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
deleted file mode 100644
index b66c2f6..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
+++ /dev/null
@@ -1,74 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.max
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMaxTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends MaxTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_max() {
- g.V.age.max
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
- g.V.repeat(__.both).times(5).age.max
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
- g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends MaxTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_max() {
- ComputerTestHelper.compute("g.V.age.max", g)
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
- ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.max", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
- ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
deleted file mode 100644
index d291d1a..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
+++ /dev/null
@@ -1,63 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.mean
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMeanTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends MeanTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_age_mean() {
- g.V.age.mean
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
- g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends MeanTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_age_mean() {
- ComputerTestHelper.compute("g.V.age.mean", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
- ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))", g)
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
deleted file mode 100644
index 4f6f871..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
+++ /dev/null
@@ -1,74 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.min
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMinTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends MinTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_min() {
- g.V.age.min
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
- g.V.repeat(__.both).times(5).age.min
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
- g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends MinTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_min() {
- ComputerTestHelper.compute("g.V.age.min", g)
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
- ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.min", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
- ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
deleted file mode 100644
index 2a9f7cb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
+++ /dev/null
@@ -1,184 +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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyOrderTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends OrderTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order() {
- g.V().name.order()
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
- g.V.name.order.by { a, b -> a[1] <=> b[1] }.by { a, b -> b[2] <=> a[2] }
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
- g.V.order.by('name', Order.incr).name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
- g.V.order.by('name', Order.incr).name
- }
-
- @Override
- public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
- g.V.outE.order.by('weight', Order.decr).weight
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
- return g.V.order.by('name', { a, b -> a[1].compareTo(b[1]) }).by('name', { a, b -> b[2].compareTo(a[2]) }).name;
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
- g.V.as('a').out('created').as('b').order.by(Order.shuffle).select();
- }
-
- @Override
- public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
- final Object v1Id) {
- g.V(v1Id).map {
- final Map map = [:];
- map[1] = it.age;
- map[2] = it.age * 2;
- map[3] = it.age * 3;
- map[4] = it.age;
- return map;
- }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
- g.V.order.by(__.outE.count, Order.decr)
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends OrderTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order() {
- ComputerTestHelper.compute("g.V().name.order()", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
- ComputerTestHelper.compute("g.V.name.order.by { a, b -> a[1] <=> b[1] }.by{ a, b -> b[2] <=> a[2] }", g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_order_byXname_incrX_name() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_outE_order_byXweight_decrX_weight() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
- ComputerTestHelper.compute("g.V.as('a').out('created').as('b').order.by(Order.shuffle).select()", g);
- }
-
- @Override
- public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
- final Object v1Id) {
- ComputerTestHelper.compute("""
- g.V(${v1Id}).map {
- final Map map = [:];
- map[1] = it.age;
- map[2] = it.age * 2;
- map[3] = it.age * 3;
- map[4] = it.age;
- return map;
- }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
- """, g)
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_order_byXoutE_count__decrX() {
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
- super.g_V_name_order_byXa1_b1X_byXb2_a2X();
- }
- }
-}
[10/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
deleted file mode 100644
index 58af180..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
+++ /dev/null
@@ -1,931 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.Bindings;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.CrossJoinEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.Enumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.InnerJoinEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.IteratorEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.as;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MatchTest extends AbstractGremlinProcessTest {
-
- // very basic query
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX();
-
- // query with selection
- public abstract Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX();
-
- // linked traversals
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX();
-
- // a basic tree with two leaves
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX();
-
- // a tree with three leaves
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
-
- // illustrates early deduplication in "predicate" traversals
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX();
-
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX();
-
- public abstract Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
-
- // contains a cycle
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX();
-
- // contains an unreachable label
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX();
-
- // nested match()
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
-
- // contains a pair of traversals which connect the same labels, together with a predicate traversal
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
-
- // contains an identical pair of sets of traversals, up to variable names and has() conditions
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
-
- // forms a non-trivial DAG
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX();
-
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX();
-
- // inclusion of where
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
-
- //TODO: with Traversal.reverse()
- //public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
-
- //TODO: with Traversal.reverse()
- // public abstract Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_out_bX() throws Exception {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_out_bX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "lop")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "ripple")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "lop")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "peter")).put("b", convertToVertex(graph, "lop")));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_out_bX_selectXb_idX() throws Exception {
- final Traversal<Vertex, Object> traversal = get_g_V_matchXa_out_bX_selectXb_idX();
- printTraversalForm(traversal);
- int counter = 0;
- final Object vadasId = convertToVertexId("vadas");
- final Object joshId = convertToVertexId("josh");
- final Object lopId = convertToVertexId("lop");
- final Object rippleId = convertToVertexId("ripple");
- Map<Object, Long> idCounts = new HashMap<>();
- while (traversal.hasNext()) {
- counter++;
- MapHelper.incr(idCounts, traversal.next(), 1l);
- }
- assertFalse(traversal.hasNext());
- assertEquals(idCounts.get(vadasId), Long.valueOf(1l));
- assertEquals(idCounts.get(lopId), Long.valueOf(3l));
- assertEquals(idCounts.get(joshId), Long.valueOf(1l));
- assertEquals(idCounts.get(rippleId), Long.valueOf(1l));
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_knows_b__b_created_cX() throws Exception {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__b_created_cX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_knows_b__a_created_cX() throws Exception {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__a_created_cX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")).put("c", convertToVertex(graph, "lop")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() throws Exception {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
- new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() throws Exception {
- final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertResults(Function.identity(), traversal, new Bindings<String>().put("a", "marko").put("b", "lop"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() throws Exception {
- final List<Traversal<Vertex, Map<String, String>>> traversals = Arrays.asList(
- get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX(),
- get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- assertResults(Function.identity(), traversal,
- new Bindings<String>().put("a", "marko").put("b", "lop").put("c", "marko"),
- new Bindings<String>().put("a", "josh").put("b", "lop").put("c", "marko"),
- new Bindings<String>().put("a", "peter").put("b", "lop").put("c", "marko"));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() throws Exception {
- final Traversal<Vertex, String> traversal = get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
- printTraversalForm(traversal);
- assertEquals("lop", traversal.next());
- assertEquals("lop", traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test(expected = IllegalArgumentException.class)
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__b_0created_aX() {
- get_g_V_matchXa_created_b__b_0created_aX();
- }
-
- @Test(expected = IllegalArgumentException.class)
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_knows_b__c_knows_bX() {
- get_g_V_matchXa_knows_b__c_knows_bX();
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() throws Exception {
- final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
- printTraversalForm(traversal);
- assertResults(Function.identity(), traversal,
- new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"),
- new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"), // expected duplicate: two paths to this solution
- new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "marko"),
- new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "peter"));
- }
-
- /* TODO: this test requires Traversal.reverse()
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__c_created_bX_selectXnameX() throws Exception {
- final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Long> countMap = new HashMap<>();
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Map<String, String> bindings = traversal.next();
- // TODO: c is not being bound
- // assertEquals(3, bindings.size());
- assertEquals("lop", bindings.get("b"));
- MapHelper.incr(countMap, bindings.get("a") + ":" + bindings.get("c"), 1l);
- }
- // TODO: without 'c' binding, cant check results
- // assertEquals(Long.valueOf(1), countMap.get("marko:marko"));
- //assertEquals(Long.valueOf(1), countMap.get("marko:josh"));
- //assertEquals(Long.valueOf(1), countMap.get("marko:peter"));
- //assertEquals(Long.valueOf(1), countMap.get("josh:marko"));
- //assertEquals(Long.valueOf(1), countMap.get("josh:josh"));
- //assertEquals(Long.valueOf(1), countMap.get("josh:peter"));
- //assertEquals(Long.valueOf(1), countMap.get("peter:marko"));
- //assertEquals(Long.valueOf(1), countMap.get("peter:josh"));
- //assertEquals(Long.valueOf(1), countMap.get("peter:peter"));
- //assertEquals(countMap.size(), 9);
- //assertEquals(9, counter);
- assertFalse(traversal.hasNext());
- }
- */
-
- /* TODO: this test requires Traversal.reverse()
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() throws Exception {
- // TODO: Doesn't work, only bindings to 'a' in binding set.
- final Traversal<Vertex, String> traversal = get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final List<String> results = traversal.toList();
- assertEquals(2, results.size());
- assertTrue(results.contains("josh"));
- assertTrue(results.contains("vadas"));
- }
- */
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() throws Exception {
- Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CREAM PUFF WAR")),
- new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT")));
- }
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() throws Exception {
- Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Garcia"))
- .put("b", convertToVertex(graph, "I WANT TO TELL YOU"))
- .put("c", convertToVertex(graph, "STIR IT UP"))
- .put("d", convertToVertex(graph, "George_Harrison"))
- .put("e", convertToVertex(graph, "Bob_Marley")));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() throws Exception {
- Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
- assertResults(Function.identity(), traversal,
- new Bindings<String>().put("a", "marko").put("c", "josh"),
- new Bindings<String>().put("a", "marko").put("c", "peter"),
- new Bindings<String>().put("a", "josh").put("c", "marko"),
- new Bindings<String>().put("a", "josh").put("c", "peter"),
- new Bindings<String>().put("a", "peter").put("c", "marko"),
- new Bindings<String>().put("a", "peter").put("c", "josh"));
- }
-
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() throws Exception {
- final List<Traversal<Vertex, Map<String, Vertex>>> traversals = Arrays.asList(
- get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX(),
- get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX());
-
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- assertResults(vertexToStr, traversal,
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Garcia"))
- .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
- .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
- .put("d", convertToVertex(graph, "Garcia")),
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Garcia"))
- .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
- .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
- .put("d", convertToVertex(graph, "Garcia")),
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Garcia"))
- .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
- .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
- .put("d", convertToVertex(graph, "Garcia")),
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Garcia"))
- .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
- .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
- .put("d", convertToVertex(graph, "Garcia")),
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Grateful_Dead"))
- .put("b", convertToVertex(graph, "CANT COME DOWN"))
- .put("c", convertToVertex(graph, "DOWN SO LONG"))
- .put("d", convertToVertex(graph, "Garcia")),
- new Bindings<Vertex>()
- .put("a", convertToVertex(graph, "Grateful_Dead"))
- .put("b", convertToVertex(graph, "THE ONLY TIME IS NOW"))
- .put("c", convertToVertex(graph, "DOWN SO LONG"))
- .put("d", convertToVertex(graph, "Garcia")));
- });
- }
-
-
- /* TODO: is it necessary to implement each of these traversals three times?
- @Test
- @LoadGraphWith(MODERN)
- public void testTraversalUpdater() throws Exception {
- assertBranchFactor(
- 2.0,
- as("a").out("knows").as("b"),
- new SingleIterator<>(g.V(1)));
-
- assertBranchFactor(
- 0.0,
- as("a").out("foo").as("b"),
- new SingleIterator<>(g.V(1)));
-
- assertBranchFactor(
- 7.0,
- as("a").both().both().as("b"),
- new SingleIterator<>(g.V(1)));
-
- assertBranchFactor(
- 0.5,
- as("a").outV().has("name", "marko").as("b"),
- g.E());
- }
- */
-
- @Test
- @LoadGraphWith(MODERN)
- public void testOptimization() throws Exception {
- MatchStep<Object, Object> query;
- Iterator iter;
-
- query = new MatchStep<>(g.V().asAdmin(), "d",
- as("d").in("knows").as("a"),
- as("d").has("name", "vadas"),
- as("a").out("knows").as("b"),
- as("b").out("created").as("c"));
- iter = g.V();
- query.optimize();
- //System.out.println(query.summarize());
-
- // c costs nothing (no outgoing traversals)
- assertEquals(0.0, query.findCost("c"), 0);
- // b-created->c has a cost equal to its branch factor, 1.0
- // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
- assertEquals(1.0, query.findCost("b"), 0);
- // the cost of a-knows->b is its branch factor (1.0) plus the branch factor times the cost of b-created->c (1.0), so 2.0
- // a has only one outgoing traversal, a-knows->b, so its total cost is 2.0
- assertEquals(2.0, query.findCost("a"), 0);
- // the cost of d<-knows-a is its branch factor (1.0) plus the branch factor times the cost of a-knows->b (2.0), so 3.0
- // the cost of d->has(name,vadas) is its branch factor (1.0)
- // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
- // or 3.0 + 1.0*1.0 = 4.0
- assertEquals(4.0, query.findCost("d"), 0);
-
- // apply the query to the graph, gathering non-trivial branch factors
- assertResults(query.solveFor(iter),
- new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
- new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
- query.optimize();
- //System.out.println(query.summarize());
-
- // c still costs nothing (no outgoing traversals)
- assertEquals(0.0, query.findCost("c"), 0);
- // b-created->c still has a branch factor of 1.0, as we have put two items in (josh and vadas) and gotten two out (lop and ripple)
- // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
- /* TODO: adjust and restore
- assertEquals(1.0, query.findCost("b"), 0);
- // a-knows->b now has a branch factor of 2.0 -- we put in marko and got out josh and vadas
- // the cost of a-knows->b is its branch factor (2.0) plus the branch factor times the cost of b-created->c (1.0), so 4.0
- // a has only one outgoing traversal, a-knows->b, so its total cost is 4.0
- assertEquals(4.0, query.findCost("a"), 0);
- // d<-knows-a has a branch factor of 1/6 -- we put in all six vertices and got out marko
- // we get out marko only once, because d-name->"vadas" is tried first and rules out all but one "d"
- // the cost of d<-knows-a is its branch factor (1/6) plus the branch factor times the cost of a-knows->b (4.0), so 5/6
- // since we optimized to put the has step first (it immediately eliminates most vertices),
- // the cost of d->has(name,vadas) is 1/6 -- we put in all six vertices and got out one
- // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
- // or 1/6 + 1/6*5/6 = 11/36
- */
- }
-
- // TODO: uncomment when query cycles are supported
- /*
- @Test
- @LoadGraphWith(MODERN)
- public void testCyclicPatterns() throws Exception {
- MatchStep<Object, Object> query;
- Iterator iter;
-
- iter = g.V();
- query = new MatchStep<>(g.V(), "a",
- as("a").out("uses").as("b"),
- as("b").out("dependsOn").as("c"),
- as("c").in("created").as("a"));
-
- assertResults(query.solve(iter),
- new Bindings<>().put("a", "v[1]").put("b", "v[10]").put("c", "v[11]"));
- }
- */
-
- @Test
- public void testIteratorEnumerator() throws Exception {
- IteratorEnumerator<String> ie;
- final Map<String, String> map = new HashMap<>();
- BiConsumer<String, String> visitor = map::put;
-
- ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
- add("foo");
- add("bar");
- }}.iterator());
- assertEquals(0, ie.size());
- assertTrue(ie.visitSolution(0, visitor));
- assertEquals(1, ie.size());
- assertEquals(1, map.size());
- assertEquals("foo", map.get("a"));
- map.clear();
- assertTrue(ie.visitSolution(1, visitor));
- assertEquals(2, ie.size());
- assertEquals(1, map.size());
- assertEquals("bar", map.get("a"));
- map.clear();
- assertFalse(ie.visitSolution(2, visitor));
- assertEquals(2, ie.size());
- assertEquals(0, map.size());
- // revisit previous solutions at random
- assertTrue(ie.visitSolution(1, visitor));
- assertEquals(2, ie.size());
- assertEquals(1, map.size());
- assertEquals("bar", map.get("a"));
-
- // empty enumerator
- ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
- }}.iterator());
- map.clear();
- assertEquals(0, ie.size());
- assertFalse(ie.visitSolution(0, visitor));
- assertEquals(0, ie.size());
- assertEquals(0, map.size());
- }
-
- @Test
- public void testCrossJoin() throws Exception {
- String[] a1 = new String[]{"a", "b", "c"};
- String[] a2 = new String[]{"1", "2", "3", "4"};
- String[] a3 = new String[]{"@", "#"};
-
- Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
- Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
- Enumerator<String> e3 = new IteratorEnumerator<>("punc", Arrays.asList(a3).iterator());
-
- Enumerator<String> e1e2 = new CrossJoinEnumerator<>(e1, e2);
- Enumerator<String> e2e1 = new CrossJoinEnumerator<>(e2, e1);
- BiConsumer<String, String> visitor = (name, value) -> {
- System.out.println("\t" + name + ":\t" + value);
- };
- Enumerator<String> e1e2e3 = new CrossJoinEnumerator<>(e1e2, e3);
-
- Enumerator<String> result;
-
- result = e1e2;
- assertEquals(12, exhaust(result));
- assertEquals(12, result.size());
-
- result = e2e1;
- assertEquals(12, exhaust(result));
- assertEquals(12, result.size());
-
- result = e1e2e3;
- assertEquals(24, exhaust(result));
- assertEquals(24, result.size());
-
- /*
- int i = 0;
- while (result.visitSolution(i, visitor)) {
- System.out.println("solution #" + (i + 1) + "^^");
- i++;
- }
- */
- }
-
- /* TODO: uncomment when optimized cross-joins are available
- @Test
- public void testCrossJoinLaziness() throws Exception {
- List<Integer> value = new LinkedList<>();
- for (int j = 0; j < 1000; j++) {
- value.add(j);
- }
-
- int base = 3;
- List<Enumerator<Integer>> enums = new LinkedList<>();
- for (int k = 0; k < base; k++) {
- List<Integer> lNew = new LinkedList<>();
- lNew.addAll(value);
- Enumerator<Integer> ek = new IteratorEnumerator<>("" + (char) ('a' + k), lNew.iterator());
- enums.add(ek);
- }
-
- Enumerator<Integer> e = new NewCrossJoinEnumerator<>(enums);
-
- // we now have an enumerator of 5^3^10 elements
- EnumeratorIterator<Integer> iter = new EnumeratorIterator<>(e);
-
- int count = 0;
- // each binding set is unique
- Set<String> values = new HashSet<>();
- String s;
- s = iter.next().toString();
- values.add(s);
- assertEquals(++count, values.size());
- // begin at the head of all iterators
- assertEquals("{a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0}", s);
- int lim0 = (int) Math.pow(1, base);
- // first 2^10 results are binary (0's and 1's)
- int lim1 = (int) Math.pow(2, base);
- for (int i = lim0; i < lim1; i++) {
- s = iter.next().toString();
- System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
- assertTrue(s.contains("1"));
- assertFalse(s.contains("2"));
- values.add(s);
- assertEquals(++count, values.size());
- }
- int lim2 = (int) Math.pow(3, base);
- for (int i = lim1; i < lim2; i++) {
- s = iter.next().toString();
- System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
-
- if (!s.contains("2")) {
- findMissing(null, 0, base, "abcdefghij".getBytes(), values);
- }
-
-
- assertTrue(s.contains("2"));
- assertFalse(s.contains("3"));
- values.add(s);
- assertEquals(++count, values.size());
- }
- }
- */
-
- @Test
- public void testInnerJoin() throws Exception {
- String[] a1 = new String[]{"a", "b", "c"};
- String[] a2 = new String[]{"1", "2", "3", "4"};
- String[] a3 = new String[]{"2", "4", "6", "8", "10"};
-
- Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
- Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
- Enumerator<String> e3 = new IteratorEnumerator<>("number", Arrays.asList(a3).iterator());
-
- Enumerator<String> e4 = new CrossJoinEnumerator<>(e1, e3);
- Enumerator<String> e5 = new CrossJoinEnumerator<>(e2, e4);
-
- // without AND semantics, we have all 60 combinations, including two "number" bindings per solution
- exhaust(e5);
- assertEquals(60, e5.size());
-
- // with AND semantics, we have only those six solutions for which a2 and a3 align
- Enumerator<String> join = new InnerJoinEnumerator<>(e5, new HashSet<String>() {{
- add("number");
- }});
- exhaust(join);
- assertEquals(6, join.size());
-
- assertResults(join,
- new Bindings<String>().put("letter", "a").put("number", "2"),
- new Bindings<String>().put("letter", "a").put("number", "4"),
- new Bindings<String>().put("letter", "b").put("number", "2"),
- new Bindings<String>().put("letter", "b").put("number", "4"),
- new Bindings<String>().put("letter", "c").put("number", "2"),
- new Bindings<String>().put("letter", "c").put("number", "4"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends MatchTest {
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
- return g.V().match("a", as("a").out().as("b"));
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
- return g.V().match("a", as("a").out().as("b")).select("b").by(T.id);
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
- return g.V().match("a",
- as("a").out("knows").as("b"),
- as("b").out("created").as("c"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
- return g.V().match("a",
- as("a").out("knows").as("b"),
- as("a").out("created").as("c"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
- return g.V().match("d",
- as("d").in("knows").as("a"),
- as("d").has("name", "vadas"),
- as("a").out("knows").as("b"),
- as("b").out("created").as("c"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
- return g.V().match("a",
- as("a").out("created").as("b"),
- __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select("a", "b").by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
- return g.V().match("a",
- as("a").out("created").has("name", "lop").as("b"),
- as("b").in("created").has("age", 29).as("c"),
- __.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
- return g.V().match("a",
- as("a").out("created").has("name", "lop").as("b"),
- as("b").in("created").has("age", 29).as("c"))
- .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
- return g.V().out().out().match("a",
- as("a").in("created").as("b"),
- as("b").in("knows").as("c")).select("c").out("created").values("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
- return g.V().match("a",
- as("a").out("created").as("b"),
- as("b").in("created").as("a"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
- return g.V().match("a", as("a").out("knows").as("b"),
- as("c").out("knows").as("b"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
- return g.V().match("a",
- as("a").out("knows").as("b"),
- as("b").out("created").has("name", "lop"),
- as("b").match("a1",
- as("a1").out("created").as("b1"),
- as("b1").in("created").as("c1")).select("c1").as("c")).<String>select().by("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
- return g.V().match("a",
- as("a").has("name", "Garcia"),
- as("a").in("writtenBy").as("b"),
- as("a").in("sungBy").as("b"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
- return g.V().match("a",
- as("a").in("sungBy").as("b"),
- as("a").in("sungBy").as("c"),
- as("b").out("writtenBy").as("d"),
- as("c").out("writtenBy").as("e"),
- as("d").has("name", "George_Harrison"),
- as("e").has("name", "Bob_Marley"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
- return g.V().match("a",
- as("a").in("sungBy").as("b"),
- as("a").in("writtenBy").as("c"),
- as("b").out("writtenBy").as("d"),
- as("c").out("sungBy").as("d"),
- as("d").has("name", "Garcia"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
- return g.V().match("a",
- as("a").in("sungBy").as("b"),
- as("a").in("writtenBy").as("c"),
- as("b").out("writtenBy").as("d"))
- .where(as("c").out("sungBy").as("d"))
- .where(as("d").has("name", "Garcia"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
- return g.V().match("a",
- as("a").out("created").as("b"),
- as("b").in("created").as("c"))
- .where("a", Compare.neq, "c")
- .<String>select("a", "c").by("name");
- }
-
- /*@Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
- return g.V().match("a",
- as("a").out("created").as("b"),
- as("c").out("created").as("b")).select(v -> ((Vertex) v).value("name"));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
- return g.V().out().out().match("a",
- as("b").out("created").as("a"),
- as("c").out("knows").as("b")).select("c").out("knows").value("name");
- }*/
-
- }
-
- private static final Function<Vertex, String> vertexToStr = v -> v.id().toString();
-
- private <S, E> void assertResults(final Function<E, String> toStringFunction,
- final Traversal<S, Map<String, E>> actual,
- final Bindings<E>... expected) {
- Comparator<Bindings<E>> comp = new Bindings.BindingsComparator<>(toStringFunction);
-
- List<Bindings<E>> actualList = toBindings(actual);
- List<Bindings<E>> expectedList = new LinkedList<>();
- Collections.addAll(expectedList, expected);
-
- if (expectedList.size() > actualList.size()) {
- fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
- } else if (actualList.size() > expectedList.size()) {
- fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
- }
-
- Collections.sort(actualList, comp);
- Collections.sort(expectedList, comp);
-
- for (int j = 0; j < actualList.size(); j++) {
- Bindings<E> a = actualList.get(j);
- Bindings<E> e = expectedList.get(j);
-
- if (0 != comp.compare(a, e)) {
- fail("unexpected result(s), including " + a);
- }
- }
- assertFalse(actual.hasNext());
- }
-
- private static final Function<Object, String> simpleToStringFunction = Object::toString;
-
- private <T> void assertResults(final Enumerator<T> actual,
- final Bindings<T>... expected) {
- Comparator<Bindings<T>> comp = new Bindings.BindingsComparator<>((Function<T, String>) simpleToStringFunction);
-
- List<Bindings<T>> actualList = toBindings(actual);
- List<Bindings<T>> expectedList = new LinkedList<>();
- Collections.addAll(expectedList, expected);
-
- Collections.sort(actualList, comp);
- Collections.sort(expectedList, comp);
-
- for (int j = 0; j < actualList.size(); j++) {
- if (j == expectedList.size()) {
- fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
- }
-
- Bindings<T> a = actualList.get(j);
- Bindings<T> e = expectedList.get(j);
-
- if (0 != comp.compare(a, e)) {
- fail("unexpected result(s), including " + a);
- }
- }
- if (expectedList.size() > actualList.size()) {
- fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
- }
- }
-
- private <S, E> List<Bindings<E>> toBindings(final Traversal<S, Map<String, E>> traversal) {
- List<Bindings<E>> result = new LinkedList<>();
- traversal.forEachRemaining(o -> {
- result.add(new Bindings<>(o));
- });
- return result;
- }
-
- private <T> List<Bindings<T>> toBindings(final Enumerator<T> enumerator) {
- List<Bindings<T>> bindingsList = new LinkedList<>();
- int i = 0;
- bindingsList.add(new Bindings<>());
- while (enumerator.visitSolution(i++, (name, value) -> {
- bindingsList.get(bindingsList.size() - 1).put(name, value);
- })) {
- bindingsList.add(new Bindings<>());
- }
- bindingsList.remove(bindingsList.size() - 1);
-
- return bindingsList;
- }
-
- private void assertBranchFactor(final double branchFactor,
- final Traversal t,
- final Iterator inputs) {
- Traverser start = new B_O_PA_S_SE_SL_Traverser(null, null);
- MatchStep.TraversalWrapper w = new MatchStep.TraversalWrapper(t, "a", "b");
- MatchStep.TraversalUpdater updater = new MatchStep.TraversalUpdater<>(w, inputs, start, "x");
- while (updater.hasNext()) {
- updater.next();
- }
- assertEquals(branchFactor, w.findBranchFactor(), 0);
- }
-
- private <T> int exhaust(Enumerator<T> enumerator) {
- BiConsumer<String, T> visitor = (s, t) -> {
- };
- int i = 0;
- while (enumerator.visitSolution(i, visitor)) i++;
- return i;
- }
-
- private void findMissing(String s, final int i, final int n, final byte[] names, final Set<String> actual) {
- if (0 == i) {
- s = "{";
- } else {
- s += ", ";
- }
-
- s += (char) names[i];
- s += "=";
- String tmp = s;
- for (int j = 0; j < 3; j++) {
- s += j;
-
- if (n - 1 == i) {
- s += "}";
- if (!actual.contains(s)) {
- fail("not in set: " + s);
- }
- } else {
- findMissing(s, i + 1, n, names, actual);
- }
-
- s = tmp;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
deleted file mode 100644
index 6db12d2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
+++ /dev/null
@@ -1,93 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MaxTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Integer> get_g_V_age_max();
-
- public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max();
-
- public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_age_max() {
- final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
- get_g_V_age_max(),
- get_g_V_repeatXbothX_timesX5X_age_max());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList(35), traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmaxXlocalXX() {
- final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Number> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(1.0, map.get("ripple"));
- assertEquals(0.4, map.get("lop"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends MaxTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_max() {
- return g.V().values("age").max();
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
- return g.V().repeat(both()).times(5).values("age").max();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
- return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(max(Scope.local));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
deleted file mode 100644
index 6cfb94f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
+++ /dev/null
@@ -1,88 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.mean;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MeanTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Double> get_g_V_age_mean();
-
- public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_age_mean() {
- final List<Traversal<Vertex, Double>> traversals = Arrays.asList(get_g_V_age_mean());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Double mean = traversal.next();
- assertEquals(30.75, mean, 0.05);
- assertFalse(traversal.hasNext());
-
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmeanXlocalXX() {
- final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Number> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(1.0, map.get("ripple"));
- assertEquals(1.0 / 3, map.get("lop"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends MeanTest {
-
- @Override
- public Traversal<Vertex, Double> get_g_V_age_mean() {
- return g.V().values("age").mean();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
- return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(mean(Scope.local));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
deleted file mode 100644
index 7dae819..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
+++ /dev/null
@@ -1,93 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MinTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Integer> get_g_V_age_min();
-
- public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min();
-
- public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_age_min() {
- final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
- get_g_V_age_min(),
- get_g_V_repeatXbothX_timesX5X_age_min());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList(27), traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXminXlocalXX() {
- final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Number> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(1.0, map.get("ripple"));
- assertEquals(0.2, map.get("lop"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends MinTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_min() {
- return g.V().values("age").min();
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
- return g.V().repeat(both()).times(5).values("age").min();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
- return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(min(Scope.local));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
deleted file mode 100644
index d142d18..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
+++ /dev/null
@@ -1,288 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class OrderTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_name_order();
-
- public abstract Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X();
-
- public abstract Traversal<Vertex, String> get_g_V_order_byXname_incrX_name();
-
- public abstract Traversal<Vertex, String> get_g_V_order_byXnameX_name();
-
- public abstract Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight();
-
- public abstract Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
-
- public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
-
- public abstract Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_name_order() {
-
- final Traversal<Vertex, String> traversal = get_g_V_name_order();
- printTraversalForm(traversal);
- final List<String> names = traversal.toList();
- assertEquals(names.size(), 6);
- assertEquals("josh", names.get(0));
- assertEquals("lop", names.get(1));
- assertEquals("marko", names.get(2));
- assertEquals("peter", names.get(3));
- assertEquals("ripple", names.get(4));
- assertEquals("vadas", names.get(5));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
- final Traversal<Vertex, String> traversal = get_g_V_name_order_byXa1_b1X_byXb2_a2X();
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(names.size(), 6);
- assertEquals("marko", names.get(0));
- assertEquals("vadas", names.get(1));
- assertEquals("peter", names.get(2));
- assertEquals("ripple", names.get(3));
- assertEquals("josh", names.get(4));
- assertEquals("lop", names.get(5));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_order_byXname_incrX_name() {
- Arrays.asList(get_g_V_order_byXname_incrX_name(), get_g_V_order_byXnameX_name()).forEach(traversal -> {
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(names.size(), 6);
- assertEquals("josh", names.get(0));
- assertEquals("lop", names.get(1));
- assertEquals("marko", names.get(2));
- assertEquals("peter", names.get(3));
- assertEquals("ripple", names.get(4));
- assertEquals("vadas", names.get(5));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_outE_order_byXweight_decrX_weight() {
- final Traversal<Vertex, Double> traversal = get_g_V_outE_order_byXweight_decrX_weight();
- printTraversalForm(traversal);
- final List<Double> weights = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(6, weights.size());
- assertEquals(Double.valueOf(1.0d), weights.get(0));
- assertEquals(Double.valueOf(1.0d), weights.get(1));
- assertEquals(Double.valueOf(0.5d), weights.get(2));
- assertEquals(Double.valueOf(0.4d), weights.get(3));
- assertEquals(Double.valueOf(0.4d), weights.get(4));
- assertEquals(Double.valueOf(0.2d), weights.get(5));
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
- final Traversal<Vertex, String> traversal = get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(names.size(), 6);
- assertEquals("marko", names.get(0));
- assertEquals("vadas", names.get(1));
- assertEquals("peter", names.get(2));
- assertEquals("ripple", names.get(3));
- assertEquals("josh", names.get(4));
- assertEquals("lop", names.get(5));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
- final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
- printTraversalForm(traversal);
- int counter = 0;
- int markoCounter = 0;
- int joshCounter = 0;
- int peterCounter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Vertex> bindings = traversal.next();
- assertEquals(2, bindings.size());
- if (bindings.get("a").id().equals(convertToVertexId("marko"))) {
- assertEquals(convertToVertexId("lop"), bindings.get("b").id());
- markoCounter++;
- } else if (bindings.get("a").id().equals(convertToVertexId("josh"))) {
- assertTrue((bindings.get("b")).id().equals(convertToVertexId("lop")) || bindings.get("b").id().equals(convertToVertexId("ripple")));
- joshCounter++;
- } else if (bindings.get("a").id().equals(convertToVertexId("peter"))) {
- assertEquals(convertToVertexId("lop"), bindings.get("b").id());
- peterCounter++;
- } else {
- fail("This state should not have been reachable");
- }
-
-
- }
- assertEquals(4, markoCounter + joshCounter + peterCounter);
- assertEquals(1, markoCounter);
- assertEquals(1, peterCounter);
- assertEquals(2, joshCounter);
- assertEquals(4, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX() {
- final Traversal<Vertex, Map<Integer, Integer>> traversal = get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final Map<Integer, Integer> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(4, map.size());
- final Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
- Map.Entry<Integer, Integer> entry = iterator.next();
- assertEquals(3, entry.getKey().intValue());
- assertEquals(87, entry.getValue().intValue());
- entry = iterator.next();
- assertEquals(2, entry.getKey().intValue());
- assertEquals(58, entry.getValue().intValue());
- entry = iterator.next();
- assertEquals(1, entry.getKey().intValue());
- assertEquals(29, entry.getValue().intValue());
- entry = iterator.next();
- assertEquals(4, entry.getKey().intValue());
- assertEquals(29, entry.getValue().intValue());
- assertFalse(iterator.hasNext());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_order_byXoutE_count__decrX() {
- Arrays.asList(get_g_V_order_byXoutE_count__decrX()).forEach(traversal -> {
- printTraversalForm(traversal);
- final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(vertices.size(), 6);
- assertEquals("marko", vertices.get(0).value("name"));
- assertEquals("josh", vertices.get(1).value("name"));
- assertEquals("peter", vertices.get(2).value("name"));
- assertTrue(vertices.get(3).value("name").equals("vadas") || vertices.get(3).value("name").equals("ripple") || vertices.get(3).value("name").equals("lop"));
- assertTrue(vertices.get(4).value("name").equals("vadas") || vertices.get(4).value("name").equals("ripple") || vertices.get(4).value("name").equals("lop"));
- assertTrue(vertices.get(5).value("name").equals("vadas") || vertices.get(5).value("name").equals("ripple") || vertices.get(5).value("name").equals("lop"));
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends OrderTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order() {
- return g.V().<String>values("name").order();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
- return g.V().<String>values("name").order().by((a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).by((a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3)));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
- return g.V().order().by("name", Order.incr).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
- return g.V().order().by("name", Order.incr).values("name");
- }
-
- @Override
- public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
- return g.V().outE().order().by("weight", Order.decr).values("weight");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
- return g.V().order().
- <String>by("name", (a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).
- <String>by("name", (a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3))).values("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
- return g.V().as("a").out("created").as("b").order().by(Order.shuffle).select();
- }
-
- @Override
- public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id) {
- return g.V(v1Id).map(v -> {
- final Map<Integer, Integer> map = new HashMap<>();
- map.put(1, (int) v.get().value("age"));
- map.put(2, (int) v.get().value("age") * 2);
- map.put(3, (int) v.get().value("age") * 3);
- map.put(4, (int) v.get().value("age"));
- return map;
- }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
- return g.V().order().by(outE().count(), Order.decr);
- }
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
deleted file mode 100644
index 3637689..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
+++ /dev/null
@@ -1,165 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class PathTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id);
-
- public abstract Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
-
- public abstract Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX();
-
- public abstract Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_name_path() {
- final Traversal<Vertex, Path> traversal = get_g_VX1X_name_path(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final Path path = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, path.size());
- assertEquals(convertToVertexId("marko"), ((Vertex) path.get(0)).<String>id());
- assertEquals("marko", path.<String>get(1));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_path_byXageX_byXnameX() {
- final Traversal<Vertex, Path> traversal = get_g_VX1X_out_path_byXageX_byXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- final Set<String> names = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- final Path path = traversal.next();
- assertEquals(Integer.valueOf(29), path.<Integer>get(0));
- assertTrue(path.get(1).equals("josh") || path.get(1).equals("vadas") || path.get(1).equals("lop"));
- names.add(path.get(1));
- }
- assertEquals(3, counter);
- assertEquals(3, names.size());
- }
-
- @Test
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @LoadGraphWith(MODERN)
- public void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
- final Traversal<Vertex, Path> traversal = get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Path path = traversal.next();
- assertEquals(3, path.size());
- assertEquals("marko", ((Vertex) path.get(0)).<String>value("name"));
- assertEquals("josh", path.<String>get(1));
- assertEquals("java", path.<String>get(2));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @LoadGraphWith(MODERN)
- public void g_V_out_out_path_byXnameX_byXageX() {
- final Traversal<Vertex, Path> traversal = get_g_V_out_out_path_byXnameX_byXageX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Path path = traversal.next();
- assertEquals(3, path.size());
- assertEquals("marko", path.<String>get(0));
- assertEquals(Integer.valueOf(32), path.<Integer>get(1));
- assertTrue(path.get(2).equals("lop") || path.get(2).equals("ripple"));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
- final Traversal<Vertex, Path> traversal = get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
- printTraversalForm(traversal);
- final Path path = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(1, path.size());
- assertTrue(path.hasLabel("a"));
- assertTrue(path.hasLabel("b"));
- assertTrue(path.hasLabel("c"));
- assertEquals(1, path.labels().size());
- assertEquals(3, path.labels().get(0).size());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends PathTest {
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
- return g.V(v1Id).values("name").path();
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
- return g.V(v1Id).out().path().by("age").by("name");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
- return g.V().repeat(out()).times(2).path().by().by("name").by("lang");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
- return g.V().out().out().path().by("name").by("age");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
- return g.V().as("a").has("name", "marko").as("b").has("age", 29).as("c").path();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
deleted file mode 100644
index d6cf31c..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
+++ /dev/null
@@ -1,65 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class PropertiesTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value();
-
- public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXageX_propertiesXname_ageX_value() {
- Arrays.asList(get_g_V_hasXageX_propertiesXage_nameX_value(), get_g_V_hasXageX_propertiesXname_ageX_value()).forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", 29, "vadas", 27, "josh", 32, "peter", 35), traversal);
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends PropertiesTest {
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
- return g.V().has("age").properties("name", "age").value();
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
- return g.V().has("age").properties("age", "name").value();
- }
- }
-}
-
[39/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
deleted file mode 100644
index 95bb3fc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
+++ /dev/null
@@ -1,225 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.io.Serializable;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalSideEffects extends Cloneable, Serializable {
-
- public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
-
- /**
- * Determines if the {@link TraversalSideEffects} contains the respective key.
- * If the key references a stored {@link java.util.function.Supplier}, then it should return true as it will be dynamically created on get().
- *
- * @param key the key to check for
- * @return whether the key exists in the sideEffects
- */
- public default boolean exists(final String key) {
- return this.keys().contains(key);
- }
-
- /**
- * Set the specified key to the specified value.
- * If a {@link java.util.function.Supplier} is provided, it is NOT assumed to be a supplier as set by registerSupplier().
- *
- * @param key the key
- * @param value the value
- */
- public void set(final String key, final Object value);
-
- /**
- * Get the sideEffect associated with the provided key.
- * If the sideEffect contains an object for the key, return it.
- * Else if the sideEffect has a registered {@link java.util.function.Supplier} for that key, generate the object, store the object in the sideEffects, and return it.
- *
- * @param key the key to get the value for
- * @param <V> the type of the value to retrieve
- * @return the value associated with key
- * @throws IllegalArgumentException if the key does not reference an object or a registered supplier.
- */
- public <V> V get(final String key) throws IllegalArgumentException;
-
- /**
- * Return the value associated with the key or return the provided otherValue.
- * The otherValue will not be stored in the sideEffect.
- *
- * @param key the key to get the value for
- * @param otherValue if not value is associated with key, return the other value.
- * @param <V> the type of the value to get
- * @return the value associated with the key or the otherValue
- */
- public default <V> V orElse(final String key, final V otherValue) {
- return this.exists(key) ? this.get(key) : otherValue;
- }
-
- /**
- * If a value or registered {@link java.util.function.Supplier} exists for the provided key, consume it with the provided consumer.
- *
- * @param key the key to the value
- * @param consumer the consumer to process the value
- * @param <V> the type of the value to consume
- */
- public default <V> void ifPresent(final String key, final Consumer<V> consumer) {
- if (this.exists(key)) consumer.accept(this.get(key));
- }
-
- /**
- * Remove both the value and registered {@link java.util.function.Supplier} associated with provided key.
- *
- * @param key the key of the value and registered supplier to remove
- */
- public void remove(final String key);
-
- /**
- * The keys of the sideEffect which includes registered {@link java.util.function.Supplier} keys.
- * In essence, that which is possible to get().
- *
- * @return the keys of the sideEffect
- */
- public Set<String> keys();
-
- ////////////
-
- /**
- * Register a {@link java.util.function.Supplier} with the provided key.
- * When sideEffects get() are called, if no object exists and there exists a registered supplier for the key, the object is generated.
- * Registered suppliers are used for the lazy generation of sideEffect data.
- *
- * @param key the key to register the supplier with
- * @param supplier the supplier that will generate an object when get() is called if it hasn't already been created
- */
- public void registerSupplier(final String key, final Supplier supplier);
-
- /**
- * Get the registered {@link java.util.function.Supplier} associated with the specified key.
- *
- * @param key the key associated with the supplier
- * @param <V> The object type of the supplier
- * @return A non-empty optional if the supplier exists
- */
- public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key);
-
- /**
- * A helper method to register a {@link java.util.function.Supplier} if it has not already been registered.
- *
- * @param key the key of the supplier to register
- * @param supplier the supplier to register if the key has not already been registered
- */
- public default void registerSupplierIfAbsent(final String key, final Supplier supplier) {
- if (!this.getRegisteredSupplier(key).isPresent())
- this.registerSupplier(key, supplier);
- }
-
- public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator);
-
- public <S> Optional<Supplier<S>> getSackInitialValue();
-
- public <S> Optional<UnaryOperator<S>> getSackSplitOperator();
-
- /**
- * If the sideEffect contains an object associated with the key, return it.
- * Else if a "with" supplier exists for the key, generate the object, store it in the sideEffects and return the object.
- * Else use the provided supplier to generate the object, store it in the sideEffects and return the object.
- * Note that if the orCreate supplier is used, it is NOT registered as a {@link java.util.function.Supplier}.
- *
- * @param key the key of the object to get
- * @param orCreate if the object doesn't exist as an object or suppliable object, then generate it with the specified supplier
- * @param <V> the return type of the object
- * @return the object that is either retrieved, generated, or supplier via orCreate
- */
- public default <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
- if (this.exists(key))
- return this.<V>get(key);
- final Optional<Supplier<V>> with = this.getRegisteredSupplier(key);
- if (with.isPresent()) {
- final V v = with.get().get();
- this.set(key, v);
- return v;
- } else {
- final V v = orCreate.get();
- this.set(key, v);
- return v;
- }
- }
-
- ////////////
-
- public default <V> void forEach(final BiConsumer<String, V> biConsumer) {
- this.keys().forEach(key -> biConsumer.accept(key, this.get(key)));
- }
-
- /**
- * In a distributed {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer} traversal, the sideEffects of the traversal are not a single object within a single JVM.
- * Instead, the sideEffects are distributed across the graph and the pieces are stored on the computing vertices.
- * This method is necessary to call when the {@link org.apache.tinkerpop.gremlin.process.Traversal} is processing the {@link org.apache.tinkerpop.gremlin.process.Traverser}s at a particular {@link org.apache.tinkerpop.gremlin.structure.Vertex}.
- *
- * @param vertex the vertex where the traversal is currently executing.
- */
- public void setLocalVertex(final Vertex vertex);
-
- /**
- * Cloning is used to duplicate the sideEffects typically in OLAP environments.
- *
- * @return The cloned sideEffects
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public TraversalSideEffects clone();
-
- /**
- * Add the current {@link TraversalSideEffects} data and suppliers to the provided {@link TraversalSideEffects}.
- *
- * @param sideEffects the sideEffects to add this traversal's sideEffect data to.
- */
- public void mergeInto(final TraversalSideEffects sideEffects);
-
- public static class Exceptions {
-
- public static IllegalArgumentException sideEffectKeyCanNotBeEmpty() {
- return new IllegalArgumentException("Side effect key can not be the empty string");
- }
-
- public static IllegalArgumentException sideEffectKeyCanNotBeNull() {
- return new IllegalArgumentException("Side effect key can not be null");
- }
-
- public static IllegalArgumentException sideEffectValueCanNotBeNull() {
- return new IllegalArgumentException("Side effect value can not be null");
- }
-
- public static IllegalArgumentException sideEffectDoesNotExist(final String key) {
- return new IllegalArgumentException("Side effects do not have a value for provided key: " + key);
- }
-
- public static UnsupportedOperationException dataTypeOfSideEffectValueNotSupported(final Object val) {
- return new UnsupportedOperationException(String.format("Side effect value [%s] is of type %s is not supported", val, val.getClass()));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
deleted file mode 100644
index 49ba077..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
+++ /dev/null
@@ -1,48 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalSource {
-
- public TraversalSource.Builder asBuilder();
-
- public Optional<GraphComputer> getGraphComputer();
-
- public Optional<Graph> getGraph();
-
- ////////////////
-
- public interface Builder<C extends TraversalSource> extends Serializable {
-
- public Builder engine(final TraversalEngine.Builder engine);
-
- public Builder strategy(final TraversalStrategy strategy);
-
- public C create(final Graph graph);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
deleted file mode 100644
index 91f57a5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
+++ /dev/null
@@ -1,195 +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;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ComparatorHolderRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ConjunctionStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.DedupOptimizerStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.EngineDependentStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.IdentityRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.LabeledEndStepStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.MatchWhereStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ProfileStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.tools.MultiMap;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Matthias Broecheler (me@matthiasb.com)
- */
-public interface TraversalStrategies extends Serializable, Cloneable {
-
- /**
- * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
- */
- public List<TraversalStrategy> toList();
-
- /**
- * 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.
- *
- * @param traversal the traversal to apply the strategies to
- * @param engine the engine that the traversal is going to be executed on
- */
- public void applyStrategies(final Traversal.Admin<?, ?> traversal);
-
- /**
- * Add all the provided {@link TraversalStrategy} instances to the current collection.
- * When all the provided strategies have been added, the collection is resorted.
- *
- * @param strategies the traversal strategies to add
- * @return the newly updated/sorted traversal strategies collection
- */
- public TraversalStrategies addStrategies(final TraversalStrategy... strategies);
-
- /**
- * Remove all the provided {@link TraversalStrategy} classes from the current collection.
- * When all the provided strategies have been removed, the collection is resorted.
- *
- * @param strategyClasses the traversal strategies to remove by their class
- * @return the newly updated/sorted traversal strategies collection
- */
- @SuppressWarnings("unchecked")
- public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses);
-
- /**
- * {@inheritDoc}
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public TraversalStrategies clone();
-
- /**
- * Get the {@link TraverserGeneratorFactory} to use to generate traversers.
- */
- public TraverserGeneratorFactory getTraverserGeneratorFactory();
-
- /**
- * Set the {@link TraverserGeneratorFactory} to use for determining which {@link Traverser} type to generate for the {@link Traversal}.
- *
- * @param traverserGeneratorFactory the factory to use
- */
- public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory);
-
- /**
- * Sorts the list of provided strategies such that the {@link org.apache.tinkerpop.gremlin.process.TraversalStrategy#applyPost()}
- * and {@link TraversalStrategy#applyPrior()} dependencies are respected.
- * <p/>
- * Note, that the order may not be unique.
- *
- * @param strategies the traversal strategies to sort
- */
- public static void sortStrategies(final List<? extends TraversalStrategy> strategies) {
- final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap = new HashMap<>();
- final Set<Class<? extends TraversalStrategy>> strategyClass = new HashSet<>(strategies.size());
- //Initialize data structure
- strategies.forEach(s -> strategyClass.add(s.getClass()));
-
- //Initialize all the dependencies
- strategies.forEach(strategy -> {
- strategy.applyPrior().forEach(s -> {
- if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
- });
- strategy.applyPost().forEach(s -> {
- if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
- });
- });
- //Now, compute transitive closure until convergence
- boolean updated;
- do {
- updated = false;
- for (final Class<? extends TraversalStrategy> sc : strategyClass) {
- List<Class<? extends TraversalStrategy>> toAdd = null;
- for (Class<? extends TraversalStrategy> before : MultiMap.get(dependencyMap, sc)) {
- final Set<Class<? extends TraversalStrategy>> beforeDep = MultiMap.get(dependencyMap, before);
- if (!beforeDep.isEmpty()) {
- if (toAdd == null) toAdd = new ArrayList<>(beforeDep.size());
- toAdd.addAll(beforeDep);
- }
- }
- if (toAdd != null && MultiMap.putAll(dependencyMap, sc, toAdd)) updated = true;
- }
- } while (updated);
- Collections.sort(strategies, new Comparator<TraversalStrategy>() {
- @Override
- public int compare(final TraversalStrategy s1, final TraversalStrategy s2) {
- boolean s1Before = MultiMap.containsEntry(dependencyMap, s1.getClass(), s2.getClass());
- boolean s2Before = MultiMap.containsEntry(dependencyMap, s2.getClass(), s1.getClass());
- if (s1Before && s2Before)
- throw new IllegalStateException("Cyclic dependency between traversal strategies: ["
- + s1.getClass().getName() + ", " + s2.getClass().getName() + ']');
- if (s1Before) return -1;
- else if (s2Before) return 1;
- else return 0;
- }
- });
- }
-
- public static final class GlobalCache {
-
- private static final Map<Class<? extends Graph>, TraversalStrategies> CACHE = new HashMap<>();
-
- static {
- final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
- coreStrategies.addStrategies(
- DedupOptimizerStrategy.instance(),
- RangeByIsCountStrategy.instance(),
- IdentityRemovalStrategy.instance(),
- MatchWhereStrategy.instance(),
- ComparatorHolderRemovalStrategy.instance(),
- LabeledEndStepStrategy.instance(),
- EngineDependentStrategy.instance(),
- ProfileStrategy.instance(),
- TraversalVerificationStrategy.instance(),
- ConjunctionStrategy.instance());
- CACHE.put(Graph.class, coreStrategies.clone());
- CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
- }
-
- public static void registerStrategies(final Class<? extends Graph> graphClass, final TraversalStrategies traversalStrategies) {
- CACHE.put(graphClass, traversalStrategies);
- }
-
- public static TraversalStrategies getStrategies(final Class<? extends Graph> graphClass) {
- final TraversalStrategies traversalStrategies = CACHE.get(graphClass);
- if (null == traversalStrategies) {
- if (EmptyGraph.class.isAssignableFrom(graphClass))
- return CACHE.get(EmptyGraph.class);
- else return CACHE.get(Graph.class);
- }
- return traversalStrategies;
- }
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
deleted file mode 100644
index 33658b5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
+++ /dev/null
@@ -1,50 +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;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * A {@link TraversalStrategy} defines a particular atomic operation for mutating a {@link Traversal} prior to its evaluation.
- * Traversal strategies are typically used for optimizing a traversal for the particular underlying graph engine.
- * A TraversalStrategy should not have a public constructor as they should not maintain state between applications.
- * Make use of a singleton instance() object to reduce object creation on the JVM.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Matthias Broecheler (me@matthiasb.com)
- */
-public interface TraversalStrategy extends Serializable {
-
- // A TraversalStrategy should not have a public constructor
- // Make use of a singleton instance() object to reduce object creation on the JVM
- // Moreover they are stateless objects.
-
- public void apply(final Traversal.Admin<?, ?> traversal);
-
- public default Set<Class<? extends TraversalStrategy>> applyPrior() {
- return Collections.emptySet();
- }
-
- public default Set<Class<? extends TraversalStrategy>> applyPost() {
- return Collections.emptySet();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
deleted file mode 100644
index c9fca71..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
+++ /dev/null
@@ -1,280 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
-
-import java.io.Serializable;
-
-/**
- * A {@link Traverser} represents the current state of an object flowing through a {@link Traversal}.
- * A traverser maintains a reference to the current object, a traverser-local "sack", a traversal-global sideEffect, a bulk count, and a path history.
- * <p/>
- * Different types of traverser can exist depending on the semantics of the traversal and the desire for
- * space/time optimizations of the developer.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cloneable {
-
- /**
- * Get the object that the traverser is current at.
- *
- * @return The current object of the traverser
- */
- public T get();
-
- /**
- * Get the sack local sack object of this traverser.
- *
- * @param <S> the type of the sack object
- * @return the sack object
- */
- public <S> S sack();
-
- /**
- * Set the traversers sack object to the provided value ("sack the value").
- *
- * @param object the new value of the traverser's sack
- * @param <S> the type of the object
- */
- public <S> void sack(final S object);
-
- /**
- * Get the current path of the traverser.
- *
- * @return The path of the traverser
- */
- public Path path();
-
- /**
- * Get the object associated with the specified step-label in the traverser's path history.
- *
- * @param stepLabel the step-label in the path to access
- * @param <A> the type of the object
- * @return the object associated with that path label (if more than one object occurs at that step, a list is returned)
- */
- public default <A> A path(final String stepLabel) {
- return this.path().get(stepLabel);
- }
-
- /**
- * Return the number of times the traverser has gone through a looping section of a traversal.
- *
- * @return The number of times the traverser has gone through a loop
- */
- public int loops();
-
- /**
- * A traverser may represent a grouping of traversers to allow for more efficient data propagation.
- *
- * @return the number of traversers represented in this traverser.
- */
- public long bulk();
-
- /**
- * Get a particular value from the sideEffects of the traverser.
- *
- * @param sideEffectKey the key of the value to get from the sideEffects
- * @param <A> the type of the returned object
- * @return the object in the sideEffects of the respective key
- */
- public default <A> A sideEffects(final String sideEffectKey) {
- return this.asAdmin().getSideEffects().get(sideEffectKey);
- }
-
- /**
- * Set a particular value in the sideEffects of the traverser.
- *
- * @param sideEffectKey the key of the value to set int the sideEffects
- * @param sideEffectValue the value to set for the sideEffect key
- */
- public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) {
- this.asAdmin().getSideEffects().set(sideEffectKey, sideEffectValue);
- }
-
- /**
- * If the underlying object of the traverser is comparable, compare it with the other traverser.
- *
- * @param other the other traverser that presumably has a comparable internal object
- * @return the comparison of the two objects of the traversers
- * @throws ClassCastException if the object of the traverser is not comparable
- */
- @Override
- public default int compareTo(final Traverser<T> other) throws ClassCastException {
- return ((Comparable) this.get()).compareTo(other.get());
- }
-
- /**
- * Typecast the traverser to a "system traverser" so {@link Traverser.Admin} methods can be accessed.
- * This is used as a helper method to avoid the awkwardness of <code>((Traverser.Administrative)traverser)</code>.
- * The default implementation simply returns "this" type casted to {@link Traverser.Admin}.
- *
- * @return The type-casted traverser
- */
- public default Admin<T> asAdmin() {
- return (Admin<T>) this;
- }
-
- /**
- * Traverser cloning is important when splitting a traverser at a bifurcation point in a traversal.
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public Traverser<T> clone();
-
- /**
- * The methods in System.Traverser are useful to underlying Step and Traversal implementations.
- * They should not be accessed by the user during lambda-based manipulations.
- */
- public interface Admin<T> extends Traverser<T>, Attachable<Admin<T>> {
-
- public static final String HALT = "halt";
-
- /**
- * When two traversers are {@link Traverser#equals} to each other, then they can be merged.
- * This method is used to merge the traversers into a single traverser.
- * This is used for optimization where instead of enumerating all traversers, they can be counted.
- *
- * @param other the other traverser to merge into this traverser. Once merged, the other can be garbage collected.
- */
- public void merge(final Admin<?> other);
-
- /**
- * Generate a child traverser of the current traverser for current as step and new object location.
- * The child has the path history, future, and loop information of the parent.
- * The child extends that path history with the current as and provided R-object.
- *
- * @param r The current object of the child
- * @param step The step yielding the split
- * @param <R> The current object type of the child
- * @return The split traverser
- */
- public <R> Admin<R> split(final R r, final Step<T, R> step);
-
- /**
- * Generate a sibling traverser of the current traverser with a full copy of all state within the sibling.
- *
- * @return The split traverser
- */
- public Admin<T> split();
-
- /**
- * Set the current object location of the traverser.
- *
- * @param t The current object of the traverser
- */
- public void set(final T t);
-
- /**
- * Increment the number of times the traverser has gone through a looping section of traversal.
- * The step label is important to create a stack of loop counters when within a nested context.
- * If the provided label is not the same as the current label on the stack, add a new loop counter.
- * If the provided label is the same as the current label on the stack, increment the loop counter.
- *
- * @param stepLabel the label of the step that is doing the incrementing
- */
- public void incrLoops(final String stepLabel);
-
- /**
- * Set the number of times the traverser has gone through a loop back to 0.
- * When a traverser exits a looping construct, this method should be called.
- * In a nested loop context, the highest stack loop counter should be removed.
- */
- public void resetLoops();
-
- /**
- * Get the step id of where the traverser is located.
- * This is typically used in multi-machine systems that require the movement of
- * traversers between different traversal instances.
- *
- * @return The future step for the traverser
- */
- public String getStepId();
-
- /**
- * Set the step id of where the traverser is located.
- * If the future is {@link Traverser.Admin#HALT}, then {@link Traverser.Admin#isHalted()} is true.
- *
- * @param stepId The future step of the traverser
- */
- public void setStepId(final String stepId);
-
- /**
- * If the traverser has "no future" then it is done with its lifecycle.
- * This does not mean that the traverser is "dead," only that it has successfully passed through a {@link Traversal}.
- *
- * @return Whether the traverser is done executing or not
- */
- public default boolean isHalted() {
- return getStepId().equals(HALT);
- }
-
- /**
- * Set the number of traversers represented by this traverser.
- *
- * @param count the number of traversers
- */
- public void setBulk(final long count);
-
- /**
- * Prepare the traverser for migration across a JVM boundary.
- *
- * @return The deflated traverser
- */
- public Admin<T> detach();
-
- /**
- * Regenerate the detached traverser given its location at a particular vertex.
- *
- * @param hostVertex The vertex that is hosting the traverser
- * @return The inflated traverser
- */
- @Override
- public Admin<T> attach(final Vertex hostVertex);
-
- /**
- * Traversers can not attach to graphs and thus, an {@link UnsupportedOperationException} is thrown.
- *
- * @param graph the graph to attach the traverser to, which it can't.
- * @return nothing as an exception is thrown
- * @throws UnsupportedOperationException is always thrown as it makes no sense to attach a traverser to a graph
- */
- @Override
- public default Admin<T> attach(final Graph graph) throws UnsupportedOperationException {
- throw new UnsupportedOperationException("A traverser can only exist at the vertices of the graph, not the graph itself");
- }
-
- /**
- * Set the sideEffects of the {@link Traversal}. Given that traversers can move between machines,
- * it may be important to re-set this when the traverser crosses machine boundaries.
- *
- * @param sideEffects the sideEffects of the traversal.
- */
- public void setSideEffects(final TraversalSideEffects sideEffects);
-
- /**
- * Get the sideEffects associated with the traversal of the traverser.
- *
- * @return the traversal sideEffects of the traverser
- */
- public TraversalSideEffects getSideEffects();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
deleted file mode 100644
index 28563db..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
+++ /dev/null
@@ -1,48 +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;
-
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraverserGenerator {
-
- public Set<TraverserRequirement> getProvidedRequirements();
-
- public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk);
-
- public default <S> Iterator<Traverser.Admin<S>> generateIterator(final Iterator<S> starts, final Step<S, ?> startStep, final long initialBulk) {
- return new Iterator<Traverser.Admin<S>>() {
- @Override
- public boolean hasNext() {
- return starts.hasNext();
- }
-
- @Override
- public Traverser.Admin<S> next() {
- return generate(starts.next(), startStep, initialBulk);
- }
- };
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
index 6fa3533..f72f4ee 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.computer;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 7f2a481..881185c 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
@@ -18,16 +18,15 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
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.computer.util.AbstractVertexProgramBuilder;
import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 fbfe64e..6afdeaf 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
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.Memory;
import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
@@ -27,7 +27,7 @@ import org.apache.tinkerpop.gremlin.process.computer.Messenger;
import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
index cd97fd1..d5f986a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
index b262b13..03e0afc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
import org.apache.tinkerpop.gremlin.process.computer.util.ScriptEngineCache;
import org.apache.tinkerpop.gremlin.structure.Graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
index f95a7d1..c8e7ff7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import java.io.Serializable;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 4376003..bbd221d 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
@@ -19,11 +19,11 @@
package org.apache.tinkerpop.gremlin.process.computer.traversal;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
import org.apache.tinkerpop.gremlin.process.computer.Memory;
@@ -35,13 +35,13 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Computer
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
index 533e619..ad33da6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.process.computer.traversal;
import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import java.util.Optional;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
index 89f8932..1226146 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
@@ -18,13 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.structure.*;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
index 2b80011..272de75 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index 3698215..1f9636e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -18,18 +18,18 @@
*/
package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+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.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
index 041f34d..0ba12b6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
@@ -19,14 +19,14 @@
package org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.util.GraphComputerHelper;
import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
index de1fd5f..3f51ba6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.computer.util;
import org.apache.commons.configuration.AbstractConfiguration;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
import org.apache.tinkerpop.gremlin.util.Serializer;
import java.io.IOException;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
deleted file mode 100644
index f11b6c3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
+++ /dev/null
@@ -1,47 +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.graph.traversal;
-
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
-
- public DefaultGraphTraversal(final Graph graph) {
- super(graph);
- }
-
- @Override
- public GraphTraversal.Admin<S, E> asAdmin() {
- return this;
- }
-
- @Override
- public GraphTraversal<S, E> iterate() {
- return GraphTraversal.Admin.super.iterate();
- }
-
- @Override
- public DefaultGraphTraversal<S, E> clone() {
- return (DefaultGraphTraversal<S, E>) super.clone();
- }
-}
[26/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
new file mode 100644
index 0000000..9941e3c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
@@ -0,0 +1,84 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class RangeLocalStep<S> extends MapStep<S, S> {
+
+ private final long low;
+ private final long high;
+
+ public RangeLocalStep(final Traversal.Admin traversal, final long low, final long high) {
+ super(traversal);
+ if (low != -1 && high != -1 && low > high) {
+ throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
+ }
+ this.low = low;
+ this.high = high;
+ }
+
+ @Override
+ protected S map(final Traverser.Admin<S> traverser) {
+ final S start = traverser.get();
+ if (start instanceof Map) {
+ final Map map = (Map) start;
+ final long capacity = (this.high != -1 ? this.high : map.size()) - this.low;
+ final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
+ long c = 0L;
+ for (final Object obj : map.entrySet()) {
+ final Map.Entry entry = (Map.Entry) obj;
+ if (c >= this.low) {
+ if (c < this.high || this.high == -1) {
+ result.put(entry.getKey(), entry.getValue());
+ } else break;
+ }
+ c++;
+ }
+ return (S) result;
+ } else if (start instanceof Collection) {
+ final Collection collection = (Collection) start;
+ final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+ long c = 0L;
+ for (final Object item : collection) {
+ if (c >= this.low) {
+ if (c < this.high || this.high == -1) {
+ result.add(item);
+ } else break;
+ }
+ c++;
+ }
+ return (S) result;
+ }
+ return start;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java
new file mode 100644
index 0000000..3e0385b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackStep<S, E> extends MapStep<S, E> {
+
+ public SackStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ return traverser.sack();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.SACK);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
new file mode 100644
index 0000000..8203c44
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
@@ -0,0 +1,112 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class SampleLocalStep<S> extends MapStep<S, S> {
+
+ private static final Random RANDOM = new Random();
+
+ private final int amountToSample;
+
+ public SampleLocalStep(final Traversal.Admin traversal, final int amountToSample) {
+ super(traversal);
+ this.amountToSample = amountToSample;
+ }
+
+ @Override
+ protected S map(final Traverser.Admin<S> traverser) {
+ final S start = traverser.get();
+ if (start instanceof Map) {
+ return mapMap((Map) start);
+ } else if (start instanceof Collection) {
+ return mapCollection((Collection) start);
+ } else if (RANDOM.nextDouble() > 0.5d) {
+ throw FastNoSuchElementException.instance();
+ }
+ return start;
+ }
+
+ private S mapCollection(final Collection collection) {
+ final int size = collection.size();
+ if (size <= this.amountToSample) {
+ return (S) collection;
+ }
+ final double individualWeight = 1.0d / size;
+ final Collection result = new BulkSet();
+ double runningWeight = 0.0d;
+ int runningAmountToSample = 0;
+ while (runningAmountToSample < this.amountToSample) {
+ for (final Object item : collection) {
+ runningWeight = runningWeight + individualWeight;
+ if (RANDOM.nextDouble() <= (runningWeight / size)) {
+ result.add(item);
+ if (++runningAmountToSample == this.amountToSample) {
+ break;
+ }
+ }
+ }
+ }
+ return (S) result;
+ }
+
+ private S mapMap(final Map map) {
+ final int size = map.size();
+ if (size <= this.amountToSample) {
+ return (S) map;
+ }
+ final double individualWeight = 1.0d / size;
+ final Map result = new HashMap(this.amountToSample);
+ double runningWeight = 0.0d;
+ while (result.size() < this.amountToSample) {
+ for (final Object obj : map.entrySet()) {
+ runningWeight = runningWeight + individualWeight;
+ final Map.Entry entry = (Map.Entry) obj;
+ if (RANDOM.nextDouble() <= (runningWeight / size)) {
+ result.put(entry.getKey(), entry.getValue());
+ if (result.size() == this.amountToSample) {
+ break;
+ }
+ }
+ }
+ }
+ return (S) result;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
new file mode 100644
index 0000000..fcc830e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
@@ -0,0 +1,103 @@
+/*
+ * 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.step.map;
+
+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.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent, EngineDependent {
+
+ private final String selectLabel;
+ private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
+ private boolean requiresPaths = false;
+
+ public SelectOneStep(final Traversal.Admin traversal, final String selectLabel) {
+ super(traversal);
+ this.selectLabel = selectLabel;
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ final S start = traverser.get();
+ if (start instanceof Map && ((Map) start).containsKey(this.selectLabel))
+ return (E) TraversalUtil.apply(((Map) start).get(this.selectLabel), this.selectTraversal);
+ else
+ return (E) TraversalUtil.apply(traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ this.requiresPaths = traversalEngine.isComputer() ?
+ TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent() :
+ TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
+ .filter(step -> step instanceof CollectingBarrierStep)
+ .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent()
+ || (step.getLabel().isPresent() && this.selectLabel.equals(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
+ .findAny().isPresent() ||
+ TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
+ filter(step -> step instanceof TraversalParent).findAny().isPresent();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.selectLabel, this.selectTraversal);
+ }
+
+ @Override
+ public SelectOneStep<S, E> clone() {
+ final SelectOneStep<S, E> clone = (SelectOneStep<S, E>) super.clone();
+ clone.selectTraversal = this.selectTraversal.clone();
+ return clone;
+ }
+
+ @Override
+ public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+ return Collections.singletonList(this.selectTraversal);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
+ this.selectTraversal = this.integrateChild(selectTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
+ if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
+ return requirements;
+ }
+}
+
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
new file mode 100644
index 0000000..3f62100
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
@@ -0,0 +1,130 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+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.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements TraversalParent, EngineDependent {
+
+ protected TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+ private final List<String> selectLabels;
+ private boolean requiresPaths = false;
+
+ public SelectStep(final Traversal.Admin traversal, final String... selectLabels) {
+ super(traversal);
+ this.selectLabels = selectLabels.length == 0 ? TraversalHelper.getLabelsUpTo(this, this.traversal) : Arrays.asList(selectLabels);
+ }
+
+ @Override
+ protected Map<String, E> map(final Traverser.Admin<S> traverser) {
+ final S start = traverser.get();
+ final Map<String, E> bindings = new LinkedHashMap<>();
+
+ ////// PROCESS STEP BINDINGS
+ final Path path = traverser.path();
+ this.selectLabels.forEach(label -> {
+ if (path.hasLabel(label))
+ bindings.put(label, (E) TraversalUtil.apply(path.<Object>get(label), this.traversalRing.next()));
+ });
+
+ ////// PROCESS MAP BINDINGS
+ if (start instanceof Map) {
+ if (this.selectLabels.isEmpty())
+ ((Map<String, Object>) start).forEach((k, v) -> bindings.put(k, (E) TraversalUtil.apply(v, this.traversalRing.next())));
+ else
+ this.selectLabels.forEach(label -> {
+ if (((Map) start).containsKey(label))
+ bindings.put(label, (E) TraversalUtil.apply(((Map) start).get(label), this.traversalRing.next()));
+ });
+ }
+
+ this.traversalRing.reset();
+ return bindings;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.traversalRing.reset();
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ this.requiresPaths = traversalEngine.isComputer() ?
+ TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent() :
+ TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
+ .filter(step -> step instanceof CollectingBarrierStep)
+ .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent()
+ || (step.getLabel().isPresent() && this.selectLabels.contains(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
+ .findAny().isPresent() ||
+ TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
+ filter(step -> step instanceof TraversalParent).findAny().isPresent();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.selectLabels, this.traversalRing);
+ }
+
+ @Override
+ public SelectStep<S, E> clone() {
+ final SelectStep<S, E> clone = (SelectStep<S, E>) super.clone();
+ clone.traversalRing = new TraversalRing<>();
+ for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+ clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+ return this.traversalRing.getTraversals();
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
+ this.traversalRing.addTraversal(this.integrateChild(selectTraversal));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
+ if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
+ return requirements;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
new file mode 100644
index 0000000..99ccd68
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
@@ -0,0 +1,137 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements MapReducer {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.BULK,
+ TraverserRequirement.OBJECT
+ );
+
+ public SumGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier(new ConstantSupplier<>(0.0d));
+ this.setBiFunction(SumGlobalBiFunction.instance());
+ }
+
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+ return SumGlobalMapReduce.instance();
+ }
+
+ /////
+
+ private static class SumGlobalBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
+
+ private static final SumGlobalBiFunction INSTANCE = new SumGlobalBiFunction();
+
+ private SumGlobalBiFunction() {
+
+ }
+
+ @Override
+ public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
+ }
+
+ public final static <S extends Number> SumGlobalBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////////
+
+ private static class SumGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+ private static final SumGlobalMapReduce INSTANCE = new SumGlobalMapReduce();
+
+ private SumGlobalMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
+ vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get().doubleValue() * traverser.bulk())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+ if (values.hasNext()) {
+ Number sum = values.next();
+ while (values.hasNext()) {
+ sum = sum.doubleValue() + values.next().doubleValue();
+ }
+ emitter.emit(sum);
+ }
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+ return keyValues.hasNext() ? keyValues.next().getValue() : 0.0d;
+ }
+
+ public static final SumGlobalMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
new file mode 100644
index 0000000..4ca2e5a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
@@ -0,0 +1,58 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+ public SumLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ Number result;
+ final Iterator<E> iterator = traverser.get().iterator();
+ if (iterator.hasNext()) {
+ result = iterator.next();
+ while (iterator.hasNext()) {
+ result = result.doubleValue() + iterator.next().doubleValue();
+ }
+ } else {
+ result = 0.0d;
+ }
+ return (E) result;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
new file mode 100644
index 0000000..ff3df84
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
@@ -0,0 +1,178 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TreeStep<S> extends ReducingBarrierStep<S, Tree> implements MapReducer, TraversalParent {
+
+ private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+
+ public TreeStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier((Supplier) TreeSupplier.instance());
+ this.setBiFunction(new TreeBiFunction());
+ }
+
+
+ @Override
+ public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+ return this.traversalRing.getTraversals();
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
+ this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> getMapReduce() {
+ return TreeMapReduce.instance();
+ }
+
+ @Override
+ public TreeStep<S> clone() {
+ final TreeStep<S> clone = (TreeStep<S>) super.clone();
+ clone.traversalRing = new TraversalRing<>();
+ for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+ clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public Traverser<Tree> processNextStart() {
+ if (this.byPass) {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ return traverser.split(this.reducingBiFunction.apply(new Tree(), traverser), this);
+ } else {
+ return super.processNextStart();
+ }
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.traversalRing);
+ }
+
+ ///////////
+
+ private class TreeBiFunction implements BiFunction<Tree, Traverser<S>, Tree>, Serializable {
+
+ private TreeBiFunction() {
+
+ }
+
+ @Override
+ public Tree apply(final Tree mutatingSeed, final Traverser<S> traverser) {
+ Tree depth = mutatingSeed;
+ final Path path = traverser.path();
+ for (int i = 0; i < path.size(); i++) {
+ final Object object = TraversalUtil.apply(path.<Object>get(i), TreeStep.this.traversalRing.next());
+ if (!depth.containsKey(object))
+ depth.put(object, new Tree<>());
+ depth = (Tree) depth.get(object);
+ }
+ TreeStep.this.traversalRing.reset();
+ return mutatingSeed;
+ }
+ }
+
+ ///////////
+
+ public static final class TreeMapReduce extends StaticMapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> {
+
+ private static final TreeMapReduce INSTANCE = new TreeMapReduce();
+
+ private TreeMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Tree> emitter) {
+ vertex.<TraverserSet<Tree>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+ final Tree tree = new Tree();
+ values.forEachRemaining(tree::addTree);
+ emitter.emit(tree);
+ }
+
+ @Override
+ public Tree generateFinalResult(final Iterator<KeyValue<NullObject, Tree>> keyValues) {
+ final Tree tree = new Tree();
+ keyValues.forEachRemaining(keyValue -> tree.addTree(keyValue.getValue()));
+ return tree;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ public static final TreeMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
new file mode 100644
index 0000000..382815e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
@@ -0,0 +1,57 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class UnfoldStep<S, E> extends FlatMapStep<S, E> {
+
+ public UnfoldStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+ final S s = traverser.get();
+ if (s instanceof Iterator)
+ return (Iterator) s;
+ else if (s instanceof Iterable)
+ return ((Iterable) s).iterator();
+ else if (s instanceof Map)
+ return ((Map) s).entrySet().iterator();
+ else
+ return IteratorUtils.of((E) s);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
new file mode 100644
index 0000000..1b3d034
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
@@ -0,0 +1,82 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> {
+
+ private final String[] edgeLabels;
+ private Direction direction;
+ private final Class<E> returnClass;
+
+ public VertexStep(final Traversal.Admin traversal, final Class<E> returnClass, final Direction direction, final String... edgeLabels) {
+ super(traversal);
+ this.direction = direction;
+ this.edgeLabels = edgeLabels;
+ this.returnClass = returnClass;
+ }
+
+ @Override
+ protected Iterator<E> flatMap(final Traverser.Admin<Vertex> traverser) {
+ return Vertex.class.isAssignableFrom(this.returnClass) ?
+ (Iterator<E>) traverser.get().vertices(this.direction, this.edgeLabels) :
+ (Iterator<E>) traverser.get().edges(this.direction, this.edgeLabels);
+ }
+
+ public Direction getDirection() {
+ return this.direction;
+ }
+
+ public String[] getEdgeLabels() {
+ return this.edgeLabels;
+ }
+
+ public Class<E> getReturnClass() {
+ return this.returnClass;
+ }
+
+ public void reverseDirection() {
+ this.direction = this.direction.opposite();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.direction, Arrays.asList(this.edgeLabels), this.returnClass.getSimpleName().toLowerCase());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
new file mode 100644
index 0000000..fb01a6e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
@@ -0,0 +1,87 @@
+/*
+ * 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.step.map.match;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.function.Function;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class Bindings<T> {
+ private final SortedMap<String, T> map = new TreeMap<>();
+
+ public Bindings() {
+ }
+
+ public Bindings(final Map<String, T> map) {
+ this.map.putAll(map);
+ }
+
+ public Bindings<T> put(final String name, final T value) {
+ map.put(name, value);
+ return this;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder("{");
+ boolean first = true;
+ for (Map.Entry<String, T> entry : map.entrySet()) {
+ if (first) first = false;
+ else sb.append(", ");
+ sb.append(entry.getKey()).append(':').append(entry.getValue());
+ }
+ sb.append('}');
+ return sb.toString();
+ }
+
+ public static class BindingsComparator<T> implements Comparator<Bindings<T>> {
+ private final Function<T, String> toStringFunction;
+
+ public BindingsComparator(Function<T, String> toStringFunction) {
+ this.toStringFunction = toStringFunction;
+ }
+
+ @Override
+ public int compare(Bindings<T> left, Bindings<T> right) {
+ int cmp = ((Integer) left.map.size()).compareTo(right.map.size());
+ if (0 != cmp) return cmp;
+
+ Iterator<Map.Entry<String, T>> i1 = left.map.entrySet().iterator();
+ Iterator<Map.Entry<String, T>> i2 = right.map.entrySet().iterator();
+ while (i1.hasNext()) {
+ Map.Entry<String, T> e1 = i1.next();
+ Map.Entry<String, T> e2 = i2.next();
+
+ cmp = e1.getKey().compareTo(e1.getKey());
+ if (0 != cmp) return cmp;
+
+ cmp = e1.getValue().toString().compareTo(e2.getValue().toString());
+ if (0 != cmp) return cmp;
+ }
+
+ return 0;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java
new file mode 100644
index 0000000..167de93
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.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.traversal.step.map.match;
+
+import java.util.function.BiConsumer;
+
+/**
+ * An Enumerator which finds the Cartesian product of two other Enumerators,
+ * expanding at the same rate in either dimension.
+ * This maximizes the size of the product with respect to the number of expansions of the base Enumerators.
+ */
+public class CrossJoinEnumerator<T> implements Enumerator<T> {
+
+ private final Enumerator<T> xEnum, yEnum;
+
+ public CrossJoinEnumerator(final Enumerator<T> xEnum,
+ final Enumerator<T> yEnum) {
+ this.xEnum = xEnum;
+ this.yEnum = yEnum;
+ }
+
+ public int size() {
+ return xEnum.size() * yEnum.size();
+ }
+
+ // note: permits random access
+ public boolean visitSolution(final int index,
+ final BiConsumer<String, T> visitor) {
+ int sq = (int) Math.sqrt(index);
+
+ // choose x and y such that the solution represented by index
+ // remains constant as this Enumerator expands
+ int x, y;
+
+ if (0 == index) {
+ x = y = 0;
+ } else {
+ int r = index - sq * sq;
+ if (r < sq) {
+ x = sq;
+ y = r;
+ } else {
+ x = r - sq;
+ y = sq;
+ }
+ }
+
+ // expand x if necessary
+ if (!hasIndex(xEnum, sq)) {
+ if (0 == xEnum.size()) {
+ return false;
+ }
+
+ x = index % xEnum.size();
+ y = index / xEnum.size();
+ }
+
+ // expand y if necessary
+ if (!hasIndex(yEnum, y)) {
+ int height = yEnum.size();
+ if (0 == height) {
+ return false;
+ }
+
+ x = index / height;
+ if (!hasIndex(xEnum, x)) {
+ return false;
+ }
+ y = index % height;
+ }
+
+ // solutions are visited completely (if we have reached this point), else not at all
+ return xEnum.visitSolution(x, visitor) && yEnum.visitSolution(y, visitor);
+ }
+
+ private boolean hasIndex(final Enumerator<T> e,
+ final int index) {
+ return index < e.size() || e.visitSolution(index, (BiConsumer<String, T>) MatchStep.TRIVIAL_CONSUMER);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java
new file mode 100644
index 0000000..c5f8bac
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.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.step.map.match;
+
+import java.util.function.BiConsumer;
+
+/**
+ * An array of key/value maps accessible by index.
+ * The total size of the enumerator may be unknown when it is created;
+ * it grows when successive solutions are requested, computing as many as necessary.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public interface Enumerator<T> {
+
+ /**
+ * @return the number of solutions so far known; the enumerator has at least this many.
+ * This should be a relatively cheap operation.
+ */
+ int size();
+
+ /**
+ * Provides access to a solution, allowing it to be printed, put into a map, etc.
+ *
+ * @param index the index of the solution
+ * @param visitor a consumer for each key/value pair in the solution
+ * @return whether a solution exists at the given index and was visited
+ */
+ boolean visitSolution(int index, BiConsumer<String, T> visitor);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
new file mode 100644
index 0000000..a26e24d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
@@ -0,0 +1,129 @@
+/*
+ * 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.step.map.match;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+
+/**
+ * An Enumerator which joins the solutions of a base Enumerator according to repeated variables
+ * <p/>
+ * Note: this Enumerator requires random access to its base Enumerator,
+ * as it maintains a list of indices at which valid solutions are found, and visits only those indices.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class InnerJoinEnumerator<T> implements Enumerator<T> {
+ private final Enumerator<T> baseEnumerator;
+ private Iterator<Integer> iterator;
+ private final List<Integer> joinIndices;
+
+ private final Map<String, T> map;
+ private final BiConsumer<String, T> joinVisitor;
+
+ private int joinCount;
+
+ public InnerJoinEnumerator(final Enumerator<T> baseEnumerator,
+ final Set<String> joinVariables) {
+
+ this.baseEnumerator = baseEnumerator;
+ this.joinIndices = new ArrayList<>();
+
+ map = new HashMap<>();
+ // TODO: allow for more than two instances of a variable
+ joinVisitor = (name, newValue) -> {
+ if (joinVariables.contains(name)) {
+ T value = map.get(name);
+ if (null == value) {
+ map.put(name, newValue);
+ } else if (value.equals(newValue)) {
+ joinCount++;
+ }
+ } else {
+ map.put(name, newValue);
+ }
+ };
+
+ iterator = new Iterator<Integer>() {
+ private int currentIndex = -1;
+
+ {
+ advanceToNext();
+ }
+
+ public boolean hasNext() {
+ // there are no calls to this method
+ return false;
+ }
+
+ public Integer next() {
+ int tmp = currentIndex;
+ advanceToNext();
+ return tmp;
+ }
+
+ private void advanceToNext() {
+ while (true) {
+ map.clear();
+ joinCount = 0;
+
+ if (!baseEnumerator.visitSolution(++currentIndex, joinVisitor)) {
+ iterator = null;
+ return;
+ }
+
+ if (joinVariables.size() == joinCount) {
+ joinIndices.add(currentIndex);
+ return;
+ }
+ }
+ }
+ };
+ }
+
+ public int size() {
+ return joinIndices.size();
+ }
+
+ public boolean visitSolution(int i, BiConsumer<String, T> visitor) {
+ while (i >= joinIndices.size()) {
+ if (null == iterator) {
+ return false;
+ }
+
+ iterator.next();
+ }
+
+ map.clear();
+ if (!baseEnumerator.visitSolution(joinIndices.get(i), joinVisitor)) {
+ throw new IllegalStateException();
+ }
+
+ for (Map.Entry<String, T> entry : map.entrySet()) {
+ visitor.accept(entry.getKey(), entry.getValue());
+ }
+
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
new file mode 100644
index 0000000..57d32b7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
@@ -0,0 +1,67 @@
+/*
+ * 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.step.map.match;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class IteratorEnumerator<T> implements Enumerator<T> {
+ private final String name;
+ private Iterator<T> iterator;
+ private final List<T> memory = new ArrayList<>();
+
+ public IteratorEnumerator(final String name,
+ final Iterator<T> iterator) {
+ this.name = name;
+ this.iterator = iterator;
+ }
+
+ public int size() {
+ return memory.size();
+ }
+
+ public boolean visitSolution(final int index,
+ final BiConsumer<String, T> visitor) {
+ T value;
+
+ if (index < memory.size()) {
+ value = memory.get(index);
+ } else do {
+ if (null == iterator) {
+ return false;
+ } else if (!iterator.hasNext()) {
+ // free up memory as soon as possible
+ iterator = null;
+ return false;
+ }
+
+ value = iterator.next();
+ memory.add(value);
+ } while (index >= memory.size());
+
+ MatchStep.visit(name, value, visitor);
+
+ return true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
new file mode 100644
index 0000000..d9cbf28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
@@ -0,0 +1,559 @@
+/*
+ * 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.step.map.match;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+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;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.Stack;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> implements TraversalParent {
+
+ static final BiConsumer<String, Object> TRIVIAL_CONSUMER = (s, t) -> {
+ };
+
+ private static final String ANON_LABEL_PREFIX = "_";
+
+ // optimize before processing each start object, by default
+ private static final int DEFAULT_STARTS_PER_OPTIMIZE = 1;
+
+ private final String startLabel;
+ private final Map<String, List<TraversalWrapper<S, S>>> traversalsByStartAs;
+ private final List<Traversal> traversals = new ArrayList<>();
+
+ private int startsPerOptimize = DEFAULT_STARTS_PER_OPTIMIZE;
+ private int optimizeCounter = -1;
+ private int anonLabelCounter = 0;
+
+ private Enumerator<S> currentSolution;
+ private int currentIndex;
+
+ // initial value allows MatchStep to be used as a stand-alone query engine
+ private Traverser.Admin<S> currentStart;
+
+ public MatchStep(final Traversal.Admin traversal, final String startLabel, final Traversal... traversals) {
+ super(traversal);
+ this.startLabel = startLabel;
+ this.traversalsByStartAs = new HashMap<>();
+ this.currentStart = new B_O_PA_S_SE_SL_Traverser<>(null, this);
+ for (final Traversal tl : traversals) {
+ addTraversalPrivate(tl);
+ this.integrateChild(tl.asAdmin());
+ this.traversals.add(tl);
+ }
+ checkSolvability();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.traversalsByStartAs);
+ }
+
+ /**
+ * Adds an individual traversal to an already-constructed MatchStep.
+ * The query must be solvable after addition (i.e. should not require the addition of
+ * further traversals in order to be solvable)
+ * This method should be called before the query is first executed.
+ *
+ * @param traversal the traversal to add
+ */
+ public void addTraversal(final Traversal<S, S> traversal) {
+ addTraversalPrivate(traversal);
+ this.traversals.add(traversal);
+ this.integrateChild(traversal.asAdmin());
+ checkSolvability();
+ }
+
+ public void setStartsPerOptimize(final int startsPerOptimize) {
+ if (startsPerOptimize < 1) {
+ throw new IllegalArgumentException();
+ }
+ this.startsPerOptimize = startsPerOptimize;
+ }
+
+ @Override
+ protected Traverser<Map<String, E>> processNextStart() throws NoSuchElementException {
+ final Map<String, E> map = new HashMap<>();
+ final Traverser<Map<String, E>> result = this.currentStart.split(map, this);
+ final BiConsumer<String, S> resultSetter = (name, value) -> map.put(name, (E) value);
+
+ while (true) { // break out when the current solution is exhausted and there are no more starts
+ if (null == this.currentSolution) {
+ if (this.starts.hasNext()) {
+ this.optimizeCounter = (this.optimizeCounter + 1) % this.startsPerOptimize;
+ if (0 == this.optimizeCounter) {
+ optimize();
+ }
+
+ this.currentStart = this.starts.next();
+ this.currentSolution = solveFor(IteratorUtils.of(this.currentStart.get()));
+ this.currentIndex = 0;
+ } else {
+ throw FastNoSuchElementException.instance();
+ }
+ }
+
+ map.clear();
+ if (this.currentSolution.visitSolution(this.currentIndex++, resultSetter)) {
+ return result;
+ } else {
+ this.currentSolution = null;
+ }
+ }
+ }
+
+ /**
+ * @return a description of the current state of this step, including the query plan and gathered statistics
+ */
+ public String summarize() {
+ final StringBuilder sb = new StringBuilder("match \"")
+ .append(this.startLabel)
+ .append("\":\t")
+ .append(findCost(this.startLabel))
+ .append('\n');
+ summarize(this.startLabel, sb, new HashSet<>(), 1);
+ return sb.toString();
+ }
+
+ private void summarize(final String outLabel,
+ final StringBuilder sb,
+ final Set<String> visited,
+ final int indent) {
+ if (!visited.contains(outLabel)) {
+ visited.add(outLabel);
+ final List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outLabel);
+ if (null != outs) {
+ for (final TraversalWrapper<S, S> w : outs) {
+ for (int i = 0; i < indent; i++) sb.append('\t');
+ sb.append(outLabel).append("->").append(w.endLabel).append(":\t");
+ sb.append(findCost(w));
+ sb.append('\t').append(w);
+ sb.append('\n');
+ summarize(w.endLabel, sb, visited, indent + 1);
+ }
+ }
+ }
+ }
+
+ private void addTraversalPrivate(final Traversal<S, S> traversal) {
+
+ String startAs = traversal.asAdmin().getStartStep().getLabel().orElseThrow(()
+ -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
+ String endAs = traversal.asAdmin().getEndStep().getLabel().orElse(null);
+ checkAs(startAs);
+ if (null == endAs) {
+ endAs = createAnonymousAs();
+ } else {
+ checkAs(endAs);
+ }
+
+ final TraversalWrapper<S, S> wrapper = new TraversalWrapper<>(traversal, startAs, endAs);
+ // index all wrapped traversals by their startLabel
+ List<TraversalWrapper<S, S>> l2 = this.traversalsByStartAs.get(startAs);
+ if (null == l2) {
+ l2 = new LinkedList<>();
+ this.traversalsByStartAs.put(startAs, l2);
+ }
+ l2.add(wrapper);
+ }
+
+ // given all the wrapped traversals, determine bad patterns in the set and throw exceptions if not solvable
+ private void checkSolvability() {
+ final Set<String> pathSet = new HashSet<>();
+ final Stack<String> stack = new Stack<>();
+ stack.push(this.startLabel);
+ int countTraversals = 0;
+ while (!stack.isEmpty()) {
+ final String outAs = stack.peek();
+ if (pathSet.contains(outAs)) {
+ stack.pop();
+ pathSet.remove(outAs);
+ } else {
+ pathSet.add(outAs);
+ final List<TraversalWrapper<S, S>> l = traversalsByStartAs.get(outAs);
+ if (null != l) {
+ for (final TraversalWrapper<S, S> tw : l) {
+ countTraversals++;
+ if (pathSet.contains(tw.endLabel)) {
+ throw new IllegalArgumentException("The provided traversal set contains a cycle due to '"
+ + tw.endLabel + '\'');
+ }
+ stack.push(tw.endLabel);
+ }
+ }
+ }
+ }
+
+ int totalTraversals = 0;
+ for (List<TraversalWrapper<S, S>> l : this.traversalsByStartAs.values()) {
+ totalTraversals += l.size();
+ }
+
+ if (countTraversals < totalTraversals) {
+ throw new IllegalArgumentException("The provided traversal set contains unreachable as-label(s)");
+ }
+ }
+
+ private static void checkAs(final String as) {
+ // note: this won't happen so long as the anon prefix is the same as Traversal.UNDERSCORE
+ if (isAnonymousAs(as)) {
+ throw new IllegalArgumentException("The step named '" + as + "' uses reserved prefix '"
+ + ANON_LABEL_PREFIX + '\'');
+ }
+ }
+
+ private static boolean isAnonymousAs(final String as) {
+ return as.startsWith(ANON_LABEL_PREFIX);
+ }
+
+ private String createAnonymousAs() {
+ return ANON_LABEL_PREFIX + ++this.anonLabelCounter;
+ }
+
+ /**
+ * Directly applies this match query to a sequence of inputs
+ *
+ * @param inputs a sequence of inputs
+ * @return an enumerator over all solutions
+ */
+ public Enumerator<S> solveFor(final Iterator<S> inputs) {
+ return solveFor(startLabel, inputs);
+ }
+
+ private Enumerator<S> solveFor(final String localStartAs,
+ final Iterator<S> inputs) {
+ List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
+ if (null == outs) {
+ // no out-traversals from here; just enumerate the values bound to localStartAs
+ return isAnonymousAs(localStartAs)
+ ? new SimpleEnumerator<>(localStartAs, inputs)
+ : new IteratorEnumerator<>(localStartAs, inputs);
+ } else {
+ // for each value bound to localStartAs, feed it into all out-traversals in parallel and join the results
+ return new SerialEnumerator<>(localStartAs, inputs, o -> {
+ Enumerator<S> result = null;
+ Set<String> leftLabels = new HashSet<>();
+
+ for (TraversalWrapper<S, S> w : outs) {
+ TraversalUpdater<S, S> updater
+ = new TraversalUpdater<>(w, IteratorUtils.of(o), currentStart, this.getId());
+
+ Set<String> rightLabels = new HashSet<>();
+ addVariables(w.endLabel, rightLabels);
+ Enumerator<S> ie = solveFor(w.endLabel, updater);
+ result = null == result ? ie : crossJoin(result, ie, leftLabels, rightLabels);
+ leftLabels.addAll(rightLabels);
+ }
+
+ return result;
+ });
+ }
+ }
+
+ private static <T> Enumerator<T> crossJoin(final Enumerator<T> left,
+ final Enumerator<T> right,
+ final Set<String> leftLabels,
+ final Set<String> rightLabels) {
+ Set<String> shared = new HashSet<>();
+ for (String s : rightLabels) {
+ if (leftLabels.contains(s)) {
+ shared.add(s);
+ }
+ }
+
+ Enumerator<T> cj = new CrossJoinEnumerator<>(left, right);
+ return shared.size() > 0 ? new InnerJoinEnumerator<>(cj, shared) : cj;
+ }
+
+ // recursively add all non-anonymous variables from a starting point in the query
+ private void addVariables(final String localStartAs,
+ final Set<String> variables) {
+ if (!isAnonymousAs(localStartAs)) {
+ variables.add(localStartAs);
+ }
+
+ List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
+ if (null != outs) {
+ for (TraversalWrapper<S, S> w : outs) {
+ String endAs = w.endLabel;
+ if (!variables.contains(endAs)) {
+ addVariables(endAs, variables);
+ }
+ }
+ }
+ }
+
+ // applies a visitor, skipping anonymous variables
+ static <T> void visit(final String name,
+ final T value,
+ final BiConsumer<String, T> visitor) {
+ if (!isAnonymousAs(name)) {
+ visitor.accept(name, value);
+ }
+ }
+
+ /**
+ * Computes and applies a new query plan based on gathered statistics about traversal inputs and outputs.
+ */
+ // note: optimize() is never called from within a solution iterator, as it changes the query plan
+ public void optimize() {
+ optimizeAt(startLabel);
+ }
+
+ private void optimizeAt(final String outAs) {
+ List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
+ if (null != outs) {
+ for (TraversalWrapper<S, S> t : outs) {
+ optimizeAt(t.endLabel);
+ updateOrderingFactor(t);
+ }
+ Collections.sort(outs);
+ }
+ }
+
+ private double findCost(final TraversalWrapper<S, S> root) {
+ double bf = root.findBranchFactor();
+ return bf + findCost(root.endLabel, root.findBranchFactor());
+ }
+
+ private double findCost(final String outAs,
+ final double branchFactor) {
+ double bf = branchFactor;
+
+ double cost = 0;
+
+ List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
+ if (null != outs) {
+ for (TraversalWrapper<S, S> child : outs) {
+ cost += bf * findCost(child);
+ bf *= child.findBranchFactor();
+ }
+ }
+
+ return cost;
+ }
+
+ /**
+ * @param outLabel the out-label of one or more traversals in the query
+ * @return the expected cost, in the current query plan, of applying the branch of the query plan at
+ * the given out-label to one start value
+ */
+ public double findCost(final String outLabel) {
+ return findCost(outLabel, 1.0);
+ }
+
+ private void updateOrderingFactor(final TraversalWrapper<S, S> w) {
+ w.orderingFactor = ((w.findBranchFactor() - 1) / findCost(w));
+ }
+
+ @Override
+ public List<Traversal> getLocalChildren() {
+ return this.traversals;
+ }
+
+ /**
+ * A wrapper for a traversal in a query which maintains statistics about the traversal as
+ * it consumes inputs and produces outputs.
+ * The "branch factor" of the traversal is an important factor in determining its place in the query plan.
+ */
+ // note: input and output counts are never "refreshed".
+ // The position of a traversal in a query never changes, although its priority / likelihood of being executed does.
+ // Priority in turn affects branch factor.
+ // However, with sufficient inputs and optimizations,the branch factor is expected to converge on a stable value.
+ public static class TraversalWrapper<A, B> implements Comparable<TraversalWrapper<A, B>> {
+ private final Traversal<A, B> traversal;
+ private final String startLabel, endLabel;
+ private int totalInputs = 0;
+ private int totalOutputs = 0;
+ private double orderingFactor;
+
+ public TraversalWrapper(final Traversal<A, B> traversal,
+ final String startLabel,
+ final String endLabel) {
+ this.traversal = traversal;
+ this.startLabel = startLabel;
+ this.endLabel = endLabel;
+ }
+
+ public void incrementInputs() {
+ this.totalInputs++;
+ }
+
+ public void incrementOutputs(int outputs) {
+ this.totalOutputs += outputs;
+ }
+
+ // TODO: take variance into account, to avoid penalizing traversals for early encounters with super-inputs,
+ // or simply for never having been tried
+ public double findBranchFactor() {
+ return 0 == this.totalInputs ? 1 : this.totalOutputs / ((double) this.totalInputs);
+ }
+
+ @Override
+ public int compareTo(final TraversalWrapper<A, B> other) {
+ return ((Double) this.orderingFactor).compareTo(other.orderingFactor);
+ }
+
+ public Traversal<A, B> getTraversal() {
+ return this.traversal;
+ }
+
+ public void reset() {
+ this.traversal.asAdmin().reset();
+ }
+
+ @Override
+ public String toString() {
+ return this.traversal.toString();
+ //return "[" + this.startLabel + "->" + this.endLabel + "," + findBranchFactor() + ","
+ // + this.totalInputs + "," + this.totalOutputs + "," + this.traversal + "]";
+ }
+ }
+
+ /**
+ * A helper object which wraps a traversal, submitting starts and counting results per start
+ */
+ public static class TraversalUpdater<A, B> implements Iterator<B> {
+ private final TraversalWrapper<A, B> w;
+ private int outputs = -1;
+
+ public TraversalUpdater(final TraversalWrapper<A, B> w,
+ final Iterator<A> inputs,
+ final Traverser<A> start,
+ final String as) {
+ this.w = w;
+
+ Iterator<A> seIter = new SideEffectIterator<>(inputs, ignored -> {
+ // only increment traversal input and output counts once an input
+ // has been completely processed by the traversal
+ if (-1 != outputs) {
+ w.incrementInputs();
+ w.incrementOutputs(outputs);
+ }
+ outputs = 0;
+ });
+ Iterator<Traverser<A>> starts = new MapIterator<>(seIter,
+ o -> {
+ final Traverser.Admin<A> traverser = ((Traverser.Admin<A>) start).split();
+ traverser.set((A) o);
+ return traverser;
+ });
+
+ w.reset();
+
+ // with the traversal "empty" and ready for re-use, add new starts
+ w.traversal.asAdmin().addStarts(starts);
+ }
+
+ // note: may return true after first returning false (inheriting this behavior from e.g. DefaultTraversal)
+ @Override
+ public boolean hasNext() {
+ return w.traversal.hasNext();
+ }
+
+ @Override
+ public B next() {
+ outputs++;
+ B b = w.traversal.next();
+
+ // immediately check hasNext(), possibly updating the traverser's statistics
+ // even if we otherwise abandon the iterator
+ w.traversal.hasNext();
+
+ return b;
+ }
+ }
+
+ // an iterator which executes a side-effect the first time hasNext() is called before a next()
+ private static class SideEffectIterator<T> implements Iterator<T> {
+ private final Consumer onHasNext;
+ private final Iterator<T> baseIterator;
+ private boolean ready = true;
+
+ private SideEffectIterator(final Iterator<T> baseIterator,
+ final Consumer onHasNext) {
+ this.onHasNext = onHasNext;
+ this.baseIterator = baseIterator;
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (this.ready) {
+ this.onHasNext.accept(null);
+ this.ready = false;
+ }
+ return this.baseIterator.hasNext();
+ }
+
+ @Override
+ public T next() {
+ T value = this.baseIterator.next();
+ this.ready = true;
+ return value;
+ }
+ }
+
+ private static class MapIterator<A, B> implements Iterator<B> {
+ private final Function<A, B> map;
+ private final Iterator<A> baseIterator;
+
+ public MapIterator(final Iterator<A> baseIterator, final Function<A, B> map) {
+ this.map = map;
+ this.baseIterator = baseIterator;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.baseIterator.hasNext();
+ }
+
+ @Override
+ public B next() {
+ return this.map.apply(this.baseIterator.next());
+ }
+ }
+}
\ No newline at end of file
[14/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
new file mode 100644
index 0000000..21c36cd
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
@@ -0,0 +1,67 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyValueMapTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends ValueMapTest {
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+ g.V.valueMap
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+ g.V.valueMap('name', 'age')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+ g.V(v1Id).out('created').valueMap
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends ValueMapTest {
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+ ComputerTestHelper.compute("g.V.valueMap", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+ ComputerTestHelper.compute("g.V.valueMap('name', 'age')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out('created').valueMap", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
new file mode 100644
index 0000000..2951c47
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
@@ -0,0 +1,293 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Direction
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyVertexTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends VertexTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V() {
+ g.V
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+ g.V(v1Id).out
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+ g.V(v2Id).in
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+ g.V(v4Id).both
+ }
+
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E() {
+ g.E
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+ g.V(v1Id).outE
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+ g.V(v2Id).inE
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+ g.V(v4Id).bothE
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+ g.V(v4Id).bothE('created')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+ g.V(v1Id).outE.inV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+ g.V(v2Id).inE.outV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+ g.V.outE.has('weight', 1.0d).outV
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+ g.V.out.outE.inV.inE.inV.both.name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+ g.V(v1Id).outE('knows').bothV.name
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+ g.V(v1Id).out('knows')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+ g.V(v1Id).out('knows', 'created')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+ g.V(v1Id).outE('knows').inV()
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+ g.V(v1Id).outE('knows', 'created').inV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_out_out() {
+ g.V().out().out()
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+ g.V(v1Id).out.out.out
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+ g.V(v1Id).out.name
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+ g.V(v1Id).outE.otherV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+ g.V(v4Id).bothE.otherV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
+ g.V(v4Id).bothE.has('weight', Compare.lt, 1.0d).otherV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+ g.V(v1Id).to(Direction.OUT, 'knows');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends VertexTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V() {
+ ComputerTestHelper.compute("g.V", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+ ComputerTestHelper.compute("g.V(${v2Id}).in", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).both", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E() {
+ ComputerTestHelper.compute("g.E", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+ ComputerTestHelper.compute("g.V(${v2Id}).inE", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).bothE", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).bothE('created')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE.inV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+ ComputerTestHelper.compute("g.V(${v2Id}).inE.outV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+ ComputerTestHelper.compute("g.V.outE.has('weight', 1.0d).outV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+ ComputerTestHelper.compute("g.V.out.outE.inV.inE.inV.both.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').bothV.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out('knows')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out('knows', 'created')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').inV()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows', 'created').inV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_out_out() {
+ ComputerTestHelper.compute("g.V().out().out()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.out.out", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE.otherV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).bothE.otherV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).bothE.has('weight', Compare.lt, 1.0d).otherV", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).to(Direction.OUT, 'knows')", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
new file mode 100644
index 0000000..e22d6af
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
@@ -0,0 +1,70 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAggregateTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends AggregateTest {
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+ g.V.name.aggregate('x').cap('x')
+ }
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+ g.V.aggregate('x').by('name').cap('x')
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+ g.V.out.aggregate('a').path;
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends AggregateTest {
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+ ComputerTestHelper.compute("g.V.name.aggregate('x').cap('x')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+ ComputerTestHelper.compute("g.V.aggregate('x').by('name').cap('x')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+ ComputerTestHelper.compute("g.V.out.aggregate('a').path", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
new file mode 100644
index 0000000..cba9f10
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
@@ -0,0 +1,126 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyGroupCountTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends GroupCountTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+ g.V.out('created').groupCount.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+ g.V.out('created').groupCount('a').by('name').cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+ g.V.out('created').name.groupCount
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+ g.V.out('created').name.groupCount('a').cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+ g.V.has('no').groupCount;
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+ g.V.has('no').groupCount('a').cap('a');
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+ g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+ g.V.union(
+ __.repeat(__.out).times(2).groupCount('m').by('lang'),
+ __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends GroupCountTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+ ComputerTestHelper.compute("g.V.out('created').groupCount.by('name')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+ ComputerTestHelper.compute("g.V.out('created').groupCount('a').by('name').cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+ ComputerTestHelper.compute("g.V.out('created').name.groupCount", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+ ComputerTestHelper.compute("g.V.out('created').name.groupCount('a').cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+ ComputerTestHelper.compute("g.V.has('no').groupCount", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+ ComputerTestHelper.compute("g.V.has('no').groupCount('a').cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+ ComputerTestHelper.compute("g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+ ComputerTestHelper.compute("""
+ g.V.union(
+ __.repeat(__.out).times(2).groupCount('m').by('lang'),
+ __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
+ """, g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
new file mode 100644
index 0000000..988ca17
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
@@ -0,0 +1,101 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyGroupTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends GroupTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+ g.V.group.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+ g.V.group('a').by('name').cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+ g.V.has('lang').group('a').by('lang').by('name').out.cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+ g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+ g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+ g.V.group.by(__.outE.count).by('name')
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends GroupTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+ ComputerTestHelper.compute("g.V.group.by('name')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+ ComputerTestHelper.compute("g.V.group('a').by('name').cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+ ComputerTestHelper.compute("g.V.has('lang').group('a').by('lang').by('name').out.cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+ ComputerTestHelper.compute("g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local))", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+ ComputerTestHelper.compute("g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+ ComputerTestHelper.compute("g.V.group.by(__.outE.count).by('name')", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
new file mode 100644
index 0000000..e56f652
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyInjectTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends InjectTest {
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
+ g.V(v1Id).out.inject(g.V(v2Id).next()).name
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
+ g.V(v1Id).out().name.inject('daniel').as('a').map { it.length() }.path
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends InjectTest {
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_VX1X_out_injectXv2X_name() {
+ super.g_VX1X_out_injectXv2X_name()
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
+ super.g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path()
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(Object v1Id, Object v2Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
new file mode 100644
index 0000000..41ca348
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
@@ -0,0 +1,93 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyProfileTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends ProfileTest {
+
+ @Override
+ Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+ g.V.out.out.profile();
+ }
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+ g.V.repeat(__.both()).times(3).profile();
+ }
+
+ @Override
+ Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ g.V().has(__.in("created").count().is(1l)).values("name").profile();
+ }
+
+ @org.junit.Ignore
+ @Override
+ void g_V_sleep_sleep_profile() {
+ }
+
+ @Override
+ Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+ return null
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends ProfileTest {
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+ ComputerTestHelper.compute("g.V.out.out.profile()", g);
+ }
+
+
+ @Override
+ public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+ ComputerTestHelper.compute("g.V.repeat(__.both()).times(3).profile()", g);
+ }
+
+ @Override
+ Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ ComputerTestHelper.compute(" g.V().has(__.in('created').count().is(1l)).values('name').profile()", g);
+ }
+
+ @Override
+ @org.junit.Ignore
+ void g_V_sleep_sleep_profile() {
+ }
+
+ @Override
+ Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+ return null
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
new file mode 100644
index 0000000..1ccdb85
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
@@ -0,0 +1,72 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.structure.Operator.sum
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySackTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SackTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+ g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()
+ }
+
+ @Override
+ public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+ g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack
+ }
+
+ @Override
+ public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+ g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SackTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+ ComputerTestHelper.compute("g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+ ComputerTestHelper.compute("g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+ ComputerTestHelper.compute("g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
new file mode 100644
index 0000000..c717b61
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
@@ -0,0 +1,64 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySideEffectCapTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SideEffectCapTest {
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+ g.V.has('age').groupCount('a').by('name').out.cap('a')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+ g.V.choose(__.has(T.label, 'person'),
+ __.age.groupCount('a'),
+ __.values("name").groupCount('b')).cap('a', 'b')
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SideEffectCapTest {
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+ ComputerTestHelper.compute("g.V.has('age').groupCount('a').by('name').out.cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+ ComputerTestHelper.compute("""
+ g.V.choose(__.has(T.label, 'person'),
+ __.age.groupCount('a'),
+ __.values("name").groupCount('b')).cap('a', 'b')
+ """, g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
new file mode 100644
index 0000000..8e18716
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
@@ -0,0 +1,56 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySideEffectTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SideEffectTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
+ g.V(v1Id).withSideEffect('a') { [] }.sideEffect {
+ it.sideEffects('a').clear();
+ it.sideEffects('a').add(it.get());
+ }.name;
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
+ g.V(v1Id).withSideEffect('c') { [0] }.out.sideEffect {
+ def temp = it.sideEffects('c')[0];
+ it.sideEffects('c').clear();
+ it.sideEffects('c').add(temp + 1);
+ }.name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
+ g.V(v1Id).out().sideEffect {}.name
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
new file mode 100644
index 0000000..5e31723
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
@@ -0,0 +1,83 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyStoreTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends StoreTest {
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+ g.V().store('a').by('name').out().cap('a');
+ }
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
+ final Object v1Id) {
+ g.V(v1Id).store('a').by('name').out().store('a').by('name').name.cap('a');
+ }
+
+ @Override
+ public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+ g.V.withSideEffect('a') { [] as Set }.both.name.store('a').cap('a')
+ }
+
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+ g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends StoreTest {
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+ ComputerTestHelper.compute("g.V().store('a').by('name').out().cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
+ final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).store('a').by('name').out().store('a').by('name').name.cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+ ComputerTestHelper.compute("g.V.withSideEffect('a'){[] as Set}.both.name.store('a').cap('a')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+ ComputerTestHelper.compute("g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a')", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
new file mode 100644
index 0000000..a7c00ee
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
@@ -0,0 +1,48 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Graph
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySubgraphTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SubgraphTest {
+
+ @Override
+ public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(
+ final Object v1Id, final Graph subgraph) {
+ g.V(v1Id).withSideEffect('sg') { subgraph }.outE('knows').subgraph('sg').name.cap('sg')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(
+ final Graph subgraph) {
+ g.V.withSideEffect('sg') { subgraph }.repeat(__.bothE('created').subgraph('sg').outV).times(5).name.dedup
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
new file mode 100644
index 0000000..5bd5bff
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
@@ -0,0 +1,109 @@
+/*
+ * 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.step.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyTreeTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends TreeTest {
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+ g.V.out.out.tree.by(T.id);
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+ g.V.out.out.tree('a').by(T.id).cap('a');
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
+ g.V(v1Id).out.out.tree.by('name');
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
+ g.V(v1Id).out.out.tree('a').by('name').both.both.cap('a');
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+ g.V.out.out.tree();
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+ g.V.out.out.tree('a').cap('a');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends TreeTest {
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+ ComputerTestHelper.compute("g.V.out.out.tree.by(id)", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+ ComputerTestHelper.compute("g.V.out.out.tree('a').by(id).cap('a')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+ ComputerTestHelper.compute("g.V.out.out.tree()", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+ ComputerTestHelper.compute("g.V.out.out.tree('a').cap('a')", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_VX1X_out_out_tree_byXnameX() {
+
+ }
+
+ @Override
+ Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(Object v1Id) {
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(Object v1Id) {
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
index ba592c3..5378141 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
@@ -27,7 +27,7 @@ import com.carrotsearch.junitbenchmarks.annotation.LabelType;
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.structure.Compare;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
index 7488e6c..4be3f98 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
@@ -25,8 +25,8 @@ import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.groovy.DefaultImportCustomizerProvider;
import org.apache.tinkerpop.gremlin.groovy.NoImportCustomizerProvider;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.util.config.YamlConfiguration;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index 57288bd..6279643 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@ -24,49 +24,49 @@ import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
import org.apache.tinkerpop.gremlin.groovy.util.SugarTestHelper;
import org.apache.tinkerpop.gremlin.process.computer.GroovyGraphComputerTest;
import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyBranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyLocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyRepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyUnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyAndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyDedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyFilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyIsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyOrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyWhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyBackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyFoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyOrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyUnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyAggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyStoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyTreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyBranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyLocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyRepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyUnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyAndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyWhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyBackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyFoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyUnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyAggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyStoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyTreeTest;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
index ebb7b40..56fbf6a 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
@@ -22,56 +22,56 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.GraphManager;
import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
import org.apache.tinkerpop.gremlin.groovy.util.SugarTestHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyBranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyLocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyRepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyUnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyAndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyDedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyFilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyIsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyOrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyWhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddEdgeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyBackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyFoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyOrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyUnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyAggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyStoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySubgraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyTreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyBranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyLocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyRepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyUnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyAndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyWhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyBackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyFoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyUnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyAggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyStoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyTreeTest;
import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
index 3f20a2a..580c87d 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.groovy.function.GComparator
import org.apache.tinkerpop.gremlin.groovy.function.GFunction
import org.apache.tinkerpop.gremlin.groovy.function.GSupplier
import org.apache.tinkerpop.gremlin.groovy.function.GUnaryOperator
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
index 6ebae15..41878a2 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.groovy.loaders
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.Traverser
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper
import org.apache.tinkerpop.gremlin.structure.*
import org.apache.tinkerpop.gremlin.structure.util.StringFactory
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 0055aa4..da9b2a0 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -24,20 +24,20 @@ import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.algorithm.generator.AbstractGenerator;
import org.apache.tinkerpop.gremlin.groovy.function.GFunction;
import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Compare;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Direction;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
index 87c7a61..9b55c4a 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.server.Context;
import org.apache.tinkerpop.gremlin.server.GremlinServer;
import org.apache.tinkerpop.gremlin.server.OpProcessor;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
index 306f6d3..277e50e 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
@@ -24,14 +24,13 @@ import org.apache.tinkerpop.gremlin.driver.ResultSet;
import org.apache.tinkerpop.gremlin.driver.Tokens;
import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.driver.message.ResponseStatus;
import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
import org.apache.tinkerpop.gremlin.driver.simple.NioClient;
import org.apache.tinkerpop.gremlin.driver.simple.SimpleClient;
import org.apache.tinkerpop.gremlin.driver.simple.WebSocketClient;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.server.channel.NioChannelizer;
import org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor;
import org.junit.Rule;
[28/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
new file mode 100644
index 0000000..ab364d8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
@@ -0,0 +1,45 @@
+/*
+ * 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.step.filter;
+
+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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FilterStep<S> extends AbstractStep<S, S> {
+
+ public FilterStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() {
+ while (true) {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ if (this.filter(traverser)) {
+ return traverser;
+ }
+ }
+ }
+
+ protected abstract boolean filter(final Traverser.Admin<S> traverser);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
new file mode 100644
index 0000000..3efbe5b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
@@ -0,0 +1,69 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder { // TODO: make final when graph strategies are fixed up
+
+ private final HasContainer hasContainer;
+
+ public HasStep(final Traversal.Admin traversal, final HasContainer hasContainer) {
+ super(traversal);
+ this.hasContainer = hasContainer;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return this.hasContainer.test(traverser.get());
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.hasContainer);
+ }
+
+ @Override
+ public List<HasContainer> getHasContainers() {
+ return Collections.singletonList(this.hasContainer);
+ }
+
+ @Override
+ public void addHasContainer(final HasContainer hasContainer) {
+ throw new UnsupportedOperationException(this.getClass().getSimpleName() + " does not support adding new HasContainers");
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
new file mode 100644
index 0000000..4cdfc8f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.step.filter;
+
+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;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class HasTraversalStep<S> extends AbstractStep<S, S> implements TraversalParent {
+
+ private Traversal.Admin<S, ?> hasTraversal;
+ private final boolean negate;
+
+ public HasTraversalStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> hasTraversal, final boolean negate) {
+ super(traversal);
+ this.negate = negate;
+ this.hasTraversal = this.integrateChild(hasTraversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ while (true) {
+ final Traverser.Admin<S> start = this.starts.next();
+ if (TraversalUtil.test(start, this.hasTraversal) != this.negate)
+ return start;
+ }
+ }
+
+ @Override
+ public String toString() {
+ final String stepString = TraversalHelper.makeStepString(this, this.hasTraversal);
+ return this.negate ? stepString.replaceFirst("\\(", "(!") : stepString;
+ }
+
+ @Override
+ public List<Traversal<S, ?>> getLocalChildren() {
+ return Collections.singletonList(this.hasTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements();
+ }
+
+ @Override
+ public HasTraversalStep<S> clone() {
+ final HasTraversalStep<S> clone = (HasTraversalStep<S>) super.clone();
+ clone.hasTraversal = clone.integrateChild(this.hasTraversal.clone());
+ return clone;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
new file mode 100644
index 0000000..0f33178
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
@@ -0,0 +1,66 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class IsStep<S> extends FilterStep<S> {
+
+ private final Object value;
+ private final BiPredicate<S, Object> biPredicate;
+
+ public IsStep(final Traversal.Admin traversal, final BiPredicate<S, Object> biPredicate, final Object value) {
+ super(traversal);
+ this.value = value;
+ this.biPredicate = biPredicate;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return this.biPredicate.test(traverser.get(), this.value);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.biPredicate, this.value);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public BiPredicate<S, Object> getPredicate() {
+ return biPredicate;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
new file mode 100644
index 0000000..0036733
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Predicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaFilterStep<S> extends FilterStep<S> {
+
+ private final Predicate<Traverser<S>> predicate;
+
+ public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
+ super(traversal);
+ this.predicate = predicate;
+ }
+
+ public Predicate<Traverser<S>> getPredicate() {
+ return predicate;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return this.predicate.test(traverser);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this,this.predicate);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
new file mode 100644
index 0000000..9f2dec8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrStep<S> extends ConjunctionStep<S> implements TraversalParent {
+
+ public OrStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... orTraversals) {
+ super(traversal, orTraversals);
+
+ }
+
+ public static final class OrMarker<S> extends ConjunctionMarker<S> {
+ public OrMarker(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
new file mode 100644
index 0000000..72e92ef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -0,0 +1,113 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging {
+
+ private final long low;
+ private final long high;
+ private AtomicLong counter = new AtomicLong(0l);
+
+ public RangeGlobalStep(final Traversal.Admin traversal, final long low, final long high) {
+ super(traversal);
+ if (low != -1 && high != -1 && low > high) {
+ throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
+ }
+ this.low = low;
+ this.high = high;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ if (this.high != -1 && this.counter.get() >= this.high) {
+ throw FastNoSuchElementException.instance();
+ }
+
+ long avail = traverser.bulk();
+ if (this.counter.get() + avail <= this.low) {
+ // Will not surpass the low w/ this traverser. Skip and filter the whole thing.
+ this.counter.getAndAdd(avail);
+ return false;
+ }
+
+ // Skip for the low and trim for the high. Both can happen at once.
+
+ long toSkip = 0;
+ if (this.counter.get() < this.low) {
+ toSkip = this.low - this.counter.get();
+ }
+
+ long toTrim = 0;
+ if (this.high != -1 && this.counter.get() + avail >= this.high) {
+ toTrim = this.counter.get() + avail - this.high;
+ }
+
+ long toEmit = avail - toSkip - toTrim;
+ this.counter.getAndAdd(toSkip + toEmit);
+ traverser.asAdmin().setBulk(toEmit);
+
+ return true;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.counter.set(0l);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.low, this.high);
+ }
+
+ public long getLowRange() {
+ return this.low;
+ }
+
+ public long getHighRange() {
+ return this.high;
+ }
+
+ @Override
+ public RangeGlobalStep<S> clone() {
+ final RangeGlobalStep<S> clone = (RangeGlobalStep<S>) super.clone();
+ clone.counter = new AtomicLong(0l);
+ return clone;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.BULK);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
new file mode 100644
index 0000000..bc217d3
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
@@ -0,0 +1,97 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RetainStep<S> extends FilterStep<S> {
+
+ private final String sideEffectKeyOrPathLabel;
+ private final Collection<S> retainCollection;
+ private final S retainObject;
+ private final short choice;
+
+ public RetainStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
+ this.retainCollection = null;
+ this.retainObject = null;
+ this.choice = 0;
+ }
+
+ public RetainStep(final Traversal.Admin traversal, final Collection<S> retainCollection) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = null;
+ this.retainCollection = retainCollection;
+ this.retainObject = null;
+ this.choice = 1;
+ }
+
+ public RetainStep(final Traversal.Admin traversal, final S retainObject) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = null;
+ this.retainCollection = null;
+ this.retainObject = retainObject;
+ this.choice = 2;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ switch (this.choice) {
+ case 0: {
+ final Object retain = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
+ traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
+ traverser.path(this.sideEffectKeyOrPathLabel);
+ return retain instanceof Collection ?
+ ((Collection) retain).contains(traverser.get()) :
+ retain.equals(traverser.get());
+ }
+ case 1:
+ return this.retainCollection.contains(traverser.get());
+ default:
+ return this.retainObject.equals(traverser.get());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return null == this.sideEffectKeyOrPathLabel ?
+ Collections.singleton(TraverserRequirement.OBJECT) :
+ Stream.of(TraverserRequirement.OBJECT,
+ TraverserRequirement.SIDE_EFFECTS,
+ TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
new file mode 100644
index 0000000..5817f37
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
@@ -0,0 +1,117 @@
+/*
+ * 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.step.filter;
+
+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.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SampleGlobalStep<S> extends CollectingBarrierStep<S> implements TraversalParent {
+
+ private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
+ private final int amountToSample;
+ private static final Random RANDOM = new Random();
+
+ public SampleGlobalStep(final Traversal.Admin traversal, final int amountToSample) {
+ super(traversal);
+ this.amountToSample = amountToSample;
+ }
+
+ @Override
+ public List<Traversal.Admin<S, Number>> getLocalChildren() {
+ return Collections.singletonList(this.probabilityTraversal);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> probabilityTraversal) {
+ this.probabilityTraversal = this.integrateChild(probabilityTraversal);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.amountToSample, this.probabilityTraversal);
+ }
+
+ @Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ // return the entire traverser set if the set is smaller than the amount to sample
+ if (traverserSet.bulkSize() <= this.amountToSample)
+ return;
+ //////////////// else sample the set
+ double totalWeight = 0.0d;
+ for (final Traverser<S> s : traverserSet) {
+ totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
+ }
+ ///////
+ final TraverserSet<S> sampledSet = new TraverserSet<>();
+ int runningAmountToSample = 0;
+ while (runningAmountToSample < this.amountToSample) {
+ boolean reSample = false;
+ double runningWeight = 0.0d;
+ for (final Traverser.Admin<S> s : traverserSet) {
+ long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
+ if (sampleBulk < s.bulk()) {
+ final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
+ for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
+ runningWeight = runningWeight + currentWeight;
+ if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
+ final Traverser.Admin<S> split = s.asAdmin().split();
+ split.asAdmin().setBulk(1l);
+ sampledSet.add(split);
+ runningAmountToSample++;
+ totalWeight = totalWeight - currentWeight;
+ reSample = true;
+ break;
+ }
+ }
+ if (reSample || (runningAmountToSample >= this.amountToSample))
+ break;
+ }
+ }
+ }
+ traverserSet.clear();
+ traverserSet.addAll(sampledSet);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+ }
+
+ @Override
+ public SampleGlobalStep<S> clone() {
+ final SampleGlobalStep<S> clone = (SampleGlobalStep<S>) super.clone();
+ clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone());
+ return clone;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
new file mode 100644
index 0000000..5789803
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.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.step.filter;
+
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SimplePathStep<S> extends FilterStep<S> {
+
+ public SimplePathStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return traverser.path().isSimple();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
new file mode 100644
index 0000000..c0e5f28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Randall Barnhart (random pi)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public final class TimeLimitStep<S> extends FilterStep<S> {
+
+ private AtomicLong startTime = new AtomicLong(-1);
+ private final long timeLimit;
+ private AtomicBoolean timedOut = new AtomicBoolean(false);
+
+
+ public TimeLimitStep(final Traversal.Admin traversal, final long timeLimit) {
+ super(traversal);
+ this.timeLimit = timeLimit;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ if (this.startTime.get() == -1l)
+ this.startTime.set(System.currentTimeMillis());
+ if ((System.currentTimeMillis() - this.startTime.get()) >= this.timeLimit) {
+ this.timedOut.set(true);
+ throw FastNoSuchElementException.instance();
+ }
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.timeLimit);
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.startTime.set(-1l);
+ this.timedOut.set(false);
+ }
+
+ public boolean getTimedOut() {
+ return this.timedOut.get();
+ }
+
+ @Override
+ public TimeLimitStep<S> clone() {
+ final TimeLimitStep<S> clone = (TimeLimitStep<S>) super.clone();
+ clone.timedOut = new AtomicBoolean(this.timedOut.get());
+ clone.startTime = new AtomicLong(this.startTime.get());
+ return clone;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
new file mode 100644
index 0000000..14c541a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -0,0 +1,132 @@
+/*
+ * 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.step.filter;
+
+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.util.MarkerIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class WhereStep<E> extends FilterStep<Map<String, E>> implements TraversalParent {
+
+ private final String firstKey;
+ private final String secondKey;
+ private final BiPredicate biPredicate;
+ private Traversal.Admin constraint;
+
+
+ public WhereStep(final Traversal.Admin traversal, final String firstKey, final String secondKey, final BiPredicate<E, E> biPredicate) {
+ super(traversal);
+ this.firstKey = firstKey;
+ this.secondKey = secondKey;
+ this.biPredicate = biPredicate;
+ this.constraint = null;
+ }
+
+ public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
+ super(traversal);
+ this.firstKey = null;
+ this.secondKey = null;
+ this.biPredicate = null;
+ this.constraint = this.integrateChild(constraint);
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
+ if (null == this.constraint) {
+ final Map<String, E> map = traverser.get();
+ if (!map.containsKey(this.firstKey))
+ throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
+ if (!map.containsKey(this.secondKey))
+ throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
+ return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
+ } else {
+ final Step<?, ?> startStep = this.constraint.getStartStep();
+ Step<?, ?> endStep = this.constraint.getEndStep();
+ if (endStep instanceof MarkerIdentityStep) // DAH!
+ endStep = endStep.getPreviousStep();
+
+ final Map<String, E> map = traverser.get();
+ if (!map.containsKey(startStep.getLabel().get()))
+ throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabel().get());
+ final Object startObject = map.get(startStep.getLabel().get());
+ final Object endObject;
+ if (endStep.getLabel().isPresent()) {
+ if (!map.containsKey(endStep.getLabel().get()))
+ throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabel().get());
+ endObject = map.get(endStep.getLabel().get());
+ } else
+ endObject = null;
+
+ startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
+ if (null == endObject) {
+ if (this.constraint.hasNext()) {
+ this.constraint.reset();
+ return true;
+ } else {
+ return false;
+ }
+
+ } else {
+ while (this.constraint.hasNext()) {
+ if (this.constraint.next().equals(endObject)) {
+ this.constraint.reset();
+ return true;
+ }
+ }
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public List<Traversal.Admin> getLocalChildren() {
+ return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
+ }
+
+ @Override
+ public WhereStep<E> clone() {
+ final WhereStep<E> clone = (WhereStep<E>) super.clone();
+ if (null != this.constraint)
+ clone.constraint = clone.integrateChild(this.constraint.clone());
+ return clone;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
new file mode 100644
index 0000000..9671f34
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddEdgeByPathStep extends MapStep<Vertex, Edge> implements Mutating {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.PATH,
+ TraverserRequirement.OBJECT
+ );
+
+ // TODO: Weight key based on Traverser.getCount() ?
+
+ private final Direction direction;
+ private final String edgeLabel;
+ private final String stepLabel;
+ private final Object[] keyValues;
+
+ public AddEdgeByPathStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final String stepLabel, final Object... keyValues) {
+ super(traversal);
+ this.direction = direction;
+ if (this.direction.equals(Direction.BOTH))
+ throw new IllegalArgumentException("Only in- and out- directions are supported by " + AddEdgeByPathStep.class.getSimpleName());
+ this.edgeLabel = edgeLabel;
+ this.stepLabel = stepLabel;
+ this.keyValues = keyValues;
+ }
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ public String getEdgeLabel() {
+ return edgeLabel;
+ }
+
+ public String getStepLabel() {
+ return stepLabel;
+ }
+
+ public Object[] getKeyValues() {
+ return keyValues;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.direction.name(), this.edgeLabel, this.stepLabel);
+ }
+
+ @Override
+ protected Edge map(Traverser.Admin<Vertex> traverser) {
+ final Vertex currentVertex = traverser.get();
+ final Vertex otherVertex = traverser.path().get(this.stepLabel);
+ if (this.direction.equals(Direction.IN))
+ return otherVertex.addEdge(this.edgeLabel, currentVertex, this.keyValues);
+ else
+ return currentVertex.addEdge(this.edgeLabel, otherVertex, this.keyValues);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
new file mode 100644
index 0000000..e96c65f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddEdgeStep extends FlatMapStep<Vertex, Edge> implements Mutating {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+ private final String edgeLabel;
+ private final Object[] keyValues;
+ private final List<Vertex> vertices;
+ private final Direction direction;
+
+ public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Vertex vertex, final Object... keyValues) {
+ this(traversal, direction, edgeLabel, IteratorUtils.of(vertex), keyValues);
+ }
+
+ public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Iterator<Vertex> vertices, final Object... keyValues) {
+ super(traversal);
+ this.direction = direction;
+ this.edgeLabel = edgeLabel;
+ this.vertices = IteratorUtils.list(vertices);
+ this.keyValues = keyValues;
+ }
+
+ public Direction getDirection() {
+ return direction;
+ }
+
+ public String getEdgeLabel() {
+ return edgeLabel;
+ }
+
+ public Object[] getKeyValues() {
+ return keyValues;
+ }
+
+ public List<Vertex> getVertices() {
+ return vertices;
+ }
+
+ @Override
+ protected Iterator<Edge> flatMap(final Traverser.Admin<Vertex> traverser) {
+ return IteratorUtils.map(this.vertices.iterator(), this.direction.equals(Direction.OUT) ?
+ vertex -> traverser.get().addEdge(this.edgeLabel, vertex, this.keyValues) :
+ vertex -> vertex.addEdge(this.edgeLabel, traverser.get(), this.keyValues));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
new file mode 100644
index 0000000..2f90ea1
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
@@ -0,0 +1,53 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> implements Mutating {
+
+ private final Object[] keyValues;
+ private boolean first = true;
+
+ public AddVertexStartStep(final Traversal.Admin traversal, final Object... keyValues) {
+ super(traversal);
+ this.keyValues = keyValues;
+ }
+
+ public Object[] getKeyValues() {
+ return keyValues;
+ }
+
+ @Override
+ protected Traverser<Vertex> processNextStart() {
+ if (this.first) {
+ this.first = false;
+ return this.getTraversal().getTraverserGenerator().generate(this.getTraversal().getGraph().get().addVertex(this.keyValues), this, 1l);
+ } else
+ throw FastNoSuchElementException.instance();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
new file mode 100644
index 0000000..0632f87
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
@@ -0,0 +1,49 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddVertexStep<S> extends MapStep<S, Vertex> implements Mutating {
+
+ private final Object[] keyValues;
+ private final transient Graph graph;
+
+ public AddVertexStep(final Traversal.Admin traversal, final Object... keyValues) {
+ super(traversal);
+ this.keyValues = keyValues;
+ this.graph = this.getTraversal().getGraph().get();
+ }
+
+ public Object[] getKeyValues() {
+ return keyValues;
+ }
+
+ @Override
+ protected Vertex map(final Traverser.Admin<S> traverser) {
+ return this.graph.addVertex(this.keyValues);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
new file mode 100644
index 0000000..9d683df
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
@@ -0,0 +1,64 @@
+/*
+ * 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.step.map;
+
+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.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class BackStep<S, E> extends MapStep<S, E> implements EngineDependent {
+
+ private final String stepLabel;
+ private boolean requiresPaths = false;
+
+ public BackStep(final Traversal.Admin traversal, final String stepLabel) {
+ super(traversal);
+ this.stepLabel = stepLabel;
+ }
+
+ @Override
+ protected E map(final Traverser.Admin<S> traverser) {
+ return traverser.path(this.stepLabel);
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ this.requiresPaths = traversalEngine.isComputer();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ //return this.requiresPaths ? Collections.singleton(TraverserRequirement.PATH) : Collections.singleton(TraverserRequirement.PATH_ACCESS);
+ return Collections.singleton(TraverserRequirement.PATH); // TODO: if the traversal isn't nested, path access works
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.stepLabel);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
new file mode 100644
index 0000000..a0a8d7f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements TraversalParent {
+
+ private List<Traversal.Admin<S, E>> coalesceTraversals;
+
+ @SafeVarargs
+ public CoalesceStep(final Traversal.Admin traversal, final Traversal.Admin<S, E>... coalesceTraversals) {
+ super(traversal);
+ this.coalesceTraversals = Arrays.asList(coalesceTraversals);
+ for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
+ this.integrateChild(conjunctionTraversal);
+ }
+ }
+
+ @Override
+ protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+ for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) {
+ coalesceTraversal.reset();
+ coalesceTraversal.addStart(traverser.asAdmin().split());
+ if (coalesceTraversal.hasNext())
+ return coalesceTraversal;
+ }
+ return EmptyIterator.instance();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements();
+ }
+
+ @Override
+ public List<Traversal.Admin<S, E>> getLocalChildren() {
+ return Collections.unmodifiableList(this.coalesceTraversals);
+ }
+
+ @Override
+ public CoalesceStep<S, E> clone() {
+ final CoalesceStep<S, E> clone = (CoalesceStep<S, E>) super.clone();
+ clone.coalesceTraversals = new ArrayList<>();
+ for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
+ clone.coalesceTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.coalesceTraversals);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
new file mode 100644
index 0000000..cb7ede4
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
@@ -0,0 +1,134 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
+
+ public CountGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ this.setSeedSupplier(new ConstantSupplier<>(0L));
+ this.setBiFunction(CountBiFunction.<S>instance());
+ }
+
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
+ return CountGlobalMapReduce.instance();
+ }
+
+ ///////////
+
+ private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
+
+ private static final CountBiFunction INSTANCE = new CountBiFunction();
+
+ private CountBiFunction() {
+
+ }
+
+ @Override
+ public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
+ return mutatingSeed + traverser.bulk();
+ }
+
+ public final static <S> CountBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////////
+
+ private static class CountGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> {
+
+ private static CountGlobalMapReduce INSTANCE = new CountGlobalMapReduce();
+
+ private CountGlobalMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final MapReduce.Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Long> emitter) {
+ vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.bulk())));
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
+ this.reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
+ long count = 0l;
+ while (values.hasNext()) {
+ count = count + values.next();
+ }
+ emitter.emit(count);
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return REDUCING;
+ }
+
+ @Override
+ public Long generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
+ return keyValues.hasNext() ? keyValues.next().getValue() : 0L;
+ }
+
+ public static final CountGlobalMapReduce instance() {
+ return INSTANCE;
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
new file mode 100644
index 0000000..8c6dc9d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class CountLocalStep<S> extends MapStep<S, Long> {
+
+ public CountLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Long map(final Traverser.Admin<S> traverser) {
+ final S item = traverser.get();
+ return (item instanceof Collection) ? ((Collection) item).size()
+ : (item instanceof Map) ? ((Map) item).size() : 1L;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
new file mode 100644
index 0000000..59c66c7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class DedupLocalStep<E, S extends Iterable<E>> extends MapStep<S, Set<E>> {
+
+ public DedupLocalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Set<E> map(final Traverser.Admin<S> traverser) {
+ final Set<E> result = new LinkedHashSet<>();
+ for (final E item : traverser.get()) {
+ result.add(item);
+ }
+ return result;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
new file mode 100644
index 0000000..411737c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
@@ -0,0 +1,58 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EdgeOtherVertexStep extends MapStep<Edge, Vertex> {
+
+ public EdgeOtherVertexStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Vertex map(final Traverser.Admin<Edge> traverser) {
+ final List<Object> objects = traverser.path().objects();
+ for (int i = objects.size() - 2; i >= 0; i--) {
+ if (objects.get(i) instanceof Vertex) {
+ return ElementHelper.areEqual((Vertex) objects.get(i), traverser.get().outVertex()) ?
+ traverser.get().inVertex() :
+ traverser.get().outVertex();
+ }
+ }
+ throw new IllegalStateException("The path history of the traverser does not contain a previous vertex: " + traverser.path());
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
new file mode 100644
index 0000000..4783e25
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
@@ -0,0 +1,67 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EdgeVertexStep extends FlatMapStep<Edge, Vertex> {
+
+ private Direction direction;
+
+ public EdgeVertexStep(final Traversal.Admin traversal, final Direction direction) {
+ super(traversal);
+ this.direction = direction;
+ }
+
+ @Override
+ protected Iterator<Vertex> flatMap(final Traverser.Admin<Edge> traverser) {
+ return traverser.get().vertices(this.direction);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.direction);
+ }
+
+ public Direction getDirection() {
+ return this.direction;
+ }
+
+ public void reverseDirection() {
+ this.direction = this.direction.opposite();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.OBJECT);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
new file mode 100644
index 0000000..eb111c8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.step.map;
+
+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;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
+
+ private Traverser.Admin<S> head = null;
+ private Iterator<E> iterator = EmptyIterator.instance();
+
+ public FlatMapStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<E> processNextStart() {
+ while (true) {
+ if (this.iterator.hasNext()) {
+ return this.head.split(this.iterator.next(), this);
+ } else {
+ this.head = this.starts.next();
+ this.iterator = this.flatMap(this.head);
+ }
+ }
+ }
+
+ protected abstract Iterator<E> flatMap(final Traverser.Admin<S> traverser);
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.iterator = EmptyIterator.instance();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
new file mode 100644
index 0000000..27580a9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
@@ -0,0 +1,93 @@
+/*
+ * 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.step.map;
+
+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.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+ public FoldStep(final Traversal.Admin traversal) {
+ this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
+ }
+
+ public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
+ super(traversal);
+ this.setSeedSupplier(seed);
+ this.setBiFunction(new FoldBiFunction<>(foldFunction));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ /////////
+
+ private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
+
+ private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
+
+ private ArrayListBiFunction() {
+
+ }
+
+ @Override
+ public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
+ mutatingSeed.add(traverser);
+ return mutatingSeed;
+ }
+
+ public final static <S> ArrayListBiFunction<S> instance() {
+ return INSTANCE;
+ }
+ }
+
+ ///////
+
+ public static class FoldBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
+
+ private final BiFunction<E, S, E> biFunction;
+
+ public FoldBiFunction(final BiFunction<E, S, E> biFunction) {
+ this.biFunction = biFunction;
+ }
+
+ @Override
+ public E apply(final E seed, final Traverser<S> traverser) {
+ return this.biFunction.apply(seed, traverser.get());
+ }
+
+ }
+}
[19/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
index aa9b8b4..fbbcb4a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.structure.util;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
index e7df760..a6a20f5 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.junit.Test;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
index ffed272..321f201 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.junit.Test;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
index 341795e..6ed1e90 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.junit.Test;
import static org.junit.Assert.assertFalse;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
index 1230934..1ee3c5c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.junit.Test;
import java.util.ArrayList;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
index 7e5726e..5677fec 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.util.iterator;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.junit.Test;
import java.util.Iterator;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
index a310096..67594e7 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
@@ -59,7 +59,7 @@ public enum ResponseStatusCode {
SERVER_ERROR(500),
/**
- * The remote {@link org.apache.tinkerpop.gremlin.process.Traversal} submitted for processing evaluated in on the
+ * The remote {@link org.apache.tinkerpop.gremlin.process.traversal.Traversal} submitted for processing evaluated in on the
* server with errors and could not be processed.
*/
SERVER_ERROR_TRAVERSAL_EVALUATION(596),
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
index 8d481fc..1403c98 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Compare;
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/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
index a385cb5..85c669e 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Compare;
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/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
index b50a18d..15eb158 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Compare;
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/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
deleted file mode 100644
index 1414a67..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
+++ /dev/null
@@ -1,45 +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
-
-import org.apache.tinkerpop.gremlin.process.computer.ComputerResult
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.structure.Graph
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class ComputerTestHelper {
-
- public static final Traversal compute(
- final Graph graph,
- final TraversalSource.Builder builder,
- final String scriptEngineName,
- final String traversalScript) {
-
- final TraversalVertexProgram program = TraversalVertexProgram.build().traversal(graph.getClass(), builder, scriptEngineName, traversalScript).create();
- final ComputerResult result = builder.create(graph).getGraphComputer().get().program(program).submit().get();
- return program.computerResultTraversal(result);
- }
-
- public static final Traversal compute(final String script, final GraphTraversalSource g) {
- return ComputerTestHelper.compute(g.getGraph().get(), g.asBuilder(), "gremlin-groovy", script);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
new file mode 100644
index 0000000..f62ad8c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
@@ -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.computer
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.structure.Graph
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ComputerTestHelper {
+
+ public static final Traversal compute(
+ final Graph graph,
+ final TraversalSource.Builder builder,
+ final String scriptEngineName,
+ final String traversalScript) {
+
+ final TraversalVertexProgram program = TraversalVertexProgram.build().traversal(graph.getClass(), builder, scriptEngineName, traversalScript).create();
+ final ComputerResult result = builder.create(graph).getGraphComputer().get().program(program).submit().get();
+ return program.computerResultTraversal(result);
+ }
+
+ public static final Traversal compute(final String script, final GraphTraversalSource g) {
+ return ComputerTestHelper.compute(g.getGraph().get(), g.asBuilder(), "gremlin-groovy", script);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
deleted file mode 100644
index 926fdeb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyBranchTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends BranchTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
- g.V.branch(__.label.is('person').count)
- .option(1L, __.age)
- .option(0L, __.lang)
- .option(0L, __.name)
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
- g.V.branch(__.label)
- .option('person', __.age)
- .option('software', __.lang)
- .option('software', __.name);
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends BranchTest {
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
- super.g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
- ComputerTestHelper.compute("g.V.branch(__.label.is('person').count).option(1L, __.age).option(0L, __.lang).option(0L,__.name)", g);
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
- ComputerTestHelper.compute("""
- g.V.branch(__.label)
- .option('person', __.age)
- .option('software', __.lang)
- .option('software', __.name)
- """, g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
deleted file mode 100644
index 4f44727..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
+++ /dev/null
@@ -1,51 +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.graph.traversal.step.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class GroovyChooseTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends ChooseTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
- g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends ChooseTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
- ComputerTestHelper.compute("g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
deleted file mode 100644
index cf41776..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
+++ /dev/null
@@ -1,146 +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.graph.traversal.step.branch
-
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyLocalTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends LocalTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
- g.V.local(__.properties('location').order.by(T.value, Order.incr).limit(2)).value
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
- g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
- g.V.local(__.outE.count());
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
- g.V(v1Id).local(__.outE('knows').limit(1)).inV.name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
- g.V().local(__.bothE('created').limit(1)).otherV.name
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
- g.V(v4Id).local(__.bothE('created').limit(1))
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
- g.V(v4Id).local(__.bothE('knows', 'created').limit(1))
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
- g.V(v4Id).local(__.bothE.limit(1)).otherV.name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
- g.V(v4Id).local(__.bothE.limit(2).otherV).name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
- g.V().inE('knows').local(__.limit(2).outV).name
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends LocalTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
- ComputerTestHelper.compute("g.V.local(__.properties('location').order.by(T.value,Order.incr).limit(2)).value", g);
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
- ComputerTestHelper.compute("g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)", g);
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
- ComputerTestHelper.compute("g.V.local(__.outE.count())", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).local(__.outE('knows').limit(1)).inV.name", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
- ComputerTestHelper.compute("g.V().local(__.bothE('created').limit(1)).otherV.name", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('created').limit(1))", g);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('knows', 'created').limit(1))", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(1)).otherV.name", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
- ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(2)).otherV.name", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
- ComputerTestHelper.compute("g.V().local(__.inE('knows').limit(2).outV).name", g);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
deleted file mode 100644
index e5bf7df..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
+++ /dev/null
@@ -1,134 +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.graph.traversal.step.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRepeatTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends RepeatTest {
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
- g.V.repeat(__.out).times(2).emit.path
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
- g.V.repeat(__.out).times(2).repeat(__.in).times(2).name
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
- g.V.repeat(__.out).times(2)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
- g.V.repeat(__.out).times(2).emit;
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
- g.V(v1Id).times(2).repeat(__.out).name
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
- g.V.emit.repeat(__.out).times(2).path
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
- g.V.emit.times(2).repeat(__.out).path
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
- g.V(v1Id).emit(has(T.label, 'person')).repeat(__.out).name
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
- g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends RepeatTest {
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
- ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit.path", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
- ComputerTestHelper.compute("g.V.repeat(__.out).times(2).repeat(__.in).times(2).name", g)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
- ComputerTestHelper.compute("g.V.repeat(__.out).times(2)", g)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
- ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).times(2).repeat(__.out).name", g)
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
- ComputerTestHelper.compute("g.V.emit.repeat(__.out).times(2).path", g)
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
- ComputerTestHelper.compute("g.V.emit.times(2).repeat(__.out).path", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).emit(has(T.label, 'person')).repeat(__.out).name", g)
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
- ComputerTestHelper.compute("g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
deleted file mode 100644
index 12d125d..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
+++ /dev/null
@@ -1,111 +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.graph.traversal.step.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyUnionTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends UnionTest {
-
- public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
- g.V.union(__.out, __.in).name
- }
-
- public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
- g.V(v1Id).union(repeat(__.out).times(2), __.out).name
- }
-
- public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
- g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)
- }
-
- public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
- g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount
- }
-
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
- g.V.union(
- repeat(union(
- out('created'),
- __.in('created'))).times(2),
- repeat(union(
- __.in('created'),
- out('created'))).times(2)).label.groupCount()
- }
-
- @Override
- public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
- final Object v1Id, final Object v2Id) {
- g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
- }
-
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends UnionTest {
-
- public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
- ComputerTestHelper.compute("g.V.union(__.out, __.in).name", g)
- }
-
- public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).union(repeat(__.out).times(2), __.out).name", g)
- }
-
- public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
- ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)", g)
- }
-
- public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
- ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount", g)
- }
-
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
- ComputerTestHelper.compute("""
- g.V.union(
- repeat(union(
- out('created'),
- __.in('created'))).times(2),
- repeat(union(
- __.in('created'),
- out('created'))).times(2)).label.groupCount()
- """, g)
- }
-
- @Override
- public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
- final Object v1Id, final Object v2Id) {
- g.engine(StandardTraversalEngine.INSTANCE);
- g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
deleted file mode 100644
index 79ebbda..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
+++ /dev/null
@@ -1,66 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAndTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends AndTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
- g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
- g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends AndTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
- ComputerTestHelper.compute("g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
- ComputerTestHelper.compute("g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
deleted file mode 100644
index c2d1caf..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
+++ /dev/null
@@ -1,60 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCoinTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends CoinTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
- g.V.coin(1.0f)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
- g.V.coin(0.0f)
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends CoinTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
- ComputerTestHelper.compute("g.V.coin(1.0f)", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
- ComputerTestHelper.compute("g.V.coin(0.0f)", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
deleted file mode 100644
index 3084cc3..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
+++ /dev/null
@@ -1,61 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCyclicPathTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends CyclicPathTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
- g.V(v1Id).out('created').in('created').cyclicPath
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
- g.V(v1Id).out('created').in('created').cyclicPath.path
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends CyclicPathTest {
-
- @Override
- Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1) {
- ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath", g);
- }
-
- @Override
- Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1) {
- ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath().path()", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
deleted file mode 100644
index 51c1c27..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
+++ /dev/null
@@ -1,100 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.dedup
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyDedupTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends DedupTest {
- @Override
- public Traversal<Vertex, String> get_g_V_both_dedup_name() {
- g.V.both.dedup.name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
- g.V.both.has(T.label, 'software').dedup.by('lang').name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
- g.V().both().properties('name').order.by { a, b -> a.value() <=> b.value() }.dedup.value
- }
-
- @Override
- Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
- g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends DedupTest {
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_both_dedup_name() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
- }
-
- @Override
- @Test
- @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
- public void g_V_both_name_orderXa_bX_dedup() {
- }
-
- @Override
- public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
- ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))", g);
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_both_dedup_name() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
- // override with nothing until the test itself is supported
- return null
- }
-
- @Override
- Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
- // override with nothing until the test itself is supported
- return null
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
deleted file mode 100644
index 5110063..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
+++ /dev/null
@@ -1,115 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyExceptTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends ExceptTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
- g.V(v1Id).out.except(g.V(v2Id).next())
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
- g.V(v1Id).out.aggregate('x').out.except('x')
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
- g.V(v1Id).out('created').in('created').except(g.V(v1Id).next()).values('name')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
- g.V.out.except(g.V.toList())
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
- g.V.out.except([])
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
- final Object v1Id) {
- g.V(v1Id).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
- g.V(v1Id).as('a').out('created').in('created').except('a').name
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends ExceptTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.except(g.V(${v2Id}).next())", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.except('x')", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').except(g.V(${v1Id}).next()).values('name')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
- ComputerTestHelper.compute("g.V.out.except(g.V.toList())", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
- ComputerTestHelper.compute("g.V.out.except([])", g);
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
- final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').except('a').name", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
deleted file mode 100644
index fe67966..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
+++ /dev/null
@@ -1,179 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyFilterTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends FilterTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
- g.V.filter { false }
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
- g.V.filter { true }
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
- g.V.filter { it.property('lang').orElse("none") == 'java' }
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
- g.V(v1Id).filter { it.age > 30 }
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
- g.V(v1Id).out.filter { it.property('age').orElse(0) > 30 }
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
- g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
- g.E.filter { false }
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
- g.E.filter { true }
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends FilterTest {
-
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_filterXfalseX() {
- super.g_V_filterXfalseX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_filterXtrueX() {
- super.g_V_filterXtrueX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_filterXlang_eq_javaX() {
- super.g_V_filterXlang_eq_javaX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_VX1X_filterXage_gt_30X() {
- super.g_VX1X_filterXage_gt_30X();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_VX1X_out_filterXage_gt_30X() {
- super.g_VX1X_out_filterXage_gt_30X();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
- super.g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_E_filterXfalseX() {
- super.g_E_filterXfalseX();
- }
-
- @Test
- @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
- @Override
- public void g_E_filterXtrueX() {
- super.g_E_filterXtrueX();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
- ComputerTestHelper.compute("g.V.filter { false }", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
- ComputerTestHelper.compute("g.V.filter { true }", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
- ComputerTestHelper.compute("g.V.filter { it.property('lang').orElse('none') == 'java' }", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).filter { it.age > 30 }", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).out.filter { it.property('age').orElse(0) > 30 }", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
- ComputerTestHelper.compute("g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
- ComputerTestHelper.compute("g.E.filter { false }", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
- ComputerTestHelper.compute("g.E.filter { true }", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
deleted file mode 100644
index 4283e0b..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
+++ /dev/null
@@ -1,68 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class GroovyHasNotTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends HasNotTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
- g.V(v1Id).hasNot(propertyKey)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
- g.V.hasNot(propertyKey)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
- return g.V().hasNot(__.out('created')).values('name');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends HasNotTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
- ComputerTestHelper.compute("g.V(${v1Id}).hasNot('${propertyKey}')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
- ComputerTestHelper.compute("g.V.hasNot('${propertyKey}')", g);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
- ComputerTestHelper.compute("return g.V().hasNot(__.out('created')).values('name')", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
deleted file mode 100644
index a591901..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
+++ /dev/null
@@ -1,191 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyHasTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends HasTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
- g.V.out('knows').has(__.out('created')).name
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
- g.V(v1Id).has(key)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
- g.V(v1Id).has('name', 'marko')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
- g.V.has('name', 'marko')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
- g.V.has('name', 'blah')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
- g.V.has('blah')
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
- g.V(v1Id).has('age', Compare.gt, 30)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
- g.V(v1Id).out.hasId(v2Id)
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
- g.V.has('age', Compare.gt, 30)
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
- g.E(e7Id).hasLabel('knows')
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
- g.E.hasLabel('knows')
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
- g.E.hasLabel('uses', 'traverses')
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
- g.V.hasLabel("person", "software", 'blah');
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
- g.V.has('person', 'name', 'marko').age;
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
- g.V(v1Id).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends HasTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
- ComputerTestHelper.compute("g.V.out('knows').has(__.out('created')).name", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
- ComputerTestHelper.compute("g.V(${v1Id}).has('${key}')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).has('name', 'marko')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
- ComputerTestHelper.compute("g.V.has('name', 'marko')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
- ComputerTestHelper.compute(" g.V.has('name', 'blah')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
- ComputerTestHelper.compute("g.V.has('blah')", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).has('age', Compare.gt, 30)", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
- ComputerTestHelper.compute(" g.V(${v1Id}).out.hasId(${v2Id})", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
- ComputerTestHelper.compute("g.V.has('age', Compare.gt, 30)", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
- ComputerTestHelper.compute(" g.E(${e7Id}).hasLabel('knows')", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
- ComputerTestHelper.compute("g.E.hasLabel('knows')", g);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
- ComputerTestHelper.compute("g.E.hasLabel('uses', 'traverses')", g);
- }
-
- @Override
- Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
- ComputerTestHelper.compute("g.V.hasLabel('person', 'software', 'blah')", g);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
- ComputerTestHelper.compute("g.V.has('person', 'name', 'marko').age", g);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
- ComputerTestHelper.compute("g.V(${v1Id}).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV", g);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
deleted file mode 100644
index 4803da0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
+++ /dev/null
@@ -1,91 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyIsTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends IsTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
- return g.V().values('age').is(32);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
- return g.V().values('age').is(Compare.lte, 30);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
- return g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
- return g.V().has(__.in('created').count().is(1l)).values('name');
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
- return g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name');
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends IsTest {
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
- ComputerTestHelper.compute("g.V().values('age').is(32)", g)
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
- ComputerTestHelper.compute("g.V().values('age').is(Compare.lte, 30)", g)
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
- ComputerTestHelper.compute("g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34)", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
- ComputerTestHelper.compute("g.V().has(__.in('created').count().is(1l)).values('name')", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
- ComputerTestHelper.compute("g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name')", g)
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
deleted file mode 100644
index 5208d15..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
+++ /dev/null
@@ -1,66 +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.graph.traversal.step.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyOrTest {
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class StandardTraversals extends OrTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
- g.V.or(has('age', gt, 27), outE().count.gte(2l)).name
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
- g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name
- }
- }
-
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class ComputerTraversals extends OrTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
- ComputerTestHelper.compute("g.V.or(has('age', gt, 27), outE().count.gte(2l)).name", g)
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
- ComputerTestHelper.compute("g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name", g)
- }
- }
-}
[30/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
new file mode 100644
index 0000000..50e1fd8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -0,0 +1,847 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTraversalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.DedupLocalStep;
+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.FoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.IdStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.KeyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LabelStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaFlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SampleLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackElementValueStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackObjectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementFunctionComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementValueComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.TraversalComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface GraphTraversal<S, E> extends Traversal<S, E> {
+
+ public interface Admin<S, E> extends Traversal.Admin<S, E>, GraphTraversal<S, E> {
+
+ @Override
+ public default <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
+ return (GraphTraversal.Admin<S, E2>) Traversal.Admin.super.addStep((Step) step);
+ }
+
+ @Override
+ public default GraphTraversal<S, E> iterate() {
+ return GraphTraversal.super.iterate();
+ }
+
+ @Override
+ public GraphTraversal.Admin<S, E> clone();
+ }
+
+ @Override
+ public default GraphTraversal.Admin<S, E> asAdmin() {
+ return (GraphTraversal.Admin<S, E>) this;
+ }
+
+ ///////////////////// MAP STEPS /////////////////////
+
+ public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
+ return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), function));
+ }
+
+ public default <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
+ return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), function));
+ }
+
+ public default GraphTraversal<S, Object> id() {
+ return this.asAdmin().addStep(new IdStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, String> label() {
+ return this.asAdmin().addStep(new LabelStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> identity() {
+ return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
+ return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, direction, edgeLabels));
+ }
+
+ public default GraphTraversal<S, Vertex> out(final String... edgeLabels) {
+ return this.to(Direction.OUT, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Vertex> in(final String... edgeLabels) {
+ return this.to(Direction.IN, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Vertex> both(final String... edgeLabels) {
+ return this.to(Direction.BOTH, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
+ return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, direction, edgeLabels));
+ }
+
+ public default GraphTraversal<S, Edge> outE(final String... edgeLabels) {
+ return this.toE(Direction.OUT, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Edge> inE(final String... edgeLabels) {
+ return this.toE(Direction.IN, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
+ return this.toE(Direction.BOTH, edgeLabels);
+ }
+
+ public default GraphTraversal<S, Vertex> toV(final Direction direction) {
+ return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), direction));
+ }
+
+ public default GraphTraversal<S, Vertex> inV() {
+ return this.toV(Direction.IN);
+ }
+
+ public default GraphTraversal<S, Vertex> outV() {
+ return this.toV(Direction.OUT);
+ }
+
+ public default GraphTraversal<S, Vertex> bothV() {
+ return this.toV(Direction.BOTH);
+ }
+
+ public default GraphTraversal<S, Vertex> otherV() {
+ return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> order() {
+ return this.order(Scope.global);
+ }
+
+ public default GraphTraversal<S, E> order(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
+ return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.PROPERTY, propertyKeys));
+ }
+
+ public default <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
+ return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.VALUE, propertyKeys));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
+ return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.PROPERTY, propertyKeys));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
+ return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.VALUE, propertyKeys));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
+ return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), includeTokens, PropertyType.VALUE, propertyKeys));
+ }
+
+ public default GraphTraversal<S, String> key() {
+ return this.asAdmin().addStep(new KeyStep(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, E2> value() {
+ return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, Path> path() {
+ return this.asAdmin().addStep(new PathStep<>(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, E2> back(final String stepLabel) {
+ return this.asAdmin().addStep(new BackStep<>(this.asAdmin(), stepLabel));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
+ return (GraphTraversal) this.asAdmin().addStep(new MatchStep<E, Map<String, E2>>(this.asAdmin(), startLabel, traversals));
+ }
+
+ public default <E2> GraphTraversal<S, E2> sack() {
+ return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
+ return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), stepLabels));
+ }
+
+ public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
+ return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), stepLabel));
+ }
+
+ public default <E2> GraphTraversal<S, E2> unfold() {
+ return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, List<E>> fold() {
+ return this.asAdmin().addStep(new FoldStep<>(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
+ return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
+ }
+
+ public default GraphTraversal<S, Long> count() {
+ return this.count(Scope.global);
+ }
+
+ public default GraphTraversal<S, Long> count(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, Double> sum() {
+ return this.sum(Scope.global);
+ }
+
+ public default GraphTraversal<S, Double> sum(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new SumGlobalStep(this.asAdmin()) : new SumLocalStep<>(this.asAdmin()));
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> max() {
+ return this.max(Scope.global);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new MaxGlobalStep<E2>(this.asAdmin()) : new MaxLocalStep(this.asAdmin()));
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> min() {
+ return this.min(Scope.global);
+ }
+
+ public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep(this.asAdmin()));
+ }
+
+
+ public default GraphTraversal<S, Double> mean() {
+ return this.mean(Scope.global);
+ }
+
+ public default GraphTraversal<S, Double> mean(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new MeanGlobalStep<>(this.asAdmin()) : new MeanLocalStep<>(this.asAdmin()));
+ }
+
+ public default <K, R> GraphTraversal<S, Map<K, R>> group() {
+ return this.asAdmin().addStep(new GroupStep<>(this.asAdmin()));
+ }
+
+ public default <E2> GraphTraversal<S, Map<E2, Long>> groupCount() {
+ return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, Tree> tree() {
+ return this.asAdmin().addStep(new TreeStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, Vertex> addV(final Object... keyValues) {
+ return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), keyValues));
+ }
+
+ public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+ return this.asAdmin().addStep(new AddEdgeByPathStep(this.asAdmin(), direction, edgeLabel, stepLabel, propertyKeyValues));
+ }
+
+ public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+ return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertex, propertyKeyValues));
+ }
+
+ public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+ return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertices, propertyKeyValues));
+ }
+
+ public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+ return this.addE(Direction.IN, edgeLabel, stepLabel, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+ return this.addE(Direction.IN, edgeLabel, otherVertex, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+ return this.addE(Direction.IN, edgeLabel, otherVertices, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+ return this.addE(Direction.OUT, edgeLabel, stepLabel, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+ return this.addE(Direction.OUT, edgeLabel, otherVertex, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+ return this.addE(Direction.OUT, edgeLabel, otherVertices, propertyKeyValues);
+ }
+
+ public default GraphTraversal<S, E> property(final String key, final Object value) {
+ return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value));
+ }
+
+ ///////////////////// FILTER STEPS /////////////////////
+
+ public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
+ return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), predicate));
+ }
+
+ public default GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
+ return this.asAdmin().addStep(0 == orTraversals.length ?
+ new OrStep.OrMarker<>(this.asAdmin()) :
+ new OrStep(this.asAdmin(), Arrays.copyOf(orTraversals, orTraversals.length, Traversal.Admin[].class)));
+ }
+
+ public default GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
+ return this.asAdmin().addStep(0 == andTraversals.length ?
+ new AndStep.AndMarker<>(this.asAdmin()) :
+ new AndStep(this.asAdmin(), Arrays.copyOf(andTraversals, andTraversals.length, Traversal.Admin[].class)));
+ }
+
+ public default GraphTraversal<S, E> inject(final E... injections) {
+ return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), injections));
+ }
+
+ public default GraphTraversal<S, E> dedup() {
+ return this.dedup(Scope.global);
+ }
+
+ public default GraphTraversal<S, E> dedup(final Scope scope) {
+ return this.asAdmin().addStep(scope.equals(Scope.global) ? new DedupGlobalStep<>(this.asAdmin()) : new DedupLocalStep(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> except(final String sideEffectKeyOrPathLabel) {
+ return this.asAdmin().addStep(new ExceptStep<E>(this.asAdmin(), sideEffectKeyOrPathLabel));
+ }
+
+ public default GraphTraversal<S, E> except(final E exceptObject) {
+ return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptObject));
+ }
+
+ public default GraphTraversal<S, E> except(final Collection<E> exceptCollection) {
+ return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptCollection));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
+ return this.asAdmin().addStep(new WhereStep(this.asAdmin(), firstKey, secondKey, predicate));
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
+ return this.where(firstKey, secondKey, predicate);
+ }
+
+ public default <E2> GraphTraversal<S, Map<String, E2>> where(final Traversal constraint) {
+ return this.asAdmin().addStep(new WhereStep<>(this.asAdmin(), constraint.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> has(final Traversal<?, ?> hasNextTraversal) {
+ return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNextTraversal, false));
+ }
+
+ public default GraphTraversal<S, E> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
+ return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNotNextTraversal, true));
+ }
+
+ public default GraphTraversal<S, E> has(final String key) {
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.within)));
+ }
+
+ public default GraphTraversal<S, E> has(final String key, final Object value) {
+ return this.has(key, Compare.eq, value);
+ }
+
+ public default GraphTraversal<S, E> has(final T accessor, final Object value) {
+ return this.has(accessor.getAccessor(), value);
+ }
+
+ public default GraphTraversal<S, E> has(final String key, final BiPredicate predicate, final Object value) {
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, predicate, value)));
+ }
+
+ public default GraphTraversal<S, E> has(final T accessor, final BiPredicate predicate, final Object value) {
+ return this.has(accessor.getAccessor(), predicate, value);
+ }
+
+ public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
+ return this.has(label, key, Compare.eq, value);
+ }
+
+ public default GraphTraversal<S, E> has(final String label, final String key, final BiPredicate predicate, final Object value) {
+ return this.has(T.label, label).has(key, predicate, value);
+ }
+
+ public default GraphTraversal<S, E> hasNot(final String key) {
+ return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.without)));
+ }
+
+ public default GraphTraversal<S, E> hasLabel(final String... labels) {
+ return labels.length == 1 ? this.has(T.label, labels[0]) : this.has(T.label, Contains.within, Arrays.asList(labels));
+ }
+
+ public default GraphTraversal<S, E> hasId(final Object... ids) {
+ return ids.length == 1 ? this.has(T.id, ids[0]) : this.has(T.id, Contains.within, Arrays.asList(ids));
+ }
+
+ public default GraphTraversal<S, E> hasKey(final String... keys) {
+ return keys.length == 1 ? this.has(T.key, keys[0]) : this.has(T.key, Contains.within, Arrays.asList(keys));
+ }
+
+ public default GraphTraversal<S, E> hasValue(final Object... values) {
+ return values.length == 1 ? this.has(T.value, values[0]) : this.has(T.value, Contains.within, Arrays.asList(values));
+ }
+
+ public default GraphTraversal<S, E> is(final Object value) {
+ return this.is(Compare.eq, value);
+ }
+
+ public default GraphTraversal<S, E> is(final BiPredicate predicate, final Object value) {
+ return this.asAdmin().addStep(new IsStep(this.asAdmin(), predicate, value));
+ }
+
+ public default GraphTraversal<S, E> coin(final double probability) {
+ return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), probability));
+ }
+
+ public default GraphTraversal<S, E> range(final long low, final long high) {
+ return this.range(Scope.global, low, high);
+ }
+
+ public default GraphTraversal<S, E> range(final Scope scope, final long low, final long high) {
+ return this.asAdmin().addStep(scope.equals(Scope.global)
+ ? new RangeGlobalStep<>(this.asAdmin(), low, high)
+ : new RangeLocalStep<>(this.asAdmin(), low, high));
+ }
+
+ public default GraphTraversal<S, E> limit(final long limit) {
+ return this.range(Scope.global, 0, limit);
+ }
+
+ public default GraphTraversal<S, E> limit(final Scope scope, final long limit) {
+ return this.range(scope, 0, limit);
+ }
+
+ public default GraphTraversal<S, E> retain(final String sideEffectKeyOrPathLabel) {
+ return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), sideEffectKeyOrPathLabel));
+ }
+
+ public default GraphTraversal<S, E> retain(final E retainObject) {
+ return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainObject));
+ }
+
+ public default GraphTraversal<S, E> retain(final Collection<E> retainCollection) {
+ return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainCollection));
+ }
+
+ public default GraphTraversal<S, E> simplePath() {
+ return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> cyclicPath() {
+ return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> sample(final int amountToSample) {
+ return this.sample(Scope.global, amountToSample);
+ }
+
+ public default GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
+ return this.asAdmin().addStep(scope.equals(Scope.global)
+ ? new SampleGlobalStep<>(this.asAdmin(), amountToSample)
+ : new SampleLocalStep<>(this.asAdmin(), amountToSample));
+ }
+
+ ///////////////////// SIDE-EFFECT STEPS /////////////////////
+
+ public default GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
+ return this.asAdmin().addStep(new LambdaSideEffectStep<>(this.asAdmin(), consumer));
+ }
+
+ public default <E2> GraphTraversal<S, E2> cap(final String... sideEffectKeys) {
+ return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), sideEffectKeys));
+ }
+
+ public default GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
+ return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), sideEffectKey));
+ }
+
+ public default GraphTraversal<S, E> aggregate(final String sideEffectKey) {
+ return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey));
+ }
+
+ public default GraphTraversal<S, E> group(final String sideEffectKey) {
+ return this.asAdmin().addStep(new GroupSideEffectStep<>(this.asAdmin(), sideEffectKey));
+ }
+
+ public default GraphTraversal<S, E> groupCount(final String sideEffectKey) {
+ return this.asAdmin().addStep(new GroupCountSideEffectStep<>(this.asAdmin(), sideEffectKey));
+ }
+
+ public default GraphTraversal<S, E> timeLimit(final long timeLimit) {
+ return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), timeLimit));
+ }
+
+ public default GraphTraversal<S, E> tree(final String sideEffectKey) {
+ return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), sideEffectKey));
+ }
+
+ public default <V> GraphTraversal<S, E> sack(final BiFunction<V, E, V> sackFunction) {
+ return this.asAdmin().addStep(new SackObjectStep<>(this.asAdmin(), sackFunction));
+ }
+
+ public default <V> GraphTraversal<S, E> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
+ return this.asAdmin().addStep(new SackElementValueStep(this.asAdmin(), sackOperator, elementPropertyKey));
+ }
+
+ public default GraphTraversal<S, E> store(final String sideEffectKey) {
+ return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
+ }
+
+ public default GraphTraversal<S, E> profile() {
+ return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
+ }
+
+ ///////////////////// BRANCH STEPS /////////////////////
+
+ public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
+ final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin());
+ branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal);
+ return this.asAdmin().addStep(branchStep);
+ }
+
+ public default <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
+ return this.branch(new MapTraverserTraversal<>(function));
+ }
+
+ public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
+ return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) choiceTraversal));
+ }
+
+ public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice));
+ }
+
+ public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
+ return this.choose(new MapTraversal<>(choiceFunction));
+ }
+
+ public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ return this.choose(new FilterTraversal<>(choosePredicate), trueChoice, falseChoice);
+ }
+
+ public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
+ return this.asAdmin().addStep(new UnionStep(this.asAdmin(), Arrays.copyOf(unionTraversals, unionTraversals.length, Traversal.Admin[].class)));
+ }
+
+ public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
+ return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, Traversal.Admin[].class)));
+ }
+
+ public default GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
+ return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) repeatTraversal);
+ }
+
+ public default GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
+ return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) emitTraversal);
+ }
+
+ public default GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
+ return this.emit(new FilterTraverserTraversal<>(emitPredicate));
+ }
+
+ public default GraphTraversal<S, E> emit() {
+ return this.emit(TrueTraversal.instance());
+ }
+
+ public default GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
+ return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) untilTraversal);
+ }
+
+ public default GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
+ return this.until(new FilterTraverserTraversal<>(untilPredicate));
+ }
+
+ public default GraphTraversal<S, E> times(final int maxLoops) {
+ return this.until(new LoopTraversal(maxLoops));
+ }
+
+ public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
+ return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), localTraversal.asAdmin()));
+ }
+
+ ///////////////////// UTILITY STEPS /////////////////////
+
+ public default GraphTraversal<S, E> withSideEffect(final String key, final Supplier supplier) {
+ this.asAdmin().getSideEffects().registerSupplier(key, supplier);
+ return this;
+ }
+
+ public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
+ this.asAdmin().getSideEffects().setSack(initialValue, Optional.of(splitOperator));
+ return this;
+ }
+
+ public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue) {
+ this.asAdmin().getSideEffects().setSack(initialValue, Optional.empty());
+ return this;
+ }
+
+ public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
+ this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
+ return this;
+ }
+
+ public default <A> GraphTraversal<S, E> withSack(A initialValue) {
+ this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
+ return this;
+ }
+
+ public default GraphTraversal<S, E> withPath() {
+ return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
+ }
+
+ public default GraphTraversal<S, E> as(final String stepLabel) {
+ if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
+ this.asAdmin().getEndStep().setLabel(stepLabel);
+ return this;
+ }
+
+ public default GraphTraversal<S, E> barrier() {
+ return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
+ @Override
+ public void barrierConsumer(TraverserSet traverserSet) {
+
+ }
+ });
+ }
+
+ ////
+
+ public default GraphTraversal<S, E> by() {
+ ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new IdentityTraversal<>());
+ return this;
+ }
+
+ public default <V> GraphTraversal<S, E> by(final Function<V, Object> functionProjection) {
+ ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(functionProjection));
+ return this;
+ }
+
+ public default GraphTraversal<S, E> by(final T tokenProjection) {
+ ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(tokenProjection));
+ return this;
+ }
+
+ public default GraphTraversal<S, E> by(final String elementPropertyKey) {
+ ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new ElementValueTraversal<>(elementPropertyKey));
+ return this;
+ }
+
+ public default GraphTraversal<S, E> by(final Traversal<?, ?> byTraversal) {
+ ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(byTraversal.asAdmin());
+ return this;
+ }
+
+ ////
+
+ public default GraphTraversal<S, E> by(final Order order) {
+ ((ComparatorHolder) this.asAdmin().getEndStep()).addComparator(order);
+ return this;
+ }
+
+ public default GraphTraversal<S, E> by(final Comparator<E> comparator) {
+ ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(comparator);
+ return this;
+ }
+
+ public default <V> GraphTraversal<S, E> by(final Function<Element, V> elementFunctionProjection, final Comparator<V> elementFunctionValueComparator) {
+ ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementFunctionComparator<>(elementFunctionProjection, elementFunctionValueComparator));
+ return this;
+ }
+
+ public default <V> GraphTraversal<S, E> by(final String elementPropertyProjection, final Comparator<V> propertyValueComparator) {
+ ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementValueComparator<>(elementPropertyProjection, propertyValueComparator));
+ return this;
+ }
+
+ public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> endComparator) {
+ ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(new TraversalComparator(traversal.asAdmin(), endComparator));
+ return this;
+ }
+
+ ////
+
+ public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
+ ((TraversalOptionParent<M, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, traversalOption.asAdmin());
+ return this;
+ }
+
+ public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
+ ((TraversalOptionParent<TraversalOptionParent.Pick, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, traversalOption.asAdmin());
+ return this;
+ }
+
+ ////
+
+ @Override
+ public default void remove() {
+ try {
+ this.asAdmin().applyStrategies();
+ final Step<?, E> endStep = this.asAdmin().getEndStep();
+ while (true) {
+ final Object object = endStep.next().get();
+ if (object instanceof Element)
+ ((Element) object).remove();
+ else if (object instanceof Property)
+ ((Property) object).remove();
+ else {
+ throw new IllegalStateException("The following object does not have a remove() method: " + object);
+ }
+ }
+ } catch (final NoSuchElementException ignored) {
+
+ }
+ }
+
+ @Override
+ public default GraphTraversal<S, E> iterate() {
+ Traversal.super.iterate();
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..b1d8bb0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -0,0 +1,138 @@
+/*
+ * 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.dsl.graph;
+
+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.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Transaction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GraphTraversalSource implements TraversalSource {
+
+ public static final Builder standard = GraphTraversalSource.build().engine(StandardTraversalEngine.build());
+ public static final Builder computer = GraphTraversalSource.build().engine(ComputerTraversalEngine.build());
+
+ public static Builder computer(final Class<? extends GraphComputer> graphComputerClass) {
+ return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(graphComputerClass));
+ }
+
+ ////
+
+ private final transient Graph graph;
+ private final TraversalEngine.Builder engine;
+ private final TraversalStrategies strategies;
+
+ public GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final TraversalStrategy... strategies) {
+ this.graph = graph;
+ this.engine = engine;
+ final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
+ this.strategies = strategies.length == 0 ? tempStrategies : tempStrategies.clone().addStrategies(strategies);
+ }
+
+ public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
+ final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
+ traversal.setEngine(this.engine.create(this.graph));
+ traversal.setStrategies(this.strategies);
+ return traversal.addStep(new AddVertexStartStep(traversal, keyValues));
+ }
+
+ public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
+ final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
+ traversal.setEngine(this.engine.create(this.graph));
+ traversal.setStrategies(this.strategies);
+ return traversal.addStep(new GraphStep<>(traversal, Vertex.class, vertexIds));
+ }
+
+ public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
+ final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.graph);
+ traversal.setEngine(this.engine.create(this.graph));
+ traversal.setStrategies(this.strategies);
+ return traversal.addStep(new GraphStep<>(traversal, Edge.class, edgesIds));
+ }
+
+ public Transaction tx() {
+ return this.graph.tx();
+ }
+
+ public static Builder build() {
+ return new Builder();
+ }
+
+
+ @Override
+ public Optional<GraphComputer> getGraphComputer() {
+ return this.engine.create(this.graph).getGraphComputer();
+ }
+
+ @Override
+ public Optional<Graph> getGraph() {
+ return Optional.ofNullable(this.graph);
+ }
+
+ @Override
+ public GraphTraversalSource.Builder asBuilder() {
+ final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engine);
+ this.strategies.toList().forEach(builder::strategy);
+ return builder;
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalSourceString(this);
+ }
+
+ //////
+
+ public static class Builder implements TraversalSource.Builder<GraphTraversalSource> {
+
+ private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build();
+ private List<TraversalStrategy> strategies = new ArrayList<>();
+
+ public Builder engine(final TraversalEngine.Builder engineBuilder) {
+ this.engineBuilder = engineBuilder;
+ return this;
+ }
+
+ public Builder strategy(final TraversalStrategy strategy) {
+ this.strategies.add(strategy);
+ return this;
+ }
+
+ public GraphTraversalSource create(final Graph graph) {
+ return new GraphTraversalSource(graph, this.engineBuilder, this.strategies.toArray(new TraversalStrategy[this.strategies.size()]));
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
new file mode 100644
index 0000000..7946e5c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -0,0 +1,602 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+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.Tree;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class __ {
+
+ protected __() {
+ }
+
+ //////////////////////////////////////////////////////////////////////
+
+ public static <A> GraphTraversal<A, A> start() {
+ return new DefaultGraphTraversal<>(EmptyGraph.instance());
+ }
+
+ public static <A> GraphTraversal<A, A> __(final Object... starts) {
+ return inject(starts);
+ }
+
+ ///////////////////// MAP STEPS /////////////////////
+
+ public static <A, E2> GraphTraversal<A, E2> map(final Function<Traverser<A>, E2> function) {
+ return __.<A>start().map(function);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> flatMap(final Function<Traverser<A>, Iterator<E2>> function) {
+ return __.<A>start().flatMap(function);
+ }
+
+ public static <A> GraphTraversal<A, A> identity() {
+ return __.<A>start().identity();
+ }
+
+ public static <A> GraphTraversal<A, String> label() {
+ return __.<A>start().label();
+ }
+
+ public static <A> GraphTraversal<A, Object> id() {
+ return __.<A>start().id();
+ }
+
+ public static <A> GraphTraversal<A, Vertex> to(final Direction direction, final String... edgeLabels) {
+ return __.<A>start().to(direction, edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Vertex> out(final String... edgeLabels) {
+ return __.<A>start().out(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Vertex> in(final String... edgeLabels) {
+ return __.<A>start().in(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Vertex> both(final String... edgeLabels) {
+ return __.<A>start().both(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Edge> toE(final Direction direction, final String... edgeLabels) {
+ return __.<A>start().toE(direction, edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Edge> outE(final String... edgeLabels) {
+ return __.<A>start().outE(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Edge> inE(final String... edgeLabels) {
+ return __.<A>start().inE(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Edge> bothE(final String... edgeLabels) {
+ return __.<A>start().bothE(edgeLabels);
+ }
+
+ public static <A> GraphTraversal<A, Vertex> toV(final Direction direction) {
+ return __.<A>start().toV(direction);
+ }
+
+ public static <A> GraphTraversal<A, Vertex> inV() {
+ return __.<A>start().inV();
+ }
+
+ public static <A> GraphTraversal<A, Vertex> outV() {
+ return __.<A>start().outV();
+ }
+
+ public static <A> GraphTraversal<A, Vertex> bothV() {
+ return __.<A>start().bothV();
+ }
+
+ public static <A> GraphTraversal<A, Vertex> otherV() {
+ return __.<A>start().otherV();
+ }
+
+ public static <A> GraphTraversal<A, A> order() {
+ return __.<A>start().order();
+ }
+
+ public static <A> GraphTraversal<A, A> order(final Scope scope) {
+ return __.<A>start().order(scope);
+ }
+
+ public static <A, E2> GraphTraversal<A, ? extends Property<E2>> properties(final String... propertyKeys) {
+ return __.<A>start().properties(propertyKeys);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> values(final String... propertyKeys) {
+ return __.<A>start().values(propertyKeys);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> propertyMap(final String... propertyKeys) {
+ return __.<A>start().propertyMap(propertyKeys);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final String... propertyKeys) {
+ return __.<A>start().valueMap(propertyKeys);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
+ return __.<A>start().valueMap(includeTokens, propertyKeys);
+ }
+
+ public static <A> GraphTraversal<A, String> key() {
+ return __.<A>start().key();
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> value() {
+ return __.<A>start().value();
+ }
+
+ public static <A> GraphTraversal<A, Path> path() {
+ return __.<A>start().path();
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> back(final String stepLabel) {
+ return __.<A>start().back(stepLabel);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
+ return __.<A>start().match(startLabel, traversals);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> sack() {
+ return __.<A>start().sack();
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> select(final String stepLabel) {
+ return __.<A>start().select(stepLabel);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> select(final String... stepLabels) {
+ return __.<A>start().select(stepLabels);
+ }
+
+ public static <A> GraphTraversal<A, A> unfold() {
+ return __.<A>start().unfold();
+ }
+
+ public static <A> GraphTraversal<A, List<A>> fold() {
+ return __.<A>start().fold();
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> fold(final E2 seed, final BiFunction<E2, A, E2> foldFunction) {
+ return __.<A>start().fold(seed, foldFunction);
+ }
+
+ public static <A> GraphTraversal<A, Long> count() {
+ return __.<A>start().count();
+ }
+
+ public static <A> GraphTraversal<A, Long> count(final Scope scope) {
+ return __.<A>start().count(scope);
+ }
+
+ public static <A> GraphTraversal<A, Double> sum() {
+ return __.<A>start().sum();
+ }
+
+ public static <A> GraphTraversal<A, Double> sum(final Scope scope) {
+ return __.<A>start().sum(scope);
+ }
+
+
+ public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
+ return __.<A>start().min();
+ }
+
+ public static <A, E2 extends Number> GraphTraversal<A, E2> min(final Scope scope) {
+ return __.<A>start().min(scope);
+ }
+
+ public static <A, E2 extends Number> GraphTraversal<A, E2> max() {
+ return __.<A>start().max();
+ }
+
+ public static <A, E2 extends Number> GraphTraversal<A, E2> max(final Scope scope) {
+ return __.<A>start().max(scope);
+ }
+
+ public static <A> GraphTraversal<A, Double> mean() {
+ return __.<A>start().mean();
+ }
+
+ public static <A> GraphTraversal<A, Double> mean(final Scope scope) {
+ return __.<A>start().mean(scope);
+ }
+
+ public static <A, K, R> GraphTraversal<A, Map<K, R>> group() {
+ return __.<A>start().group();
+ }
+
+ public static <A, B> GraphTraversal<A, Map<B, Long>> groupCount() {
+ return __.<A>start().<B>groupCount();
+ }
+
+ public static <A> GraphTraversal<A, Tree> tree() {
+ return __.<A>start().tree();
+ }
+
+ public static <A> GraphTraversal<A, Vertex> addV(final Object... propertyKeyValues) {
+ return __.<A>start().addV(propertyKeyValues);
+ }
+
+ public static <A> GraphTraversal<A, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+ return __.<A>start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
+ }
+
+ public static <A> GraphTraversal<A, Edge> addInE(final String edgeLabel, final String setLabel, final Object... propertyKeyValues) {
+ return __.<A>start().addInE(edgeLabel, setLabel, propertyKeyValues);
+ }
+
+ public static <A> GraphTraversal<A, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+ return __.<A>start().addOutE(edgeLabel, stepLabel, propertyKeyValues);
+ }
+
+ public static <A> GraphTraversal<A, A> property(final String key, final Object value) {
+ return __.<A>start().property(key, value);
+ }
+
+ ///////////////////// FILTER STEPS /////////////////////
+
+ public static <A> GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
+ return __.<A>start().filter(predicate);
+ }
+
+ public static <A> GraphTraversal<A, A> and(final Traversal<?, ?>... andTraversals) {
+ return __.<A>start().and(andTraversals);
+ }
+
+ public static <A> GraphTraversal<A, A> or(final Traversal<?, ?>... orTraversals) {
+ return __.<A>start().or(orTraversals);
+ }
+
+ public static <A> GraphTraversal<A, A> inject(final Object... injections) {
+ return __.<A>start().inject((A[]) injections);
+ }
+
+ public static <A> GraphTraversal<A, A> dedup() {
+ return __.<A>start().dedup();
+ }
+
+ public static <A> GraphTraversal<A, A> dedup(final Scope scope) {
+ return __.<A>start().dedup(scope);
+ }
+
+ public static <A> GraphTraversal<A, A> except(final String sideEffectKeyOrPathLabel) {
+ return __.<A>start().except(sideEffectKeyOrPathLabel);
+ }
+
+ public static <A> GraphTraversal<A, A> except(final Object exceptObject) {
+ return __.<A>start().except((A) exceptObject);
+ }
+
+ public static <A> GraphTraversal<A, A> except(final Collection<A> exceptCollection) {
+ return __.<A>start().except(exceptCollection);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final Traversal<?, ?> hasNextTraversal) {
+ return __.<A>start().has(hasNextTraversal);
+ }
+
+ public static <A> GraphTraversal<A, A> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
+ return __.<A>start().hasNot(hasNotNextTraversal);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final String key) {
+ return __.<A>start().has(key);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
+ return __.<A>start().has(key, value);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
+ return __.<A>start().has(accessor, value);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final String key, final BiPredicate predicate, final Object value) {
+ return __.<A>start().has(key, predicate, value);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final T accessor, final BiPredicate predicate, final Object value) {
+ return __.<A>start().has(accessor, predicate, value);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final String label, final String key, final Object value) {
+ return __.<A>start().has(label, key, value);
+ }
+
+ public static <A> GraphTraversal<A, A> has(final String label, final String key, final BiPredicate predicate, final Object value) {
+ return __.<A>start().has(label, key, predicate, value);
+ }
+
+ public static <A> GraphTraversal<A, A> hasNot(final String key) {
+ return __.<A>start().hasNot(key);
+ }
+
+ public static <A> GraphTraversal<A, A> hasLabel(final String... labels) {
+ return __.<A>start().hasLabel(labels);
+ }
+
+ public static <A> GraphTraversal<A, A> hasId(final Object... ids) {
+ return __.<A>start().hasId(ids);
+ }
+
+ public static <A> GraphTraversal<A, A> hasKey(final String... keys) {
+ return __.<A>start().hasKey(keys);
+ }
+
+ public static <A> GraphTraversal<A, A> hasValue(final Object... values) {
+ return __.<A>start().hasValue(values);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
+ return __.<A>start().where(firstKey, secondKey, predicate);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
+ return __.<A>start().where(firstKey, predicate, secondKey);
+ }
+
+ public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final Traversal constraint) {
+ return __.<A>start().where(constraint);
+ }
+
+ public static <A> GraphTraversal<A, A> is(final Object value) {
+ return __.<A>start().is(value);
+ }
+
+ public static <A> GraphTraversal<A, A> is(final BiPredicate predicate, final Object value) {
+ return __.<A>start().is(predicate, value);
+ }
+
+ public static <A> GraphTraversal<A, A> coin(final double probability) {
+ return __.<A>start().coin(probability);
+ }
+
+ public static <A> GraphTraversal<A, A> range(final long low, final long high) {
+ return __.<A>start().range(low, high);
+ }
+
+ public static <A> GraphTraversal<A, A> range(final Scope scope, final long low, final long high) {
+ return __.<A>start().range(scope, low, high);
+ }
+
+ public static <A> GraphTraversal<A, A> limit(final long limit) {
+ return __.<A>start().limit(limit);
+ }
+
+ public static <A> GraphTraversal<A, A> limit(final Scope scope, final long limit) {
+ return __.<A>start().limit(scope, limit);
+ }
+
+ public static <A> GraphTraversal<A, A> retain(final String sideEffectKeyOrPathLabel) {
+ return __.<A>start().retain(sideEffectKeyOrPathLabel);
+ }
+
+ public static <A> GraphTraversal<A, A> retain(final Object retainObject) {
+ return __.<A>start().retain((A) retainObject);
+ }
+
+ public static <A> GraphTraversal<A, A> retain(final Collection<A> retainCollection) {
+ return __.<A>start().retain(retainCollection);
+ }
+
+ public static <A> GraphTraversal<A, A> simplePath() {
+ return __.<A>start().simplePath();
+ }
+
+ public static <A> GraphTraversal<A, A> cyclicPath() {
+ return __.<A>start().cyclicPath();
+ }
+
+ public static <A> GraphTraversal<A, A> sample(final int amountToSample) {
+ return __.<A>start().sample(amountToSample);
+ }
+
+ public static <A> GraphTraversal<A, A> sample(final Scope scope, final int amountToSample) {
+ return __.<A>start().sample(scope, amountToSample);
+ }
+
+ ///////////////////// SIDE-EFFECT STEPS /////////////////////
+
+ public static <A> GraphTraversal<A, A> sideEffect(final Consumer<Traverser<A>> consumer) {
+ return __.<A>start().sideEffect(consumer);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> cap(final String... sideEffectKeys) {
+ return __.<A>start().cap(sideEffectKeys);
+ }
+
+ public static <A> GraphTraversal<A, Edge> subgraph(final String sideEffectKey) {
+ return __.<A>start().subgraph(sideEffectKey);
+ }
+
+ public static <A> GraphTraversal<A, A> aggregate(final String sideEffectKey) {
+ return __.<A>start().aggregate(sideEffectKey);
+ }
+
+ public static <A> GraphTraversal<A, A> group(final String sideEffectKey) {
+ return __.<A>start().group(sideEffectKey);
+ }
+
+ public static <A> GraphTraversal<A, A> groupCount(final String sideEffectKey) {
+ return __.<A>start().groupCount(sideEffectKey);
+ }
+
+ public static <A> GraphTraversal<A, A> timeLimit(final long timeLimit) {
+ return __.<A>start().timeLimit(timeLimit);
+ }
+
+ public static <A> GraphTraversal<A, A> tree(final String sideEffectKey) {
+ return __.<A>start().tree(sideEffectKey);
+ }
+
+ public static <A, V> GraphTraversal<A, A> sack(final BiFunction<V, A, V> sackFunction) {
+ return __.<A>start().sack(sackFunction);
+ }
+
+ public static <A, V> GraphTraversal<A, A> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
+ return __.<A>start().sack(sackOperator, elementPropertyKey);
+ }
+
+ public static <A> GraphTraversal<A, A> store(final String sideEffectKey) {
+ return __.<A>start().store(sideEffectKey);
+ }
+
+ ///////////////////// BRANCH STEPS /////////////////////
+
+ public static <A, M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {
+ return __.<A>start().branch(function);
+ }
+
+ public static <A, M, E2> GraphTraversal<A, E2> branch(final Traversal<?, M> traversalFunction) {
+ return __.<A>start().branch(traversalFunction);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> choose(final Predicate<A> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ return __.<A>start().choose(choosePredicate, trueChoice, falseChoice);
+ }
+
+ public static <A, M, E2> GraphTraversal<A, E2> choose(final Function<A, M> choiceFunction) {
+ return __.<A>start().choose(choiceFunction);
+ }
+
+ public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalFunction) {
+ return __.<A>start().choose(traversalFunction);
+ }
+
+ public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+ return __.<A>start().choose(traversalPredicate, trueChoice, falseChoice);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> union(final Traversal<?, E2>... traversals) {
+ return __.<A>start().union(traversals);
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> coalesce(final Traversal<?, E2>... traversals) {
+ return __.<A>start().coalesce(traversals);
+ }
+
+ public static <A> GraphTraversal<A, A> repeat(final Traversal<?, A> traversal) {
+ return __.<A>start().repeat(traversal);
+ }
+
+ public static <A> GraphTraversal<A, A> emit(final Traversal<?, ?> emitTraversal) {
+ return __.<A>start().emit(emitTraversal);
+ }
+
+ public static <A> GraphTraversal<A, A> emit(final Predicate<Traverser<A>> emitPredicate) {
+ return __.<A>start().emit(emitPredicate);
+ }
+
+ public static <A> GraphTraversal<A, A> until(final Traversal<?, ?> untilTraversal) {
+ return __.<A>start().until(untilTraversal);
+ }
+
+ public static <A> GraphTraversal<A, A> until(final Predicate<Traverser<A>> untilPredicate) {
+ return __.<A>start().until(untilPredicate);
+ }
+
+ public static <A> GraphTraversal<A, A> times(final int maxLoops) {
+ return __.<A>start().times(maxLoops);
+ }
+
+ public static <A> GraphTraversal<A, A> emit() {
+ return __.<A>start().emit();
+ }
+
+ public static <A, E2> GraphTraversal<A, E2> local(final Traversal<?, E2> localTraversal) {
+ return __.<A>start().local(localTraversal);
+ }
+
+ ///////////////////// UTILITY STEPS /////////////////////
+
+ public static <A> GraphTraversal<A, A> as(final String label) {
+ return __.<A>start().as(label);
+ }
+
+ public static <A> GraphTraversal<A, A> profile() {
+ return __.<A>start().profile();
+ }
+
+ public static <A> GraphTraversal<A, A> withSideEffect(final String key, final Supplier supplier) {
+ return __.<A>start().withSideEffect(key, supplier);
+ }
+
+ public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue, final UnaryOperator<B> splitOperator) {
+ return __.<A>start().withSack(initialValue, splitOperator);
+ }
+
+ public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue) {
+ return __.<A>start().withSack(initialValue);
+ }
+
+ public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+ return __.<A>start().withSack(initialValue, splitOperator);
+ }
+
+ public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
+ return __.<A>start().withSack(initialValue);
+ }
+
+ public static <A> GraphTraversal<A, A> withPath() {
+ return __.<A>start().withPath();
+ }
+
+ public static <A> GraphTraversal<A, A> barrier() {
+ return __.<A>start().barrier();
+ }
+
+ ////
+
+ public static <A> GraphTraversal<A, A> iterate() {
+ return __.<A>start().iterate();
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 1116311..6ea0c48 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
@@ -18,15 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.engine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+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.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import java.io.Serializable;
import java.util.Optional;
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 342bb60..7d66d9d 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,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.engine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+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.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 2425d45..673b383 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
@@ -18,19 +18,19 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+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.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
import org.apache.tinkerpop.gremlin.structure.Graph;
import java.util.Collections;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
index 98f0fe0..c80898b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.structure.Element;
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
index 0ab2455..2b551a7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import java.util.function.Predicate;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
index 3ac002b..d4c6d90 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import java.util.function.Predicate;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
index 7aeee74..7a02e53 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
@@ -18,14 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+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.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.structure.Graph;
import java.util.List;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
index debe515..95cf7f0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
new file mode 100644
index 0000000..c1fc06a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
@@ -0,0 +1,49 @@
+/*
+ * 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.lambda;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LoopTraversal<S, E> extends AbstractLambdaTraversal<S, E> {
+
+ private final long maxLoops;
+ private boolean allow = false;
+
+ public LoopTraversal(final long maxLoops) {
+ this.maxLoops = maxLoops;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.allow;
+ }
+
+ @Override
+ public void addStart(final Traverser<S> start) {
+ this.allow = start.loops() >= this.maxLoops;
+ }
+
+ @Override
+ public String toString() {
+ return "loops(" + this.maxLoops + ')';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
index b7baeee..7c97d2d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import java.util.function.Function;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
index 9675b74..3893735 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.lambda;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import java.util.function.Function;
[38/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
deleted file mode 100644
index 50f5abd..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ /dev/null
@@ -1,847 +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.graph.traversal;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.lambda.LoopTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTraversalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.DedupLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroupCountStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroupStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.IdStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.KeyStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LabelStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaFlatMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertyMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertyValueStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.RangeLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SackStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SampleLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.TreeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AddPropertyStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.LambdaSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackElementValueStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackObjectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.PathIdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.ElementFunctionComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.ElementValueComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.function.BiFunction;
-import java.util.function.BiPredicate;
-import java.util.function.BinaryOperator;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface GraphTraversal<S, E> extends Traversal<S, E> {
-
- public interface Admin<S, E> extends Traversal.Admin<S, E>, GraphTraversal<S, E> {
-
- @Override
- public default <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
- return (GraphTraversal.Admin<S, E2>) Traversal.Admin.super.addStep((Step) step);
- }
-
- @Override
- public default GraphTraversal<S, E> iterate() {
- return GraphTraversal.super.iterate();
- }
-
- @Override
- public GraphTraversal.Admin<S, E> clone();
- }
-
- @Override
- public default GraphTraversal.Admin<S, E> asAdmin() {
- return (GraphTraversal.Admin<S, E>) this;
- }
-
- ///////////////////// MAP STEPS /////////////////////
-
- public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
- return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), function));
- }
-
- public default <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
- return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), function));
- }
-
- public default GraphTraversal<S, Object> id() {
- return this.asAdmin().addStep(new IdStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, String> label() {
- return this.asAdmin().addStep(new LabelStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> identity() {
- return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
- return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, direction, edgeLabels));
- }
-
- public default GraphTraversal<S, Vertex> out(final String... edgeLabels) {
- return this.to(Direction.OUT, edgeLabels);
- }
-
- public default GraphTraversal<S, Vertex> in(final String... edgeLabels) {
- return this.to(Direction.IN, edgeLabels);
- }
-
- public default GraphTraversal<S, Vertex> both(final String... edgeLabels) {
- return this.to(Direction.BOTH, edgeLabels);
- }
-
- public default GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
- return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, direction, edgeLabels));
- }
-
- public default GraphTraversal<S, Edge> outE(final String... edgeLabels) {
- return this.toE(Direction.OUT, edgeLabels);
- }
-
- public default GraphTraversal<S, Edge> inE(final String... edgeLabels) {
- return this.toE(Direction.IN, edgeLabels);
- }
-
- public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
- return this.toE(Direction.BOTH, edgeLabels);
- }
-
- public default GraphTraversal<S, Vertex> toV(final Direction direction) {
- return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), direction));
- }
-
- public default GraphTraversal<S, Vertex> inV() {
- return this.toV(Direction.IN);
- }
-
- public default GraphTraversal<S, Vertex> outV() {
- return this.toV(Direction.OUT);
- }
-
- public default GraphTraversal<S, Vertex> bothV() {
- return this.toV(Direction.BOTH);
- }
-
- public default GraphTraversal<S, Vertex> otherV() {
- return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> order() {
- return this.order(Scope.global);
- }
-
- public default GraphTraversal<S, E> order(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
- return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.PROPERTY, propertyKeys));
- }
-
- public default <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
- return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.VALUE, propertyKeys));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
- return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.PROPERTY, propertyKeys));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
- return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.VALUE, propertyKeys));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
- return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), includeTokens, PropertyType.VALUE, propertyKeys));
- }
-
- public default GraphTraversal<S, String> key() {
- return this.asAdmin().addStep(new KeyStep(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, E2> value() {
- return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, Path> path() {
- return this.asAdmin().addStep(new PathStep<>(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, E2> back(final String stepLabel) {
- return this.asAdmin().addStep(new BackStep<>(this.asAdmin(), stepLabel));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
- return (GraphTraversal) this.asAdmin().addStep(new MatchStep<E, Map<String, E2>>(this.asAdmin(), startLabel, traversals));
- }
-
- public default <E2> GraphTraversal<S, E2> sack() {
- return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
- return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), stepLabels));
- }
-
- public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
- return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), stepLabel));
- }
-
- public default <E2> GraphTraversal<S, E2> unfold() {
- return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, List<E>> fold() {
- return this.asAdmin().addStep(new FoldStep<>(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
- return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
- }
-
- public default GraphTraversal<S, Long> count() {
- return this.count(Scope.global);
- }
-
- public default GraphTraversal<S, Long> count(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, Double> sum() {
- return this.sum(Scope.global);
- }
-
- public default GraphTraversal<S, Double> sum(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new SumGlobalStep(this.asAdmin()) : new SumLocalStep<>(this.asAdmin()));
- }
-
- public default <E2 extends Number> GraphTraversal<S, E2> max() {
- return this.max(Scope.global);
- }
-
- public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new MaxGlobalStep<E2>(this.asAdmin()) : new MaxLocalStep(this.asAdmin()));
- }
-
- public default <E2 extends Number> GraphTraversal<S, E2> min() {
- return this.min(Scope.global);
- }
-
- public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep(this.asAdmin()));
- }
-
-
- public default GraphTraversal<S, Double> mean() {
- return this.mean(Scope.global);
- }
-
- public default GraphTraversal<S, Double> mean(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new MeanGlobalStep<>(this.asAdmin()) : new MeanLocalStep<>(this.asAdmin()));
- }
-
- public default <K, R> GraphTraversal<S, Map<K, R>> group() {
- return this.asAdmin().addStep(new GroupStep<>(this.asAdmin()));
- }
-
- public default <E2> GraphTraversal<S, Map<E2, Long>> groupCount() {
- return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, Tree> tree() {
- return this.asAdmin().addStep(new TreeStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, Vertex> addV(final Object... keyValues) {
- return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), keyValues));
- }
-
- public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
- return this.asAdmin().addStep(new AddEdgeByPathStep(this.asAdmin(), direction, edgeLabel, stepLabel, propertyKeyValues));
- }
-
- public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
- return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertex, propertyKeyValues));
- }
-
- public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
- return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertices, propertyKeyValues));
- }
-
- public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
- return this.addE(Direction.IN, edgeLabel, stepLabel, propertyKeyValues);
- }
-
- public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
- return this.addE(Direction.IN, edgeLabel, otherVertex, propertyKeyValues);
- }
-
- public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
- return this.addE(Direction.IN, edgeLabel, otherVertices, propertyKeyValues);
- }
-
- public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
- return this.addE(Direction.OUT, edgeLabel, stepLabel, propertyKeyValues);
- }
-
- public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
- return this.addE(Direction.OUT, edgeLabel, otherVertex, propertyKeyValues);
- }
-
- public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
- return this.addE(Direction.OUT, edgeLabel, otherVertices, propertyKeyValues);
- }
-
- public default GraphTraversal<S, E> property(final String key, final Object value) {
- return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value));
- }
-
- ///////////////////// FILTER STEPS /////////////////////
-
- public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
- return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), predicate));
- }
-
- public default GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
- return this.asAdmin().addStep(0 == orTraversals.length ?
- new OrStep.OrMarker<>(this.asAdmin()) :
- new OrStep(this.asAdmin(), Arrays.copyOf(orTraversals, orTraversals.length, Traversal.Admin[].class)));
- }
-
- public default GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
- return this.asAdmin().addStep(0 == andTraversals.length ?
- new AndStep.AndMarker<>(this.asAdmin()) :
- new AndStep(this.asAdmin(), Arrays.copyOf(andTraversals, andTraversals.length, Traversal.Admin[].class)));
- }
-
- public default GraphTraversal<S, E> inject(final E... injections) {
- return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), injections));
- }
-
- public default GraphTraversal<S, E> dedup() {
- return this.dedup(Scope.global);
- }
-
- public default GraphTraversal<S, E> dedup(final Scope scope) {
- return this.asAdmin().addStep(scope.equals(Scope.global) ? new DedupGlobalStep<>(this.asAdmin()) : new DedupLocalStep(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> except(final String sideEffectKeyOrPathLabel) {
- return this.asAdmin().addStep(new ExceptStep<E>(this.asAdmin(), sideEffectKeyOrPathLabel));
- }
-
- public default GraphTraversal<S, E> except(final E exceptObject) {
- return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptObject));
- }
-
- public default GraphTraversal<S, E> except(final Collection<E> exceptCollection) {
- return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptCollection));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
- return this.asAdmin().addStep(new WhereStep(this.asAdmin(), firstKey, secondKey, predicate));
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
- return this.where(firstKey, secondKey, predicate);
- }
-
- public default <E2> GraphTraversal<S, Map<String, E2>> where(final Traversal constraint) {
- return this.asAdmin().addStep(new WhereStep<>(this.asAdmin(), constraint.asAdmin()));
- }
-
- public default GraphTraversal<S, E> has(final Traversal<?, ?> hasNextTraversal) {
- return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNextTraversal, false));
- }
-
- public default GraphTraversal<S, E> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
- return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNotNextTraversal, true));
- }
-
- public default GraphTraversal<S, E> has(final String key) {
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.within)));
- }
-
- public default GraphTraversal<S, E> has(final String key, final Object value) {
- return this.has(key, Compare.eq, value);
- }
-
- public default GraphTraversal<S, E> has(final T accessor, final Object value) {
- return this.has(accessor.getAccessor(), value);
- }
-
- public default GraphTraversal<S, E> has(final String key, final BiPredicate predicate, final Object value) {
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, predicate, value)));
- }
-
- public default GraphTraversal<S, E> has(final T accessor, final BiPredicate predicate, final Object value) {
- return this.has(accessor.getAccessor(), predicate, value);
- }
-
- public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
- return this.has(label, key, Compare.eq, value);
- }
-
- public default GraphTraversal<S, E> has(final String label, final String key, final BiPredicate predicate, final Object value) {
- return this.has(T.label, label).has(key, predicate, value);
- }
-
- public default GraphTraversal<S, E> hasNot(final String key) {
- return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.without)));
- }
-
- public default GraphTraversal<S, E> hasLabel(final String... labels) {
- return labels.length == 1 ? this.has(T.label, labels[0]) : this.has(T.label, Contains.within, Arrays.asList(labels));
- }
-
- public default GraphTraversal<S, E> hasId(final Object... ids) {
- return ids.length == 1 ? this.has(T.id, ids[0]) : this.has(T.id, Contains.within, Arrays.asList(ids));
- }
-
- public default GraphTraversal<S, E> hasKey(final String... keys) {
- return keys.length == 1 ? this.has(T.key, keys[0]) : this.has(T.key, Contains.within, Arrays.asList(keys));
- }
-
- public default GraphTraversal<S, E> hasValue(final Object... values) {
- return values.length == 1 ? this.has(T.value, values[0]) : this.has(T.value, Contains.within, Arrays.asList(values));
- }
-
- public default GraphTraversal<S, E> is(final Object value) {
- return this.is(Compare.eq, value);
- }
-
- public default GraphTraversal<S, E> is(final BiPredicate predicate, final Object value) {
- return this.asAdmin().addStep(new IsStep(this.asAdmin(), predicate, value));
- }
-
- public default GraphTraversal<S, E> coin(final double probability) {
- return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), probability));
- }
-
- public default GraphTraversal<S, E> range(final long low, final long high) {
- return this.range(Scope.global, low, high);
- }
-
- public default GraphTraversal<S, E> range(final Scope scope, final long low, final long high) {
- return this.asAdmin().addStep(scope.equals(Scope.global)
- ? new RangeGlobalStep<>(this.asAdmin(), low, high)
- : new RangeLocalStep<>(this.asAdmin(), low, high));
- }
-
- public default GraphTraversal<S, E> limit(final long limit) {
- return this.range(Scope.global, 0, limit);
- }
-
- public default GraphTraversal<S, E> limit(final Scope scope, final long limit) {
- return this.range(scope, 0, limit);
- }
-
- public default GraphTraversal<S, E> retain(final String sideEffectKeyOrPathLabel) {
- return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), sideEffectKeyOrPathLabel));
- }
-
- public default GraphTraversal<S, E> retain(final E retainObject) {
- return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainObject));
- }
-
- public default GraphTraversal<S, E> retain(final Collection<E> retainCollection) {
- return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainCollection));
- }
-
- public default GraphTraversal<S, E> simplePath() {
- return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> cyclicPath() {
- return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> sample(final int amountToSample) {
- return this.sample(Scope.global, amountToSample);
- }
-
- public default GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
- return this.asAdmin().addStep(scope.equals(Scope.global)
- ? new SampleGlobalStep<>(this.asAdmin(), amountToSample)
- : new SampleLocalStep<>(this.asAdmin(), amountToSample));
- }
-
- ///////////////////// SIDE-EFFECT STEPS /////////////////////
-
- public default GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
- return this.asAdmin().addStep(new LambdaSideEffectStep<>(this.asAdmin(), consumer));
- }
-
- public default <E2> GraphTraversal<S, E2> cap(final String... sideEffectKeys) {
- return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), sideEffectKeys));
- }
-
- public default GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
- return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), sideEffectKey));
- }
-
- public default GraphTraversal<S, E> aggregate(final String sideEffectKey) {
- return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey));
- }
-
- public default GraphTraversal<S, E> group(final String sideEffectKey) {
- return this.asAdmin().addStep(new GroupSideEffectStep<>(this.asAdmin(), sideEffectKey));
- }
-
- public default GraphTraversal<S, E> groupCount(final String sideEffectKey) {
- return this.asAdmin().addStep(new GroupCountSideEffectStep<>(this.asAdmin(), sideEffectKey));
- }
-
- public default GraphTraversal<S, E> timeLimit(final long timeLimit) {
- return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), timeLimit));
- }
-
- public default GraphTraversal<S, E> tree(final String sideEffectKey) {
- return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), sideEffectKey));
- }
-
- public default <V> GraphTraversal<S, E> sack(final BiFunction<V, E, V> sackFunction) {
- return this.asAdmin().addStep(new SackObjectStep<>(this.asAdmin(), sackFunction));
- }
-
- public default <V> GraphTraversal<S, E> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
- return this.asAdmin().addStep(new SackElementValueStep(this.asAdmin(), sackOperator, elementPropertyKey));
- }
-
- public default GraphTraversal<S, E> store(final String sideEffectKey) {
- return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
- }
-
- public default GraphTraversal<S, E> profile() {
- return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
- }
-
- ///////////////////// BRANCH STEPS /////////////////////
-
- public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
- final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin());
- branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal);
- return this.asAdmin().addStep(branchStep);
- }
-
- public default <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
- return this.branch(new MapTraverserTraversal<>(function));
- }
-
- public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
- return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) choiceTraversal));
- }
-
- public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice));
- }
-
- public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
- return this.choose(new MapTraversal<>(choiceFunction));
- }
-
- public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- return this.choose(new FilterTraversal<>(choosePredicate), trueChoice, falseChoice);
- }
-
- public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
- return this.asAdmin().addStep(new UnionStep(this.asAdmin(), Arrays.copyOf(unionTraversals, unionTraversals.length, Traversal.Admin[].class)));
- }
-
- public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
- return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, Traversal.Admin[].class)));
- }
-
- public default GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
- return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) repeatTraversal);
- }
-
- public default GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
- return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) emitTraversal);
- }
-
- public default GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
- return this.emit(new FilterTraverserTraversal<>(emitPredicate));
- }
-
- public default GraphTraversal<S, E> emit() {
- return this.emit(TrueTraversal.instance());
- }
-
- public default GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
- return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) untilTraversal);
- }
-
- public default GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
- return this.until(new FilterTraverserTraversal<>(untilPredicate));
- }
-
- public default GraphTraversal<S, E> times(final int maxLoops) {
- return this.until(new LoopTraversal(maxLoops));
- }
-
- public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
- return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), localTraversal.asAdmin()));
- }
-
- ///////////////////// UTILITY STEPS /////////////////////
-
- public default GraphTraversal<S, E> withSideEffect(final String key, final Supplier supplier) {
- this.asAdmin().getSideEffects().registerSupplier(key, supplier);
- return this;
- }
-
- public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
- this.asAdmin().getSideEffects().setSack(initialValue, Optional.of(splitOperator));
- return this;
- }
-
- public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue) {
- this.asAdmin().getSideEffects().setSack(initialValue, Optional.empty());
- return this;
- }
-
- public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
- this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
- return this;
- }
-
- public default <A> GraphTraversal<S, E> withSack(A initialValue) {
- this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
- return this;
- }
-
- public default GraphTraversal<S, E> withPath() {
- return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
- }
-
- public default GraphTraversal<S, E> as(final String stepLabel) {
- if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
- this.asAdmin().getEndStep().setLabel(stepLabel);
- return this;
- }
-
- public default GraphTraversal<S, E> barrier() {
- return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
- @Override
- public void barrierConsumer(TraverserSet traverserSet) {
-
- }
- });
- }
-
- ////
-
- public default GraphTraversal<S, E> by() {
- ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new IdentityTraversal<>());
- return this;
- }
-
- public default <V> GraphTraversal<S, E> by(final Function<V, Object> functionProjection) {
- ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(functionProjection));
- return this;
- }
-
- public default GraphTraversal<S, E> by(final T tokenProjection) {
- ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(tokenProjection));
- return this;
- }
-
- public default GraphTraversal<S, E> by(final String elementPropertyKey) {
- ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new ElementValueTraversal<>(elementPropertyKey));
- return this;
- }
-
- public default GraphTraversal<S, E> by(final Traversal<?, ?> byTraversal) {
- ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(byTraversal.asAdmin());
- return this;
- }
-
- ////
-
- public default GraphTraversal<S, E> by(final Order order) {
- ((ComparatorHolder) this.asAdmin().getEndStep()).addComparator(order);
- return this;
- }
-
- public default GraphTraversal<S, E> by(final Comparator<E> comparator) {
- ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(comparator);
- return this;
- }
-
- public default <V> GraphTraversal<S, E> by(final Function<Element, V> elementFunctionProjection, final Comparator<V> elementFunctionValueComparator) {
- ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementFunctionComparator<>(elementFunctionProjection, elementFunctionValueComparator));
- return this;
- }
-
- public default <V> GraphTraversal<S, E> by(final String elementPropertyProjection, final Comparator<V> propertyValueComparator) {
- ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementValueComparator<>(elementPropertyProjection, propertyValueComparator));
- return this;
- }
-
- public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> endComparator) {
- ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(new TraversalComparator(traversal.asAdmin(), endComparator));
- return this;
- }
-
- ////
-
- public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
- ((TraversalOptionParent<M, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, traversalOption.asAdmin());
- return this;
- }
-
- public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
- ((TraversalOptionParent<TraversalOptionParent.Pick, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, traversalOption.asAdmin());
- return this;
- }
-
- ////
-
- @Override
- public default void remove() {
- try {
- this.asAdmin().applyStrategies();
- final Step<?, E> endStep = this.asAdmin().getEndStep();
- while (true) {
- final Object object = endStep.next().get();
- if (object instanceof Element)
- ((Element) object).remove();
- else if (object instanceof Property)
- ((Property) object).remove();
- else {
- throw new IllegalStateException("The following object does not have a remove() method: " + object);
- }
- }
- } catch (final NoSuchElementException ignored) {
-
- }
- }
-
- @Override
- public default GraphTraversal<S, E> iterate() {
- Traversal.super.iterate();
- return this;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
deleted file mode 100644
index cf0de34..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
+++ /dev/null
@@ -1,138 +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.graph.traversal;
-
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Transaction;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GraphTraversalSource implements TraversalSource {
-
- public static final Builder standard = GraphTraversalSource.build().engine(StandardTraversalEngine.build());
- public static final Builder computer = GraphTraversalSource.build().engine(ComputerTraversalEngine.build());
-
- public static Builder computer(final Class<? extends GraphComputer> graphComputerClass) {
- return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(graphComputerClass));
- }
-
- ////
-
- private final transient Graph graph;
- private final TraversalEngine.Builder engine;
- private final TraversalStrategies strategies;
-
- public GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final TraversalStrategy... strategies) {
- this.graph = graph;
- this.engine = engine;
- final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
- this.strategies = strategies.length == 0 ? tempStrategies : tempStrategies.clone().addStrategies(strategies);
- }
-
- public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
- traversal.setEngine(this.engine.create(this.graph));
- traversal.setStrategies(this.strategies);
- return traversal.addStep(new AddVertexStartStep(traversal, keyValues));
- }
-
- public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
- final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
- traversal.setEngine(this.engine.create(this.graph));
- traversal.setStrategies(this.strategies);
- return traversal.addStep(new GraphStep<>(traversal, Vertex.class, vertexIds));
- }
-
- public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
- final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.graph);
- traversal.setEngine(this.engine.create(this.graph));
- traversal.setStrategies(this.strategies);
- return traversal.addStep(new GraphStep<>(traversal, Edge.class, edgesIds));
- }
-
- public Transaction tx() {
- return this.graph.tx();
- }
-
- public static Builder build() {
- return new Builder();
- }
-
-
- @Override
- public Optional<GraphComputer> getGraphComputer() {
- return this.engine.create(this.graph).getGraphComputer();
- }
-
- @Override
- public Optional<Graph> getGraph() {
- return Optional.ofNullable(this.graph);
- }
-
- @Override
- public GraphTraversalSource.Builder asBuilder() {
- final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engine);
- this.strategies.toList().forEach(builder::strategy);
- return builder;
- }
-
- @Override
- public String toString() {
- return StringFactory.traversalSourceString(this);
- }
-
- //////
-
- public static class Builder implements TraversalSource.Builder<GraphTraversalSource> {
-
- private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build();
- private List<TraversalStrategy> strategies = new ArrayList<>();
-
- public Builder engine(final TraversalEngine.Builder engineBuilder) {
- this.engineBuilder = engineBuilder;
- return this;
- }
-
- public Builder strategy(final TraversalStrategy strategy) {
- this.strategies.add(strategy);
- return this;
- }
-
- public GraphTraversalSource create(final Graph graph) {
- return new GraphTraversalSource(graph, this.engineBuilder, this.strategies.toArray(new TraversalStrategy[this.strategies.size()]));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
deleted file mode 100644
index b613596..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
+++ /dev/null
@@ -1,602 +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.graph.traversal;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiFunction;
-import java.util.function.BiPredicate;
-import java.util.function.BinaryOperator;
-import java.util.function.Consumer;
-import java.util.function.Function;
-import java.util.function.Predicate;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class __ {
-
- protected __() {
- }
-
- //////////////////////////////////////////////////////////////////////
-
- public static <A> GraphTraversal<A, A> start() {
- return new DefaultGraphTraversal<>(EmptyGraph.instance());
- }
-
- public static <A> GraphTraversal<A, A> __(final Object... starts) {
- return inject(starts);
- }
-
- ///////////////////// MAP STEPS /////////////////////
-
- public static <A, E2> GraphTraversal<A, E2> map(final Function<Traverser<A>, E2> function) {
- return __.<A>start().map(function);
- }
-
- public static <A, E2> GraphTraversal<A, E2> flatMap(final Function<Traverser<A>, Iterator<E2>> function) {
- return __.<A>start().flatMap(function);
- }
-
- public static <A> GraphTraversal<A, A> identity() {
- return __.<A>start().identity();
- }
-
- public static <A> GraphTraversal<A, String> label() {
- return __.<A>start().label();
- }
-
- public static <A> GraphTraversal<A, Object> id() {
- return __.<A>start().id();
- }
-
- public static <A> GraphTraversal<A, Vertex> to(final Direction direction, final String... edgeLabels) {
- return __.<A>start().to(direction, edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Vertex> out(final String... edgeLabels) {
- return __.<A>start().out(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Vertex> in(final String... edgeLabels) {
- return __.<A>start().in(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Vertex> both(final String... edgeLabels) {
- return __.<A>start().both(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Edge> toE(final Direction direction, final String... edgeLabels) {
- return __.<A>start().toE(direction, edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Edge> outE(final String... edgeLabels) {
- return __.<A>start().outE(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Edge> inE(final String... edgeLabels) {
- return __.<A>start().inE(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Edge> bothE(final String... edgeLabels) {
- return __.<A>start().bothE(edgeLabels);
- }
-
- public static <A> GraphTraversal<A, Vertex> toV(final Direction direction) {
- return __.<A>start().toV(direction);
- }
-
- public static <A> GraphTraversal<A, Vertex> inV() {
- return __.<A>start().inV();
- }
-
- public static <A> GraphTraversal<A, Vertex> outV() {
- return __.<A>start().outV();
- }
-
- public static <A> GraphTraversal<A, Vertex> bothV() {
- return __.<A>start().bothV();
- }
-
- public static <A> GraphTraversal<A, Vertex> otherV() {
- return __.<A>start().otherV();
- }
-
- public static <A> GraphTraversal<A, A> order() {
- return __.<A>start().order();
- }
-
- public static <A> GraphTraversal<A, A> order(final Scope scope) {
- return __.<A>start().order(scope);
- }
-
- public static <A, E2> GraphTraversal<A, ? extends Property<E2>> properties(final String... propertyKeys) {
- return __.<A>start().properties(propertyKeys);
- }
-
- public static <A, E2> GraphTraversal<A, E2> values(final String... propertyKeys) {
- return __.<A>start().values(propertyKeys);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> propertyMap(final String... propertyKeys) {
- return __.<A>start().propertyMap(propertyKeys);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final String... propertyKeys) {
- return __.<A>start().valueMap(propertyKeys);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
- return __.<A>start().valueMap(includeTokens, propertyKeys);
- }
-
- public static <A> GraphTraversal<A, String> key() {
- return __.<A>start().key();
- }
-
- public static <A, E2> GraphTraversal<A, E2> value() {
- return __.<A>start().value();
- }
-
- public static <A> GraphTraversal<A, Path> path() {
- return __.<A>start().path();
- }
-
- public static <A, E2> GraphTraversal<A, E2> back(final String stepLabel) {
- return __.<A>start().back(stepLabel);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
- return __.<A>start().match(startLabel, traversals);
- }
-
- public static <A, E2> GraphTraversal<A, E2> sack() {
- return __.<A>start().sack();
- }
-
- public static <A, E2> GraphTraversal<A, E2> select(final String stepLabel) {
- return __.<A>start().select(stepLabel);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> select(final String... stepLabels) {
- return __.<A>start().select(stepLabels);
- }
-
- public static <A> GraphTraversal<A, A> unfold() {
- return __.<A>start().unfold();
- }
-
- public static <A> GraphTraversal<A, List<A>> fold() {
- return __.<A>start().fold();
- }
-
- public static <A, E2> GraphTraversal<A, E2> fold(final E2 seed, final BiFunction<E2, A, E2> foldFunction) {
- return __.<A>start().fold(seed, foldFunction);
- }
-
- public static <A> GraphTraversal<A, Long> count() {
- return __.<A>start().count();
- }
-
- public static <A> GraphTraversal<A, Long> count(final Scope scope) {
- return __.<A>start().count(scope);
- }
-
- public static <A> GraphTraversal<A, Double> sum() {
- return __.<A>start().sum();
- }
-
- public static <A> GraphTraversal<A, Double> sum(final Scope scope) {
- return __.<A>start().sum(scope);
- }
-
-
- public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
- return __.<A>start().min();
- }
-
- public static <A, E2 extends Number> GraphTraversal<A, E2> min(final Scope scope) {
- return __.<A>start().min(scope);
- }
-
- public static <A, E2 extends Number> GraphTraversal<A, E2> max() {
- return __.<A>start().max();
- }
-
- public static <A, E2 extends Number> GraphTraversal<A, E2> max(final Scope scope) {
- return __.<A>start().max(scope);
- }
-
- public static <A> GraphTraversal<A, Double> mean() {
- return __.<A>start().mean();
- }
-
- public static <A> GraphTraversal<A, Double> mean(final Scope scope) {
- return __.<A>start().mean(scope);
- }
-
- public static <A, K, R> GraphTraversal<A, Map<K, R>> group() {
- return __.<A>start().group();
- }
-
- public static <A, B> GraphTraversal<A, Map<B, Long>> groupCount() {
- return __.<A>start().<B>groupCount();
- }
-
- public static <A> GraphTraversal<A, Tree> tree() {
- return __.<A>start().tree();
- }
-
- public static <A> GraphTraversal<A, Vertex> addV(final Object... propertyKeyValues) {
- return __.<A>start().addV(propertyKeyValues);
- }
-
- public static <A> GraphTraversal<A, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
- return __.<A>start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
- }
-
- public static <A> GraphTraversal<A, Edge> addInE(final String edgeLabel, final String setLabel, final Object... propertyKeyValues) {
- return __.<A>start().addInE(edgeLabel, setLabel, propertyKeyValues);
- }
-
- public static <A> GraphTraversal<A, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
- return __.<A>start().addOutE(edgeLabel, stepLabel, propertyKeyValues);
- }
-
- public static <A> GraphTraversal<A, A> property(final String key, final Object value) {
- return __.<A>start().property(key, value);
- }
-
- ///////////////////// FILTER STEPS /////////////////////
-
- public static <A> GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
- return __.<A>start().filter(predicate);
- }
-
- public static <A> GraphTraversal<A, A> and(final Traversal<?, ?>... andTraversals) {
- return __.<A>start().and(andTraversals);
- }
-
- public static <A> GraphTraversal<A, A> or(final Traversal<?, ?>... orTraversals) {
- return __.<A>start().or(orTraversals);
- }
-
- public static <A> GraphTraversal<A, A> inject(final Object... injections) {
- return __.<A>start().inject((A[]) injections);
- }
-
- public static <A> GraphTraversal<A, A> dedup() {
- return __.<A>start().dedup();
- }
-
- public static <A> GraphTraversal<A, A> dedup(final Scope scope) {
- return __.<A>start().dedup(scope);
- }
-
- public static <A> GraphTraversal<A, A> except(final String sideEffectKeyOrPathLabel) {
- return __.<A>start().except(sideEffectKeyOrPathLabel);
- }
-
- public static <A> GraphTraversal<A, A> except(final Object exceptObject) {
- return __.<A>start().except((A) exceptObject);
- }
-
- public static <A> GraphTraversal<A, A> except(final Collection<A> exceptCollection) {
- return __.<A>start().except(exceptCollection);
- }
-
- public static <A> GraphTraversal<A, A> has(final Traversal<?, ?> hasNextTraversal) {
- return __.<A>start().has(hasNextTraversal);
- }
-
- public static <A> GraphTraversal<A, A> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
- return __.<A>start().hasNot(hasNotNextTraversal);
- }
-
- public static <A> GraphTraversal<A, A> has(final String key) {
- return __.<A>start().has(key);
- }
-
- public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
- return __.<A>start().has(key, value);
- }
-
- public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
- return __.<A>start().has(accessor, value);
- }
-
- public static <A> GraphTraversal<A, A> has(final String key, final BiPredicate predicate, final Object value) {
- return __.<A>start().has(key, predicate, value);
- }
-
- public static <A> GraphTraversal<A, A> has(final T accessor, final BiPredicate predicate, final Object value) {
- return __.<A>start().has(accessor, predicate, value);
- }
-
- public static <A> GraphTraversal<A, A> has(final String label, final String key, final Object value) {
- return __.<A>start().has(label, key, value);
- }
-
- public static <A> GraphTraversal<A, A> has(final String label, final String key, final BiPredicate predicate, final Object value) {
- return __.<A>start().has(label, key, predicate, value);
- }
-
- public static <A> GraphTraversal<A, A> hasNot(final String key) {
- return __.<A>start().hasNot(key);
- }
-
- public static <A> GraphTraversal<A, A> hasLabel(final String... labels) {
- return __.<A>start().hasLabel(labels);
- }
-
- public static <A> GraphTraversal<A, A> hasId(final Object... ids) {
- return __.<A>start().hasId(ids);
- }
-
- public static <A> GraphTraversal<A, A> hasKey(final String... keys) {
- return __.<A>start().hasKey(keys);
- }
-
- public static <A> GraphTraversal<A, A> hasValue(final Object... values) {
- return __.<A>start().hasValue(values);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
- return __.<A>start().where(firstKey, secondKey, predicate);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
- return __.<A>start().where(firstKey, predicate, secondKey);
- }
-
- public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final Traversal constraint) {
- return __.<A>start().where(constraint);
- }
-
- public static <A> GraphTraversal<A, A> is(final Object value) {
- return __.<A>start().is(value);
- }
-
- public static <A> GraphTraversal<A, A> is(final BiPredicate predicate, final Object value) {
- return __.<A>start().is(predicate, value);
- }
-
- public static <A> GraphTraversal<A, A> coin(final double probability) {
- return __.<A>start().coin(probability);
- }
-
- public static <A> GraphTraversal<A, A> range(final long low, final long high) {
- return __.<A>start().range(low, high);
- }
-
- public static <A> GraphTraversal<A, A> range(final Scope scope, final long low, final long high) {
- return __.<A>start().range(scope, low, high);
- }
-
- public static <A> GraphTraversal<A, A> limit(final long limit) {
- return __.<A>start().limit(limit);
- }
-
- public static <A> GraphTraversal<A, A> limit(final Scope scope, final long limit) {
- return __.<A>start().limit(scope, limit);
- }
-
- public static <A> GraphTraversal<A, A> retain(final String sideEffectKeyOrPathLabel) {
- return __.<A>start().retain(sideEffectKeyOrPathLabel);
- }
-
- public static <A> GraphTraversal<A, A> retain(final Object retainObject) {
- return __.<A>start().retain((A) retainObject);
- }
-
- public static <A> GraphTraversal<A, A> retain(final Collection<A> retainCollection) {
- return __.<A>start().retain(retainCollection);
- }
-
- public static <A> GraphTraversal<A, A> simplePath() {
- return __.<A>start().simplePath();
- }
-
- public static <A> GraphTraversal<A, A> cyclicPath() {
- return __.<A>start().cyclicPath();
- }
-
- public static <A> GraphTraversal<A, A> sample(final int amountToSample) {
- return __.<A>start().sample(amountToSample);
- }
-
- public static <A> GraphTraversal<A, A> sample(final Scope scope, final int amountToSample) {
- return __.<A>start().sample(scope, amountToSample);
- }
-
- ///////////////////// SIDE-EFFECT STEPS /////////////////////
-
- public static <A> GraphTraversal<A, A> sideEffect(final Consumer<Traverser<A>> consumer) {
- return __.<A>start().sideEffect(consumer);
- }
-
- public static <A, E2> GraphTraversal<A, E2> cap(final String... sideEffectKeys) {
- return __.<A>start().cap(sideEffectKeys);
- }
-
- public static <A> GraphTraversal<A, Edge> subgraph(final String sideEffectKey) {
- return __.<A>start().subgraph(sideEffectKey);
- }
-
- public static <A> GraphTraversal<A, A> aggregate(final String sideEffectKey) {
- return __.<A>start().aggregate(sideEffectKey);
- }
-
- public static <A> GraphTraversal<A, A> group(final String sideEffectKey) {
- return __.<A>start().group(sideEffectKey);
- }
-
- public static <A> GraphTraversal<A, A> groupCount(final String sideEffectKey) {
- return __.<A>start().groupCount(sideEffectKey);
- }
-
- public static <A> GraphTraversal<A, A> timeLimit(final long timeLimit) {
- return __.<A>start().timeLimit(timeLimit);
- }
-
- public static <A> GraphTraversal<A, A> tree(final String sideEffectKey) {
- return __.<A>start().tree(sideEffectKey);
- }
-
- public static <A, V> GraphTraversal<A, A> sack(final BiFunction<V, A, V> sackFunction) {
- return __.<A>start().sack(sackFunction);
- }
-
- public static <A, V> GraphTraversal<A, A> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
- return __.<A>start().sack(sackOperator, elementPropertyKey);
- }
-
- public static <A> GraphTraversal<A, A> store(final String sideEffectKey) {
- return __.<A>start().store(sideEffectKey);
- }
-
- ///////////////////// BRANCH STEPS /////////////////////
-
- public static <A, M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {
- return __.<A>start().branch(function);
- }
-
- public static <A, M, E2> GraphTraversal<A, E2> branch(final Traversal<?, M> traversalFunction) {
- return __.<A>start().branch(traversalFunction);
- }
-
- public static <A, E2> GraphTraversal<A, E2> choose(final Predicate<A> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- return __.<A>start().choose(choosePredicate, trueChoice, falseChoice);
- }
-
- public static <A, M, E2> GraphTraversal<A, E2> choose(final Function<A, M> choiceFunction) {
- return __.<A>start().choose(choiceFunction);
- }
-
- public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalFunction) {
- return __.<A>start().choose(traversalFunction);
- }
-
- public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
- return __.<A>start().choose(traversalPredicate, trueChoice, falseChoice);
- }
-
- public static <A, E2> GraphTraversal<A, E2> union(final Traversal<?, E2>... traversals) {
- return __.<A>start().union(traversals);
- }
-
- public static <A, E2> GraphTraversal<A, E2> coalesce(final Traversal<?, E2>... traversals) {
- return __.<A>start().coalesce(traversals);
- }
-
- public static <A> GraphTraversal<A, A> repeat(final Traversal<?, A> traversal) {
- return __.<A>start().repeat(traversal);
- }
-
- public static <A> GraphTraversal<A, A> emit(final Traversal<?, ?> emitTraversal) {
- return __.<A>start().emit(emitTraversal);
- }
-
- public static <A> GraphTraversal<A, A> emit(final Predicate<Traverser<A>> emitPredicate) {
- return __.<A>start().emit(emitPredicate);
- }
-
- public static <A> GraphTraversal<A, A> until(final Traversal<?, ?> untilTraversal) {
- return __.<A>start().until(untilTraversal);
- }
-
- public static <A> GraphTraversal<A, A> until(final Predicate<Traverser<A>> untilPredicate) {
- return __.<A>start().until(untilPredicate);
- }
-
- public static <A> GraphTraversal<A, A> times(final int maxLoops) {
- return __.<A>start().times(maxLoops);
- }
-
- public static <A> GraphTraversal<A, A> emit() {
- return __.<A>start().emit();
- }
-
- public static <A, E2> GraphTraversal<A, E2> local(final Traversal<?, E2> localTraversal) {
- return __.<A>start().local(localTraversal);
- }
-
- ///////////////////// UTILITY STEPS /////////////////////
-
- public static <A> GraphTraversal<A, A> as(final String label) {
- return __.<A>start().as(label);
- }
-
- public static <A> GraphTraversal<A, A> profile() {
- return __.<A>start().profile();
- }
-
- public static <A> GraphTraversal<A, A> withSideEffect(final String key, final Supplier supplier) {
- return __.<A>start().withSideEffect(key, supplier);
- }
-
- public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue, final UnaryOperator<B> splitOperator) {
- return __.<A>start().withSack(initialValue, splitOperator);
- }
-
- public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue) {
- return __.<A>start().withSack(initialValue);
- }
-
- public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
- return __.<A>start().withSack(initialValue, splitOperator);
- }
-
- public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
- return __.<A>start().withSack(initialValue);
- }
-
- public static <A> GraphTraversal<A, A> withPath() {
- return __.<A>start().withPath();
- }
-
- public static <A> GraphTraversal<A, A> barrier() {
- return __.<A>start().barrier();
- }
-
- ////
-
- public static <A> GraphTraversal<A, A> iterate() {
- return __.<A>start().iterate();
- }
-
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
deleted file mode 100644
index fdc03fa..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
+++ /dev/null
@@ -1,50 +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.graph.traversal.lambda;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.AbstractLambdaTraversal;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LoopTraversal<S, E> extends AbstractLambdaTraversal<S, E> {
-
- private final long maxLoops;
- private boolean allow = false;
-
- public LoopTraversal(final long maxLoops) {
- this.maxLoops = maxLoops;
- }
-
- @Override
- public boolean hasNext() {
- return this.allow;
- }
-
- @Override
- public void addStart(final Traverser<S> start) {
- this.allow = start.loops() >= this.maxLoops;
- }
-
- @Override
- public String toString() {
- return "loops(" + this.maxLoops + ')';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
deleted file mode 100644
index 474c994..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
+++ /dev/null
@@ -1,33 +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.graph.traversal.step;
-
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface ComparatorHolder<S> {
-
- public void addComparator(final Comparator<S> comparator);
-
- public List<Comparator<S>> getComparators();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
deleted file mode 100644
index 52db804..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
+++ /dev/null
@@ -1,33 +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.graph.traversal.step;
-
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface HasContainerHolder {
-
- public List<HasContainer> getHasContainers();
-
- public void addHasContainer(final HasContainer hasContainer);
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
deleted file mode 100644
index ad7761b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
+++ /dev/null
@@ -1,28 +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.graph.traversal.step;
-
-/**
- * A marker interface for steps that modify the graph.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public interface Mutating {
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
deleted file mode 100644
index 6263b96..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
+++ /dev/null
@@ -1,30 +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.graph.traversal.step;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Ranging {
-
- public long getLowRange();
-
- public long getHighRange();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
deleted file mode 100644
index 9ad7d87..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
+++ /dev/null
@@ -1,28 +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.graph.traversal.step;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface SideEffectCapable {
-
- public String getSideEffectKey();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
deleted file mode 100644
index dbea36a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
+++ /dev/null
@@ -1,32 +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.graph.traversal.step;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalOptionParent<M, S, E> extends TraversalParent {
-
- public static enum Pick {any, none}
-
- public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption);
-}
[06/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
new file mode 100644
index 0000000..628902f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class IsTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
+
+ public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
+
+ public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valuesXageX_isX32X() {
+ Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isX32X();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals(Integer.valueOf(32), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valuesXageX_isXlte_30X() {
+ Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXlte_30X();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(27, 29), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+ Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList(29, 32), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+ Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals("ripple", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+ Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals("lop", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends IsTest {
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+ return g.V().<Integer>values("age").is(32);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+ return g.V().<Integer>values("age").is(Compare.lte, 30);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+ return g.V().<Integer>values("age").is(Compare.gte, 29).is(Compare.lt, 34);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+ return g.V().has(in("created").count().is(1l)).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+ return g.V().has(in("created").count().is(Compare.gte, 2l)).values("name");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
new file mode 100644
index 0000000..c1f73eb
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class OrTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
+
+ public abstract Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+ final Traversal<Vertex, String> traversal = get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("marko", "ripple", "lop", "peter"), traversal);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends OrTest {
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+ return g.V().or(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+ return g.V().or(outE("knows"), has(T.label, "software").or().has("age", Compare.gte, 35)).values("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
new file mode 100644
index 0000000..31c8be3
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
@@ -0,0 +1,265 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class RangeTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X();
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_limitX2X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_limitX2X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ traversal.next();
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_localXoutE_limitX1X_inVX_limitX3X();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ traversal.next();
+ }
+ assertEquals(3, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next().value("name");
+ assertTrue(name.equals("lop") || name.equals("ripple"));
+ }
+ assertEquals(1, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next().value("name");
+ assertTrue(name.equals("lop") || name.equals("ripple"));
+ }
+ assertEquals(1, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next().value("name");
+ assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final String name = traversal.next().value("name");
+ assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ traversal.next();
+ counter++;
+ }
+ assertEquals(6, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @Ignore("This should not work cause fold kills the path history")
+ public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ final Map<String, Object> map = traversal.next();
+ final List<Double> weights = (List<Double>) map.get("w");
+ if (map.get("s").equals("lop")) {
+ assertEquals(1, weights.size());
+ assertTrue(Arrays.asList(0.4, 0.2).contains(weights.get(0)));
+ } else if (map.get("s").equals("ripple")) {
+ assertEquals(1, weights.size());
+ assertEquals(1.0, weights.get(0), 0.0);
+ } else {
+ assertTrue(false);
+ }
+ counter++;
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @Ignore("This should not work cause fold kills the path history")
+ public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ final Map<String, Object> map = traversal.next();
+ final List<Double> weights = (List<Double>) map.get("w");
+ if (map.get("s").equals("lop")) {
+ assertEquals(2, weights.size());
+ assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(0)));
+ assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(1)));
+ assertNotEquals(weights.get(0), weights.get(1));
+ } else if (map.get("s").equals("ripple")) {
+ assertEquals(0, weights.size());
+ } else {
+ assertTrue(false);
+ }
+ counter++;
+ }
+ assertEquals(2, counter);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends RangeTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
+ return g.V(v1Id).out().limit(2);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+ return g.V().local(outE().limit(1)).inV().limit(3);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
+ return g.V(v1Id).out("knows").outE("created").range(0, 1).inV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
+ return g.V(v1Id).out("knows").out("created").range(0, 1);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
+ return g.V(v1Id).out("created").in("created").range(1, 3);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
+ return g.V(v1Id).out("created").inE("created").range(1, 3).outV();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+ return g.V().repeat(both()).times(3).range(5, 11);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+ return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().limit(Scope.local, 1)).as("w").select().by("name").by();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+ return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().range(Scope.local, 1, 3)).as("w").select().by("name").by();
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
new file mode 100644
index 0000000..aecfb9d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class RetainTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id);
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_VX1X_out_retainXg_v2X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_retainXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+ printTraversalForm(traversal);
+ assertEquals("vadas", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_out_aggregateXxX_out_retainXxX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_retainXxX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals("lop", traversal.next().<String>value("name"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertEquals("marko", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends RetainTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+ return g.V(v1Id).out().retain(g.V(v2Id).next());
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+ return g.V(v1Id).out().aggregate("x").out().retain("x");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+ return g.V(v1Id).as("a").out("created").in("created").retain("a").values("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
new file mode 100644
index 0000000..de80f32
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SampleTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Edge, Edge> get_g_E_sampleX1X();
+
+ public abstract Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX();
+
+ public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX();
+
+ public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
+
+ public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_E_sampleX1X() {
+ final Traversal<Edge, Edge> traversal = get_g_E_sampleX1X();
+ assertTrue(traversal.hasNext());
+ traversal.next();
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_E_sampleX2X_byXweightX() {
+ final Traversal<Edge, Edge> traversal = get_g_E_sampleX2X_byXweightX();
+ assertTrue(traversal.hasNext());
+ traversal.next();
+ assertTrue(traversal.hasNext());
+ traversal.next();
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_localXoutE_sampleX1X_byXweightXX() {
+ final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_sampleX1X_byXweightXX();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ traversal.next();
+ }
+ assertEquals(3, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+ final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
+ get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Collection<Double>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(2, map.get("software").size());
+ assertEquals(2, map.get("person").size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
+ final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
+ get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Collection<Double>> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(4, map.get("software").size());
+ assertEquals(5, map.get("person").size());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SampleTest {
+ @Override
+ public Traversal<Edge, Edge> get_g_E_sampleX1X() {
+ return g.E().sample(1);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+ return g.E().sample(2).by("weight");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+ return g.V().local(outE().sample(1).by("weight"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+ return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 2));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
+ return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 5));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
new file mode 100644
index 0000000..61a7734
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SimplePathTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id);
+
+ public abstract Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outXcreatedX_inXcreatedX_simplePath() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Vertex vertex = traversal.next();
+ assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("peter"));
+ }
+ assertEquals(2, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_repeatXboth_simplePathX_timesX3X_path() {
+ final Traversal<Vertex, Path> traversal = get_g_V_repeatXboth_simplePathX_timesX3X_path();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertTrue(traversal.next().isSimple());
+ }
+ assertEquals(18, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends SimplePathTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+ return g.V(v1Id).out("created").in("created").simplePath();
+ }
+
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+ return g.V().repeat(both().simplePath()).times(3).path();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
new file mode 100644
index 0000000..da75411
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class WhereTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
+
+ public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Object> map = traversal.next();
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.containsKey("b"));
+ assertEquals(map.get("a"), map.get("b"));
+ }
+ assertEquals(6, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_b_neqX() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Object> map = traversal.next();
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.containsKey("b"));
+ assertNotEquals(map.get("a"), map.get("b"));
+ assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("marko")) ||
+ ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")) ||
+ ((Vertex) map.get("a")).id().equals(convertToVertexId("josh")));
+ assertTrue(((Vertex) map.get("b")).id().equals(convertToVertexId("marko")) ||
+ ((Vertex) map.get("b")).id().equals(convertToVertexId("peter")) ||
+ ((Vertex) map.get("b")).id().equals(convertToVertexId("josh")));
+ }
+ assertEquals(6, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ int markoCounter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Object> map = traversal.next();
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.containsKey("b"));
+ assertEquals(convertToVertexId("marko"), ((Vertex) map.get("b")).id());
+ if (((Vertex) map.get("a")).id().equals(convertToVertexId("marko")))
+ markoCounter++;
+ else
+ assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("josh")) || ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")));
+ }
+ assertEquals(3, markoCounter);
+ assertEquals(5, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+ final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Map<String, Object> map = traversal.next();
+ assertEquals(2, map.size());
+ assertTrue(map.containsKey("a"));
+ assertTrue(map.containsKey("b"));
+ assertEquals(convertToVertexId("marko"), ((Vertex) map.get("a")).id());
+ assertEquals(convertToVertexId("josh"), ((Vertex) map.get("b")).id());
+ }
+ assertEquals(1, counter);
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends WhereTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+ return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.eq, "b");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+ return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.neq, "b");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+ return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("b").has("name", "marko"));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+ return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("a").out("knows").as("b"));
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
new file mode 100644
index 0000000..3f790b8
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class AddEdgeTest extends AbstractGremlinTest {
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+ public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int count = 0;
+ while (traversal.hasNext()) {
+ final Edge edge = traversal.next();
+ assertEquals("createdBy", edge.label());
+ assertEquals(0, IteratorUtils.count(edge.properties()));
+ count++;
+
+ }
+ assertEquals(1, count);
+ assertEquals(7, IteratorUtils.count(graph.edges()));
+ assertEquals(6, IteratorUtils.count(graph.vertices()));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+ public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int count = 0;
+ while (traversal.hasNext()) {
+ final Edge edge = traversal.next();
+ assertEquals("createdBy", edge.label());
+ assertEquals(2, edge.<Integer>value("weight").intValue());
+ assertEquals(1, IteratorUtils.count(edge.properties()));
+ count++;
+
+
+ }
+ assertEquals(1, count);
+ assertEquals(7, IteratorUtils.count(graph.edges()));
+ assertEquals(6, IteratorUtils.count(graph.vertices()));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+ public void g_V_addOutEXexistsWith__g_V__time_nowX() {
+ final Traversal<Vertex, Edge> traversal = get_g_V_addOutEXexistsWith__g_V__time_nowX();
+ printTraversalForm(traversal);
+ int count = 0;
+ while (traversal.hasNext()) {
+ final Edge edge = traversal.next();
+ assertEquals("existsWith", edge.label());
+ assertEquals("now", edge.value("time"));
+ assertEquals(1, IteratorUtils.count(edge.properties()));
+ count++;
+ }
+ assertEquals(36, count);
+ assertEquals(42, IteratorUtils.count(graph.edges()));
+ for (final Vertex vertex : IteratorUtils.list(graph.vertices())) {
+ assertEquals(6, IteratorUtils.count(vertex.edges(Direction.OUT, "existsWith")));
+ assertEquals(6, IteratorUtils.count(vertex.edges(Direction.IN, "existsWith")));
+ }
+ assertEquals(6, IteratorUtils.count(graph.vertices()));
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends AddEdgeTest {
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
+ return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id) {
+ return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a", "weight", 2);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
+ return g.V().addOutE("existsWith", g.V(), "time", "now");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
new file mode 100644
index 0000000..284633b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AddVertexTest extends AbstractGremlinTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
+
+ public abstract Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+ public void g_V_addVXlabel_animal_age_0X() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
+ printTraversalForm(traversal);
+ int count = 0;
+ while (traversal.hasNext()) {
+ final Vertex vertex = traversal.next();
+ assertEquals("animal", vertex.label());
+ assertEquals(0, vertex.<Integer>value("age").intValue());
+ count++;
+ }
+ assertEquals(12, IteratorUtils.count(graph.vertices()));
+ assertEquals(6, count);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+ public void g_addVXlabel_person_name_stephenX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
+ printTraversalForm(traversal);
+ final Vertex stephen = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals("person", stephen.label());
+ assertEquals("stephen", stephen.value("name"));
+ assertEquals(1, IteratorUtils.count(stephen.properties()));
+ assertEquals(7, IteratorUtils.count(graph.vertices()));
+ }
+
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class Traversals extends AddVertexTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
+ return g.V().addV(T.label, "animal", "age", 0);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+ return g.addV(T.label, "person", "name", "stephen");
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
new file mode 100644
index 0000000..631d2dc
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
@@ -0,0 +1,220 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class BackTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX();
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_asXhereX_out_backXhereX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXhereX_out_backXhereX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ assertEquals("marko", traversal.next().<String>value("name"));
+ }
+ assertEquals(3, counter);
+ }
+
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ final Vertex vertex = traversal.next();
+ assertEquals("java", vertex.<String>value("lang"));
+ assertTrue(vertex.value("name").equals("ripple") || vertex.value("name").equals("lop"));
+ }
+ assertEquals(2, counter);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX() {
+ final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ final Edge edge = traversal.next();
+ assertEquals("knows", edge.label());
+ assertEquals(convertToVertexId("vadas"), edge.inVertex().id());
+ assertEquals(convertToVertexId("marko"), edge.outVertex().id());
+ assertEquals(0.5d, edge.<Double>value("weight"), 0.0001d);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name() {
+ final Traversal<Vertex, String> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(convertToVertexId("josh"));
+ printTraversalForm(traversal);
+ int counter = 0;
+ final Set<String> names = new HashSet<>();
+ while (traversal.hasNext()) {
+ counter++;
+ names.add(traversal.next());
+ }
+ assertEquals(2, counter);
+ assertEquals(2, names.size());
+ assertTrue(names.contains("ripple"));
+ assertTrue(names.contains("lop"));
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX() {
+ final List<Traversal<Vertex, Edge>> traversals = Arrays.asList(
+ get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
+ get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
+ get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")));
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertTrue(traversal.hasNext());
+ final Edge edge = traversal.next();
+ assertEquals("knows", edge.label());
+ assertEquals(1.0d, edge.<Double>value("weight"), 0.00001d);
+ assertFalse(traversal.hasNext());
+ assertFalse(traversal.hasNext());
+ });
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_asXhereXout_name_backXhereX() {
+ Traversal<Vertex, Vertex> traversal = get_g_V_asXhereXout_name_backXhereX();
+ printTraversalForm(traversal);
+ super.checkResults(new HashMap<Vertex, Long>() {{
+ put(convertToVertex(graph, "marko"), 3l);
+ put(convertToVertex(graph, "josh"), 2l);
+ put(convertToVertex(graph, "peter"), 1l);
+ }}, traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+ List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX());
+ traversals.forEach(traversal -> {
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ final Map<String, Long> map = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(2, map.size());
+ assertEquals(1l, map.get("ripple").longValue());
+ assertEquals(6l, map.get("lop").longValue());
+ });
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends BackTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+ return g.V(v1Id).as("here").out().back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+ return g.V(v4Id).out().as("here").has("lang", "java").back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id) {
+ return g.V(v4Id).out().as("here").has("lang", "java").back("here").values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+ return g.V(v1Id).outE().as("here").inV().has("name", "vadas").back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+ return g.V(v1Id).outE("knows").has("weight", 1.0d).as("here").inV().has("name", "josh").back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+ return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).inV().has("name", "josh").<Edge>back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+ return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).as("fake").inV().has("name", "josh").<Edge>back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+ return g.V().as("here").out().values("name").back("here");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+ return (Traversal) g.V().out("created")
+ .union(as("project").in("created").has("name", "marko").back("project"),
+ as("project").in("created").in("knows").has("name", "marko").back("project")).groupCount().by("name");
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
new file mode 100644
index 0000000..d8f4c04
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class CoalesceTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX();
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id);
+
+ public abstract Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
+
+ public abstract Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_coalesceXoutXfooX_outXbarXX() {
+ Traversal<Vertex, Vertex> traversal = get_g_V_coalesceXoutXfooX_outXbarXX();
+ printTraversalForm(traversal);
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX() {
+ Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ checkResults(Arrays.asList("josh", "vadas"), traversal);
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX() {
+ Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(convertToVertexId("marko"));
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ assertEquals("lop", traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+ Traversal<Vertex, Map<String, Long>> traversal = get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
+ printTraversalForm(traversal);
+ assertTrue(traversal.hasNext());
+ Map<String, Long> result = traversal.next();
+ assertEquals(4, result.size());
+ assertTrue(result.containsKey("josh") && result.containsKey("lop") && result.containsKey("ripple") && result.containsKey("vadas"));
+ assertEquals(1L, (long) result.get("josh"));
+ assertEquals(2L, (long) result.get("lop"));
+ assertEquals(1L, (long) result.get("ripple"));
+ assertEquals(1L, (long) result.get("vadas"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @LoadGraphWith(MODERN)
+ public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+ Traversal<Vertex, Path> traversal = get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
+ printTraversalForm(traversal);
+ Map<String, Integer> first = new HashMap<>();
+ Map<String, Integer> last = new HashMap<>();
+ int counter = 0;
+ while (traversal.hasNext()) {
+ counter++;
+ Path path = traversal.next();
+ first.compute(path.<String>get(0), (k, v) -> v != null ? v + 1 : 1);
+ last.compute(path.<String>get(2), (k, v) -> v != null ? v + 1 : 1);
+ assertEquals(3, path.size());
+ assertTrue((path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("vadas"))
+ || (path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("josh"))
+ || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop"))
+ || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("ripple"))
+ || (path.<String>get(0).equals("peter") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop")));
+ }
+ assertEquals(5, counter);
+ assertEquals(2, (int) first.get("marko"));
+ assertEquals(2, (int) first.get("josh"));
+ assertEquals(1, (int) first.get("peter"));
+ assertEquals(1, (int) last.get("josh"));
+ assertEquals(1, (int) last.get("vadas"));
+ assertEquals(2, (int) last.get("lop"));
+ assertEquals(1, (int) last.get("ripple"));
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends CoalesceTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+ return g.V().coalesce(out("foo"), out("bar"));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+ return g.V(v1Id).coalesce(out("knows"), out("created")).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+ return g.V(v1Id).coalesce(out("created"), out("knows")).values("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+ return g.V().coalesce(out("likes"), out("knows"), out("created")).<String>groupCount().by("name");
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+ return g.V().coalesce(outE("knows"), outE("created")).otherV().path().by("name").by(T.label);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
new file mode 100644
index 0000000..570ffbb
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CountTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, Long> get_g_V_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_out_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_both_both_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_hasXnoX_count();
+
+ public abstract Traversal<Vertex, Long> get_g_V_fold_countXlocalX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(6), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_out_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_out_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(6), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_both_both_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_both_both_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(1406914), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_repeatXoutX_timesX3X_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX3X_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(14465066L), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(GRATEFUL)
+ public void g_V_repeatXoutX_timesX8X_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX8X_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(2505037961767380L), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_hasXnoX_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(0), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_filterXfalseX_count() {
+ final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
+ printTraversalForm(traversal);
+ assertEquals(new Long(0), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_fold_countXlocalX() {
+ final Traversal<Vertex, Long> traversal = get_g_V_fold_countXlocalX();
+ printTraversalForm(traversal);
+ assertEquals(new Long(6), traversal.next());
+ assertFalse(traversal.hasNext());
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends CountTest {
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_count() {
+ return g.V().count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_out_count() {
+ return g.V().out().count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_both_both_count() {
+ return g.V().both().both().count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+ return g.V().repeat(out()).times(3).count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+ return g.V().repeat(out()).times(8).count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+ return g.V().has("no").count();
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+ return g.V().fold().count(Scope.local);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
new file mode 100644
index 0000000..58d84a9
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.step.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Operator;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BinaryOperator;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FoldTest extends AbstractGremlinProcessTest {
+
+ public abstract Traversal<Vertex, List<Vertex>> get_g_V_fold();
+
+ public abstract Traversal<Vertex, Vertex> get_g_V_fold_unfold();
+
+ public abstract Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX();
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_fold() {
+ final Traversal<Vertex, List<Vertex>> traversal = get_g_V_fold();
+ printTraversalForm(traversal);
+ List<Vertex> list = traversal.next();
+ assertFalse(traversal.hasNext());
+ Set<Vertex> vertices = new HashSet<>(list);
+ assertEquals(6, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_fold_unfold() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_fold_unfold();
+ printTraversalForm(traversal);
+ int count = 0;
+ Set<Vertex> vertices = new HashSet<>();
+ while (traversal.hasNext()) {
+ vertices.add(traversal.next());
+ count++;
+ }
+ assertFalse(traversal.hasNext());
+ assertEquals(6, count);
+ assertEquals(6, vertices.size());
+ }
+
+ @Test
+ @LoadGraphWith(MODERN)
+ public void g_V_age_foldX0_plusX() {
+ final Traversal<Vertex, Integer> traversal = get_g_V_age_foldX0_plusX();
+ printTraversalForm(traversal);
+ final Integer ageSum = traversal.next();
+ assertFalse(traversal.hasNext());
+ assertEquals(Integer.valueOf(123), ageSum);
+ }
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class Traversals extends FoldTest {
+
+ @Override
+ public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+ return g.V().fold();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+ return g.V().fold().unfold();
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+ return g.V().<Integer>values("age").fold(0, (BinaryOperator) Operator.sum);
+ }
+ }
+}
[25/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
new file mode 100644
index 0000000..e4f8bef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
@@ -0,0 +1,119 @@
+/*
+ * 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.step.map.match;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+/**
+ * An enumerator which consumes values from an iterator and maps each value to a secondary enumerator
+ * (for example, a join)
+ * Enumerated indices cover all solutions in the secondary enumerators,
+ * in ascending order according to the value iterator and the enumerators' own indices.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class SerialEnumerator<T> implements Enumerator<T> {
+ private final String name;
+ private Iterator<T> iterator;
+ private final Function<T, Enumerator<T>> constructor;
+ private final List<Enumerator<T>> memory = new ArrayList<>();
+ private final List<T> values = new ArrayList<>();
+
+ // TODO: this only assigned, not accessed until the efficient implementation of size() is restored
+ private int completedEnumsSize = 0;
+
+ public SerialEnumerator(final String name,
+ final Iterator<T> iterator,
+ final Function<T, Enumerator<T>> constructor) {
+ this.name = name;
+ this.iterator = iterator;
+ this.constructor = constructor;
+ }
+
+ public int size() {
+ // TODO: restore the more efficient implementation of size() while taking into account that
+ // traversal iterators such as DefaultTraversal may return hasNext=true after first returning hasNext=false
+ /*
+ int size = completedEnumsSize;
+ if (!sideEffects.isEmpty()) {
+ size += sideEffects.get(sideEffects.size() - 1).size();
+ }
+ return size;
+ */
+
+ //*
+ int size = 0;
+ for (Enumerator<T> e : memory) size += e.size();
+ return size;
+ //*/
+ }
+
+ // note: *not* intended for random access; use binary search if this is ever needed
+ public boolean visitSolution(final int index,
+ final BiConsumer<String, T> visitor) {
+ int totalSize = 0;
+ int memIndex = 0;
+ while (true) {
+ if (memIndex < memory.size()) {
+ Enumerator<T> e = memory.get(memIndex);
+
+ if (e.visitSolution(index - totalSize, visitor)) {
+ // additionally, bind the value stored in this enumerator
+ MatchStep.visit(name, values.get(memIndex), visitor);
+
+ return true;
+ } else {
+ totalSize += e.size();
+ memIndex++;
+ }
+ } else {
+ if (null == iterator) {
+ return false;
+ } else if (!iterator.hasNext()) {
+ // free up memory as soon as possible
+ iterator = null;
+ return false;
+ }
+
+ if (!memory.isEmpty()) {
+ int lastSize = memory.get(memIndex - 1).size();
+
+ // first remove the head enumeration if it exists and is empty
+ // (only the head will ever be empty, avoiding wasted space)
+ if (0 == lastSize) {
+ memIndex--;
+ memory.remove(memIndex);
+ values.remove(memIndex);
+ } else {
+ completedEnumsSize += lastSize;
+ }
+ }
+
+ T value = iterator.next();
+ values.add(value);
+ Enumerator<T> e = constructor.apply(value);
+ memory.add(memory.size(), e);
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
new file mode 100644
index 0000000..eb5da9c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
@@ -0,0 +1,66 @@
+/*
+ * 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.step.map.match;
+
+import java.util.Iterator;
+import java.util.function.BiConsumer;
+
+/**
+ * An enumerator of at most one element
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class SimpleEnumerator<T> implements Enumerator<T> {
+
+ private final String name;
+ private Iterator<T> iterator;
+ private T element;
+
+ public SimpleEnumerator(final String name,
+ final Iterator<T> iterator) {
+ this.name = name;
+ this.iterator = iterator;
+ }
+
+ @Override
+ public int size() {
+ return null == element ? 0 : 1;
+ }
+
+ @Override
+ public boolean visitSolution(int index, BiConsumer<String, T> visitor) {
+ if (0 != index) {
+ return false;
+ }
+
+ if (null != iterator) {
+ if (iterator.hasNext()) {
+ element = iterator.next();
+ }
+ iterator = null;
+ }
+
+ if (null != element) {
+ MatchStep.visit(name, element, visitor);
+ return true;
+ }
+
+ return false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
new file mode 100644
index 0000000..f79ed92
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -0,0 +1,54 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+ private final String key;
+ private final Object value;
+
+ public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value) {
+ super(traversal);
+ this.key = key;
+ this.value = value;
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ traverser.get().property(this.key, this.value);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
new file mode 100644
index 0000000..502037e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
@@ -0,0 +1,160 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+ private Traversal.Admin<S, Object> aggregateTraversal = null;
+ private String sideEffectKey;
+
+ public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey, this.aggregateTraversal);
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
+ return new AggregateMapReduce(this);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> aggregateTraversal) {
+ this.aggregateTraversal = this.integrateChild(aggregateTraversal);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, Object>> getLocalChildren() {
+ return null == this.aggregateTraversal ? Collections.emptyList() : Collections.singletonList(this.aggregateTraversal);
+ }
+
+ @Override
+ public void barrierConsumer(final TraverserSet<S> traverserSet) {
+ traverserSet.forEach(traverser ->
+ TraversalHelper.addToCollection(
+ traverser.getSideEffects().get(this.sideEffectKey),
+ TraversalUtil.applyNullable(traverser, this.aggregateTraversal),
+ traverser.bulk()));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
+ }
+
+ @Override
+ public AggregateStep<S> clone() {
+ final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
+ if (null != this.aggregateTraversal)
+ clone.aggregateTraversal = clone.integrateChild(this.aggregateTraversal.clone());
+ return clone;
+ }
+
+ ////////
+
+ public static final class AggregateMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+ public static final String AGGREGATE_STEP_SIDE_EFFECT_KEY = "gremlin.aggregateStep.sideEffectKey";
+
+ private String sideEffectKey;
+ private Supplier<Collection> collectionSupplier;
+
+ private AggregateMapReduce() {
+
+ }
+
+ public AggregateMapReduce(final AggregateStep step) {
+ this.sideEffectKey = step.getSideEffectKey();
+ this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ super.storeState(configuration);
+ configuration.setProperty(AGGREGATE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.sideEffectKey = configuration.getString(AGGREGATE_STEP_SIDE_EFFECT_KEY);
+ this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return stage.equals(Stage.MAP);
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
+ VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
+ }
+
+ @Override
+ public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
+ final Collection collection = this.collectionSupplier.get();
+ keyValues.forEachRemaining(keyValue -> collection.add(keyValue.getValue()));
+ return collection;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return this.sideEffectKey;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
new file mode 100644
index 0000000..1b6b514
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
@@ -0,0 +1,99 @@
+/*
+ * 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.step.sideEffect;
+
+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.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GraphStep<S extends Element> extends StartStep<S> implements EngineDependent {
+
+ protected final Class<S> returnClass;
+ protected Object[] ids;
+ protected transient Supplier<Iterator<S>> iteratorSupplier;
+
+ public GraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
+ super(traversal);
+ this.returnClass = returnClass;
+ this.ids = ids;
+ for (int i = 0; i < this.ids.length; i++) {
+ if (this.ids[i] instanceof Element)
+ this.ids[i] = ((Element) this.ids[i]).id();
+ }
+ this.iteratorSupplier = () -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ?
+ this.getTraversal().getGraph().get().vertices(this.ids) :
+ this.getTraversal().getGraph().get().edges(this.ids));
+ }
+
+ public String toString() {
+ return TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.returnClass.getSimpleName().toLowerCase());
+ }
+
+ public boolean returnsVertices() {
+ return Vertex.class.isAssignableFrom(this.returnClass);
+ }
+
+ public boolean returnsEdges() {
+ return Edge.class.isAssignableFrom(this.returnClass);
+ }
+
+ public Class<S> getReturnClass() {
+ return this.returnClass;
+ }
+
+ public void setIteratorSupplier(final Supplier<Iterator<S>> iteratorSupplier) {
+ this.iteratorSupplier = iteratorSupplier;
+ }
+
+ public Object[] getIds() {
+ return this.ids;
+ }
+
+ public void clearIds() {
+ this.ids = new Object[0];
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ if (traversalEngine.isComputer()) {
+ this.iteratorSupplier = Collections::emptyIterator;
+ }
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() {
+ if (this.first)
+ this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
+ return super.processNextStart();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
new file mode 100644
index 0000000..5a80c4f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
@@ -0,0 +1,171 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupCountSideEffectStep<S, E> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<E, Long, E, Long, Map<E, Long>> {
+
+ private Traversal.Admin<S, E> groupTraversal = null;
+ private String sideEffectKey;
+
+ public GroupCountSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ final Map<Object, Long> groupCountMap = traverser.sideEffects(this.sideEffectKey);
+ MapHelper.incr(groupCountMap, TraversalUtil.applyNullable(traverser.asAdmin(), this.groupTraversal), traverser.bulk());
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
+ return new GroupCountSideEffectMapReduce<>(this);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey, this.groupTraversal);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
+ this.groupTraversal = this.integrateChild(groupTraversal);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, E>> getLocalChildren() {
+ return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
+ }
+
+ @Override
+ public GroupCountSideEffectStep<S, E> clone() {
+ final GroupCountSideEffectStep<S, E> clone = (GroupCountSideEffectStep<S, E>) super.clone();
+ if (null != this.groupTraversal)
+ clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+ return clone;
+ }
+
+ ///////
+
+ public static final class GroupCountSideEffectMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
+
+ public static final String GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupCountSideEffectStep.sideEffectKey";
+
+ private String sideEffectKey;
+ private Supplier<Map<E, Long>> mapSupplier;
+
+ private GroupCountSideEffectMapReduce() {
+
+ }
+
+ public GroupCountSideEffectMapReduce(final GroupCountSideEffectStep step) {
+ this.sideEffectKey = step.getSideEffectKey();
+ this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ super.storeState(configuration);
+ configuration.setProperty(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.sideEffectKey = configuration.getString(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+ this.mapSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return true;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
+ VertexTraversalSideEffects.of(vertex).<Map<E, Number>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach((k, v) -> emitter.emit(k, v.longValue()));
+ }
+
+ @Override
+ public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+ long counter = 0;
+ while (values.hasNext()) {
+ counter = counter + values.next();
+ }
+ emitter.emit(key, counter);
+ }
+
+ @Override
+ public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+ reduce(key, values, emitter);
+ }
+
+ @Override
+ public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
+ final Map<E, Long> map = this.mapSupplier.get();
+ keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+ return map;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return this.sideEffectKey;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..d344953
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
@@ -0,0 +1,248 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+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.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+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.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupSideEffectStep<S, K, V, R> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, EngineDependent, MapReducer<K, Collection<V>, K, R, Map<K, R>> {
+
+ private char state = 'k';
+ private Traversal.Admin<S, K> keyTraversal = null;
+ private Traversal.Admin<S, V> valueTraversal = null;
+ private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+ private String sideEffectKey;
+ private boolean onGraphComputer = false;
+ private Map<K, Collection<V>> tempGroupByMap;
+
+ public GroupSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ final Map<K, Collection<V>> groupMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
+ final K key = TraversalUtil.applyNullable(traverser, keyTraversal);
+ final V value = TraversalUtil.applyNullable(traverser, valueTraversal);
+ Collection<V> values = groupMap.get(key);
+ if (null == values) {
+ values = new BulkSet<>();
+ groupMap.put(key, values);
+ }
+ TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+ //////// reducer for OLTP
+ if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
+ this.tempGroupByMap = groupMap;
+ final Map<K, R> reduceMap = new HashMap<>();
+ groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, this.reduceTraversal)));
+ traverser.sideEffects(this.sideEffectKey, reduceMap);
+ }
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public void onEngine(final TraversalEngine traversalEngine) {
+ this.onGraphComputer = traversalEngine.isComputer();
+ }
+
+ @Override
+ public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
+ return new GroupSideEffectMapReduce<>(this);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+ }
+
+ @Override
+ public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
+ final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
+ if (null != this.keyTraversal)
+ children.add((Traversal.Admin) this.keyTraversal);
+ if (null != this.valueTraversal)
+ children.add((Traversal.Admin) this.valueTraversal);
+ if (null != this.reduceTraversal)
+ children.add((Traversal.Admin) this.reduceTraversal);
+ return children;
+ }
+
+ public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
+ return this.reduceTraversal;
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
+ if ('k' == this.state) {
+ this.keyTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'v';
+ } else if ('v' == this.state) {
+ this.valueTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'r';
+ } else if ('r' == this.state) {
+ this.reduceTraversal = this.integrateChild(kvrTraversal);
+ this.state = 'x';
+ } else {
+ throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
+ }
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+ }
+
+ @Override
+ public GroupSideEffectStep<S, K, V, R> clone() {
+ final GroupSideEffectStep<S, K, V, R> clone = (GroupSideEffectStep<S, K, V, R>) super.clone();
+ if (null != this.keyTraversal)
+ clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+ if (null != this.valueTraversal)
+ clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
+ if (null != this.reduceTraversal)
+ clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
+ return clone;
+ }
+
+ ///////////
+
+ public static final class GroupSideEffectMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
+
+ public static final String GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupSideEffectStep.sideEffectKey";
+ public static final String GROUP_SIDE_EFFECT_STEP_STEP_ID = "gremlin.groupSideEffectStep.stepId";
+
+ private String sideEffectKey;
+ private String groupStepId;
+ private Traversal.Admin<Collection<V>, R> reduceTraversal;
+ private Supplier<Map<K, R>> mapSupplier;
+
+ private GroupSideEffectMapReduce() {
+
+ }
+
+ public GroupSideEffectMapReduce(final GroupSideEffectStep step) {
+ this.groupStepId = step.getId();
+ this.sideEffectKey = step.getSideEffectKey();
+ this.reduceTraversal = step.getReduceTraversal();
+ this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ MapReduce.super.storeState(configuration);
+ configuration.setProperty(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+ configuration.setProperty(GROUP_SIDE_EFFECT_STEP_STEP_ID, this.groupStepId);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.sideEffectKey = configuration.getString(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+ this.groupStepId = configuration.getString(GROUP_SIDE_EFFECT_STEP_STEP_ID);
+ final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
+ if (!traversal.isLocked())
+ traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+ final GroupSideEffectStep groupSideEffectStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
+ this.reduceTraversal = groupSideEffectStep.getReduceTraversal();
+ this.mapSupplier = traversal.getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return !stage.equals(Stage.COMBINE);
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
+ VertexTraversalSideEffects.of(vertex).<Map<K, Collection<V>>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach(emitter::emit);
+ }
+
+ @Override
+ public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
+ final Set<V> set = new BulkSet<>();
+ values.forEachRemaining(set::addAll);
+ emitter.emit(key, TraversalUtil.applyNullable(set, this.reduceTraversal));
+ }
+
+ @Override
+ public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
+ final Map<K, R> map = this.mapSupplier.get();
+ keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+ return map;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public GroupSideEffectMapReduce<K, V, R> clone() {
+ try {
+ final GroupSideEffectMapReduce<K, V, R> clone = (GroupSideEffectMapReduce<K, V, R>) super.clone();
+ if (null != clone.reduceTraversal)
+ clone.reduceTraversal = this.reduceTraversal.clone();
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.mapReduceString(this, this.getMemoryKey());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
new file mode 100644
index 0000000..269f2c9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
@@ -0,0 +1,40 @@
+/*
+ * 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.step.sideEffect;
+
+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;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdentityStep<S> extends AbstractStep<S, S> {
+
+ public IdentityStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ return this.starts.next();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
new file mode 100644
index 0000000..34b5eab
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
@@ -0,0 +1,50 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class InjectStep<S> extends StartStep<S> {
+
+ private final S[] injections;
+
+ @SafeVarargs
+ public InjectStep(final Traversal.Admin traversal, final S... injections) {
+ super(traversal);
+ this.injections = injections;
+ this.start = new ArrayIterator<>(this.injections);
+ }
+
+ @Override
+ public InjectStep<S> clone() {
+ final InjectStep<S> clone = (InjectStep<S>) super.clone();
+ clone.start = new ArrayIterator<>(clone.injections);
+ return clone;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.start = new ArrayIterator<>(this.injections);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
new file mode 100644
index 0000000..2050489
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Consumer;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaSideEffectStep<S> extends SideEffectStep<S> {
+
+ private final Consumer<Traverser<S>> consumer;
+
+ public LambdaSideEffectStep(final Traversal.Admin traversal, final Consumer<Traverser<S>> consumer) {
+ super(traversal);
+ this.consumer = consumer;
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ this.consumer.accept(traverser);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.consumer);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
new file mode 100644
index 0000000..4be3483
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
@@ -0,0 +1,219 @@
+/*
+ * 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.step.sideEffect;
+
+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.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+
+ // Stored in the Traversal sideEffects but kept here as a reference for convenience.
+ private StandardTraversalMetrics traversalMetrics;
+
+ public ProfileStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+
+ @Override
+ public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
+ return ProfileMapReduce.instance();
+ }
+
+ @Override
+ public Traverser<S> next() {
+ Traverser<S> ret = null;
+ initializeIfNeeded();
+ traversalMetrics.start(this.getId());
+ try {
+ ret = super.next();
+ return ret;
+ } finally {
+ if (ret != null) {
+ traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
+ } else {
+ traversalMetrics.stop(this.getId());
+ }
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ initializeIfNeeded();
+ traversalMetrics.start(this.getId());
+ boolean ret = super.hasNext();
+ traversalMetrics.stop(this.getId());
+ return ret;
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ return this.starts.next();
+ }
+
+ private void initializeIfNeeded() {
+ if (traversalMetrics != null) {
+ return;
+ }
+
+ createTraversalMetricsSideEffectIfNecessary();
+
+ // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
+ // sideEffects after serialization.
+ if (traversalMetrics == null) {
+ // look up the TraversalMetrics in the root traversal's sideEffects
+ Traversal t = this.getTraversal();
+ while (!(t.asAdmin().getParent() instanceof EmptyStep)) {
+ t = t.asAdmin().getParent().asStep().getTraversal();
+ }
+ traversalMetrics = t.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+ }
+ }
+
+ private void createTraversalMetricsSideEffectIfNecessary() {
+ if (this.getTraversal().getSideEffects().exists(TraversalMetrics.METRICS_KEY)) {
+ // Already initialized
+ return;
+ }
+
+ if (!(this.getTraversal().getParent() instanceof EmptyStep)) {
+ // Initialization is handled at the top-level of the traversal only.
+ return;
+ }
+
+ // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
+ // once per thread if using Computer.)
+
+ traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
+ prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+ }
+
+ // Walk the traversal steps and initialize the Metrics timers.
+ private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
+
+ DependantMutableMetrics prevMetrics = null;
+ final List<Step> steps = traversal.getSteps();
+ for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
+ Step step = steps.get(ii);
+ ProfileStep profileStep = (ProfileStep) steps.get(ii + 1);
+
+ // Create metrics
+ MutableMetrics metrics;
+
+ // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
+ if (traversal.getEngine().isComputer()) {
+ metrics = new MutableMetrics(step.getId(), step.toString());
+ } else {
+ metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
+ prevMetrics = (DependantMutableMetrics) metrics;
+ }
+
+ // Initialize counters (necessary because some steps might end up being 0)
+ metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
+ metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
+
+ // Add metrics to parent, if necessary
+ if (parentMetrics != null) {
+ parentMetrics.addNested(metrics);
+ }
+
+ // The TraversalMetrics sideEffect is shared across all the steps.
+ profileStep.traversalMetrics = this.traversalMetrics;
+
+ // Add root metrics to traversalMetrics
+ this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileStep.getId());
+
+ // Handle nested traversal
+ if (step instanceof TraversalParent) {
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+ prepTraversalForProfiling(t, metrics);
+ }
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+ prepTraversalForProfiling(t, metrics);
+ }
+ }
+ }
+ }
+
+ //////////////////
+
+ public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+
+ private static ProfileMapReduce INSTANCE = new ProfileMapReduce();
+
+ private ProfileMapReduce() {
+
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return true;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return TraversalMetrics.METRICS_KEY;
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
+ VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>ifPresent(TraversalMetrics.METRICS_KEY, emitter::emit);
+ }
+
+ @Override
+ public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+ reduce(key, values, emitter);
+ }
+
+ @Override
+ public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+ emitter.emit(StandardTraversalMetrics.merge(values));
+ }
+
+ @Override
+ public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
+ return keyValues.next().getValue();
+ }
+
+ public static ProfileMapReduce instance() {
+ return INSTANCE;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
new file mode 100644
index 0000000..412164a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
@@ -0,0 +1,66 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BinaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackElementValueStep<S extends Element, V> extends SideEffectStep<S> {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.SACK,
+ TraverserRequirement.OBJECT
+ );
+
+ private BinaryOperator<V> operator;
+ private final String propertyKey;
+
+ public SackElementValueStep(final Traversal.Admin traversal, final BinaryOperator<V> operator, final String propertyKey) {
+ super(traversal);
+ this.operator = operator;
+ this.propertyKey = propertyKey;
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ traverser.get().values(this.propertyKey).forEachRemaining(value -> {
+ traverser.sack(this.operator.apply(traverser.sack(), (V) value));
+ });
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.operator, this.propertyKey);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
new file mode 100644
index 0000000..cae570a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
@@ -0,0 +1,55 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackObjectStep<S, V> extends SideEffectStep<S> {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.SACK,
+ TraverserRequirement.OBJECT
+ );
+
+ private final BiFunction<V, S, V> operator;
+
+ public SackObjectStep(final Traversal.Admin traversal, final BiFunction<V, S, V> operator) {
+ super(traversal);
+ this.operator = operator;
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ traverser.sack(this.operator.apply(traverser.sack(), traverser.get()));
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
new file mode 100644
index 0000000..28f1cf0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.SIDE_EFFECTS,
+ TraverserRequirement.OBJECT
+ );
+
+ private List<String> sideEffectKeys;
+
+ public SideEffectCapStep(final Traversal.Admin traversal, final String... sideEffectKeys) {
+ super(traversal);
+ if (0 == sideEffectKeys.length)
+ throw new IllegalArgumentException("At least one sideEffect key must be provided to " + this.getClass().getSimpleName());
+ this.sideEffectKeys = Arrays.asList(sideEffectKeys);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKeys);
+ }
+
+ public List<String> getSideEffectKeys() {
+ return this.sideEffectKeys;
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ @Override
+ public E supply() {
+ return this.sideEffectKeys.size() == 1 ?
+ this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
+ (E) this.getMapOfSideEffects();
+ }
+
+ public Map<String, Object> getMapOfSideEffects() {
+ final Map<String, Object> sideEffects = new HashMap<>();
+ for (final String sideEffectKey : this.sideEffectKeys) {
+ sideEffects.put(sideEffectKey, this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey));
+ }
+ return sideEffects;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
new file mode 100644
index 0000000..2854e6e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
@@ -0,0 +1,42 @@
+/*
+ * 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.step.sideEffect;
+
+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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SideEffectStep<S> extends AbstractStep<S, S> {
+
+ public SideEffectStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ protected abstract void sideEffect(final Traverser.Admin<S> traverser);
+
+ @Override
+ protected Traverser<S> processNextStart() {
+ final Traverser.Admin<S> traverser = this.starts.next();
+ this.sideEffect(traverser);
+ return traverser;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
new file mode 100644
index 0000000..5e762fe
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
@@ -0,0 +1,79 @@
+/*
+ * 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.step.sideEffect;
+
+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;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class StartStep<S> extends AbstractStep<S, S> {
+
+ protected Object start;
+ protected boolean first = true;
+
+ public StartStep(final Traversal.Admin traversal, final Object start) {
+ super(traversal);
+ this.start = start;
+ }
+
+ public StartStep(final Traversal.Admin traversal) {
+ this(traversal, null);
+ }
+
+ public <T> T getStart() {
+ return (T) this.start;
+ }
+
+ public boolean startAssignableTo(final Class... assignableClasses) {
+ return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
+ }
+
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.start);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() {
+ if (this.first) {
+ if (null != this.start) {
+ if (this.start instanceof Iterator)
+ this.starts.add(this.getTraversal().getTraverserGenerator().generateIterator((Iterator<S>) this.start, this, 1l));
+ else
+ this.starts.add(this.getTraversal().getTraverserGenerator().generate((S) this.start, this, 1l));
+ }
+ this.first = false;
+ }
+ return this.starts.next();
+ }
+
+ @Override
+ public StartStep<S> clone() {
+ final StartStep<S> clone = (StartStep<S>) super.clone();
+ clone.first = true;
+ clone.start = null;
+ return clone;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
new file mode 100644
index 0000000..20c92d6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
@@ -0,0 +1,159 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+ private Traversal.Admin<S, Object> storeTraversal = null;
+ private String sideEffectKey;
+
+ public StoreStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<S> traverser) {
+ TraversalHelper.addToCollection(
+ traverser.sideEffects(this.sideEffectKey),
+ TraversalUtil.applyNullable(traverser.asAdmin(), this.storeTraversal),
+ traverser.bulk());
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey, this.storeTraversal);
+ }
+
+ @Override
+ public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
+ return new StoreMapReduce(this);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, Object>> getLocalChildren() {
+ return null == this.storeTraversal ? Collections.emptyList() : Collections.singletonList(this.storeTraversal);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin<?, ?> storeTraversal) {
+ this.storeTraversal = this.integrateChild(storeTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+ }
+
+ @Override
+ public StoreStep<S> clone() {
+ final StoreStep<S> clone = (StoreStep<S>) super.clone();
+ if (null != this.storeTraversal)
+ clone.storeTraversal = clone.integrateChild(this.storeTraversal.clone());
+ return clone;
+ }
+
+ ///////////////
+
+ public static final class StoreMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+ public static final String STORE_STEP_SIDE_EFFECT_KEY = "gremlin.storeStep.sideEffectKey";
+
+ private String sideEffectKey;
+ private Supplier<Collection> collectionSupplier;
+
+ private StoreMapReduce() {
+
+ }
+
+ public StoreMapReduce(final StoreStep step) {
+ this.sideEffectKey = step.getSideEffectKey();
+ this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+ }
+
+ @Override
+ public void storeState(final Configuration configuration) {
+ super.storeState(configuration);
+ configuration.setProperty(STORE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+ }
+
+ @Override
+ public void loadState(final Configuration configuration) {
+ this.sideEffectKey = configuration.getString(STORE_STEP_SIDE_EFFECT_KEY);
+ this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+ }
+
+ @Override
+ public boolean doStage(final Stage stage) {
+ return stage.equals(Stage.MAP);
+ }
+
+ @Override
+ public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
+ VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
+ }
+
+ @Override
+ public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
+ final Collection collection = this.collectionSupplier.get();
+ keyValues.forEachRemaining(pair -> collection.add(pair.getValue()));
+ return collection;
+ }
+
+ @Override
+ public String getMemoryKey() {
+ return this.sideEffectKey;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
new file mode 100644
index 0000000..0657585
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
@@ -0,0 +1,122 @@
+/*
+ * 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.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+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.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A side-effect step that produces an edge induced subgraph.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SubgraphStep extends SideEffectStep<Edge> implements SideEffectCapable {
+
+ private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+ TraverserRequirement.OBJECT,
+ TraverserRequirement.SIDE_EFFECTS
+ );
+
+ private Graph subgraph;
+ private String sideEffectKey;
+
+ private static final Map<String, Object> DEFAULT_CONFIGURATION = new HashMap<String, Object>() {{
+ put(Graph.GRAPH, "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph"); // hard coded because TinkerGraph is not part of gremlin-core
+ }};
+
+ // TODO: add support for side-effecting out an edge list.
+
+ public SubgraphStep(final Traversal.Admin traversal, final String sideEffectKey) {
+ super(traversal);
+ this.sideEffectKey = sideEffectKey;
+ this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, () -> GraphFactory.open(DEFAULT_CONFIGURATION));
+ }
+
+ @Override
+ protected void sideEffect(final Traverser.Admin<Edge> traverser) {
+ if (null == this.subgraph) {
+ this.subgraph = traverser.sideEffects(this.sideEffectKey);
+ if (!this.subgraph.features().vertex().supportsUserSuppliedIds() || !this.subgraph.features().edge().supportsUserSuppliedIds())
+ throw new IllegalArgumentException("The provided subgraph must support user supplied ids for vertices and edges: " + this.subgraph);
+ }
+ SubgraphStep.addEdgeToSubgraph(this.subgraph, traverser.get());
+ }
+
+ @Override
+ public String getSideEffectKey() {
+ return this.sideEffectKey;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKey);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return REQUIREMENTS;
+ }
+
+ @Override
+ public SubgraphStep clone() {
+ final SubgraphStep clone = (SubgraphStep) super.clone();
+ this.subgraph = null;
+ return clone;
+ }
+
+ ///
+
+ private static Vertex getOrCreate(final Graph subgraph, final Vertex vertex) {
+ final Iterator<Vertex> vertexIterator = subgraph.vertices(vertex.id());
+ if (vertexIterator.hasNext()) return vertexIterator.next();
+ final Vertex subgraphVertex = subgraph.addVertex(T.id, vertex.id(), T.label, vertex.label());
+ vertex.properties().forEachRemaining(vertexProperty -> {
+ final VertexProperty<?> subgraphVertexProperty = subgraphVertex.property(vertexProperty.key(), vertexProperty.value(), T.id, vertexProperty.id()); // TODO: demand vertex property id?
+ vertexProperty.properties().forEachRemaining(property -> subgraphVertexProperty.<Object>property(property.key(), property.value()));
+ });
+ return subgraphVertex;
+ }
+
+ private static void addEdgeToSubgraph(final Graph subgraph, final Edge edge) {
+ final Iterator<Edge> edgeIterator = subgraph.edges(edge.id());
+ if (edgeIterator.hasNext()) return;
+ final Iterator<Vertex> vertexIterator = edge.vertices(Direction.BOTH);
+ final Vertex subGraphOutVertex = getOrCreate(subgraph, vertexIterator.next());
+ final Vertex subGraphInVertex = getOrCreate(subgraph, vertexIterator.next());
+ final Edge subGraphEdge = subGraphOutVertex.addEdge(edge.label(), subGraphInVertex, T.id, edge.id());
+ edge.properties().forEachRemaining(property -> subGraphEdge.<Object>property(property.key(), property.value()));
+ }
+}
[40/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/4c97e964
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/4c97e964
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/4c97e964
Branch: refs/heads/master
Commit: 4c97e964623ffd28b0b0e01820adfa6db501f79a
Parents: b563dc3
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Mar 19 12:26:09 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Mar 19 12:26:09 2015 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 2 +
.../console/plugin/GephiRemoteAcceptor.groovy | 2 +-
.../groovy/plugin/SugarGremlinPluginTest.java | 2 +-
.../process/FastNoSuchElementException.java | 46 -
.../apache/tinkerpop/gremlin/process/Path.java | 180 ----
.../apache/tinkerpop/gremlin/process/Scope.java | 27 -
.../apache/tinkerpop/gremlin/process/Step.java | 158 ----
.../org/apache/tinkerpop/gremlin/process/T.java | 114 ---
.../tinkerpop/gremlin/process/Traversal.java | 429 ---------
.../gremlin/process/TraversalEngine.java | 55 --
.../gremlin/process/TraversalSideEffects.java | 225 -----
.../gremlin/process/TraversalSource.java | 48 -
.../gremlin/process/TraversalStrategies.java | 195 ----
.../gremlin/process/TraversalStrategy.java | 50 -
.../tinkerpop/gremlin/process/Traverser.java | 280 ------
.../gremlin/process/TraverserGenerator.java | 48 -
.../gremlin/process/computer/MessageScope.java | 2 +-
.../peerpressure/PeerPressureVertexProgram.java | 7 +-
.../ranking/pagerank/PageRankVertexProgram.java | 4 +-
.../traversal/TraversalClassSupplier.java | 2 +-
.../traversal/TraversalScriptSupplier.java | 4 +-
.../computer/traversal/TraversalSupplier.java | 2 +-
.../traversal/TraversalVertexProgram.java | 20 +-
.../TraversalVertexProgramMessageCombiner.java | 2 +-
.../computer/traversal/TraverserExecutor.java | 10 +-
.../traversal/VertexTraversalSideEffects.java | 2 +-
.../traversal/step/map/ComputerResultStep.java | 14 +-
.../mapreduce/TraverserMapReduce.java | 8 +-
.../computer/util/VertexProgramHelper.java | 8 +-
.../graph/traversal/DefaultGraphTraversal.java | 47 -
.../process/graph/traversal/GraphTraversal.java | 847 -----------------
.../graph/traversal/GraphTraversalSource.java | 138 ---
.../gremlin/process/graph/traversal/__.java | 602 ------------
.../graph/traversal/lambda/LoopTraversal.java | 50 -
.../graph/traversal/step/ComparatorHolder.java | 33 -
.../traversal/step/HasContainerHolder.java | 33 -
.../process/graph/traversal/step/Mutating.java | 28 -
.../process/graph/traversal/step/Ranging.java | 30 -
.../graph/traversal/step/SideEffectCapable.java | 28 -
.../traversal/step/TraversalOptionParent.java | 32 -
.../graph/traversal/step/branch/BranchStep.java | 166 ----
.../graph/traversal/step/branch/ChooseStep.java | 51 -
.../graph/traversal/step/branch/LocalStep.java | 87 --
.../graph/traversal/step/branch/RepeatStep.java | 263 ------
.../graph/traversal/step/branch/UnionStep.java | 52 --
.../graph/traversal/step/filter/AndStep.java | 39 -
.../graph/traversal/step/filter/CoinStep.java | 64 --
.../traversal/step/filter/ConjunctionStep.java | 193 ----
.../traversal/step/filter/CyclicPathStep.java | 46 -
.../traversal/step/filter/DedupGlobalStep.java | 86 --
.../graph/traversal/step/filter/ExceptStep.java | 97 --
.../graph/traversal/step/filter/FilterStep.java | 47 -
.../graph/traversal/step/filter/HasStep.java | 69 --
.../traversal/step/filter/HasTraversalStep.java | 80 --
.../graph/traversal/step/filter/IsStep.java | 66 --
.../traversal/step/filter/LambdaFilterStep.java | 52 --
.../graph/traversal/step/filter/OrStep.java | 39 -
.../traversal/step/filter/RangeGlobalStep.java | 113 ---
.../graph/traversal/step/filter/RetainStep.java | 97 --
.../traversal/step/filter/SampleGlobalStep.java | 117 ---
.../traversal/step/filter/SimplePathStep.java | 47 -
.../traversal/step/filter/TimeLimitStep.java | 80 --
.../graph/traversal/step/filter/WhereStep.java | 132 ---
.../traversal/step/map/AddEdgeByPathStep.java | 95 --
.../graph/traversal/step/map/AddEdgeStep.java | 86 --
.../traversal/step/map/AddVertexStartStep.java | 53 --
.../graph/traversal/step/map/AddVertexStep.java | 49 -
.../graph/traversal/step/map/BackStep.java | 64 --
.../graph/traversal/step/map/CoalesceStep.java | 86 --
.../traversal/step/map/CountGlobalStep.java | 134 ---
.../traversal/step/map/CountLocalStep.java | 51 -
.../traversal/step/map/DedupLocalStep.java | 51 -
.../traversal/step/map/EdgeOtherVertexStep.java | 58 --
.../traversal/step/map/EdgeVertexStep.java | 67 --
.../graph/traversal/step/map/FlatMapStep.java | 60 --
.../graph/traversal/step/map/FoldStep.java | 93 --
.../traversal/step/map/GroupCountStep.java | 170 ----
.../graph/traversal/step/map/GroupStep.java | 277 ------
.../graph/traversal/step/map/IdStep.java | 47 -
.../graph/traversal/step/map/KeyStep.java | 47 -
.../graph/traversal/step/map/LabelStep.java | 47 -
.../traversal/step/map/LambdaFlatMapStep.java | 49 -
.../graph/traversal/step/map/LambdaMapStep.java | 48 -
.../graph/traversal/step/map/MapStep.java | 53 --
.../graph/traversal/step/map/MaxGlobalStep.java | 133 ---
.../graph/traversal/step/map/MaxLocalStep.java | 59 --
.../traversal/step/map/MeanGlobalStep.java | 218 -----
.../graph/traversal/step/map/MeanLocalStep.java | 59 --
.../graph/traversal/step/map/MinGlobalStep.java | 133 ---
.../graph/traversal/step/map/MinLocalStep.java | 59 --
.../traversal/step/map/OrderGlobalStep.java | 95 --
.../traversal/step/map/OrderLocalStep.java | 100 --
.../graph/traversal/step/map/PathStep.java | 95 --
.../traversal/step/map/PropertiesStep.java | 71 --
.../traversal/step/map/PropertyElementStep.java | 50 -
.../traversal/step/map/PropertyMapStep.java | 91 --
.../traversal/step/map/PropertyValueStep.java | 47 -
.../traversal/step/map/RangeLocalStep.java | 84 --
.../graph/traversal/step/map/SackStep.java | 46 -
.../traversal/step/map/SampleLocalStep.java | 112 ---
.../graph/traversal/step/map/SelectOneStep.java | 103 --
.../graph/traversal/step/map/SelectStep.java | 130 ---
.../graph/traversal/step/map/SumGlobalStep.java | 137 ---
.../graph/traversal/step/map/SumLocalStep.java | 58 --
.../graph/traversal/step/map/TreeStep.java | 178 ----
.../graph/traversal/step/map/UnfoldStep.java | 57 --
.../graph/traversal/step/map/VertexStep.java | 82 --
.../traversal/step/map/match/Bindings.java | 87 --
.../step/map/match/CrossJoinEnumerator.java | 96 --
.../traversal/step/map/match/Enumerator.java | 46 -
.../step/map/match/InnerJoinEnumerator.java | 129 ---
.../step/map/match/IteratorEnumerator.java | 67 --
.../traversal/step/map/match/MatchStep.java | 559 -----------
.../step/map/match/SerialEnumerator.java | 119 ---
.../step/map/match/SimpleEnumerator.java | 66 --
.../step/sideEffect/AddPropertyStep.java | 54 --
.../step/sideEffect/AggregateStep.java | 160 ----
.../traversal/step/sideEffect/GraphStep.java | 99 --
.../sideEffect/GroupCountSideEffectStep.java | 171 ----
.../step/sideEffect/GroupSideEffectStep.java | 248 -----
.../traversal/step/sideEffect/IdentityStep.java | 40 -
.../traversal/step/sideEffect/InjectStep.java | 50 -
.../step/sideEffect/LambdaSideEffectStep.java | 48 -
.../traversal/step/sideEffect/ProfileStep.java | 219 -----
.../step/sideEffect/SackElementValueStep.java | 66 --
.../step/sideEffect/SackObjectStep.java | 55 --
.../step/sideEffect/SideEffectCapStep.java | 80 --
.../step/sideEffect/SideEffectStep.java | 42 -
.../traversal/step/sideEffect/StartStep.java | 79 --
.../traversal/step/sideEffect/StoreStep.java | 159 ----
.../traversal/step/sideEffect/SubgraphStep.java | 122 ---
.../step/sideEffect/TreeSideEffectStep.java | 182 ----
.../step/util/CollectingBarrierStep.java | 68 --
.../traversal/step/util/ComputerAwareStep.java | 95 --
.../traversal/step/util/MarkerIdentityStep.java | 40 -
.../traversal/step/util/PathIdentityStep.java | 49 -
.../step/util/ReducingBarrierStep.java | 180 ----
.../step/util/SupplyingBarrierStep.java | 64 --
.../strategy/AbstractTraversalStrategy.java | 43 -
.../ComparatorHolderRemovalStrategy.java | 54 --
.../traversal/strategy/ConjunctionStrategy.java | 83 --
.../strategy/DedupOptimizerStrategy.java | 74 --
.../strategy/EngineDependentStrategy.java | 46 -
.../strategy/IdentityRemovalStrategy.java | 49 -
.../strategy/LabeledEndStepStrategy.java | 50 -
.../traversal/strategy/MatchWhereStrategy.java | 90 --
.../traversal/strategy/ProfileStrategy.java | 111 ---
.../strategy/RangeByIsCountStrategy.java | 90 --
.../traversal/strategy/TimeLimitedStrategy.java | 48 -
.../strategy/TraversalVerificationStrategy.java | 71 --
.../traversal/util/EmptyGraphTraversal.java | 66 --
.../process/graph/util/HasContainer.java | 113 ---
.../gremlin/process/graph/util/Tree.java | 134 ---
.../process/traversal/DefaultTraversal.java | 257 -----
.../traversal/DefaultTraversalSideEffects.java | 203 ----
.../traversal/DefaultTraversalStrategies.java | 105 ---
.../traversal/FastNoSuchElementException.java | 46 +
.../gremlin/process/traversal/Path.java | 180 ++++
.../gremlin/process/traversal/Scope.java | 27 +
.../gremlin/process/traversal/Step.java | 158 ++++
.../gremlin/process/traversal/StepPosition.java | 57 --
.../tinkerpop/gremlin/process/traversal/T.java | 114 +++
.../gremlin/process/traversal/Traversal.java | 429 +++++++++
.../process/traversal/TraversalEngine.java | 53 ++
.../process/traversal/TraversalMatrix.java | 66 --
.../process/traversal/TraversalSideEffects.java | 225 +++++
.../process/traversal/TraversalSource.java | 48 +
.../process/traversal/TraversalStrategies.java | 195 ++++
.../process/traversal/TraversalStrategy.java | 50 +
.../gremlin/process/traversal/Traverser.java | 280 ++++++
.../process/traversal/TraverserGenerator.java | 48 +
.../dsl/graph/DefaultGraphTraversal.java | 47 +
.../dsl/graph/EmptyGraphTraversal.java | 64 ++
.../traversal/dsl/graph/GraphTraversal.java | 847 +++++++++++++++++
.../dsl/graph/GraphTraversalSource.java | 138 +++
.../gremlin/process/traversal/dsl/graph/__.java | 602 ++++++++++++
.../engine/ComputerTraversalEngine.java | 7 +-
.../engine/StandardTraversalEngine.java | 4 +-
.../lambda/AbstractLambdaTraversal.java | 18 +-
.../traversal/lambda/ElementValueTraversal.java | 2 +-
.../traversal/lambda/FilterTraversal.java | 2 +-
.../lambda/FilterTraverserTraversal.java | 2 +-
.../traversal/lambda/HasNextTraversal.java | 14 +-
.../traversal/lambda/IdentityTraversal.java | 2 +-
.../process/traversal/lambda/LoopTraversal.java | 49 +
.../process/traversal/lambda/MapTraversal.java | 2 +-
.../traversal/lambda/MapTraverserTraversal.java | 2 +-
.../process/traversal/step/AbstractStep.java | 183 ----
.../traversal/step/ComparatorHolder.java | 33 +
.../step/ElementFunctionComparator.java | 57 --
.../traversal/step/ElementValueComparator.java | 56 --
.../process/traversal/step/EmptyStep.java | 142 ---
.../process/traversal/step/EngineDependent.java | 2 +-
.../traversal/step/ExpandableStepIterator.java | 77 --
.../traversal/step/HasContainerHolder.java | 33 +
.../process/traversal/step/Mutating.java | 28 +
.../gremlin/process/traversal/step/Ranging.java | 30 +
.../traversal/step/SideEffectCapable.java | 28 +
.../traversal/step/TraversalComparator.java | 57 --
.../traversal/step/TraversalOptionParent.java | 31 +
.../process/traversal/step/TraversalParent.java | 6 +-
.../traversal/step/branch/BranchStep.java | 166 ++++
.../traversal/step/branch/ChooseStep.java | 51 +
.../traversal/step/branch/LocalStep.java | 87 ++
.../traversal/step/branch/RepeatStep.java | 263 ++++++
.../traversal/step/branch/UnionStep.java | 52 ++
.../process/traversal/step/filter/AndStep.java | 39 +
.../process/traversal/step/filter/CoinStep.java | 64 ++
.../traversal/step/filter/ConjunctionStep.java | 193 ++++
.../traversal/step/filter/CyclicPathStep.java | 46 +
.../traversal/step/filter/DedupGlobalStep.java | 86 ++
.../traversal/step/filter/ExceptStep.java | 97 ++
.../traversal/step/filter/FilterStep.java | 45 +
.../process/traversal/step/filter/HasStep.java | 69 ++
.../traversal/step/filter/HasTraversalStep.java | 80 ++
.../process/traversal/step/filter/IsStep.java | 66 ++
.../traversal/step/filter/LambdaFilterStep.java | 52 ++
.../process/traversal/step/filter/OrStep.java | 39 +
.../traversal/step/filter/RangeGlobalStep.java | 113 +++
.../traversal/step/filter/RetainStep.java | 97 ++
.../traversal/step/filter/SampleGlobalStep.java | 117 +++
.../traversal/step/filter/SimplePathStep.java | 47 +
.../traversal/step/filter/TimeLimitStep.java | 80 ++
.../traversal/step/filter/WhereStep.java | 132 +++
.../traversal/step/map/AddEdgeByPathStep.java | 95 ++
.../process/traversal/step/map/AddEdgeStep.java | 86 ++
.../traversal/step/map/AddVertexStartStep.java | 53 ++
.../traversal/step/map/AddVertexStep.java | 49 +
.../process/traversal/step/map/BackStep.java | 64 ++
.../traversal/step/map/CoalesceStep.java | 86 ++
.../traversal/step/map/CountGlobalStep.java | 134 +++
.../traversal/step/map/CountLocalStep.java | 51 +
.../traversal/step/map/DedupLocalStep.java | 51 +
.../traversal/step/map/EdgeOtherVertexStep.java | 58 ++
.../traversal/step/map/EdgeVertexStep.java | 67 ++
.../process/traversal/step/map/FlatMapStep.java | 59 ++
.../process/traversal/step/map/FoldStep.java | 93 ++
.../traversal/step/map/GroupCountStep.java | 170 ++++
.../process/traversal/step/map/GroupStep.java | 277 ++++++
.../process/traversal/step/map/IdStep.java | 47 +
.../process/traversal/step/map/KeyStep.java | 47 +
.../process/traversal/step/map/LabelStep.java | 47 +
.../traversal/step/map/LambdaFlatMapStep.java | 49 +
.../traversal/step/map/LambdaMapStep.java | 48 +
.../process/traversal/step/map/MapStep.java | 53 ++
.../traversal/step/map/MaxGlobalStep.java | 133 +++
.../traversal/step/map/MaxLocalStep.java | 59 ++
.../traversal/step/map/MeanGlobalStep.java | 218 +++++
.../traversal/step/map/MeanLocalStep.java | 59 ++
.../traversal/step/map/MinGlobalStep.java | 133 +++
.../traversal/step/map/MinLocalStep.java | 59 ++
.../traversal/step/map/OrderGlobalStep.java | 95 ++
.../traversal/step/map/OrderLocalStep.java | 100 ++
.../process/traversal/step/map/PathStep.java | 95 ++
.../traversal/step/map/PropertiesStep.java | 71 ++
.../traversal/step/map/PropertyElementStep.java | 50 +
.../traversal/step/map/PropertyMapStep.java | 91 ++
.../traversal/step/map/PropertyValueStep.java | 47 +
.../traversal/step/map/RangeLocalStep.java | 84 ++
.../process/traversal/step/map/SackStep.java | 46 +
.../traversal/step/map/SampleLocalStep.java | 112 +++
.../traversal/step/map/SelectOneStep.java | 103 ++
.../process/traversal/step/map/SelectStep.java | 130 +++
.../traversal/step/map/SumGlobalStep.java | 137 +++
.../traversal/step/map/SumLocalStep.java | 58 ++
.../process/traversal/step/map/TreeStep.java | 178 ++++
.../process/traversal/step/map/UnfoldStep.java | 57 ++
.../process/traversal/step/map/VertexStep.java | 82 ++
.../traversal/step/map/match/Bindings.java | 87 ++
.../step/map/match/CrossJoinEnumerator.java | 96 ++
.../traversal/step/map/match/Enumerator.java | 46 +
.../step/map/match/InnerJoinEnumerator.java | 129 +++
.../step/map/match/IteratorEnumerator.java | 67 ++
.../traversal/step/map/match/MatchStep.java | 559 +++++++++++
.../step/map/match/SerialEnumerator.java | 119 +++
.../step/map/match/SimpleEnumerator.java | 66 ++
.../step/sideEffect/AddPropertyStep.java | 54 ++
.../step/sideEffect/AggregateStep.java | 160 ++++
.../traversal/step/sideEffect/GraphStep.java | 99 ++
.../sideEffect/GroupCountSideEffectStep.java | 171 ++++
.../step/sideEffect/GroupSideEffectStep.java | 248 +++++
.../traversal/step/sideEffect/IdentityStep.java | 40 +
.../traversal/step/sideEffect/InjectStep.java | 50 +
.../step/sideEffect/LambdaSideEffectStep.java | 48 +
.../traversal/step/sideEffect/ProfileStep.java | 219 +++++
.../step/sideEffect/SackElementValueStep.java | 66 ++
.../step/sideEffect/SackObjectStep.java | 55 ++
.../step/sideEffect/SideEffectCapStep.java | 80 ++
.../step/sideEffect/SideEffectStep.java | 42 +
.../traversal/step/sideEffect/StartStep.java | 79 ++
.../traversal/step/sideEffect/StoreStep.java | 159 ++++
.../traversal/step/sideEffect/SubgraphStep.java | 122 +++
.../step/sideEffect/TreeSideEffectStep.java | 182 ++++
.../traversal/step/util/AbstractStep.java | 183 ++++
.../process/traversal/step/util/BulkSet.java | 186 ++++
.../step/util/CollectingBarrierStep.java | 67 ++
.../traversal/step/util/ComputerAwareStep.java | 94 ++
.../step/util/ElementFunctionComparator.java | 57 ++
.../step/util/ElementValueComparator.java | 56 ++
.../process/traversal/step/util/EmptyPath.java | 102 ++
.../process/traversal/step/util/EmptyStep.java | 143 +++
.../step/util/ExpandableStepIterator.java | 77 ++
.../traversal/step/util/HasContainer.java | 113 +++
.../traversal/step/util/ImmutablePath.java | 182 ++++
.../process/traversal/step/util/MapHelper.java | 48 +
.../traversal/step/util/MarkerIdentityStep.java | 39 +
.../traversal/step/util/MutablePath.java | 107 +++
.../traversal/step/util/PathIdentityStep.java | 48 +
.../step/util/ReducingBarrierStep.java | 179 ++++
.../process/traversal/step/util/SparsePath.java | 95 ++
.../step/util/SupplyingBarrierStep.java | 63 ++
.../step/util/TraversalComparator.java | 57 ++
.../process/traversal/step/util/Tree.java | 134 +++
.../strategy/AbstractTraversalStrategy.java | 43 +
.../strategy/decoration/ElementIdStrategy.java | 14 +-
.../strategy/decoration/PartitionStrategy.java | 26 +-
.../strategy/decoration/ReadOnlyStrategy.java | 6 +-
.../strategy/decoration/SubgraphStrategy.java | 26 +-
.../ComparatorHolderRemovalStrategy.java | 54 ++
.../optimization/ConjunctionStrategy.java | 83 ++
.../optimization/DedupOptimizerStrategy.java | 75 ++
.../optimization/EngineDependentStrategy.java | 46 +
.../optimization/IdentityRemovalStrategy.java | 49 +
.../optimization/LabeledEndStepStrategy.java | 50 +
.../optimization/MatchWhereStrategy.java | 90 ++
.../strategy/optimization/ProfileStrategy.java | 112 +++
.../optimization/RangeByIsCountStrategy.java | 91 ++
.../optimization/TimeLimitedStrategy.java | 49 +
.../TraversalVerificationStrategy.java | 72 ++
.../traverser/B_O_PA_S_SE_SL_Traverser.java | 86 ++
.../B_O_PA_S_SE_SL_TraverserGenerator.java | 62 ++
.../traverser/B_O_P_PA_S_SE_SL_Traverser.java | 58 ++
.../B_O_P_PA_S_SE_SL_TraverserGenerator.java | 61 ++
.../traversal/traverser/B_O_Traverser.java | 70 ++
.../traverser/B_O_TraverserGenerator.java | 55 ++
.../traversal/traverser/O_Traverser.java | 35 +
.../traverser/O_TraverserGenerator.java | 52 ++
.../traverser/TraverserGeneratorFactory.java | 33 +
.../traverser/TraverserRequirement.java | 39 +
.../traverser/util/AbstractPathTraverser.java | 213 +++++
.../traverser/util/AbstractTraverser.java | 187 ++++
.../util/DefaultTraverserGeneratorFactory.java | 64 ++
.../traverser/util/EmptyTraverser.java | 153 +++
.../traversal/traverser/util/TraverserSet.java | 143 +++
.../traversal/util/DefaultTraversal.java | 256 +++++
.../util/DefaultTraversalSideEffects.java | 202 ++++
.../util/DefaultTraversalStrategies.java | 105 +++
.../traversal/util/DependantMutableMetrics.java | 59 ++
.../process/traversal/util/EmptyTraversal.java | 20 +-
.../util/EmptyTraversalSideEffects.java | 2 +-
.../util/EmptyTraversalStrategies.java | 11 +-
.../traversal/util/ImmutableMetrics.java | 103 ++
.../gremlin/process/traversal/util/Metrics.java | 104 +++
.../process/traversal/util/MutableMetrics.java | 171 ++++
.../traversal/util/SideEffectHelper.java | 2 +-
.../util/StandardTraversalMetrics.java | 204 ++++
.../process/traversal/util/StepPosition.java | 57 ++
.../process/traversal/util/TraversalHelper.java | 17 +-
.../process/traversal/util/TraversalMatrix.java | 66 ++
.../traversal/util/TraversalMetrics.java | 77 ++
.../process/traversal/util/TraversalRing.java | 2 +-
.../process/traversal/util/TraversalUtil.java | 4 +-
.../traverser/B_O_PA_S_SE_SL_Traverser.java | 87 --
.../B_O_PA_S_SE_SL_TraverserGenerator.java | 62 --
.../traverser/B_O_P_PA_S_SE_SL_Traverser.java | 58 --
.../B_O_P_PA_S_SE_SL_TraverserGenerator.java | 61 --
.../process/traverser/B_O_Traverser.java | 70 --
.../traverser/B_O_TraverserGenerator.java | 55 --
.../gremlin/process/traverser/O_Traverser.java | 35 -
.../process/traverser/O_TraverserGenerator.java | 52 --
.../traverser/TraverserGeneratorFactory.java | 33 -
.../process/traverser/TraverserRequirement.java | 39 -
.../traverser/util/AbstractPathTraverser.java | 213 -----
.../traverser/util/AbstractTraverser.java | 187 ----
.../util/DefaultTraverserGeneratorFactory.java | 64 --
.../process/traverser/util/EmptyTraverser.java | 153 ---
.../tinkerpop/gremlin/process/util/BulkSet.java | 186 ----
.../gremlin/process/util/MapHelper.java | 48 -
.../gremlin/process/util/TraverserSet.java | 143 ---
.../util/metric/DependantMutableMetrics.java | 59 --
.../process/util/metric/ImmutableMetrics.java | 103 --
.../gremlin/process/util/metric/Metrics.java | 104 ---
.../process/util/metric/MutableMetrics.java | 171 ----
.../util/metric/StandardTraversalMetrics.java | 204 ----
.../process/util/metric/TraversalMetrics.java | 78 --
.../gremlin/process/util/path/EmptyPath.java | 102 --
.../process/util/path/ImmutablePath.java | 182 ----
.../gremlin/process/util/path/MutablePath.java | 107 ---
.../gremlin/process/util/path/SparsePath.java | 95 --
.../tinkerpop/gremlin/structure/Graph.java | 8 +-
.../gremlin/structure/io/GraphReader.java | 2 +-
.../gremlin/structure/io/GraphWriter.java | 2 +-
.../structure/io/graphml/GraphMLReader.java | 2 +-
.../structure/io/graphml/GraphMLWriter.java | 2 +-
.../structure/io/graphson/GraphSONModule.java | 6 +-
.../structure/io/graphson/GraphSONReader.java | 2 +-
.../structure/io/graphson/GraphSONWriter.java | 2 +-
.../io/graphson/LegacyGraphSONReader.java | 2 +-
.../structure/io/gryo/GraphSerializer.java | 4 +-
.../structure/io/gryo/GremlinClassResolver.java | 2 +-
.../gremlin/structure/io/gryo/GryoMapper.java | 24 +-
.../gremlin/structure/io/gryo/GryoReader.java | 2 +-
.../io/gryo/VertexByteArrayInputStream.java | 2 +-
.../structure/strategy/GraphStrategy.java | 2 +-
.../gremlin/structure/strategy/IdStrategy.java | 4 +-
.../structure/strategy/PartitionStrategy.java | 14 +-
.../structure/strategy/SequenceStrategy.java | 2 +-
.../structure/strategy/StrategyGraph.java | 1 -
.../structure/strategy/SubgraphStrategy.java | 2 +-
.../step/sideEffect/StrategyGraphStep.java | 6 +-
.../gremlin/structure/util/ElementHelper.java | 22 +-
.../gremlin/structure/util/StringFactory.java | 10 +-
.../structure/util/batch/BatchGraph.java | 4 +-
.../structure/util/detached/DetachedEdge.java | 2 +-
.../util/detached/DetachedFactory.java | 2 +-
.../structure/util/detached/DetachedPath.java | 4 +-
.../structure/util/detached/DetachedVertex.java | 4 +-
.../structure/util/empty/EmptyGraph.java | 2 -
.../gremlin/util/function/BulkSetSupplier.java | 2 +-
.../util/function/MeanNumberSupplier.java | 2 +-
.../util/function/TraversableLambda.java | 2 +-
.../gremlin/util/function/TreeSupplier.java | 2 +-
.../gremlin/util/iterator/ArrayIterator.java | 2 +-
.../gremlin/util/iterator/DoubleIterator.java | 2 +-
.../gremlin/util/iterator/EmptyIterator.java | 2 +-
.../gremlin/util/iterator/IteratorUtils.java | 2 +-
.../gremlin/util/iterator/MultiIterator.java | 2 +-
.../gremlin/util/iterator/SingleIterator.java | 2 +-
.../process/TraversalStrategiesTest.java | 7 +-
.../step/filter/ConjunctionStepTest.java | 7 +-
.../strategy/RangeByIsCountStrategyTest.java | 15 +-
.../strategy/TimeLimitedStrategyTest.java | 11 +-
.../gremlin/process/graph/util/TreeTest.java | 1 +
.../decoration/PartitionStrategyTest.java | 20 +-
.../decoration/ReadOnlyStrategyTest.java | 4 +-
.../decoration/SubgraphStrategyTest.java | 25 +-
.../gremlin/process/util/BulkSetTest.java | 1 +
.../process/util/TraversalHelperTest.java | 19 +-
.../structure/util/ElementHelperTest.java | 2 +-
.../util/iterator/ArrayIteratorTest.java | 2 +-
.../util/iterator/DoubleIteratorTest.java | 2 +-
.../util/iterator/EmptyIteratorTest.java | 2 +-
.../util/iterator/MultiIteratorTest.java | 2 +-
.../util/iterator/SingleIteratorTest.java | 2 +-
.../driver/message/ResponseStatusCode.java | 2 +-
.../ser/GryoMessageSerializerV1D0Test.java | 2 +-
.../JsonMessageSerializerGremlinV1d0Test.java | 2 +-
.../ser/JsonMessageSerializerV1d0Test.java | 2 +-
.../gremlin/process/ComputerTestHelper.groovy | 45 -
.../process/computer/ComputerTestHelper.groovy | 46 +
.../step/branch/GroovyBranchTest.groovy | 80 --
.../step/branch/GroovyChooseTest.groovy | 51 -
.../step/branch/GroovyLocalTest.groovy | 146 ---
.../step/branch/GroovyRepeatTest.groovy | 134 ---
.../step/branch/GroovyUnionTest.groovy | 111 ---
.../traversal/step/filter/GroovyAndTest.groovy | 66 --
.../traversal/step/filter/GroovyCoinTest.groovy | 60 --
.../step/filter/GroovyCyclicPathTest.groovy | 61 --
.../step/filter/GroovyDedupTest.groovy | 100 --
.../step/filter/GroovyExceptTest.groovy | 115 ---
.../step/filter/GroovyFilterTest.groovy | 179 ----
.../step/filter/GroovyHasNotTest.groovy | 68 --
.../traversal/step/filter/GroovyHasTest.groovy | 191 ----
.../traversal/step/filter/GroovyIsTest.groovy | 91 --
.../traversal/step/filter/GroovyOrTest.groovy | 66 --
.../step/filter/GroovyRangeTest.groovy | 198 ----
.../step/filter/GroovyRetainTest.groovy | 68 --
.../step/filter/GroovySampleTest.groovy | 115 ---
.../step/filter/GroovySimplePathTest.groovy | 62 --
.../step/filter/GroovyWhereTest.groovy | 98 --
.../traversal/step/map/GroovyAddEdgeTest.groovy | 51 -
.../step/map/GroovyAddVertexTest.groovy | 46 -
.../traversal/step/map/GroovyBackTest.groovy | 147 ---
.../step/map/GroovyCoalesceTest.groovy | 104 ---
.../traversal/step/map/GroovyCountTest.groovy | 119 ---
.../traversal/step/map/GroovyFoldTest.groovy | 79 --
.../traversal/step/map/GroovyMapTest.groovy | 129 ---
.../traversal/step/map/GroovyMatchTest.groovy | 187 ----
.../traversal/step/map/GroovyMaxTest.groovy | 74 --
.../traversal/step/map/GroovyMeanTest.groovy | 63 --
.../traversal/step/map/GroovyMinTest.groovy | 74 --
.../traversal/step/map/GroovyOrderTest.groovy | 184 ----
.../traversal/step/map/GroovyPathTest.groovy | 115 ---
.../step/map/GroovyPropertiesTest.groovy | 61 --
.../traversal/step/map/GroovySelectTest.groovy | 208 -----
.../traversal/step/map/GroovySumTest.groovy | 63 --
.../traversal/step/map/GroovyUnfoldTest.groovy | 63 --
.../step/map/GroovyValueMapTest.groovy | 68 --
.../traversal/step/map/GroovyVertexTest.groovy | 294 ------
.../step/sideEffect/GroovyAggregateTest.groovy | 71 --
.../step/sideEffect/GroovyGroupCountTest.groovy | 126 ---
.../step/sideEffect/GroovyGroupTest.groovy | 97 --
.../step/sideEffect/GroovyInjectTest.groovy | 74 --
.../step/sideEffect/GroovyProfileTest.groovy | 95 --
.../step/sideEffect/GroovySackTest.groovy | 72 --
.../sideEffect/GroovySideEffectCapTest.groovy | 65 --
.../step/sideEffect/GroovySideEffectTest.groovy | 57 --
.../step/sideEffect/GroovyStoreTest.groovy | 84 --
.../step/sideEffect/GroovySubgraphTest.groovy | 49 -
.../step/sideEffect/GroovyTreeTest.groovy | 105 ---
.../step/branch/GroovyBranchTest.groovy | 80 ++
.../step/branch/GroovyChooseTest.groovy | 51 +
.../step/branch/GroovyLocalTest.groovy | 145 +++
.../step/branch/GroovyRepeatTest.groovy | 134 +++
.../step/branch/GroovyUnionTest.groovy | 111 +++
.../traversal/step/filter/GroovyAndTest.groovy | 65 ++
.../traversal/step/filter/GroovyCoinTest.groovy | 59 ++
.../step/filter/GroovyCyclicPathTest.groovy | 60 ++
.../step/filter/GroovyDedupTest.groovy | 105 +++
.../step/filter/GroovyExceptTest.groovy | 114 +++
.../step/filter/GroovyFilterTest.groovy | 179 ++++
.../step/filter/GroovyHasNotTest.groovy | 68 ++
.../traversal/step/filter/GroovyHasTest.groovy | 191 ++++
.../traversal/step/filter/GroovyIsTest.groovy | 90 ++
.../traversal/step/filter/GroovyOrTest.groovy | 65 ++
.../step/filter/GroovyRangeTest.groovy | 196 ++++
.../step/filter/GroovyRetainTest.groovy | 67 ++
.../step/filter/GroovySampleTest.groovy | 113 +++
.../step/filter/GroovySimplePathTest.groovy | 61 ++
.../step/filter/GroovyWhereTest.groovy | 95 ++
.../traversal/step/map/GroovyAddEdgeTest.groovy | 51 +
.../step/map/GroovyAddVertexTest.groovy | 46 +
.../traversal/step/map/GroovyBackTest.groovy | 146 +++
.../step/map/GroovyCoalesceTest.groovy | 103 ++
.../traversal/step/map/GroovyCountTest.groovy | 117 +++
.../traversal/step/map/GroovyFoldTest.groovy | 76 ++
.../traversal/step/map/GroovyMapTest.groovy | 129 +++
.../traversal/step/map/GroovyMatchTest.groovy | 186 ++++
.../traversal/step/map/GroovyMaxTest.groovy | 74 ++
.../traversal/step/map/GroovyMeanTest.groovy | 63 ++
.../traversal/step/map/GroovyMinTest.groovy | 74 ++
.../traversal/step/map/GroovyOrderTest.groovy | 188 ++++
.../traversal/step/map/GroovyPathTest.groovy | 113 +++
.../step/map/GroovyPropertiesTest.groovy | 60 ++
.../traversal/step/map/GroovySelectTest.groovy | 206 ++++
.../traversal/step/map/GroovySumTest.groovy | 63 ++
.../traversal/step/map/GroovyUnfoldTest.groovy | 63 ++
.../step/map/GroovyValueMapTest.groovy | 67 ++
.../traversal/step/map/GroovyVertexTest.groovy | 293 ++++++
.../step/sideEffect/GroovyAggregateTest.groovy | 70 ++
.../step/sideEffect/GroovyGroupCountTest.groovy | 126 +++
.../step/sideEffect/GroovyGroupTest.groovy | 101 ++
.../step/sideEffect/GroovyInjectTest.groovy | 74 ++
.../step/sideEffect/GroovyProfileTest.groovy | 93 ++
.../step/sideEffect/GroovySackTest.groovy | 72 ++
.../sideEffect/GroovySideEffectCapTest.groovy | 64 ++
.../step/sideEffect/GroovySideEffectTest.groovy | 56 ++
.../step/sideEffect/GroovyStoreTest.groovy | 83 ++
.../step/sideEffect/GroovySubgraphTest.groovy | 48 +
.../step/sideEffect/GroovyTreeTest.groovy | 109 +++
.../engine/GremlinExecutorPerformanceTest.java | 2 +-
.../GremlinGroovyScriptEngineOverGraphTest.java | 4 +-
.../process/GroovyProcessComputerSuite.java | 86 +-
.../process/GroovyProcessStandardSuite.java | 100 +-
.../gremlin/groovy/loaders/StepLoader.groovy | 2 +-
.../gremlin/groovy/loaders/SugarLoader.groovy | 10 +-
.../AbstractImportCustomizerProvider.java | 16 +-
.../server/op/AbstractEvalOpProcessor.java | 2 +-
.../server/GremlinServerIntegrateTest.java | 3 +-
.../tinkerpop/gremlin/AbstractGremlinSuite.java | 2 +-
.../tinkerpop/gremlin/AbstractGremlinTest.java | 4 +-
.../apache/tinkerpop/gremlin/GraphManager.java | 2 +-
.../apache/tinkerpop/gremlin/GraphProvider.java | 36 +-
.../process/AbstractGremlinProcessTest.java | 4 +-
.../tinkerpop/gremlin/process/IgnoreEngine.java | 2 +
.../gremlin/process/ProcessComputerSuite.java | 91 +-
.../gremlin/process/ProcessStandardSuite.java | 108 +--
.../process/TraversalPerformanceTest.java | 4 +-
.../tinkerpop/gremlin/process/UseEngine.java | 2 +
.../process/computer/GraphComputerTest.java | 4 +-
.../ranking/PageRankVertexProgramTest.java | 2 +-
.../computer/util/ComputerGraphTest.java | 2 +-
.../graph/traversal/step/branch/BranchTest.java | 82 --
.../graph/traversal/step/branch/ChooseTest.java | 75 --
.../graph/traversal/step/branch/LocalTest.java | 255 -----
.../graph/traversal/step/branch/RepeatTest.java | 272 ------
.../graph/traversal/step/branch/UnionTest.java | 195 ----
.../graph/traversal/step/filter/AndTest.java | 79 --
.../graph/traversal/step/filter/CoinTest.java | 84 --
.../traversal/step/filter/CyclicPathTest.java | 86 --
.../graph/traversal/step/filter/DedupTest.java | 146 ---
.../graph/traversal/step/filter/ExceptTest.java | 187 ----
.../graph/traversal/step/filter/FilterTest.java | 222 -----
.../graph/traversal/step/filter/HasNotTest.java | 98 --
.../graph/traversal/step/filter/HasTest.java | 325 -------
.../graph/traversal/step/filter/IsTest.java | 125 ---
.../graph/traversal/step/filter/OrTest.java | 77 --
.../graph/traversal/step/filter/RangeTest.java | 265 ------
.../graph/traversal/step/filter/RetainTest.java | 94 --
.../graph/traversal/step/filter/SampleTest.java | 148 ---
.../traversal/step/filter/SimplePathTest.java | 86 --
.../graph/traversal/step/filter/WhereTest.java | 162 ----
.../graph/traversal/step/map/AddEdgeTest.java | 130 ---
.../graph/traversal/step/map/AddVertexTest.java | 91 --
.../graph/traversal/step/map/BackTest.java | 221 -----
.../graph/traversal/step/map/CoalesceTest.java | 158 ----
.../graph/traversal/step/map/CountTest.java | 168 ----
.../graph/traversal/step/map/FoldTest.java | 109 ---
.../graph/traversal/step/map/MapTest.java | 153 ---
.../graph/traversal/step/map/MatchTest.java | 931 -------------------
.../graph/traversal/step/map/MaxTest.java | 93 --
.../graph/traversal/step/map/MeanTest.java | 88 --
.../graph/traversal/step/map/MinTest.java | 93 --
.../graph/traversal/step/map/OrderTest.java | 288 ------
.../graph/traversal/step/map/PathTest.java | 165 ----
.../traversal/step/map/PropertiesTest.java | 65 --
.../graph/traversal/step/map/SelectTest.java | 310 ------
.../graph/traversal/step/map/SumTest.java | 83 --
.../graph/traversal/step/map/UnfoldTest.java | 109 ---
.../graph/traversal/step/map/ValueMapTest.java | 145 ---
.../graph/traversal/step/map/VertexTest.java | 617 ------------
.../step/sideEffect/AggregateTest.java | 149 ---
.../step/sideEffect/GroupCountTest.java | 177 ----
.../traversal/step/sideEffect/GroupTest.java | 171 ----
.../traversal/step/sideEffect/InjectTest.java | 100 --
.../traversal/step/sideEffect/ProfileTest.java | 271 ------
.../traversal/step/sideEffect/SackTest.java | 105 ---
.../step/sideEffect/SideEffectCapTest.java | 95 --
.../step/sideEffect/SideEffectTest.java | 116 ---
.../traversal/step/sideEffect/StoreTest.java | 137 ---
.../traversal/step/sideEffect/SubgraphTest.java | 116 ---
.../traversal/step/sideEffect/TreeTest.java | 139 ---
.../step/util/TraversalSideEffectsTest.java | 58 --
.../TraversalVerificationStrategyTest.java | 131 ---
.../process/traversal/CoreTraversalTest.java | 8 +-
.../process/traversal/DefaultTraversalTest.java | 50 -
.../traversal/TraversalSideEffectsTest.java | 56 ++
.../traversal/step/branch/BranchTest.java | 82 ++
.../traversal/step/branch/ChooseTest.java | 75 ++
.../traversal/step/branch/LocalTest.java | 255 +++++
.../traversal/step/branch/RepeatTest.java | 272 ++++++
.../traversal/step/branch/UnionTest.java | 194 ++++
.../process/traversal/step/filter/AndTest.java | 79 ++
.../process/traversal/step/filter/CoinTest.java | 84 ++
.../traversal/step/filter/CyclicPathTest.java | 86 ++
.../traversal/step/filter/DedupTest.java | 146 +++
.../traversal/step/filter/ExceptTest.java | 186 ++++
.../traversal/step/filter/FilterTest.java | 221 +++++
.../traversal/step/filter/HasNotTest.java | 98 ++
.../process/traversal/step/filter/HasTest.java | 325 +++++++
.../process/traversal/step/filter/IsTest.java | 125 +++
.../process/traversal/step/filter/OrTest.java | 77 ++
.../traversal/step/filter/RangeTest.java | 265 ++++++
.../traversal/step/filter/RetainTest.java | 93 ++
.../traversal/step/filter/SampleTest.java | 147 +++
.../traversal/step/filter/SimplePathTest.java | 86 ++
.../traversal/step/filter/WhereTest.java | 161 ++++
.../process/traversal/step/map/AddEdgeTest.java | 130 +++
.../traversal/step/map/AddVertexTest.java | 91 ++
.../process/traversal/step/map/BackTest.java | 220 +++++
.../traversal/step/map/CoalesceTest.java | 158 ++++
.../process/traversal/step/map/CountTest.java | 168 ++++
.../process/traversal/step/map/FoldTest.java | 108 +++
.../process/traversal/step/map/MapTest.java | 152 +++
.../process/traversal/step/map/MatchTest.java | 931 +++++++++++++++++++
.../process/traversal/step/map/MaxTest.java | 93 ++
.../process/traversal/step/map/MeanTest.java | 88 ++
.../process/traversal/step/map/MinTest.java | 93 ++
.../process/traversal/step/map/OrderTest.java | 288 ++++++
.../process/traversal/step/map/PathTest.java | 165 ++++
.../traversal/step/map/PropertiesTest.java | 65 ++
.../process/traversal/step/map/SelectTest.java | 310 ++++++
.../process/traversal/step/map/SumTest.java | 83 ++
.../process/traversal/step/map/UnfoldTest.java | 109 +++
.../traversal/step/map/ValueMapTest.java | 144 +++
.../process/traversal/step/map/VertexTest.java | 617 ++++++++++++
.../step/sideEffect/AggregateTest.java | 149 +++
.../step/sideEffect/GroupCountTest.java | 177 ++++
.../traversal/step/sideEffect/GroupTest.java | 174 ++++
.../traversal/step/sideEffect/InjectTest.java | 100 ++
.../traversal/step/sideEffect/ProfileTest.java | 274 ++++++
.../traversal/step/sideEffect/SackTest.java | 103 ++
.../step/sideEffect/SideEffectCapTest.java | 95 ++
.../step/sideEffect/SideEffectTest.java | 116 +++
.../traversal/step/sideEffect/StoreTest.java | 137 +++
.../traversal/step/sideEffect/SubgraphTest.java | 116 +++
.../traversal/step/sideEffect/TreeTest.java | 142 +++
.../process/traversal/step/util/PathTest.java | 122 +++
.../PartitionStrategyProcessTest.java | 4 +-
.../decoration/ReadOnlyStrategyProcessTest.java | 6 +-
.../decoration/SubgraphStrategyProcessTest.java | 10 +-
.../TraversalVerificationStrategyTest.java | 129 +++
.../traversal/util/DefaultTraversalTest.java | 48 +
.../gremlin/process/util/PathTest.java | 124 ---
.../tinkerpop/gremlin/structure/BatchTest.java | 2 +-
.../gremlin/structure/FeatureSupportTest.java | 2 +-
.../tinkerpop/gremlin/structure/GraphTest.java | 2 +-
.../tinkerpop/gremlin/structure/IoTest.java | 2 +-
.../gremlin/structure/SerializationTest.java | 4 +-
.../gremlin/structure/VertexPropertyTest.java | 2 +-
.../tinkerpop/gremlin/structure/VertexTest.java | 2 +-
.../structure/strategy/IdStrategyTest.java | 2 +-
.../strategy/SequenceStrategyTest.java | 2 +-
.../structure/strategy/StrategyGraphTest.java | 2 +-
.../strategy/SubgraphStrategyTest.java | 4 +-
.../groovy/plugin/HadoopRemoteAcceptor.java | 6 +-
.../computer/example/TraversalSupplier1.java | 2 +-
.../computer/example/TraversalSupplier2.java | 2 +-
.../computer/example/TraversalSupplier3.java | 2 +-
.../computer/giraph/GiraphMessenger.java | 6 +-
.../computer/spark/SparkVertexPayload.java | 6 +-
.../gremlin/hadoop/structure/HadoopGraph.java | 28 +-
.../structure/hdfs/HadoopEdgeIterator.java | 2 +-
.../structure/hdfs/HadoopVertexIterator.java | 2 +-
.../hadoop/structure/hdfs/TextIterator.java | 2 +-
.../structure/io/ObjectWritableIterator.java | 2 +-
.../structure/io/script/ScriptRecordReader.java | 2 +-
.../giraph/HadoopGiraphGraphProvider.java | 2 +-
.../spark/HadoopSparkGraphProvider.java | 2 +-
.../step/sideEffect/Neo4jGraphStep.java | 238 -----
.../step/util/Neo4jCypherIterator.java | 66 --
.../strategy/Neo4jGraphStepStrategy.java | 69 --
.../step/sideEffect/Neo4jGraphStep.java | 238 +++++
.../step/util/Neo4jCypherIterator.java | 66 ++
.../optimization/Neo4jGraphStepStrategy.java | 68 ++
.../gremlin/neo4j/structure/Neo4jGraph.java | 16 +-
.../gremlin/neo4j/structure/Neo4jVertex.java | 2 +-
.../neo4j/structure/Neo4jVertexProperty.java | 2 +-
.../gremlin/neo4j/BaseNeo4jGraphTest.java | 2 +-
.../neo4j/process/Neo4jCypherStartTest.java | 2 +-
.../gremlin/neo4j/structure/Neo4jGraphTest.java | 6 +-
.../process/computer/TinkerGraphComputer.java | 2 +-
.../process/computer/TinkerMessenger.java | 6 +-
.../traversal/sideEffect/TinkerGraphStep.java | 117 ---
.../strategy/TinkerGraphStepStrategy.java | 74 --
.../step/sideEffect/TinkerGraphStep.java | 117 +++
.../optimization/TinkerGraphStepStrategy.java | 74 ++
.../tinkergraph/structure/TinkerEdge.java | 2 +-
.../tinkergraph/structure/TinkerFactory.java | 12 +-
.../tinkergraph/structure/TinkerGraph.java | 4 +-
.../process/TinkerGraphComputerProvider.java | 4 +-
.../tinkergraph/structure/TinkerGraphTest.java | 8 +-
732 files changed, 33648 insertions(+), 33704 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 3910e7f..e9ebd66 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Refactored step API -- the TinkerPop3 steps are the foundation for any domain specific language (including graph).
+* `MapReduce` now has `workerStart(Stage)` and `workerEnd(Stage)` methods with analagous semantics to `VertexProgram`.
* Hadoop-Gremlin `ObjectWritable` now leverages Kryo for data serialization.
* `GiraphGraphComputer` supports arbitrary objects as the vertex id -- previously, only long ids were supported.
* Added `VertexProgramPool` to support thread safe pooling of vertex programs for graph computers that provide threaded workers.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
index 255a429..f065345 100644
--- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
+++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.console.plugin
import org.apache.tinkerpop.gremlin.groovy.plugin.RemoteAcceptor
import org.apache.tinkerpop.gremlin.groovy.plugin.RemoteException
-import org.apache.tinkerpop.gremlin.process.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
import org.apache.tinkerpop.gremlin.structure.Edge
import org.apache.tinkerpop.gremlin.structure.Graph
import org.apache.tinkerpop.gremlin.structure.Vertex
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
index 68d9a15..4b18cea 100644
--- a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
+++ b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.console.groovy.plugin;
import org.apache.tinkerpop.gremlin.groovy.plugin.SugarGremlinPlugin;
import org.apache.tinkerpop.gremlin.groovy.util.MetaRegistryUtil;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
import org.codehaus.groovy.tools.shell.Groovysh;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
deleted file mode 100644
index 180252e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
+++ /dev/null
@@ -1,46 +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;
-
-import java.util.NoSuchElementException;
-
-/**
- * Retrieve a singleton, fast {@link java.util.NoSuchElementException} without a stack trace.
- */
-public final class FastNoSuchElementException extends NoSuchElementException {
-
- private static final long serialVersionUID = 2303108654138257697L;
- private static final FastNoSuchElementException INSTANCE = new FastNoSuchElementException();
-
- private FastNoSuchElementException() {
- }
-
- /**
- * Retrieve a singleton, fast {@link NoSuchElementException} without a stack trace.
- */
- public static NoSuchElementException instance() {
- return INSTANCE;
- }
-
- @Override
- public synchronized Throwable fillInStackTrace() {
- return this;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
deleted file mode 100644
index d109286..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
+++ /dev/null
@@ -1,180 +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;
-
-import org.javatuples.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-/**
- * A Path denotes a particular walk through a {@link org.apache.tinkerpop.gremlin.structure.Graph} as defined by a {@link Traverser}.
- * In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
- * The list of labels are the labels of the steps traversed.
- * The list of objects are the objects traversed.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Path extends Cloneable {
-
- /**
- * Get the number of step in the path.
- *
- * @return the size of the path
- */
- public default int size() {
- return this.objects().size();
- }
-
- /**
- * Add a new step to the path with an object and any number of associated labels.
- *
- * @param object the new head of the path
- * @param labels the labels at the head of the path
- * @return the extended path
- */
- public Path extend(final Object object, final String... labels);
-
- /**
- * Get the object associated with the particular label of the path.
- * If the path as multiple labels of the type, then return a {@link List} of those objects.
- *
- * @param label the label of the path
- * @param <A> the type of the object associated with the label
- * @return the object associated with the label of the path
- * @throws IllegalArgumentException if the path does not contain the label
- */
- public default <A> A get(final String label) throws IllegalArgumentException {
- final List<Object> objects = this.objects();
- final List<Set<String>> labels = this.labels();
- Object object = null;
- for (int i = 0; i < labels.size(); i++) {
- if (labels.get(i).contains(label)) {
- if (null == object) {
- object = objects.get(i);
- } else if (object instanceof List) {
- ((List) object).add(objects.get(i));
- } else {
- final List list = new ArrayList(2);
- list.add(object);
- list.add(objects.get(i));
- object = list;
- }
- }
- }
- if (null == object)
- throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
- return (A) object;
- }
-
- /**
- * Get the object associated with the specified index into the path.
- *
- * @param index the index of the path
- * @param <A> the type of the object associated with the index
- * @return the object associated with the index of the path
- */
- public default <A> A get(final int index) {
- return (A) this.objects().get(index);
- }
-
- /**
- * Return true if the path has the specified label, else return false.
- *
- * @param label the label to search for
- * @return true if the label exists in the path
- */
- public default boolean hasLabel(final String label) {
- return this.labels().stream().filter(labels -> labels.contains(label)).findAny().isPresent();
- }
-
- /**
- * Add label to the current head of the path.
- *
- * @param label the label to add to the head of the path
- */
- public void addLabel(final String label);
-
- /**
- * An ordered list of the objects in the path.
- *
- * @return the objects of the path
- */
- public List<Object> objects();
-
- /**
- * An ordered list of the labels associated with the path
- *
- * @return the labels of the path
- */
- public List<Set<String>> labels();
-
- /**
- * {@inheritDoc}
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public Path clone();
-
- /**
- * Determines whether the path is a simple or not.
- * A simple path has no cycles and thus, no repeated objects.
- *
- * @return Whether the path is simple or not
- */
- public default boolean isSimple() {
- final List<Object> objects = this.objects();
- for (int i = 0; i < objects.size() - 1; i++) {
- for (int j = i + 1; j < objects.size(); j++) {
- if (objects.get(i).equals(objects.get(j)))
- return false;
- }
- }
- return true;
- }
-
- public default void forEach(final Consumer<Object> consumer) {
- this.objects().forEach(consumer);
- }
-
- public default void forEach(final BiConsumer<Object, Set<String>> consumer) {
- final List<Object> objects = this.objects();
- final List<Set<String>> labels = this.labels();
- for (int i = 0; i < objects.size(); i++) {
- consumer.accept(objects.get(i), labels.get(i));
- }
- }
-
- public default Stream<Pair<Object, Set<String>>> stream() {
- final List<Set<String>> labels = this.labels();
- final List<Object> objects = this.objects();
- return IntStream.range(0, this.size()).mapToObj(i -> Pair.with(objects.get(i), labels.get(i)));
- }
-
- public static class Exceptions {
-
- public static IllegalArgumentException stepWithProvidedLabelDoesNotExist(final String label) {
- return new IllegalArgumentException("The step with label " + label + " does not exist");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
deleted file mode 100644
index 0603879..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
+++ /dev/null
@@ -1,27 +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;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum Scope {
-
- global, local
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
deleted file mode 100644
index fb7fb07..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
+++ /dev/null
@@ -1,158 +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;
-
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * A {@link Step} denotes a unit of computation within a {@link Traversal}.
- * A step takes an incoming object and yields an outgoing object.
- * Steps are chained together in a {@link Traversal} to yield a lazy function chain of computation.
- * <p/>
- * In the constructor of a Step, never store explicit sideEffect objects in {@link TraversalSideEffects}.
- * If a sideEffect needs to be registered with the {@link Traversal}, use SideEffects.registerSupplier().
- *
- * @param <S> The incoming object type of the step
- * @param <E> The outgoing object type of the step
- */
-public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
-
- /**
- * Add a iterator of {@link Traverser} objects of type S to the step.
- *
- * @param starts The iterator of objects to add
- */
- public void addStarts(final Iterator<Traverser<S>> starts);
-
- /**
- * Add a single {@link Traverser} to the step.
- *
- * @param start The traverser to add
- */
- public void addStart(final Traverser<S> start);
-
- /**
- * Set the step that is previous to the current step.
- * Used for linking steps together to form a function chain.
- *
- * @param step the previous step of this step
- */
- public void setPreviousStep(final Step<?, S> step);
-
- /**
- * Get the step prior to the current step.
- *
- * @return The previous step
- */
- public Step<?, S> getPreviousStep();
-
- /**
- * Set the step that is next to the current step.
- * Used for linking steps together to form a function chain.
- *
- * @param step the next step of this step
- */
- public void setNextStep(final Step<E, ?> step);
-
- /**
- * Get the next step to the current step.
- *
- * @return The next step
- */
- public Step<E, ?> getNextStep();
-
- /**
- * Get the {@link Traversal.Admin} that this step is contained within.
- *
- * @param <A> The incoming object type of the traversal
- * @param <B> The outgoing object type of the traversal
- * @return The traversal of this step
- */
- public <A, B> Traversal.Admin<A, B> getTraversal();
-
- /**
- * Set the {@link Traversal} that this step is contained within.
- *
- * @param traversal the new traversal for this step
- */
- public void setTraversal(final Traversal.Admin<?, ?> traversal);
-
- /**
- * Reset the state of the step such that it has no incoming starts.
- * Internal states are to be reset, but any sideEffect data structures are not to be recreated.
- */
- public void reset();
-
- /**
- * Cloning is used to duplicate steps for the purpose of traversal optimization and OLTP replication.
- * When cloning a step, it is important that the steps, the cloned step is equivalent to the state of the step when reset() is called.
- * Moreover, the previous and next steps should be set to {@link org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep}.
- *
- * @return The cloned step
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public Step<S, E> clone();
-
- /**
- * Get the label of this step.
- * If the step is not labeled, then an {@link Optional#empty} is returned.
- *
- * @return the optional label of the step
- */
- public Optional<String> getLabel();
-
- /**
- * Set the label of this step.
- *
- * @param label the label for this step
- */
- public void setLabel(final String label);
-
- /**
- * Get the unique id of the step.
- * These ids can change when strategies are applied and anonymous traversals are embedded in the parent traversal.
- * A developer should typically not need to call this method.
- *
- * @param id the unique id of the step
- */
- public void setId(final String id);
-
- /**
- * Get the unique id of this step.
- *
- * @return the unique id of the step
- */
- public String getId();
-
- /**
- * Provide the necessary {@link org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement} that must be met by the traverser in order for the step to function properly.
- * The provided default implements returns an empty set.
- *
- * @return the set of requirements
- */
- public default Set<TraverserRequirement> getRequirements() {
- return Collections.emptySet();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
deleted file mode 100644
index 20d4f92..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
+++ /dev/null
@@ -1,114 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-
-import java.util.function.Function;
-
-/**
- * A collection of (T)okens which allows for more concise Traversal definitions.
- * T implements {@link Function} can be used to map an element to its token value.
- * For example, <code>T.id.apply(element)</code>.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum T implements Function<Element, Object> {
- /**
- * Label (representing Element.label())
- */
- label {
- @Override
- public String getAccessor() {
- return LABEL;
- }
-
- @Override
- public String apply(final Element element) {
- return element.label();
- }
- },
- /**
- * Id (representing Element.id())
- */
- id {
- @Override
- public String getAccessor() {
- return ID;
- }
-
- @Override
- public Object apply(final Element element) {
- return element.id();
- }
- },
- /**
- * Key (representing Property.key())
- */
- key {
- @Override
- public String getAccessor() {
- return KEY;
- }
-
- @Override
- public String apply(final Element element) {
- return ((VertexProperty) element).key();
- }
- },
- /**
- * Value (representing Property.value())
- */
- value {
- @Override
- public String getAccessor() {
- return VALUE;
- }
-
- @Override
- public Object apply(final Element element) {
- return ((VertexProperty) element).value();
- }
- };
-
- private static final String LABEL = Graph.Hidden.hide("label");
- private static final String ID = Graph.Hidden.hide("id");
- private static final String KEY = Graph.Hidden.hide("key");
- private static final String VALUE = Graph.Hidden.hide("value");
-
- public abstract String getAccessor();
-
- @Override
- public abstract Object apply(final Element element);
-
- public static T fromString(final String accessor) {
- if (accessor.equals(LABEL))
- return label;
- else if (accessor.equals(ID))
- return id;
- else if (accessor.equals(KEY))
- return key;
- else if (accessor.equals(VALUE))
- return value;
- else
- throw new IllegalArgumentException("The following token string is unknown: " + accessor);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
deleted file mode 100644
index cfaeb61..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
+++ /dev/null
@@ -1,429 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.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.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
-/**
- * A {@link Traversal} represents a directed walk over a {@link Graph}.
- * 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).
- * 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).
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
-
- /**
- * Used for reflection based access to the static "of" method of a Traversal.
- */
- public static final String OF = "of";
-
- /**
- * Get access to administrative methods of the traversal via its accompanying {@link Traversal.Admin}.
- *
- * @return the admin of this traversal
- */
- public default Traversal.Admin<S, E> asAdmin() {
- return (Traversal.Admin<S, E>) this;
- }
-
- /**
- * Return an {@link Optional} of the next E object in the traversal.
- * If the traversal is empty, then an {@link Optional#empty()} is returned.
- *
- * @return an optional of the next object in the traversal
- */
- public default Optional<E> tryNext() {
- return this.hasNext() ? Optional.of(this.next()) : Optional.empty();
- }
-
- /**
- * Get the next n-number of results from the traversal.
- * If the traversal has less than n-results, then only that number of results are returned.
- *
- * @param amount the number of results to get
- * @return the n-results in a {@link List}
- */
- public default List<E> next(final int amount) {
- final List<E> result = new ArrayList<>();
- int counter = 0;
- while (counter++ < amount && this.hasNext()) {
- result.add(this.next());
- }
- return result;
- }
-
- /**
- * Put all the results into an {@link ArrayList}.
- *
- * @return the results in a list
- */
- public default List<E> toList() {
- return this.fill(new ArrayList<>());
- }
-
- /**
- * Put all the results into a {@link HashSet}.
- *
- * @return the results in a set
- */
- public default Set<E> toSet() {
- return this.fill(new HashSet<>());
- }
-
- /**
- * Put all the results into a {@link BulkSet}.
- * This can reduce both time and space when aggregating results by ensuring a weighted set.
- *
- * @return the results in a bulk set
- */
- public default BulkSet<E> toBulkSet() {
- return this.fill(new BulkSet<>());
- }
-
- /**
- * Add all the results of the traversal to the provided collection.
- *
- * @param collection the collection to fill
- * @return the collection now filled
- */
- public default <C extends Collection<E>> C fill(final C collection) {
- try {
- if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
- // use the end step so the results are bulked
- final Step<?, E> endStep = this.asAdmin().getEndStep();
- while (true) {
- final Traverser<E> traverser = endStep.next();
- TraversalHelper.addToCollection(collection, traverser.get(), traverser.bulk());
- }
- } catch (final NoSuchElementException ignored) {
- }
- return collection;
- }
-
- /**
- * Iterate all the {@link Traverser} instances in the traversal.
- * What is returned is the empty traversal.
- * It is assumed that what is desired from the computation is are the sideEffects yielded by the traversal.
- *
- * @return the fully drained traversal
- */
- public default <A, B> Traversal<A, B> iterate() {
- try {
- if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
- // use the end step so the results are bulked
- final Step<?, E> endStep = this.asAdmin().getEndStep();
- while (true) {
- endStep.next();
- }
- } catch (final NoSuchElementException ignored) {
- }
- return (Traversal<A, B>) this;
- }
-
- /**
- * A traversal can be rewritten such that its defined end type E may yield objects of a different type.
- * This helper method allows for the casting of the output to the known the type.
- *
- * @param endType the true output type of the traversal
- * @param consumer a {@link Consumer} to process each output
- * @param <E2> the known output type of the traversal
- */
- public default <E2> void forEachRemaining(final Class<E2> endType, final Consumer<E2> consumer) {
- try {
- while (true) {
- consumer.accept((E2) next());
- }
- } catch (final NoSuchElementException ignore) {
-
- }
- }
-
- @Override
- public default void forEachRemaining(final Consumer<? super E> action) {
- try {
- while (true) {
- action.accept(next());
- }
- } catch (final NoSuchElementException ignore) {
-
- }
- }
-
- /**
- * A collection of {@link Exception} types associated with Traversal execution.
- */
- public static class Exceptions {
-
- public static IllegalStateException traversalIsLocked() {
- return new IllegalStateException("The traversal strategies are complete and the traversal can no longer be modulated");
- }
-
- public static IllegalStateException traversalIsNotReversible() {
- return new IllegalStateException("The traversal is not reversible as it contains steps that are not reversible");
- }
- }
-
- public interface Admin<S, E> extends Traversal<S, E> {
-
- /**
- * Add an iterator of {@link Traverser} objects to the head/start of the traversal.
- * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep}.
- *
- * @param starts an iterators of traversers
- */
- public default void addStarts(final Iterator<Traverser<S>> starts) {
- if (!this.isLocked()) this.applyStrategies();
- this.getStartStep().addStarts(starts);
- }
-
- /**
- * Add a single {@link Traverser} object to the head of the traversal.
- * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep}.
- *
- * @param start a traverser to add to the traversal
- */
- public default void addStart(final Traverser<S> start) {
- if (!this.isLocked()) this.applyStrategies();
- this.getStartStep().addStart(start);
- }
-
- /**
- * Get the {@link Step} instances associated with this traversal.
- * The steps are ordered according to their linked list structure as defined by {@link Step#getPreviousStep()} and {@link Step#getNextStep()}.
- *
- * @return the ordered steps of the traversal
- */
- public List<Step> getSteps();
-
- /**
- * Add a {@link Step} to the end of the traversal. This method should link the step to its next and previous step accordingly.
- *
- * @param step the step to add
- * @param <E2> the output of the step
- * @return the updated traversal
- * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
- */
- public default <E2> Traversal.Admin<S, E2> addStep(final Step<?, E2> step) throws IllegalStateException {
- return this.addStep(this.getSteps().size(), step);
- }
-
- /**
- * Add a {@link Step} to an arbitrary point in the traversal.
- *
- * @param index the location in the traversal to insert the step
- * @param step the step to add
- * @param <S2> the new start type of the traversal (if the added step was a start step)
- * @param <E2> the new end type of the traversal (if the added step was an end step)
- * @return the newly modulated traversal
- * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
- */
- public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException;
-
- /**
- * Remove a {@link Step} from the traversal.
- *
- * @param step the step to remove
- * @param <S2> the new start type of the traversal (if the removed step was a start step)
- * @param <E2> the new end type of the traversal (if the removed step was an end step)
- * @return the newly modulated traversal
- * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
- */
- public default <S2, E2> Traversal.Admin<S2, E2> removeStep(final Step<?, ?> step) throws IllegalStateException {
- return this.removeStep(this.getSteps().indexOf(step));
- }
-
- /**
- * Remove a {@link Step} from the traversal.
- *
- * @param index the location in the traversal of the step to be evicted
- * @param <S2> the new start type of the traversal (if the removed step was a start step)
- * @param <E2> the new end type of the traversal (if the removed step was an end step)
- * @return the newly modulated traversal
- * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
- */
- public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException;
-
- /**
- * Get the start/head of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
- *
- * @return the start step of the traversal
- */
- public default Step<S, ?> getStartStep() {
- final List<Step> steps = this.getSteps();
- return steps.isEmpty() ? EmptyStep.instance() : steps.get(0);
- }
-
- /**
- * Get the end/tail of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
- *
- * @return the end step of the traversal
- */
- public default Step<?, E> getEndStep() {
- final List<Step> steps = this.getSteps();
- return steps.isEmpty() ? EmptyStep.instance() : steps.get(steps.size() - 1);
- }
-
- /**
- * Apply the registered {@link TraversalStrategies} to the traversal.
- * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
- * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
- *
- * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
- */
- 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.traverser.TraverserRequirement}.
- *
- * @return the generator of traversers
- */
- public default TraverserGenerator getTraverserGenerator() {
- return this.getStrategies().getTraverserGeneratorFactory().getTraverserGenerator(this);
- }
-
- /**
- * Get the set of all {@link TraverserRequirement}s for this traversal.
- *
- * @return the features of a traverser that are required to execute properly in this traversal
- */
- public default Set<TraverserRequirement> getTraverserRequirements() {
- final Set<TraverserRequirement> requirements = this.getSteps().stream()
- .flatMap(step -> ((Step<?, ?>) step).getRequirements().stream())
- .collect(Collectors.toSet());
- if (this.getSideEffects().keys().size() > 0)
- requirements.add(TraverserRequirement.SIDE_EFFECTS);
- if (this.getSideEffects().getSackInitialValue().isPresent())
- requirements.add(TraverserRequirement.SACK);
- if (this.getEngine().isComputer())
- requirements.add(TraverserRequirement.BULK);
- return requirements;
- }
-
- /**
- * Call the {@link Step#reset} method on every step in the traversal.
- */
- public default void reset() {
- this.getSteps().forEach(Step::reset);
- }
-
- /**
- * Set the {@link TraversalSideEffects} of this traversal.
- *
- * @param sideEffects the sideEffects to set for this traversal.
- */
- public void setSideEffects(final TraversalSideEffects sideEffects);
-
- /**
- * Get the {@link TraversalSideEffects} associated with the traversal.
- *
- * @return The traversal sideEffects
- */
- public TraversalSideEffects getSideEffects();
-
- /**
- * Set the {@link TraversalStrategies} to be used by this traversal at evaluation time.
- *
- * @param strategies the strategies to use on this traversal
- */
- public void setStrategies(final TraversalStrategies strategies);
-
- /**
- * Get the {@link TraversalStrategies} associated with this traversal.
- *
- * @return the strategies associated with this traversal
- */
- public TraversalStrategies getStrategies();
-
- /**
- * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
- * Traversals can be nested and this is the means by which the traversal tree is connected.
- *
- * @param step the traversal holder parent step
- */
- public void setParent(final TraversalParent step);
-
- /**
- * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
- * Traversals can be nested and this is the means by which the traversal tree is walked.
- *
- * @return the traversal holder parent step
- */
- public TraversalParent getParent();
-
- /**
- * Cloning is used to duplicate the traversal typically in OLAP environments.
- *
- * @return The cloned traversal
- */
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public Traversal.Admin<S, E> clone();
-
- /**
- * When the traversal has had its {@link TraversalStrategies} applied to it, it is locked.
- *
- * @return whether the traversal is locked
- */
- public boolean isLocked();
-
- public Optional<Graph> getGraph();
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
deleted file mode 100644
index d93c08d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
+++ /dev/null
@@ -1,55 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalEngine extends Serializable {
-
- public enum Type {STANDARD, COMPUTER}
-
- public void processTraversal(final Traversal.Admin<?, ?> traversal);
-
- public Type getType();
-
- public Optional<GraphComputer> getGraphComputer();
-
- public default boolean isStandard() {
- return this.getType().equals(Type.STANDARD);
- }
-
- public default boolean isComputer() {
- return this.getType().equals(Type.COMPUTER);
- }
-
- ///////////
-
- public interface Builder extends Serializable {
- public TraversalEngine create(final Graph graph);
- }
-}
[16/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
new file mode 100644
index 0000000..3ec89e9
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
@@ -0,0 +1,51 @@
+/*
+ * 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.step.branch
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class GroovyChooseTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends ChooseTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+ g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends ChooseTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+ ComputerTestHelper.compute("g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
new file mode 100644
index 0000000..c5cbd5e
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
@@ -0,0 +1,145 @@
+/*
+ * 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.step.branch
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyLocalTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends LocalTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+ g.V.local(__.properties('location').order.by(T.value, Order.incr).limit(2)).value
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+ g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+ g.V.local(__.outE.count());
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+ g.V(v1Id).local(__.outE('knows').limit(1)).inV.name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+ g.V().local(__.bothE('created').limit(1)).otherV.name
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+ g.V(v4Id).local(__.bothE('created').limit(1))
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+ g.V(v4Id).local(__.bothE('knows', 'created').limit(1))
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+ g.V(v4Id).local(__.bothE.limit(1)).otherV.name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+ g.V(v4Id).local(__.bothE.limit(2).otherV).name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+ g.V().inE('knows').local(__.limit(2).outV).name
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends LocalTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+ ComputerTestHelper.compute("g.V.local(__.properties('location').order.by(T.value,Order.incr).limit(2)).value", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+ ComputerTestHelper.compute("g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+ ComputerTestHelper.compute("g.V.local(__.outE.count())", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).local(__.outE('knows').limit(1)).inV.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+ ComputerTestHelper.compute("g.V().local(__.bothE('created').limit(1)).otherV.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('created').limit(1))", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('knows', 'created').limit(1))", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(1)).otherV.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(2)).otherV.name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+ ComputerTestHelper.compute("g.V().local(__.inE('knows').limit(2).outV).name", g);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
new file mode 100644
index 0000000..cee4733
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
@@ -0,0 +1,134 @@
+/*
+ * 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.step.branch
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.groupCount
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRepeatTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends RepeatTest {
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+ g.V.repeat(__.out).times(2).emit.path
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+ g.V.repeat(__.out).times(2).repeat(__.in).times(2).name
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+ g.V.repeat(__.out).times(2)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+ g.V.repeat(__.out).times(2).emit;
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+ g.V(v1Id).times(2).repeat(__.out).name
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+ g.V.emit.repeat(__.out).times(2).path
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+ g.V.emit.times(2).repeat(__.out).path
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+ g.V(v1Id).emit(has(T.label, 'person')).repeat(__.out).name
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+ g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends RepeatTest {
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+ ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit.path", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+ ComputerTestHelper.compute("g.V.repeat(__.out).times(2).repeat(__.in).times(2).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+ ComputerTestHelper.compute("g.V.repeat(__.out).times(2)", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+ ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).times(2).repeat(__.out).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+ ComputerTestHelper.compute("g.V.emit.repeat(__.out).times(2).path", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+ ComputerTestHelper.compute("g.V.emit.times(2).repeat(__.out).path", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).emit(has(T.label, 'person')).repeat(__.out).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+ ComputerTestHelper.compute("g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
new file mode 100644
index 0000000..626a19e
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
@@ -0,0 +1,111 @@
+/*
+ * 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.step.branch
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyUnionTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends UnionTest {
+
+ public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+ g.V.union(__.out, __.in).name
+ }
+
+ public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+ g.V(v1Id).union(repeat(__.out).times(2), __.out).name
+ }
+
+ public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+ g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)
+ }
+
+ public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+ g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount
+ }
+
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+ g.V.union(
+ repeat(union(
+ out('created'),
+ __.in('created'))).times(2),
+ repeat(union(
+ __.in('created'),
+ out('created'))).times(2)).label.groupCount()
+ }
+
+ @Override
+ public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
+ final Object v1Id, final Object v2Id) {
+ g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
+ }
+
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends UnionTest {
+
+ public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+ ComputerTestHelper.compute("g.V.union(__.out, __.in).name", g)
+ }
+
+ public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).union(repeat(__.out).times(2), __.out).name", g)
+ }
+
+ public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+ ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)", g)
+ }
+
+ public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+ ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount", g)
+ }
+
+ public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+ ComputerTestHelper.compute("""
+ g.V.union(
+ repeat(union(
+ out('created'),
+ __.in('created'))).times(2),
+ repeat(union(
+ __.in('created'),
+ out('created'))).times(2)).label.groupCount()
+ """, g)
+ }
+
+ @Override
+ public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
+ final Object v1Id, final Object v2Id) {
+ g.engine(StandardTraversalEngine.INSTANCE);
+ g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
new file mode 100644
index 0000000..4ee88a6
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
@@ -0,0 +1,65 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAndTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends AndTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+ g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+ g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends AndTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+ ComputerTestHelper.compute("g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+ ComputerTestHelper.compute("g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
new file mode 100644
index 0000000..01ae205
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
@@ -0,0 +1,59 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCoinTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends CoinTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+ g.V.coin(1.0f)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+ g.V.coin(0.0f)
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends CoinTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+ ComputerTestHelper.compute("g.V.coin(1.0f)", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+ ComputerTestHelper.compute("g.V.coin(0.0f)", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
new file mode 100644
index 0000000..042d4e0
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
@@ -0,0 +1,60 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCyclicPathTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends CyclicPathTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
+ g.V(v1Id).out('created').in('created').cyclicPath
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
+ g.V(v1Id).out('created').in('created').cyclicPath.path
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends CyclicPathTest {
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1) {
+ ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath", g);
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1) {
+ ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath().path()", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
new file mode 100644
index 0000000..036d18c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
@@ -0,0 +1,105 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.dedup
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyDedupTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends DedupTest {
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_dedup_name() {
+ g.V.both.dedup.name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+ g.V.both.has(T.label, 'software').dedup.by('lang').name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+ g.V().both().properties('name').order.by { a, b -> a.value() <=> b.value() }.dedup.value
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+ g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends DedupTest {
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_both_dedup_name() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_both_name_orderXa_bX_dedup() {
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+ ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))", g);
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_both_dedup_name() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
new file mode 100644
index 0000000..6dddba2
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
@@ -0,0 +1,114 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyExceptTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends ExceptTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+ g.V(v1Id).out.except(g.V(v2Id).next())
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+ g.V(v1Id).out.aggregate('x').out.except('x')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+ g.V(v1Id).out('created').in('created').except(g.V(v1Id).next()).values('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+ g.V.out.except(g.V.toList())
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+ g.V.out.except([])
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
+ final Object v1Id) {
+ g.V(v1Id).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+ g.V(v1Id).as('a').out('created').in('created').except('a').name
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends ExceptTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.except(g.V(${v2Id}).next())", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.except('x')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').except(g.V(${v1Id}).next()).values('name')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+ ComputerTestHelper.compute("g.V.out.except(g.V.toList())", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+ ComputerTestHelper.compute("g.V.out.except([])", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
+ final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').except('a').name", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
new file mode 100644
index 0000000..6b854eb
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
@@ -0,0 +1,179 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyFilterTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends FilterTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+ g.V.filter { false }
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+ g.V.filter { true }
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+ g.V.filter { it.property('lang').orElse("none") == 'java' }
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+ g.V(v1Id).filter { it.age > 30 }
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+ g.V(v1Id).out.filter { it.property('age').orElse(0) > 30 }
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+ g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+ g.E.filter { false }
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+ g.E.filter { true }
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends FilterTest {
+
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_filterXfalseX() {
+ super.g_V_filterXfalseX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_filterXtrueX() {
+ super.g_V_filterXtrueX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_filterXlang_eq_javaX() {
+ super.g_V_filterXlang_eq_javaX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_VX1X_filterXage_gt_30X() {
+ super.g_VX1X_filterXage_gt_30X();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_VX1X_out_filterXage_gt_30X() {
+ super.g_VX1X_out_filterXage_gt_30X();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+ super.g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_E_filterXfalseX() {
+ super.g_E_filterXfalseX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_E_filterXtrueX() {
+ super.g_E_filterXtrueX();
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+ ComputerTestHelper.compute("g.V.filter { false }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+ ComputerTestHelper.compute("g.V.filter { true }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+ ComputerTestHelper.compute("g.V.filter { it.property('lang').orElse('none') == 'java' }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).filter { it.age > 30 }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.filter { it.property('age').orElse(0) > 30 }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+ ComputerTestHelper.compute("g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+ ComputerTestHelper.compute("g.E.filter { false }", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+ ComputerTestHelper.compute("g.E.filter { true }", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
new file mode 100644
index 0000000..6e63e96
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
@@ -0,0 +1,68 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class GroovyHasNotTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends HasNotTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+ g.V(v1Id).hasNot(propertyKey)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+ g.V.hasNot(propertyKey)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+ return g.V().hasNot(__.out('created')).values('name');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends HasNotTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+ ComputerTestHelper.compute("g.V(${v1Id}).hasNot('${propertyKey}')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+ ComputerTestHelper.compute("g.V.hasNot('${propertyKey}')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+ ComputerTestHelper.compute("return g.V().hasNot(__.out('created')).values('name')", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
new file mode 100644
index 0000000..d4512cb
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
@@ -0,0 +1,191 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyHasTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends HasTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+ g.V.out('knows').has(__.out('created')).name
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+ g.V(v1Id).has(key)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+ g.V(v1Id).has('name', 'marko')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+ g.V.has('name', 'marko')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+ g.V.has('name', 'blah')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+ g.V.has('blah')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+ g.V(v1Id).has('age', Compare.gt, 30)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+ g.V(v1Id).out.hasId(v2Id)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+ g.V.has('age', Compare.gt, 30)
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+ g.E(e7Id).hasLabel('knows')
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+ g.E.hasLabel('knows')
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+ g.E.hasLabel('uses', 'traverses')
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+ g.V.hasLabel("person", "software", 'blah');
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+ g.V.has('person', 'name', 'marko').age;
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+ g.V(v1Id).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends HasTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+ ComputerTestHelper.compute("g.V.out('knows').has(__.out('created')).name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+ ComputerTestHelper.compute("g.V(${v1Id}).has('${key}')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).has('name', 'marko')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+ ComputerTestHelper.compute("g.V.has('name', 'marko')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+ ComputerTestHelper.compute(" g.V.has('name', 'blah')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+ ComputerTestHelper.compute("g.V.has('blah')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).has('age', Compare.gt, 30)", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+ ComputerTestHelper.compute(" g.V(${v1Id}).out.hasId(${v2Id})", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+ ComputerTestHelper.compute("g.V.has('age', Compare.gt, 30)", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+ ComputerTestHelper.compute(" g.E(${e7Id}).hasLabel('knows')", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+ ComputerTestHelper.compute("g.E.hasLabel('knows')", g);
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+ ComputerTestHelper.compute("g.E.hasLabel('uses', 'traverses')", g);
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+ ComputerTestHelper.compute("g.V.hasLabel('person', 'software', 'blah')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+ ComputerTestHelper.compute("g.V.has('person', 'name', 'marko').age", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
new file mode 100644
index 0000000..6e57af9
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
@@ -0,0 +1,90 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyIsTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends IsTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+ return g.V().values('age').is(32);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+ return g.V().values('age').is(Compare.lte, 30);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+ return g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+ return g.V().has(__.in('created').count().is(1l)).values('name');
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+ return g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends IsTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+ ComputerTestHelper.compute("g.V().values('age').is(32)", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+ ComputerTestHelper.compute("g.V().values('age').is(Compare.lte, 30)", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+ ComputerTestHelper.compute("g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34)", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+ ComputerTestHelper.compute("g.V().has(__.in('created').count().is(1l)).values('name')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+ ComputerTestHelper.compute("g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name')", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
new file mode 100644
index 0000000..7ce8fec
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
@@ -0,0 +1,65 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyOrTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends OrTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+ g.V.or(has('age', gt, 27), outE().count.gte(2l)).name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+ g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends OrTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+ ComputerTestHelper.compute("g.V.or(has('age', gt, 27), outE().count.gte(2l)).name", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+ ComputerTestHelper.compute("g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
new file mode 100644
index 0000000..a7d4cde
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
@@ -0,0 +1,196 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRangeTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends RangeTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
+ g.V(v1Id).out.limit(2)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+ g.V.local(__.outE.limit(3)).inV.limit(3)
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
+ g.V(v1Id).out('knows').outE('created')[0].inV()
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
+ g.V(v1Id).out('knows').out('created')[0]
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
+ g.V(v1Id).out('created').in('created')[1..3]
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
+ g.V(v1Id).out('created').inE('created')[1..3].outV
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+ g.V().repeat(__.both).times(3)[5..11];
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+ g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().limit(Scope.local, 1)).as('w').select().by('name').by()
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+ g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().range(Scope.local, 1, 3)).as('w').select().by('name').by()
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends RangeTest {
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_out_limitX2X() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+ // TODO: the traversal should work in computer mode, but throws a ClassCastException
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
new file mode 100644
index 0000000..0c271de
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
@@ -0,0 +1,67 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRetainTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends RetainTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+ g.V(v1Id).out.retain(g.V(v2Id).next())
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+ g.V(v1Id).out.aggregate('x').out.retain('x')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+ g.V(v1Id).as('a').out('created').in('created').retain('a').name
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends RetainTest {
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.retain(g.V($v2Id).next())", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.retain('x')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').retain('a').name", g);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
new file mode 100644
index 0000000..8cdb4fc
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
@@ -0,0 +1,113 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static __.bothE
+import static __.sample
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySampleTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SampleTest {
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_sampleX1X() {
+ g.E.sample(1)
+ }
+
+ @Override
+ public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+ g.E.sample(2).by('weight')
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+ g.V.local(__.outE.sample(1).by('weight'))
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+ g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
+ g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SampleTest {
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_E_sampleX1X() {
+ // TODO: makes no sense when its global
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_E_sampleX2X_byXweightX() {
+ // TODO: makes no sense when its global
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+ ComputerTestHelper.compute("g.V.local(__.outE.sample(1).by('weight'))", g)
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+ ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))", g)
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
+ ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))", g)
+ }
+
+ @Override
+ Traversal<Edge, Edge> get_g_E_sampleX1X() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
new file mode 100644
index 0000000..b9789fe
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
@@ -0,0 +1,61 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySimplePathTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SimplePathTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+ g.V(v1Id).out('created').in('created').simplePath
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+ return g.V.repeat(__.both.simplePath).times(3).path()
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SimplePathTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').simplePath", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+ ComputerTestHelper.compute("g.V.repeat(__.both.simplePath).times(3).path()", g);
+ }
+ }
+}
[15/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
new file mode 100644
index 0000000..b248f40
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
@@ -0,0 +1,95 @@
+/*
+ * 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.step.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyWhereTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends WhereTest {
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+ g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b');
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+ g.V.has('age').as('a').out.in.has('age').as('b').select().where('a',Compare.neq, 'b');
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+ g.V.has('age').as('a').out.in.has('age').as('b').select().where(__.as('b').has('name', 'marko'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+ g.V().has('age').as('a').out.in.has('age').as('b').select().where(__.as('a').out('knows').as('b'));
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends WhereTest {
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+ ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+ ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.neq, 'b')", g);
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
new file mode 100644
index 0000000..b1fd7cd
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
@@ -0,0 +1,51 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAddEdgeTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends AddEdgeTest {
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
+ g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a')
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(
+ final Object v1Id) {
+ g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a', 'weight', 2)
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
+ g.V.addOutE('existsWith', g.V, 'time', 'now');
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
new file mode 100644
index 0000000..1fdf0ae
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
@@ -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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAddVertexTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends AddVertexTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
+ g.V.addV(T.label, 'animal', 'age', 0);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+ g.addV(T.label, 'person', 'name', 'stephen');
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
new file mode 100644
index 0000000..620d257
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
@@ -0,0 +1,146 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyBackTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends BackTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+ g.V(v1Id).as('here').out.back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+ g.V(v4Id).out.as('here').has('lang', 'java').back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
+ final Object v4Id) {
+ g.V(v4Id).out.as('here').has('lang', 'java').back('here').name
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+ g.V(v1Id).outE.as('here').inV.has('name', 'vadas').back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ g.V(v1Id).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ g.V(v1Id).outE('knows').as('here').has('weight', 1.0d).inV.has('name', 'josh').back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ g.V(v1Id).outE("knows").as('here').has('weight', 1.0d).as('fake').inV.has("name", 'josh').back('here')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+ g.V().as("here").out.name.back("here");
+ }
+
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+ g.V.out('created')
+ .union(__.as('project').in('created').has('name', 'marko').back('project'),
+ __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends BackTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).as('here').out.back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
+ final Object v4Id) {
+ ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here').name", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE.as('here').inV.has('name', 'vadas').back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).inV.has('name','josh').back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
+ final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).as('fake').inV.has('name','josh').back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+ ComputerTestHelper.compute("g.V().as('here').out.name.back('here')", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+ ComputerTestHelper.compute("""
+ g.V.out('created')
+ .union(__.as('project').in('created').has('name', 'marko').back('project'),
+ __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
+ """, g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
new file mode 100644
index 0000000..815ac01
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
@@ -0,0 +1,103 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+
+/**
+ *
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyCoalesceTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends CoalesceTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+ g.V().coalesce(out('foo'), out('bar'));
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+ g.V(v1Id).coalesce(out('knows'), out('created')).values('name');
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+ g.V(v1Id).coalesce(out('created'), out('knows')).values('name');
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+ g.V.coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name');
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+ g.V.coalesce(outE('knows'), outE('created')).otherV.path.by('name').by(T.label);
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends CoalesceTest {
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+ ComputerTestHelper.compute("g.V().coalesce(out('foo'), out('bar'))", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('knows'), out('created')).values('name')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('created'), out('knows')).values('name')", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+ ComputerTestHelper.compute("g.V().coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name')", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
new file mode 100644
index 0000000..c50605c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
@@ -0,0 +1,117 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCountTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends CountTest {
+ @Override
+ public Traversal<Vertex, Long> get_g_V_count() {
+ g.V.count()
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_out_count() {
+ g.V.out.count
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_both_both_count() {
+ g.V.both.both.count()
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+ g.V().repeat(__.out).times(3).count()
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+ g.V.repeat(__.out).times(8).count()
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+ g.V.has('no').count
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+ return g.V.fold.count(Scope.local);
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends CountTest {
+ @Override
+ public Traversal<Vertex, Long> get_g_V_count() {
+ ComputerTestHelper.compute("g.V.count()", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_out_count() {
+ ComputerTestHelper.compute("g.V.out.count", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_both_both_count() {
+ ComputerTestHelper.compute("g.V.both.both.count()", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+ ComputerTestHelper.compute("g.V().repeat(__.out).times(3).count()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+ ComputerTestHelper.compute("g.V.repeat(__.out).times(8).count()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+ ComputerTestHelper.compute("g.V.has('no').count", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_fold_countXlocalX() {
+ }
+
+ @Override
+ Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
new file mode 100644
index 0000000..6b8e9c7
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
@@ -0,0 +1,76 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyFoldTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends FoldTest {
+ @Override
+ public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+ g.V.fold
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+ g.V.fold.unfold
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+ g.V.age.fold(0) { seed, age -> seed + age };
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends FoldTest {
+ @Override
+ public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+ ComputerTestHelper.compute("g.V.fold", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_fold_unfold() {
+ // Does not work in OLAP cause fold() is not an endstep.
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+ ComputerTestHelper.compute("g.V.age.fold(0) { seed, age -> seed + age }", g);
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
new file mode 100644
index 0000000..8bde4a6
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
@@ -0,0 +1,129 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroovyMapTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends MapTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+ g.V(v1Id).map { v -> v.name };
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+ g.V(v1Id).outE.label.map { l -> l.length() };
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+ g.V(v1Id).out.map { v -> v.name }.map { n -> n.length() };
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+ g.V.as('a').out.map { v -> v.path('a').name };
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+ g.V().as('a').out.out().map { v -> v.path('a').name + v.name };
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends MapTest {
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_VX1X_mapXnameX() {
+ super.g_VX1X_mapXnameX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_VX1X_outE_label_mapXlengthX() {
+ super.g_VX1X_outE_label_mapXlengthX();
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_VX1X_out_mapXnameX_mapXlengthX() {
+ super.g_VX1X_out_mapXnameX_mapXlengthX();
+ }
+
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).map { v -> v.name }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).outE.label.map { l -> l.length() }", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).out.map { v -> v.name }.map { n -> n.length() }", g);
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_asXaX_out_mapXa_nameX() {
+ // TODO: Doesn't work for graph computer because sideEffects are not accessible
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
+ // TODO: Doesn't work for graph computer because sideEffects are not accessible
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
new file mode 100644
index 0000000..c7d48b3
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
@@ -0,0 +1,186 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMatchTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends MatchTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
+ g.V().match('a', __.as('a').out().as('b'));
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
+ g.V().match('a', __.as('a').out().as('b')).select('b').by(T.id)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
+ g.V().match('a',
+ __.as('a').out('knows').as('b'),
+ __.as('b').out('created').as('c'))
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
+ return g.V().match('a',
+ __.as('a').out('knows').as('b'),
+ __.as('a').out('created').as('c'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
+ return g.V().match('d',
+ __.as('d').in('knows').as('a'),
+ __.as('d').has('name', 'vadas'),
+ __.as('a').out('knows').as('b'),
+ __.as('b').out('created').as('c'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
+ g.V().match('a',
+ __.as('a').out('created').as('b'),
+ __.as('a').repeat(__.out).times(2).as('b')).select('a', 'b').by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
+ g.V().match('a',
+ __.as('a').out('created').has('name', 'lop').as('b'),
+ __.as('b').in('created').has('age', 29).as('c'),
+ __.as('c').repeat(__.out).times(2)).select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
+ g.V().out().out().match('a',
+ __.as('a').in('created').as('b'),
+ __.as('b').in('knows').as('c')).select('c').out('created').name
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
+ g.V().match('a',
+ __.as('a').out('created').as('b'),
+ __.as('b').in('created').as('a'))
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
+ return g.V().match('a', __.as('a').out('knows').as('b'),
+ __.as('c').out('knows').as('b'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
+ g.V().match('a',
+ __.as('a').out('knows').as('b'),
+ __.as('b').out('created').has('name', 'lop'),
+ __.as('b').match('a1',
+ __.as('a1').out('created').as('b1'),
+ __.as('b1').in('created').as('c1')).select('c1').as('c')).select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
+ g.V().match('a',
+ __.as('a').has('name', 'Garcia'),
+ __.as('a').in('writtenBy').as('b'),
+ __.as('a').in('sungBy').as('b'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
+ g.V().match('a',
+ __.as('a').in('sungBy').as('b'),
+ __.as('a').in('sungBy').as('c'),
+ __.as('b').out('writtenBy').as('d'),
+ __.as('c').out('writtenBy').as('e'),
+ __.as('d').has('name', 'George_Harrison'),
+ __.as('e').has('name', 'Bob_Marley'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
+ g.V().match('a',
+ __.as('a').in('sungBy').as('b'),
+ __.as('a').in('writtenBy').as('c'),
+ __.as('b').out('writtenBy').as('d'),
+ __.as('c').out('sungBy').as('d'),
+ __.as('d').has('name', 'Garcia'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
+ return g.V().match('a',
+ __.as('a').in('sungBy').as('b'),
+ __.as('a').in('writtenBy').as('c'),
+ __.as('b').out('writtenBy').as('d'))
+ .where(__.as('c').out('sungBy').as('d'))
+ .where(__.as('d').has('name', 'Garcia'));
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
+ g.V().match("a",
+ __.as("a").out("created").has("name", "lop").as("b"),
+ __.as("b").in("created").has("age", 29).as("c"))
+ .where(__.as("c").repeat(__.out()).times(2))
+ .select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
+ g.V().match('a',
+ __.as('a').out('created').as('b'),
+ __.as('b').in('created').as('c'))
+ .where('a', Compare.neq, 'c')
+ .select('a', 'c').by('name')
+ }
+
+ /*@Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
+ g.V.match('a',
+ __.as('a').out('created').as('b'),
+ __.as('c').out('created').as('b')).select { it.value('name') }
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
+ g.V.out.out.match('a',
+ __.as('b').out('created').as('a'),
+ __.as('c').out('knows').as('b')).select('c').out('knows').name
+ }*/
+ }
+
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
new file mode 100644
index 0000000..7cef641
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static __.bothE
+import static __.max
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMaxTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends MaxTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_max() {
+ g.V.age.max
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+ g.V.repeat(__.both).times(5).age.max
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
+ g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends MaxTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_max() {
+ ComputerTestHelper.compute("g.V.age.max", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+ ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.max", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
+ ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
new file mode 100644
index 0000000..5a32f96
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.mean
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMeanTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends MeanTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_age_mean() {
+ g.V.age.mean
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
+ g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends MeanTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_age_mean() {
+ ComputerTestHelper.compute("g.V.age.mean", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
+ ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))", g)
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
new file mode 100644
index 0000000..7746fdf
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static __.bothE
+import static __.min
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMinTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends MinTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_min() {
+ g.V.age.min
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+ g.V.repeat(__.both).times(5).age.min
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
+ g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends MinTest {
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_age_min() {
+ ComputerTestHelper.compute("g.V.age.min", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+ ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.min", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
+ ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))", g)
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
new file mode 100644
index 0000000..6471725
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
@@ -0,0 +1,188 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyOrderTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends OrderTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order() {
+ g.V().name.order()
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+ g.V.name.order.by { a, b -> a[1] <=> b[1] }.by { a, b -> b[2] <=> a[2] }
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+ g.V.order.by('name', Order.incr).name
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+ g.V.order.by('name', Order.incr).name
+ }
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+ g.V.outE.order.by('weight', Order.decr).weight
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+ return g.V.order.by('name', { a, b -> a[1].compareTo(b[1]) }).by('name', { a, b -> b[2].compareTo(a[2]) }).name;
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+ g.V.as('a').out('created').as('b').order.by(Order.shuffle).select();
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
+ final Object v1Id) {
+ g.V(v1Id).map {
+ final Map map = [:];
+ map[1] = it.age;
+ map[2] = it.age * 2;
+ map[3] = it.age * 3;
+ map[4] = it.age;
+ return map;
+ }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+ g.V.order.by(__.outE.count, Order.decr)
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends OrderTest {
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order() {
+ ComputerTestHelper.compute("g.V().name.order()", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+ ComputerTestHelper.compute("g.V.name.order.by { a, b -> a[1] <=> b[1] }.by{ a, b -> b[2] <=> a[2] }", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_order_byXname_incrX_name() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_outE_order_byXweight_decrX_weight() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+ ComputerTestHelper.compute("g.V.as('a').out('created').as('b').order.by(Order.shuffle).select()", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
+ final Object v1Id) {
+ ComputerTestHelper.compute("""
+ g.V(${v1Id}).map {
+ final Map map = [:];
+ map[1] = it.age;
+ map[2] = it.age * 2;
+ map[3] = it.age * 3;
+ map[4] = it.age;
+ return map;
+ }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+ """, g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_order_byXoutE_count__decrX() {
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Test
+ @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+ @Override
+ public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
+ super.g_V_name_order_byXa1_b1X_byXb2_a2X();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
new file mode 100644
index 0000000..62fae7c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
@@ -0,0 +1,113 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyPathTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends PathTest {
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+ g.V(v1Id).identity.name.path
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
+ g.V(v1Id).out.path.by('age').by('name');
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+ g.V.repeat(__.out).times(2).path.by.by('name').by('lang');
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+ g.V.out.out.path.by('name').by('age');
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+ g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path;
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends PathTest {
+
+ @Override
+ public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).identity.name.path", g);
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_out_path_byXageX_byXnameX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_out_out_path_byXnameX_byXageX() {
+ }
+
+ @Override
+ public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+ ComputerTestHelper.compute("g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path", g);
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
new file mode 100644
index 0000000..d9b1d9f
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
@@ -0,0 +1,60 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyPropertiesTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends PropertiesTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+ g.V.has('age').properties('name', 'age').value;
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+ g.V.has('age').properties('age', 'name').value;
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends PropertiesTest {
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+ ComputerTestHelper.compute("g.V.has('age').properties('name', 'age').value", g);
+ }
+
+ @Override
+ public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+ ComputerTestHelper.compute("g.V.has('age').properties('age', 'name').value", g);
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
new file mode 100644
index 0000000..a7d3894
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
@@ -0,0 +1,206 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static __.values
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySelectTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SelectTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+ g.V(v1Id).as('a').out('knows').as('b').select()
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(
+ final Object v1Id) {
+ g.V(v1Id).as('a').out('knows').as('b').select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+ g.V(v1Id).as('a').out('knows').as('b').select('a')
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(
+ final Object v1Id) {
+ g.V(v1Id).as('a').out('knows').as('b').select('a').by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+ g.V.as('a').out.as('b').select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
+ g.V.as('a').out.aggregate('x').as('b').select.by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+ g.V().as('a').name.order().as('b').select.by('name').by
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+ g.V.has('name', 'gremlin').inE('uses').order.by('skill', Order.incr).as('a').outV.as('b').select.by('skill').by('name')
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+ return g.V.has(values('name').is('marko')).as('a').select
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+ return g.V().label().groupCount().as('x').select()
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+ return g.V().hasLabel('person').as('person').local(__.bothE().label().groupCount()).as('relations').select().by('name').by()
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SelectTest {
+
+ @Override
+ public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select()", g);
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
+ }
+
+ @Override
+ public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+ ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select('a')", g);
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_asXaX_out_asXbX_select_byXnameX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+ ComputerTestHelper.compute("g.V.has(values('name').is('marko')).as('a').select", g)
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ public void g_V_label_groupCount_asXxX_select() {
+ }
+
+ @Override
+ @Test
+ @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+ void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(Object v1Id) {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+
+ @Override
+ Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+ // override with nothing until the test itself is supported
+ return null
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
new file mode 100644
index 0000000..9c72f6c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sum
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovySumTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends SumTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+ g.V().values('age').sum()
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
+ g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends SumTest {
+
+ @Override
+ public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+ ComputerTestHelper.compute("g.V.age.sum", g)
+ }
+
+ @Override
+ public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
+ ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))", g)
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
new file mode 100644
index 0000000..9901805
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.step.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyUnfoldTest {
+
+ @UseEngine(TraversalEngine.Type.STANDARD)
+ public static class StandardTraversals extends UnfoldTest {
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+ g.V.local(__.outE.fold).unfold
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+ g.V.valueMap.unfold.map { it.key }
+ }
+ }
+
+ @UseEngine(TraversalEngine.Type.COMPUTER)
+ public static class ComputerTraversals extends UnfoldTest {
+
+ @Override
+ public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+ ComputerTestHelper.compute("g.V.local(__.outE.fold).unfold", g)
+ }
+
+ @Override
+ public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+ ComputerTestHelper.compute("g.V.valueMap.unfold.map { it.key }", g)
+ }
+ }
+
+
+}
[12/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
deleted file mode 100644
index 76904f6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
+++ /dev/null
@@ -1,146 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.dedup;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class DedupTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_both_dedup_name();
-
- public abstract Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
-
- public abstract Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup();
-
- public abstract Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_both_dedup_name() {
- final Traversal<Vertex, String> traversal = get_g_V_both_dedup_name();
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(6, names.size());
- assertTrue(names.contains("marko"));
- assertTrue(names.contains("vadas"));
- assertTrue(names.contains("lop"));
- assertTrue(names.contains("josh"));
- assertTrue(names.contains("ripple"));
- assertTrue(names.contains("peter"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
- final Traversal<Vertex, String> traversal = get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(1, names.size());
- assertTrue(names.contains("lop") || names.contains("ripple"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_both_name_orderXa_bX_dedup() {
- final Traversal<Vertex, String> traversal = get_g_V_both_name_orderXa_bX_dedup();
- printTraversalForm(traversal);
- final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(6, names.size());
- assertEquals("josh", names.get(0));
- assertEquals("lop", names.get(1));
- assertEquals("marko", names.get(2));
- assertEquals("peter", names.get(3));
- assertEquals("ripple", names.get(4));
- assertEquals("vadas", names.get(5));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
- final Traversal<Vertex, Map<String, Set<Double>>> traversal =
- get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Set<Double>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(3, map.get("software").size());
- assertEquals(4, map.get("person").size());
- assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 1.0)), map.get("software"));
- assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 0.5, 1.0)), map.get("person"));
- }
-
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends DedupTest {
- @Override
- public Traversal<Vertex, String> get_g_V_both_dedup_name() {
- return g.V().both().dedup().values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
- return g.V().both().has(T.label, "software").dedup().by("lang").values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
- return g.V().both().<String>properties("name").order().by((a, b) -> a.value().compareTo(b.value())).dedup().value();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
- return g.V().<String, Set<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(dedup(Scope.local));
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
deleted file mode 100644
index 8ff327f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
+++ /dev/null
@@ -1,187 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class ExceptTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_exceptXX();
-
- public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_exceptXg_v2X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_exceptXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("lop"));
- }
- assertEquals(2, counter);
- assertEquals(2, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_aggregateXxX_out_exceptXxX() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_exceptXxX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals("ripple", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name() {
- Traversal<Vertex, String> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- List<String> names = Arrays.asList(traversal.next(), traversal.next());
- assertFalse(traversal.hasNext());
- assertEquals(2, names.size());
- assertTrue(names.contains("peter"));
- assertTrue(names.contains("josh"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_exceptXg_V_toListX() {
- Traversal<Vertex, Vertex> traversal = get_g_V_exceptXg_V_toListX();
- printTraversalForm(traversal);
- final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(0, vertices.size());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_exceptXX() {
- Traversal<Vertex, Vertex> traversal = get_g_V_exceptXX();
- printTraversalForm(traversal);
- final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(6, vertices.size());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path() {
- Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(4, paths.size());
- assertEquals(1, paths.stream().filter(path -> path.size() == 3).count());
- assertEquals(2, paths.stream().filter(path -> path.size() == 5).count());
- assertEquals(1, paths.stream().filter(path -> path.size() == 7).count());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- checkResults(Arrays.asList("peter", "josh"), traversal);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class StandardTest extends ExceptTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
- return g.V(v1Id).out().except(g.V(v2Id).next());
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
- return g.V(v1Id).out().aggregate("x").out().except("x");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
- return g.V(v1Id).out("created").in("created").except(g.V(v1Id).next()).values("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
- return g.V().except(g.V().toList());
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
- return g.V().except(Collections.emptyList());
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
- return g.V(v1Id).repeat(bothE("created").except("e").aggregate("e").otherV()).emit().path();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
- return g.V(v1Id).as("a").out("created").in("created").except("a").values("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
deleted file mode 100644
index e4610de..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
+++ /dev/null
@@ -1,222 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class FilterTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_V_filterXfalseX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_filterXtrueX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
-
- public abstract Traversal<Edge, Edge> get_g_E_filterXfalseX();
-
- public abstract Traversal<Edge, Edge> get_g_E_filterXtrueX();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_filterXfalseX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_filterXfalseX();
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_filterXtrueX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_filterXtrueX();
- printTraversalForm(traversal);
- int counter = 0;
- final Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- vertices.add(traversal.next());
- }
- assertEquals(6, counter);
- assertEquals(6, vertices.size());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_filterXlang_eq_javaX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_filterXlang_eq_javaX();
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("ripple") ||
- vertex.value("name").equals("lop"));
- }
- assertEquals(2, counter);
- assertEquals(2, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_filterXage_gt_30X() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("josh"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_filterXage_gt_30X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_filterXage_gt_30X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
- printTraversalForm(traversal);
- int counter = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- vertices.add(vertex);
- assertTrue(vertex.value("name").equals("marko") ||
- vertex.value("name").equals("peter"));
- }
- assertEquals(counter, 2);
- assertEquals(vertices.size(), 2);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_E_filterXfalseX() {
- final Traversal<Edge, Edge> traversal = get_g_E_filterXfalseX();
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_E_filterXtrueX() {
- final Traversal<Edge, Edge> traversal = get_g_E_filterXtrueX();
- printTraversalForm(traversal);
- int counter = 0;
- final Set<Edge> edges = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- edges.add(traversal.next());
- }
- assertEquals(6, counter);
- assertEquals(6, edges.size());
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends FilterTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
- return g.V().filter(v -> false);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
- return g.V().filter(v -> true);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
- return g.V().filter(v -> v.get().<String>property("lang").orElse("none").equals("java"));
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
- return g.V(v1Id).filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
- return g.V(v1Id).out().filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
- return g.V().filter(v -> {
- final String name = v.get().value("name");
- return name.startsWith("m") || name.startsWith("p");
- });
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
- return g.E().filter(e -> false);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
- return g.E().filter(e -> true);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
deleted file mode 100644
index 65eb52f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
+++ /dev/null
@@ -1,98 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class HasNotTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey);
-
- public abstract Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_hasNotXprop() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "circumference");
- printTraversalForm(traversal);
- assertEquals("marko", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "name");
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasNotXprop() {
- Traversal<Vertex, Vertex> traversal = get_g_V_hasNotXprop("circumference");
- printTraversalForm(traversal);
- final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(6, list.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasNotXoutXcreatedXX() {
- Traversal<Vertex, String> traversal = get_g_V_hasNotXoutXcreatedXX();
- checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends HasNotTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
- return g.V(v1Id).hasNot(propertyKey);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
- return g.V().hasNot(propertyKey);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
- return g.V().hasNot(__.out("created")).values("name");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
deleted file mode 100644
index f7165da..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
+++ /dev/null
@@ -1,325 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-import static org.junit.Assume.assumeTrue;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class HasTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_blahX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasXblahX();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X();
-
- public abstract Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id);
-
- public abstract Traversal<Edge, Edge> get_g_E_hasLabelXknowsX();
-
- public abstract Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX();
-
- public abstract Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_outXknowsX_hasXoutXcreatedXX_valuesXnameX() {
- Traversal<Vertex, String> traversal = get_g_V_outXknowsX_hasXoutXcreatedXX_name();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("josh"), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_hasXkeyX() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "name");
- printTraversalForm(traversal);
- assertEquals("marko", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- //
- traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "circumference");
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_hasXname_markoX() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals("marko", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("vadas"));
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXname_markoX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX();
- printTraversalForm(traversal);
- assertEquals("marko", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXname_blahX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_blahX();
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXage_gt_30X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_hasXage_gt_30X();
- printTraversalForm(traversal);
- final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
- assertEquals(2, list.size());
- for (final Element v : list) {
- assertTrue(v.<Integer>value("age") > 30);
- }
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_hasXage_gt_30X() {
- Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("josh"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_hasXid_2X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_hasIdX2X(convertToVertexId("marko"), convertToVertexId("vadas"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals(convertToVertexId("vadas"), traversal.next().id());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXblahX() {
- assumeTrue(graphMeetsTestRequirements());
- final Traversal<Vertex, Vertex> traversal = get_g_V_hasXblahX();
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_EX7X_hasXlabelXknowsX() {
- //System.out.println(convertToEdgeId("marko", "knows", "vadas"));
- Traversal<Edge, Edge> traversal = get_g_EX7X_hasLabelXknowsX(convertToEdgeId("marko", "knows", "vadas"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals("knows", traversal.next().label());
- }
- assertEquals(1, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_E_hasXlabelXknowsX() {
- final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXknowsX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals("knows", traversal.next().label());
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(CREW)
- public void g_E_hasXlabelXuses_traversesX() {
- final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXuses_traversesX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String label = traversal.next().label();
- assertTrue(label.equals("uses") || label.equals("traverses"));
- }
- assertEquals(9, counter);
- }
-
- @Test
- @LoadGraphWith(CREW)
- public void g_V_hasXlabelXperson_software_blahX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_hasLabelXperson_software_blahX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String label = traversal.next().label();
- assertTrue(label.equals("software") || label.equals("person"));
- }
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXperson_name_markoX_age() {
- final Traversal<Vertex, Integer> traversal = get_g_V_hasXperson_name_markoX_age();
- printTraversalForm(traversal);
- assertEquals(29, traversal.next().intValue());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outE_hasXweight_inside_0_06X_inV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_hasXweight_inside_0_06X_inV(convertToVertexId("marko"));
- printTraversalForm(traversal);
- while (traversal.hasNext()) {
- Vertex vertex = traversal.next();
- assertTrue(vertex.value("name").equals("vadas") || vertex.value("name").equals("lop"));
- }
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends HasTest {
- @Override
- public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
- return g.V().out("knows").has(out("created")).values("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
- return g.V(v1Id).has(key);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
- return g.V(v1Id).has("name", "marko");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
- return g.V().has("name", "marko");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
- return g.V().has("name", "blah");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
- return g.V().has("blah");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
- return g.V(v1Id).has("age", Compare.gt, 30);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
- return g.V(v1Id).out().hasId(v2Id);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
- return g.V().has("age", Compare.gt, 30);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
- return g.E(e7Id).hasLabel("knows");
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
- return g.E().hasLabel("knows");
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
- return g.E().hasLabel("uses", "traverses");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
- return g.V().hasLabel("person", "software", "blah");
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
- return g.V().has("person", "name", "marko").values("age");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
- return g.V(v1Id).outE().has("weight", Compare.inside, Arrays.asList(0.0d, 0.6d)).inV();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
deleted file mode 100644
index 065f1f7..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
+++ /dev/null
@@ -1,125 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class IsTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X();
-
- public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X();
-
- public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
-
- public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
-
- public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valuesXageX_isX32X() {
- Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isX32X();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals(Integer.valueOf(32), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valuesXageX_isXlte_30X() {
- Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXlte_30X();
- printTraversalForm(traversal);
- checkResults(Arrays.asList(27, 29), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_valuesXageX_isXgte_29X_isXlt_34X() {
- Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
- printTraversalForm(traversal);
- checkResults(Arrays.asList(29, 32), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
- Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals("ripple", traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
- Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals("lop", traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends IsTest {
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
- return g.V().<Integer>values("age").is(32);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
- return g.V().<Integer>values("age").is(Compare.lte, 30);
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
- return g.V().<Integer>values("age").is(Compare.gte, 29).is(Compare.lt, 34);
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
- return g.V().has(in("created").count().is(1l)).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
- return g.V().has(in("created").count().is(Compare.gte, 2l)).values("name");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
deleted file mode 100644
index 0038ddd..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
+++ /dev/null
@@ -1,77 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class OrTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
-
- public abstract Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
- final Traversal<Vertex, String> traversal = get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
- final Traversal<Vertex, String> traversal = get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "ripple", "lop", "peter"), traversal);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends OrTest {
- @Override
- public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
- return g.V().or(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
- return g.V().or(outE("knows"), has(T.label, "software").or().has("age", Compare.gte, 35)).values("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
deleted file mode 100644
index 9726b62..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
+++ /dev/null
@@ -1,265 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class RangeTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X();
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_limitX2X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_limitX2X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- traversal.next();
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_localXoutE_limitX1X_inVX_limitX3X();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- traversal.next();
- }
- assertEquals(3, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next().value("name");
- assertTrue(name.equals("lop") || name.equals("ripple"));
- }
- assertEquals(1, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next().value("name");
- assertTrue(name.equals("lop") || name.equals("ripple"));
- }
- assertEquals(1, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next().value("name");
- assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next().value("name");
- assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- traversal.next();
- counter++;
- }
- assertEquals(6, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @Ignore("This should not work cause fold kills the path history")
- public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- final Map<String, Object> map = traversal.next();
- final List<Double> weights = (List<Double>) map.get("w");
- if (map.get("s").equals("lop")) {
- assertEquals(1, weights.size());
- assertTrue(Arrays.asList(0.4, 0.2).contains(weights.get(0)));
- } else if (map.get("s").equals("ripple")) {
- assertEquals(1, weights.size());
- assertEquals(1.0, weights.get(0), 0.0);
- } else {
- assertTrue(false);
- }
- counter++;
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @Ignore("This should not work cause fold kills the path history")
- public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- final Map<String, Object> map = traversal.next();
- final List<Double> weights = (List<Double>) map.get("w");
- if (map.get("s").equals("lop")) {
- assertEquals(2, weights.size());
- assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(0)));
- assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(1)));
- assertNotEquals(weights.get(0), weights.get(1));
- } else if (map.get("s").equals("ripple")) {
- assertEquals(0, weights.size());
- } else {
- assertTrue(false);
- }
- counter++;
- }
- assertEquals(2, counter);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends RangeTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
- return g.V(v1Id).out().limit(2);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
- return g.V().local(outE().limit(1)).inV().limit(3);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
- return g.V(v1Id).out("knows").outE("created").range(0, 1).inV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
- return g.V(v1Id).out("knows").out("created").range(0, 1);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
- return g.V(v1Id).out("created").in("created").range(1, 3);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
- return g.V(v1Id).out("created").inE("created").range(1, 3).outV();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
- return g.V().repeat(both()).times(3).range(5, 11);
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
- return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().limit(Scope.local, 1)).as("w").select().by("name").by();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
- return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().range(Scope.local, 1, 3)).as("w").select().by("name").by();
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
deleted file mode 100644
index edbb91e..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
+++ /dev/null
@@ -1,94 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class RetainTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id);
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_retainXg_v2X() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_retainXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
- printTraversalForm(traversal);
- assertEquals("vadas", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_out_aggregateXxX_out_retainXxX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_retainXxX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals("lop", traversal.next().<String>value("name"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals("marko", traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends RetainTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
- return g.V(v1Id).out().retain(g.V(v2Id).next());
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
- return g.V(v1Id).out().aggregate("x").out().retain("x");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
- return g.V(v1Id).as("a").out("created").in("created").retain("a").values("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
deleted file mode 100644
index df65486..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
+++ /dev/null
@@ -1,148 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SampleTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Edge, Edge> get_g_E_sampleX1X();
-
- public abstract Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX();
-
- public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX();
-
- public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
-
- public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_E_sampleX1X() {
- final Traversal<Edge, Edge> traversal = get_g_E_sampleX1X();
- assertTrue(traversal.hasNext());
- traversal.next();
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_E_sampleX2X_byXweightX() {
- final Traversal<Edge, Edge> traversal = get_g_E_sampleX2X_byXweightX();
- assertTrue(traversal.hasNext());
- traversal.next();
- assertTrue(traversal.hasNext());
- traversal.next();
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_localXoutE_sampleX1X_byXweightXX() {
- final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_sampleX1X_byXweightXX();
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- traversal.next();
- }
- assertEquals(3, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
- final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
- get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Collection<Double>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(2, map.get("software").size());
- assertEquals(2, map.get("person").size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
- final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
- get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Collection<Double>> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(4, map.get("software").size());
- assertEquals(5, map.get("person").size());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SampleTest {
- @Override
- public Traversal<Edge, Edge> get_g_E_sampleX1X() {
- return g.E().sample(1);
- }
-
- @Override
- public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
- return g.E().sample(2).by("weight");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
- return g.V().local(outE().sample(1).by("weight"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
- return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 2));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
- return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 5));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
deleted file mode 100644
index 38a629d..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
+++ /dev/null
@@ -1,86 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SimplePathTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id);
-
- public abstract Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXcreatedX_inXcreatedX_simplePath() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("peter"));
- }
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXboth_simplePathX_timesX3X_path() {
- final Traversal<Vertex, Path> traversal = get_g_V_repeatXboth_simplePathX_timesX3X_path();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertTrue(traversal.next().isSimple());
- }
- assertEquals(18, counter);
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends SimplePathTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
- return g.V(v1Id).out("created").in("created").simplePath();
- }
-
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
- return g.V().repeat(both().simplePath()).times(3).path();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
deleted file mode 100644
index 89ab5d1..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
+++ /dev/null
@@ -1,162 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class WhereTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Object> map = traversal.next();
- assertEquals(2, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.containsKey("b"));
- assertEquals(map.get("a"), map.get("b"));
- }
- assertEquals(6, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_b_neqX() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Object> map = traversal.next();
- assertEquals(2, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.containsKey("b"));
- assertNotEquals(map.get("a"), map.get("b"));
- assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("marko")) ||
- ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")) ||
- ((Vertex) map.get("a")).id().equals(convertToVertexId("josh")));
- assertTrue(((Vertex) map.get("b")).id().equals(convertToVertexId("marko")) ||
- ((Vertex) map.get("b")).id().equals(convertToVertexId("peter")) ||
- ((Vertex) map.get("b")).id().equals(convertToVertexId("josh")));
- }
- assertEquals(6, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
- printTraversalForm(traversal);
- int counter = 0;
- int markoCounter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Object> map = traversal.next();
- assertEquals(2, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.containsKey("b"));
- assertEquals(convertToVertexId("marko"), ((Vertex) map.get("b")).id());
- if (((Vertex) map.get("a")).id().equals(convertToVertexId("marko")))
- markoCounter++;
- else
- assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("josh")) || ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")));
- }
- assertEquals(3, markoCounter);
- assertEquals(5, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Map<String, Object> map = traversal.next();
- assertEquals(2, map.size());
- assertTrue(map.containsKey("a"));
- assertTrue(map.containsKey("b"));
- assertEquals(convertToVertexId("marko"), ((Vertex) map.get("a")).id());
- assertEquals(convertToVertexId("josh"), ((Vertex) map.get("b")).id());
- }
- assertEquals(1, counter);
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends WhereTest {
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
- return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.eq, "b");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
- return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.neq, "b");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
- return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("b").has("name", "marko"));
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
- return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("a").out("knows").as("b"));
- }
- }
-}
\ No newline at end of file
[11/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
deleted file mode 100644
index 878575c..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
+++ /dev/null
@@ -1,130 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AddEdgeTest extends AbstractGremlinTest {
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX();
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
- public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX() {
- final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int count = 0;
- while (traversal.hasNext()) {
- final Edge edge = traversal.next();
- assertEquals("createdBy", edge.label());
- assertEquals(0, IteratorUtils.count(edge.properties()));
- count++;
-
- }
- assertEquals(1, count);
- assertEquals(7, IteratorUtils.count(graph.edges()));
- assertEquals(6, IteratorUtils.count(graph.vertices()));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
- public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X() {
- final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int count = 0;
- while (traversal.hasNext()) {
- final Edge edge = traversal.next();
- assertEquals("createdBy", edge.label());
- assertEquals(2, edge.<Integer>value("weight").intValue());
- assertEquals(1, IteratorUtils.count(edge.properties()));
- count++;
-
-
- }
- assertEquals(1, count);
- assertEquals(7, IteratorUtils.count(graph.edges()));
- assertEquals(6, IteratorUtils.count(graph.vertices()));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
- public void g_V_addOutEXexistsWith__g_V__time_nowX() {
- final Traversal<Vertex, Edge> traversal = get_g_V_addOutEXexistsWith__g_V__time_nowX();
- printTraversalForm(traversal);
- int count = 0;
- while (traversal.hasNext()) {
- final Edge edge = traversal.next();
- assertEquals("existsWith", edge.label());
- assertEquals("now", edge.value("time"));
- assertEquals(1, IteratorUtils.count(edge.properties()));
- count++;
- }
- assertEquals(36, count);
- assertEquals(42, IteratorUtils.count(graph.edges()));
- for (final Vertex vertex : IteratorUtils.list(graph.vertices())) {
- assertEquals(6, IteratorUtils.count(vertex.edges(Direction.OUT, "existsWith")));
- assertEquals(6, IteratorUtils.count(vertex.edges(Direction.IN, "existsWith")));
- }
- assertEquals(6, IteratorUtils.count(graph.vertices()));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends AddEdgeTest {
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
- return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id) {
- return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a", "weight", 2);
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
- return g.V().addOutE("existsWith", g.V(), "time", "now");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
deleted file mode 100644
index 020b98b..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
+++ /dev/null
@@ -1,91 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AddVertexTest extends AbstractGremlinTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
-
- public abstract Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX();
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
- public void g_V_addVXlabel_animal_age_0X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
- printTraversalForm(traversal);
- int count = 0;
- while (traversal.hasNext()) {
- final Vertex vertex = traversal.next();
- assertEquals("animal", vertex.label());
- assertEquals(0, vertex.<Integer>value("age").intValue());
- count++;
- }
- assertEquals(12, IteratorUtils.count(graph.vertices()));
- assertEquals(6, count);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
- public void g_addVXlabel_person_name_stephenX() {
- final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
- printTraversalForm(traversal);
- final Vertex stephen = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals("person", stephen.label());
- assertEquals("stephen", stephen.value("name"));
- assertEquals(1, IteratorUtils.count(stephen.properties()));
- assertEquals(7, IteratorUtils.count(graph.vertices()));
- }
-
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- public static class Traversals extends AddVertexTest {
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
- return g.V().addV(T.label, "animal", "age", 0);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
- return g.addV(T.label, "person", "name", "stephen");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
deleted file mode 100644
index d37f766..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
+++ /dev/null
@@ -1,221 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class BackTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id);
-
- public abstract Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
- public abstract Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_asXhereX_out_backXhereX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXhereX_out_backXhereX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals("marko", traversal.next().<String>value("name"));
- }
- assertEquals(3, counter);
- }
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final Vertex vertex = traversal.next();
- assertEquals("java", vertex.<String>value("lang"));
- assertTrue(vertex.value("name").equals("ripple") || vertex.value("name").equals("lop"));
- }
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX() {
- final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final Edge edge = traversal.next();
- assertEquals("knows", edge.label());
- assertEquals(convertToVertexId("vadas"), edge.inVertex().id());
- assertEquals(convertToVertexId("marko"), edge.outVertex().id());
- assertEquals(0.5d, edge.<Double>value("weight"), 0.0001d);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- final Set<String> names = new HashSet<>();
- while (traversal.hasNext()) {
- counter++;
- names.add(traversal.next());
- }
- assertEquals(2, counter);
- assertEquals(2, names.size());
- assertTrue(names.contains("ripple"));
- assertTrue(names.contains("lop"));
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX() {
- final List<Traversal<Vertex, Edge>> traversals = Arrays.asList(
- get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
- get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
- get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")));
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertTrue(traversal.hasNext());
- final Edge edge = traversal.next();
- assertEquals("knows", edge.label());
- assertEquals(1.0d, edge.<Double>value("weight"), 0.00001d);
- assertFalse(traversal.hasNext());
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_asXhereXout_name_backXhereX() {
- Traversal<Vertex, Vertex> traversal = get_g_V_asXhereXout_name_backXhereX();
- printTraversalForm(traversal);
- super.checkResults(new HashMap<Vertex, Long>() {{
- put(convertToVertex(graph, "marko"), 3l);
- put(convertToVertex(graph, "josh"), 2l);
- put(convertToVertex(graph, "peter"), 1l);
- }}, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
- List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(2, map.size());
- assertEquals(1l, map.get("ripple").longValue());
- assertEquals(6l, map.get("lop").longValue());
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends BackTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
- return g.V(v1Id).as("here").out().back("here");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
- return g.V(v4Id).out().as("here").has("lang", "java").back("here");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id) {
- return g.V(v4Id).out().as("here").has("lang", "java").back("here").values("name");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
- return g.V(v1Id).outE().as("here").inV().has("name", "vadas").back("here");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
- return g.V(v1Id).outE("knows").has("weight", 1.0d).as("here").inV().has("name", "josh").back("here");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id) {
- return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).inV().has("name", "josh").<Edge>back("here");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
- return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).as("fake").inV().has("name", "josh").<Edge>back("here");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
- return g.V().as("here").out().values("name").back("here");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
- return (Traversal) g.V().out("created")
- .union(as("project").in("created").has("name", "marko").back("project"),
- as("project").in("created").in("knows").has("name", "marko").back("project")).groupCount().by("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
deleted file mode 100644
index eaccc1b..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
+++ /dev/null
@@ -1,158 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class CoalesceTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX();
-
- public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
-
- public abstract Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_coalesceXoutXfooX_outXbarXX() {
- Traversal<Vertex, Vertex> traversal = get_g_V_coalesceXoutXfooX_outXbarXX();
- printTraversalForm(traversal);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX() {
- Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- checkResults(Arrays.asList("josh", "vadas"), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX() {
- Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- assertEquals("lop", traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
- Traversal<Vertex, Map<String, Long>> traversal = get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- Map<String, Long> result = traversal.next();
- assertEquals(4, result.size());
- assertTrue(result.containsKey("josh") && result.containsKey("lop") && result.containsKey("ripple") && result.containsKey("vadas"));
- assertEquals(1L, (long) result.get("josh"));
- assertEquals(2L, (long) result.get("lop"));
- assertEquals(1L, (long) result.get("ripple"));
- assertEquals(1L, (long) result.get("vadas"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- @LoadGraphWith(MODERN)
- public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
- Traversal<Vertex, Path> traversal = get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
- printTraversalForm(traversal);
- Map<String, Integer> first = new HashMap<>();
- Map<String, Integer> last = new HashMap<>();
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Path path = traversal.next();
- first.compute(path.<String>get(0), (k, v) -> v != null ? v + 1 : 1);
- last.compute(path.<String>get(2), (k, v) -> v != null ? v + 1 : 1);
- assertEquals(3, path.size());
- assertTrue((path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("vadas"))
- || (path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("josh"))
- || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop"))
- || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("ripple"))
- || (path.<String>get(0).equals("peter") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop")));
- }
- assertEquals(5, counter);
- assertEquals(2, (int) first.get("marko"));
- assertEquals(2, (int) first.get("josh"));
- assertEquals(1, (int) first.get("peter"));
- assertEquals(1, (int) last.get("josh"));
- assertEquals(1, (int) last.get("vadas"));
- assertEquals(2, (int) last.get("lop"));
- assertEquals(1, (int) last.get("ripple"));
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends CoalesceTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
- return g.V().coalesce(out("foo"), out("bar"));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
- return g.V(v1Id).coalesce(out("knows"), out("created")).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
- return g.V(v1Id).coalesce(out("created"), out("knows")).values("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
- return g.V().coalesce(out("likes"), out("knows"), out("created")).<String>groupCount().by("name");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
- return g.V().coalesce(outE("knows"), outE("created")).otherV().path().by("name").by(T.label);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
deleted file mode 100644
index d9257cb..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
+++ /dev/null
@@ -1,168 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CountTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Long> get_g_V_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_out_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_both_both_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_hasXnoX_count();
-
- public abstract Traversal<Vertex, Long> get_g_V_fold_countXlocalX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_count();
- printTraversalForm(traversal);
- assertEquals(new Long(6), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_out_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_out_count();
- printTraversalForm(traversal);
- assertEquals(new Long(6), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_both_both_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_both_both_count();
- printTraversalForm(traversal);
- assertEquals(new Long(1406914), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_repeatXoutX_timesX3X_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX3X_count();
- printTraversalForm(traversal);
- assertEquals(new Long(14465066L), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_repeatXoutX_timesX8X_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX8X_count();
- printTraversalForm(traversal);
- assertEquals(new Long(2505037961767380L), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXnoX_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
- printTraversalForm(traversal);
- assertEquals(new Long(0), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_filterXfalseX_count() {
- final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
- printTraversalForm(traversal);
- assertEquals(new Long(0), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_fold_countXlocalX() {
- final Traversal<Vertex, Long> traversal = get_g_V_fold_countXlocalX();
- printTraversalForm(traversal);
- assertEquals(new Long(6), traversal.next());
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends CountTest {
-
- @Override
- public Traversal<Vertex, Long> get_g_V_count() {
- return g.V().count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_out_count() {
- return g.V().out().count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_both_both_count() {
- return g.V().both().both().count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
- return g.V().repeat(out()).times(3).count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
- return g.V().repeat(out()).times(8).count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
- return g.V().has("no").count();
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
- return g.V().fold().count(Scope.local);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
deleted file mode 100644
index 105bf12..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
+++ /dev/null
@@ -1,109 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Operator;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BinaryOperator;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FoldTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, List<Vertex>> get_g_V_fold();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_fold_unfold();
-
- public abstract Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_fold() {
- final Traversal<Vertex, List<Vertex>> traversal = get_g_V_fold();
- printTraversalForm(traversal);
- List<Vertex> list = traversal.next();
- assertFalse(traversal.hasNext());
- Set<Vertex> vertices = new HashSet<>(list);
- assertEquals(6, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_fold_unfold() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_fold_unfold();
- printTraversalForm(traversal);
- int count = 0;
- Set<Vertex> vertices = new HashSet<>();
- while (traversal.hasNext()) {
- vertices.add(traversal.next());
- count++;
- }
- assertFalse(traversal.hasNext());
- assertEquals(6, count);
- assertEquals(6, vertices.size());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_age_foldX0_plusX() {
- final Traversal<Vertex, Integer> traversal = get_g_V_age_foldX0_plusX();
- printTraversalForm(traversal);
- final Integer ageSum = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(Integer.valueOf(123), ageSum);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends FoldTest {
-
- @Override
- public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
- return g.V().fold();
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
- return g.V().fold().unfold();
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
- return g.V().<Integer>values("age").fold(0, (BinaryOperator) Operator.sum);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
deleted file mode 100644
index 58977b0..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
+++ /dev/null
@@ -1,153 +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.graph.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class MapTest extends AbstractGremlinProcessTest {
- public abstract Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id);
-
- public abstract Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id);
-
- public abstract Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX();
-
- public abstract Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_mapXnameX() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_mapXnameX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- assertEquals(traversal.next(), "marko");
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_outE_label_mapXlengthX() {
- final Traversal<Vertex, Integer> traversal = get_g_VX1X_outE_label_mapXlengthX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- List<Integer> lengths = traversal.toList();
- assertTrue(lengths.contains("created".length()));
- assertTrue(lengths.contains("knows".length()));
- assertEquals(lengths.size(), 3);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1X_out_mapXnameX_mapXlengthX() {
- final Traversal<Vertex, Integer> traversal = get_g_VX1X_out_mapXnameX_mapXlengthX(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final List<Integer> lengths = traversal.toList();
- assertTrue(lengths.contains("josh".length()));
- assertTrue(lengths.contains("vadas".length()));
- assertTrue(lengths.contains("lop".length()));
- assertEquals(lengths.size(), 3);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_asXaX_out_mapXa_nameX() {
- int marko = 0;
- int peter = 0;
- int josh = 0;
- int other = 0;
-
- final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_mapXa_nameX();
- printTraversalForm(traversal);
- while (traversal.hasNext()) {
- final String name = traversal.next();
- if (name.equals("marko")) marko++;
- else if (name.equals("peter")) peter++;
- else if (name.equals("josh")) josh++;
- else other++;
- }
- assertEquals(marko, 3);
- assertEquals(josh, 2);
- assertEquals(peter, 1);
- assertEquals(other, 0);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
- final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_out_mapXa_name_it_nameX();
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String doubleName = traversal.next();
- assertTrue("markoripple".equals(doubleName) || "markolop".equals(doubleName));
- }
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends MapTest {
- @Override
- public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
- return g.V(v1Id).<String>map(v -> v.get().value("name"));
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
- return g.V(v1Id).outE().label().map(l -> l.get().length());
- }
-
- @Override
- public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
- return g.V(v1Id).out().map(v -> v.get().value("name")).map(n -> n.get().toString().length());
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
- return g.V().as("a").out().<String>map(v -> v.<Vertex>path("a").value("name"));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
- return g.V().as("a").out().out().map(v -> v.<Vertex>path("a").<String>value("name") + v.get().<String>value("name"));
- }
- }
-}
[13/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
index 6c1d6e6..6f638a5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
index 8fab827..e5b1a79 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
@@ -19,8 +19,8 @@
package org.apache.tinkerpop.gremlin;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
index d5a0c94..4b3c98c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
/**
* Holds objects specified by the test suites supplying them in a static manner to the test cases.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
index 6c7530a..987cf43 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
@@ -19,18 +19,18 @@
package org.apache.tinkerpop.gremlin;
import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -78,23 +78,23 @@ public interface GraphProvider {
}};
/**
- * Create a {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource} from a {@link Graph} instance. The default implementation uses the
+ * Create a {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource} from a {@link Graph} instance. The default implementation uses the
* {@link org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine} so vendors should
* override as necessary if their implementation is testing something that requires a different engine type,
- * like those tests for {@link org.apache.tinkerpop.gremlin.process.TraversalEngine.Type}.
+ * like those tests for {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type}.
*/
public default GraphTraversalSource traversal(final Graph graph) {
return GraphTraversalSource.build().engine(StandardTraversalEngine.build()).create(graph);
}
/**
- * Create a {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource} from a {@link Graph} instance. The default implementation uses the
+ * Create a {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource} from a {@link Graph} instance. The default implementation uses the
* {@link org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine} so vendors should
* override as necessary if their implementation is testing something that requires a different engine type,
- * like those tests for {@link org.apache.tinkerpop.gremlin.process.TraversalEngine.Type}.
+ * like those tests for {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type}.
* <br/>
* Implementations should apply strategies as necessary to the
- * {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource.Builder} before calling
+ * {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource.Builder} before calling
* it's {@code create} method.
*/
public default GraphTraversalSource traversal(final Graph graph, final TraversalStrategy... strategies) {
@@ -254,9 +254,9 @@ public interface GraphProvider {
* <li>{@link Graph}</li>
* <li>{@link Graph.Variables}</li>
* <li>{@link GraphTraversal}</li>
- * <li>{@link org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser}</li>
+ * <li>{@link org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser}</li>
* <li>{@link Property}</li>
- * <li>{@link org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser}</li>
+ * <li>{@link org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser}</li>
* <li>{@link Traversal}</li>
* <li>{@link Traverser}</li>
* <li>{@link Vertex}</li>
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
index 6e16efd..949dc92 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
@@ -20,7 +20,9 @@ package org.apache.tinkerpop.gremlin.process;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
import org.junit.Before;
import java.util.ArrayList;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
index 256a253..245b9e5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
@@ -18,6 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index 7604248..51dc452 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -22,51 +22,52 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.FilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategyTest;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ReadOnlyStrategyProcessTest;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
import org.junit.runners.model.InitializationError;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 1878122..82696b2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -20,63 +20,63 @@ package org.apache.tinkerpop.gremlin.process;
import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.FilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.TraversalSideEffectsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategyTest;
import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategyProcessTest;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ReadOnlyStrategyProcessTest;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
-import org.apache.tinkerpop.gremlin.process.util.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.RunnerBuilder;
@@ -155,7 +155,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
MinTest.Traversals.class,
SumTest.Traversals.class,
OrderTest.Traversals.class,
- org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest.Traversals.class,
+ org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest.Traversals.class,
PropertiesTest.Traversals.class,
SelectTest.Traversals.class,
VertexTest.Traversals.class,
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
index 346428d..5bf7542 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
@@ -26,12 +26,12 @@ import com.carrotsearch.junitbenchmarks.annotation.BenchmarkMethodChart;
import com.carrotsearch.junitbenchmarks.annotation.LabelType;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
index 63f66a4..fc1b9b5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
@@ -18,6 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Repeatable;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
index ea611f3..1022229 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
@@ -21,12 +21,10 @@ package org.apache.tinkerpop.gremlin.process.computer;
import org.apache.tinkerpop.gremlin.ExceptionCoverage;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaMapReduce;
import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
index 3d4bf4e..b7159f4 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.process.computer.ranking;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
index 9c45b63..d69f1ee 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.process.computer.util;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.UseEngine;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Vertex;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
deleted file mode 100644
index 7ed2db6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
+++ /dev/null
@@ -1,82 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.label;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class BranchTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
-
- public abstract Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
- Traversal<Vertex, Object> traversal = get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
- Traversal<Vertex, Object> traversal = get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends BranchTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
- return g.V().branch(v -> v.get().label().equals("person") ? "a" : "b")
- .option("a", values("age"))
- .option("b", values("lang"))
- .option("b", values("name"));
- }
-
- @Override
- public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
- return g.V().branch(label().is("person").count())
- .option(1L, values("age"))
- .option(0L, values("lang"))
- .option(0L, values("name"));
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
deleted file mode 100644
index e16fddb..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
+++ /dev/null
@@ -1,75 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class ChooseTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
- final Traversal<Vertex, Object> traversal = get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
- printTraversalForm(traversal);
- Map<String, Long> counts = new HashMap<>();
- int counter = 0;
- while (traversal.hasNext()) {
- MapHelper.incr(counts, traversal.next().toString(), 1l);
- counter++;
- }
- assertFalse(traversal.hasNext());
- assertEquals(2, counter);
- assertEquals(2, counts.size());
- assertEquals(Long.valueOf(1), counts.get("{name=[marko], age=[29]}"));
- assertEquals(Long.valueOf(1), counts.get("josh"));
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends ChooseTest {
-
- @Override
- public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
- return g.V().choose(out().count())
- .option(2L, values("name"))
- .option(3L, valueMap());
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
deleted file mode 100644
index 2247d42..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
+++ /dev/null
@@ -1,255 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class LocalTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
-
- public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
-
- public abstract Traversal<Vertex, Long> get_g_V_localXoutE_countX();
-
- public abstract Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
-
- public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id);
-
- public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id);
-
- public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id);
-
- public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id);
-
- public abstract Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name();
-
- @Test
- @LoadGraphWith(CREW)
- public void g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
- final Traversal<Vertex, String> traversal = get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("brussels", "san diego", "centreville", "dulles", "baltimore", "bremen", "aachen", "kaiserslautern"), traversal);
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_by() {
- final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- final Map<String, Object> map = traversal.next();
- counter++;
- assertEquals(2, map.size());
- if (map.get("a").equals("marko")) {
- assertEquals(convertToVertexId("lop"), map.get("b"));
- } else if (map.get("a").equals("josh")) {
- assertTrue(convertToVertexId("lop").equals(map.get("b")) || convertToVertexId("ripple").equals(map.get("b")));
- } else if (map.get("a").equals("peter")) {
- assertEquals(convertToVertexId("lop"), map.get("b"));
- } else {
- fail("The following map should not have been returned: " + map);
- }
- }
- assertEquals(4, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_localXoutE_countX() {
- final Traversal<Vertex, Long> traversal = get_g_V_localXoutE_countX();
- printTraversalForm(traversal);
- checkResults(Arrays.asList(3l, 0l, 0l, 0l, 1l, 2l), traversal);
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_localXbothEXknows_createdX_limitX1XX() {
- final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEXknows_createdX_limitX1XX(convertToVertexId("josh"));
- printTraversalForm(traversal);
- final Edge edge = traversal.next();
- assertTrue(edge.label().equals("created") || edge.label().equals("knows"));
- assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_localXbothE_limitX1XX_otherV_name() {
- final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX1XX_otherV_name(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next();
- assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
- }
- assertEquals(1, counter);
- assertFalse(traversal.hasNext());
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_localXbothE_limitX2XX_otherV_name() {
- final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX2XX_otherV_name(convertToVertexId("josh"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next();
- assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
- }
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
- }
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_localXinEXknowsX_limitX2XX_outV_name() {
- final Traversal<Vertex, String> traversal = get_g_V_localXinEXknowsX_limitX2XX_outV_name();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- assertEquals(traversal.next(), "marko");
- }
- assertFalse(traversal.hasNext());
- assertEquals(2, counter);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX4X_localXbothEX1_createdX_limitX1XX() {
- final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEX1_createdX_limitX1XX(convertToVertexId("josh"));
- printTraversalForm(traversal);
- final Edge edge = traversal.next();
- assertEquals("created", edge.label());
- assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_localXoutEXknowsX_limitX1XX_inV_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- final String name = traversal.next();
- assertTrue(name.equals("vadas") || name.equals("josh"));
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
- final Traversal<Vertex, String> traversal = get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- final String name = traversal.next();
- assertTrue(name.equals("marko") || name.equals("lop") || name.equals("josh") || name.equals("ripple") || name.equals("peter"));
- }
- assertEquals(5, counter);
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends LocalTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
- return g.V().local(properties("location").order().by(T.value, Order.incr).range(0, 2)).value();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
- return g.V().has(T.label, "person").as("a").local(out("created").as("b")).select("a", "b").by("name").by(T.id);
- }
-
- @Override
- public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
- return g.V().local(outE().count());
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
- return g.V(v1Id).local(outE("knows").limit(1)).inV().values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
- return g.V().local(bothE("created").limit(1)).otherV().values("name");
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
- return g.V(v4Id).local(bothE("created").limit(1));
- }
-
- @Override
- public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
- return g.V(v4Id).local(bothE("knows", "created").limit(1));
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
- return g.V(v4Id).local(bothE().limit(1)).otherV().values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
- return g.V(v4Id).local(bothE().limit(2)).otherV().values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
- return g.V().local(inE("knows").limit(2)).outV().values("name");
- }
-
-
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
deleted file mode 100644
index 57c214f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
+++ /dev/null
@@ -1,272 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class RepeatTest extends AbstractGremlinProcessTest {
-
- // DO/WHILE
-
- public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path();
-
- public abstract Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit();
-
- // WHILE/DO
-
- public abstract Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(final Object v1Id);
-
- public abstract Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path();
-
- public abstract Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path();
-
- public abstract Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id);
-
- // SIDE-EFFECTS
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX();
-
- // TODO:
- /*
- gremlin> g.V(1).repeat(out()).until(outE().count().cap().filter{it.get() == 0}).path().by('name') (3)
- ==>[marko, lop]
- ==>[marko, vadas]
- ==>[marko, josh, ripple]
- ==>[marko, josh, lop]
- */
-
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXoutX_timesX2X_emit_path() {
- final List<Traversal<Vertex, Path>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXoutX_timesX2X_emit_path());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<Integer, Long> pathLengths = new HashMap<>();
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- MapHelper.incr(pathLengths, traversal.next().size(), 1l);
- }
- assertEquals(2, pathLengths.size());
- assertEquals(8, counter);
- assertEquals(new Long(6), pathLengths.get(2));
- assertEquals(new Long(2), pathLengths.get(3));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
- final List<Traversal<Vertex, String>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "marko"), traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXoutX_timesX2X() {
- final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXoutX_timesX2X());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- assertTrue(vertex.value("name").equals("lop") || vertex.value("name").equals("ripple"));
- }
- assertEquals(2, counter);
- assertFalse(traversal.hasNext());
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXoutX_timesX2X_emit() {
- final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
- traversals.add(get_g_V_repeatXoutX_timesX2X_emit());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- Map<String, Long> map = new HashMap<>();
- while (traversal.hasNext()) {
- Vertex vertex = traversal.next();
- MapHelper.incr(map, vertex.value("name"), 1l);
- }
- assertEquals(4, map.size());
- assertTrue(map.containsKey("vadas"));
- assertTrue(map.containsKey("josh"));
- assertTrue(map.containsKey("ripple"));
- assertTrue(map.containsKey("lop"));
- assertEquals(new Long(1), map.get("vadas"));
- assertEquals(new Long(1), map.get("josh"));
- assertEquals(new Long(2), map.get("ripple"));
- assertEquals(new Long(4), map.get("lop"));
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_timesX2X_repeatXoutX_name() {
- final List<Traversal<Vertex, String>> traversals = Arrays.asList(
- get_g_VX1X_timesX2X_repeatXoutX_name(convertToVertexId("marko")));
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList("lop", "ripple"), traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_emit_timesX2X_repeatXoutX_path() {
- final List<Traversal<Vertex, Path>> traversals = Arrays.asList(
- get_g_V_emit_timesX2X_repeatXoutX_path(),
- get_g_V_emit_repeatXoutX_timesX2X_path());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- int path1 = 0;
- int path2 = 0;
- int path3 = 0;
- while (traversal.hasNext()) {
- final Path path = traversal.next();
- if (path.size() == 1) {
- path1++;
- } else if (path.size() == 2) {
- path2++;
- } else if (path.size() == 3) {
- path3++;
- } else {
- fail("Only path lengths of 1, 2, or 3 should be seen");
- }
- }
- assertEquals(6, path1);
- assertEquals(6, path2);
- assertEquals(2, path3);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_emitXhasXlabel_personXX_repeatXoutX_name() {
- final List<Traversal<Vertex, String>> traversals = Arrays.asList(get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(convertToVertexId("marko")));
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "josh", "vadas"), traversal);
- });
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
- final List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX());
- traversals.forEach(traversal -> {
- printTraversalForm(traversal);
- final Map<String, Long> map = traversal.next();
- assertFalse(traversal.hasNext());
- //[ripple:2, peter:1, vadas:2, josh:2, lop:4, marko:1]
- assertEquals(6, map.size());
- assertEquals(1l, map.get("marko").longValue());
- assertEquals(2l, map.get("vadas").longValue());
- assertEquals(2l, map.get("josh").longValue());
- assertEquals(4l, map.get("lop").longValue());
- assertEquals(2l, map.get("ripple").longValue());
- assertEquals(1l, map.get("peter").longValue());
- });
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends RepeatTest {
-
- @Override
- public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
- return g.V().repeat(out()).times(2).emit().path();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
- return g.V().repeat(out()).times(2).repeat(in()).times(2).values("name");
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
- return g.V().repeat(out()).times(2);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
- return g.V().repeat(out()).times(2).emit();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
- return g.V(v1Id).times(2).repeat(out()).values("name");
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
- return g.V().emit().repeat(out()).times(2).path();
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
- return g.V().emit().times(2).repeat(out()).path();
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
- return g.V(v1Id).emit(has(T.label, "person")).repeat(out()).values("name");
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
- return g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m");
- }
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
deleted file mode 100644
index 2594349..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
+++ /dev/null
@@ -1,195 +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.graph.traversal.step.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class UnionTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_unionXout__inX_name();
-
- public abstract Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id);
-
- public abstract Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
-
- public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
-
- public abstract Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_unionXout__inX_name() {
- final Traversal<Vertex, String> traversal = get_g_V_unionXout__inX_name();
- printTraversalForm(traversal);
- checkResults(new HashMap<String, Long>() {{
- put("marko", 3l);
- put("lop", 3l);
- put("peter", 1l);
- put("ripple", 1l);
- put("josh", 3l);
- put("vadas", 1l);
- }}, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_unionXrepeatXoutX_timesX2X__outX_name() {
- final Traversal<Vertex, String> traversal = get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(convertToVertexId("marko"));
- printTraversalForm(traversal);
- checkResults(new HashMap<String, Long>() {{
- put("lop", 2l);
- put("ripple", 1l);
- put("josh", 1l);
- put("vadas", 1l);
- }}, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX() {
- final Traversal<Vertex, String> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
- printTraversalForm(traversal);
- checkResults(new HashMap<String, Long>() {{
- put("lop", 3l);
- put("ripple", 1l);
- put("java", 4l);
- put("josh", 1l);
- put("vadas", 1l);
- put("person", 4l);
- }}, traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
- final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
- printTraversalForm(traversal);
- final Map<String, Long> groupCount = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(3l, groupCount.get("lop").longValue());
- assertEquals(1l, groupCount.get("ripple").longValue());
- assertEquals(4l, groupCount.get("java").longValue());
- assertEquals(1l, groupCount.get("josh").longValue());
- assertEquals(1l, groupCount.get("vadas").longValue());
- assertEquals(4l, groupCount.get("person").longValue());
- assertEquals(6, groupCount.size());
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
- final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
- printTraversalForm(traversal);
- final Map<String, Long> groupCount = traversal.next();
- assertFalse(traversal.hasNext());
- assertEquals(12l, groupCount.get("software").longValue());
- assertEquals(20l, groupCount.get("person").longValue());
- assertEquals(2, groupCount.size());
-
- }
-
- @Test
- @LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX() {
- final Traversal<Vertex, Number> traversal = get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(convertToVertexId("marko"), convertToVertexId("vadas"));
- printTraversalForm(traversal);
- assertTrue(traversal.hasNext());
- final Number startNumber = traversal.next();
- assertTrue(traversal.hasNext());
- if (startNumber.longValue() == 3l) {
- assertEquals(0l, traversal.next().longValue());
- assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
- //
- assertEquals(0l, traversal.next().longValue());
- assertEquals(1l, traversal.next().longValue());
- assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
- } else {
- assertEquals(1l, traversal.next().longValue());
- assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
- //
- assertEquals(3l, traversal.next().longValue());
- assertEquals(0l, traversal.next().longValue());
- assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
- }
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends UnionTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
- return g.V().union(out(), in()).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
- return g.V(v1Id).union(repeat(out()).times(2), out()).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
- return g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label());
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
- return (Traversal) g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label()).groupCount();
- }
-
- @Override
- public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
- return (Traversal) g.V().union(
- repeat(union(
- out("created"),
- in("created"))).times(2),
- repeat(union(
- in("created"),
- out("created"))).times(2)).label().groupCount();
- }
-
- @Override
- public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id) {
- return g.V(v1Id, v2Id).union(outE().count(), inE().count(), (Traversal) outE().values("weight").sum());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
deleted file mode 100644
index 11dbdea..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
+++ /dev/null
@@ -1,79 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AndTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
-
- public abstract Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
- final Traversal<Vertex, String> traversal = get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("marko", "josh"), traversal);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_andXout__hasXlabel_personX_and_hasXage_gte_32XX_name() {
- final Traversal<Vertex, String> traversal = get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
- printTraversalForm(traversal);
- checkResults(Arrays.asList("josh", "peter"), traversal);
- }
-
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends AndTest {
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
- return g.V().and(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
- }
-
- @Override
- public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
- return g.V().and(outE(), has(T.label, "person").and().has("age", Compare.gte, 32)).values("name");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
deleted file mode 100644
index a734b58..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
+++ /dev/null
@@ -1,84 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CoinTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_V_coinX1X();
-
- public abstract Traversal<Vertex, Vertex> get_g_V_coinX0X();
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_coinX1X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_coinX1X();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- traversal.next();
- }
- assertEquals(6, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_V_coinX0X() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_coinX0X();
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- traversal.next();
- }
- assertEquals(0, counter);
- assertFalse(traversal.hasNext());
- }
-
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends CoinTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
- return g.V().coin(1.0d);
- }
-
- @Override
- public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
- return g.V().coin(0.0d);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
deleted file mode 100644
index 33326d8..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
+++ /dev/null
@@ -1,86 +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.graph.traversal.step.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CyclicPathTest extends AbstractGremlinProcessTest {
-
- public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1);
-
- public abstract Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1);
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath() {
- final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Vertex vertex = traversal.next();
- assertEquals("marko", vertex.<String>value("name"));
- }
- assertEquals(1, counter);
- assertFalse(traversal.hasNext());
- }
-
- @Test
- @LoadGraphWith(MODERN)
- public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path() {
- final Traversal<Vertex, Path> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(convertToVertexId("marko"));
- printTraversalForm(traversal);
- int counter = 0;
- while (traversal.hasNext()) {
- counter++;
- Path path = traversal.next();
- assertFalse(path.isSimple());
- }
- assertEquals(1, counter);
- assertFalse(traversal.hasNext());
- }
-
- @UseEngine(TraversalEngine.Type.STANDARD)
- @UseEngine(TraversalEngine.Type.COMPUTER)
- public static class Traversals extends CyclicPathTest {
- @Override
- public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
- return g.V(v1Id).out("created").in("created").cyclicPath();
- }
-
- @Override
- public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
- return g.V(v1Id).out("created").in("created").cyclicPath().path();
- }
- }
-}
[22/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
new file mode 100644
index 0000000..6804dbd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
@@ -0,0 +1,187 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+ protected T t;
+
+ protected AbstractTraverser() {
+
+ }
+
+ public AbstractTraverser(final T t) {
+ this.t = t;
+ }
+
+ /////////////
+
+ @Override
+ public void merge(final Admin<?> other) {
+ throw new UnsupportedOperationException("This traverser does not support merging: " + this.getClass().getCanonicalName());
+ }
+
+ @Override
+ public <R> Admin<R> split(final R r, final Step<T, R> step) {
+ try {
+ final AbstractTraverser<R> clone = (AbstractTraverser<R>) super.clone();
+ clone.t = r;
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public Admin<T> split() {
+ try {
+ return (AbstractTraverser<T>) super.clone();
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void set(final T t) {
+ this.t = t;
+ }
+
+ @Override
+ public void incrLoops(final String stepLabel) {
+
+ }
+
+ @Override
+ public void resetLoops() {
+
+ }
+
+ @Override
+ public String getStepId() {
+ throw new UnsupportedOperationException("This traverser does not support futures: " + this.getClass().getCanonicalName());
+ }
+
+ @Override
+ public void setStepId(final String stepId) {
+
+ }
+
+ @Override
+ public void setBulk(final long count) {
+
+ }
+
+ @Override
+ public Admin<T> detach() {
+ this.t = DetachedFactory.detach(this.t, false);
+ return this;
+ }
+
+ @Override
+ public Admin<T> attach(final Vertex hostVertex) {
+ if (this.t instanceof DetachedElement)
+ this.t = (T) ((DetachedElement) this.t).attach(hostVertex);
+ else if (this.t instanceof DetachedProperty)
+ this.t = (T) ((DetachedProperty) this.t).attach(hostVertex);
+ // you do not want to attach a path because it will reference graph objects not at the current vertex
+ return this;
+ }
+
+ @Override
+ public void setSideEffects(final TraversalSideEffects sideEffects) {
+
+ }
+
+ @Override
+ public TraversalSideEffects getSideEffects() {
+ return EmptyTraversalSideEffects.instance();
+ //throw new UnsupportedOperationException("This traverser does not support sideEffects: " + this.getClass().getCanonicalName());
+ }
+
+ @Override
+ public T get() {
+ return this.t;
+ }
+
+ @Override
+ public <S> S sack() {
+ throw new UnsupportedOperationException("This traverser does not support sacks: " + this.getClass().getCanonicalName());
+ }
+
+ @Override
+ public <S> void sack(final S object) {
+
+ }
+
+ @Override
+ public Path path() {
+ return EmptyPath.instance();
+ }
+
+ @Override
+ public int loops() {
+ throw new UnsupportedOperationException("This traverser does not support loops: " + this.getClass().getCanonicalName());
+ }
+
+ @Override
+ public long bulk() {
+ return 1l;
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public AbstractTraverser<T> clone() {
+ try {
+ return (AbstractTraverser<T>) super.clone();
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ ///////////
+
+ @Override
+ public int hashCode() {
+ return this.t.hashCode();
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof AbstractTraverser && ((AbstractTraverser) object).get().equals(this.t);
+ }
+
+ @Override
+ public String toString() {
+ return this.t.toString();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
new file mode 100644
index 0000000..0f79d99
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
@@ -0,0 +1,64 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFactory {
+
+ private static DefaultTraverserGeneratorFactory INSTANCE = new DefaultTraverserGeneratorFactory();
+
+ public static DefaultTraverserGeneratorFactory instance() {
+ return INSTANCE;
+ }
+
+ private DefaultTraverserGeneratorFactory() {
+ }
+
+ @Override
+ public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?,?> traversal) {
+ final Set<TraverserRequirement> requirements = traversal.getTraverserRequirements();
+
+ if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+ return O_TraverserGenerator.instance();
+
+ if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+ return B_O_TraverserGenerator.instance();
+
+ if (B_O_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+ return B_O_PA_S_SE_SL_TraverserGenerator.instance();
+
+ if (B_O_P_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+ return B_O_P_PA_S_SE_SL_TraverserGenerator.instance();
+
+ throw new IllegalStateException("The provided traverser generator factory does not support the requirements of the traversal: " + this.getClass().getCanonicalName() + requirements);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
new file mode 100644
index 0000000..498f6b0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
@@ -0,0 +1,153 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+ private static final EmptyTraverser INSTANCE = new EmptyTraverser();
+
+ public static <R> EmptyTraverser<R> instance() {
+ return INSTANCE;
+ }
+
+ private EmptyTraverser() {
+
+ }
+
+ @Override
+ public void set(final T t) {
+
+ }
+
+ @Override
+ public void incrLoops(final String stepLabel) {
+
+ }
+
+ @Override
+ public void resetLoops() {
+
+ }
+
+ @Override
+ public String getStepId() {
+ return HALT;
+ }
+
+ @Override
+ public void setStepId(final String stepId) {
+
+ }
+
+ @Override
+ public void setBulk(long count) {
+
+ }
+
+ @Override
+ public <R> Admin<R> split(final R r, final Step<T, R> step) {
+ return INSTANCE;
+ }
+
+ @Override
+ public Admin<T> split() {
+ return this;
+ }
+
+ @Override
+ public Admin<T> detach() {
+ return this;
+ }
+
+ @Override
+ public Admin<T> attach(final Vertex hostVertex) {
+ return this;
+ }
+
+ @Override
+ public void setSideEffects(final TraversalSideEffects sideEffects) {
+
+ }
+
+ @Override
+ public T get() {
+ return null;
+ }
+
+ @Override
+ public <S> S sack() {
+ return null;
+ }
+
+ @Override
+ public <S> void sack(final S object) {
+
+ }
+
+ @Override
+ public void merge(final Traverser.Admin<?> other) {
+
+ }
+
+ @Override
+ public Path path() {
+ return EmptyPath.instance();
+ }
+
+ @Override
+ public int loops() {
+ return 0;
+ }
+
+ @Override
+ public long bulk() {
+ return 0l;
+ }
+
+ @Override
+ public TraversalSideEffects getSideEffects() {
+ return null;
+ }
+
+ @Override
+ public int hashCode() {
+ return 380473707;
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return object instanceof EmptyTraverser;
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntCallSuperClone")
+ public EmptyTraverser<T> clone() {
+ return this;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
new file mode 100644
index 0000000..0a0cc5a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
@@ -0,0 +1,143 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+import java.io.Serializable;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.Spliterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TraverserSet<S> extends AbstractSet<Traverser.Admin<S>> implements Set<Traverser.Admin<S>>, Queue<Traverser.Admin<S>>, Serializable {
+
+ private final Map<Traverser.Admin<S>, Traverser.Admin<S>> map = new LinkedHashMap<>();
+
+ public TraverserSet() {
+
+ }
+
+ public TraverserSet(final Traverser.Admin<S> traverser) {
+ this.map.put(traverser, traverser);
+ }
+
+ @Override
+ public Iterator<Traverser.Admin<S>> iterator() {
+ return this.map.values().iterator();
+ }
+
+ public Traverser.Admin<S> get(final Traverser.Admin<S> traverser) {
+ return this.map.get(traverser);
+ }
+
+ @Override
+ public int size() {
+ return this.map.size();
+ }
+
+ public long bulkSize() {
+ return this.map.values().stream().map(Traverser::bulk).reduce(0l, (a, b) -> a + b);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return this.map.isEmpty();
+ }
+
+ @Override
+ public boolean contains(final Object traverser) {
+ return this.map.containsKey(traverser);
+ }
+
+ @Override
+ public boolean add(final Traverser.Admin<S> traverser) {
+ final Traverser.Admin<S> existing = this.map.get(traverser);
+ if (null == existing) {
+ this.map.put(traverser, traverser);
+ return true;
+ } else {
+ existing.merge(traverser);
+ return false;
+ }
+ }
+
+ @Override
+ public boolean offer(final Traverser.Admin<S> traverser) {
+ return this.add(traverser);
+ }
+
+ @Override
+ public Traverser.Admin<S> remove() { // pop, exception if empty
+ return this.map.remove(this.map.values().iterator().next());
+ }
+
+ @Override
+ public Traverser.Admin<S> poll() { // pop, null if empty
+ return this.map.isEmpty() ? null : this.remove();
+ }
+
+ @Override
+ public Traverser.Admin<S> element() { // peek, exception if empty
+ return this.iterator().next();
+ }
+
+ @Override
+ public Traverser.Admin<S> peek() { // peek, null if empty
+ return this.map.isEmpty() ? null : this.iterator().next();
+ }
+
+ @Override
+ public boolean remove(final Object traverser) {
+ return this.map.remove(traverser) != null;
+ }
+
+ @Override
+ public void clear() {
+ this.map.clear();
+ }
+
+ @Override
+ public Spliterator<Traverser.Admin<S>> spliterator() {
+ return this.map.values().spliterator();
+ }
+
+ @Override
+ public String toString() {
+ return this.map.keySet().toString();
+ }
+
+ public void sort(final Comparator<Traverser<S>> comparator) {
+ final List<Traverser.Admin<S>> list = new ArrayList<>(this.map.values());
+ Collections.sort(list, comparator);
+ this.map.clear();
+ list.forEach(traverser -> this.map.put(traverser, traverser));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
new file mode 100644
index 0000000..71e286d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -0,0 +1,256 @@
+/*
+ * 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.util;
+
+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.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
+
+ private E lastEnd = null;
+ private long lastEndCount = 0l;
+ private Step<?, E> finalEndStep = EmptyStep.instance();
+ private final StepPosition stepPosition = new StepPosition();
+
+ protected final transient Graph graph;
+
+ protected List<Step> steps = new ArrayList<>();
+ protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
+ protected TraversalStrategies strategies;
+ protected TraversalEngine traversalEngine;
+
+ protected boolean locked = false;
+
+ protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
+
+ public DefaultTraversal(final Graph graph) {
+ this.graph = graph;
+ this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()));
+ this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
+ }
+
+ @Override
+ public Traversal.Admin<S, E> asAdmin() {
+ return this;
+ }
+
+ @Override
+ public void applyStrategies() throws IllegalStateException {
+ if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
+ TraversalHelper.reIdSteps(this.stepPosition, this);
+ this.strategies.applyStrategies(this);
+ for (final Step<?, ?> step : this.getSteps()) {
+ if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
+ globalChild.setStrategies(this.strategies);
+ globalChild.setEngine(this.traversalEngine);
+ globalChild.applyStrategies();
+ }
+ for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ localChild.setStrategies(this.strategies);
+ localChild.setEngine(StandardTraversalEngine.instance());
+ localChild.applyStrategies();
+ }
+ }
+ }
+ this.traversalEngine.processTraversal(this);
+ this.finalEndStep = this.getEndStep();
+ this.locked = true;
+ }
+
+ @Override
+ public TraversalEngine getEngine() {
+ return this.traversalEngine;
+ }
+
+ @Override
+ public void setEngine(final TraversalEngine engine) {
+ this.traversalEngine = engine;
+ }
+
+ @Override
+ public List<Step> getSteps() {
+ return Collections.unmodifiableList(this.steps);
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (!this.locked) this.applyStrategies();
+ return this.lastEndCount > 0l || this.finalEndStep.hasNext();
+ }
+
+ @Override
+ public E next() {
+ if (!this.locked) this.applyStrategies();
+ if (this.lastEndCount > 0l) {
+ this.lastEndCount--;
+ return this.lastEnd;
+ } else {
+ final Traverser<E> next = this.finalEndStep.next();
+ final long nextBulk = next.bulk();
+ if (nextBulk == 1) {
+ return next.get();
+ } else {
+ this.lastEndCount = nextBulk - 1;
+ this.lastEnd = next.get();
+ return this.lastEnd;
+ }
+ }
+ }
+
+ @Override
+ public void reset() {
+ this.steps.forEach(Step::reset);
+ this.lastEndCount = 0l;
+ }
+
+ @Override
+ public void addStart(final Traverser<S> start) {
+ if (!this.locked) this.applyStrategies();
+ if (!this.steps.isEmpty()) this.steps.get(0).addStart(start);
+ }
+
+ @Override
+ public void addStarts(final Iterator<Traverser<S>> starts) {
+ if (!this.locked) this.applyStrategies();
+ if (!this.steps.isEmpty()) this.steps.get(0).addStarts(starts);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeTraversalString(this);
+ }
+
+ @Override
+ public Step<S, ?> getStartStep() {
+ return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(0);
+ }
+
+ @Override
+ public Step<?, E> getEndStep() {
+ return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(this.steps.size() - 1);
+ }
+
+ @Override
+ public DefaultTraversal<S, E> clone() {
+ try {
+ final DefaultTraversal<S, E> clone = (DefaultTraversal<S, E>) super.clone();
+ clone.steps = new ArrayList<>();
+ clone.sideEffects = this.sideEffects.clone();
+ clone.strategies = this.strategies.clone(); // TODO: does this need to be cloned?
+ clone.lastEnd = null;
+ clone.lastEndCount = 0l;
+ for (final Step<?, ?> step : this.steps) {
+ final Step<?, ?> clonedStep = step.clone();
+ clonedStep.setTraversal(clone);
+ final Step previousStep = clone.steps.isEmpty() ? EmptyStep.instance() : clone.steps.get(clone.steps.size() - 1);
+ clonedStep.setPreviousStep(previousStep);
+ previousStep.setNextStep(clonedStep);
+ clone.steps.add(clonedStep);
+ }
+ clone.finalEndStep = clone.getEndStep();
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public boolean isLocked() {
+ return this.locked;
+ }
+
+ @Override
+ public void setSideEffects(final TraversalSideEffects sideEffects) {
+ this.sideEffects = sideEffects;
+ }
+
+ @Override
+ public TraversalSideEffects getSideEffects() {
+ return this.sideEffects;
+ }
+
+ @Override
+ public void setStrategies(final TraversalStrategies strategies) {
+ this.strategies = strategies.clone();
+ }
+
+ @Override
+ public TraversalStrategies getStrategies() {
+ return this.strategies;
+ }
+
+ @Override
+ public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
+ if (this.locked) throw Exceptions.traversalIsLocked();
+ step.setId(this.stepPosition.nextXId());
+ this.steps.add(index, step);
+ final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
+ final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
+ step.setPreviousStep(null != previousStep ? previousStep : EmptyStep.instance());
+ step.setNextStep(null != nextStep ? nextStep : EmptyStep.instance());
+ if (null != previousStep) previousStep.setNextStep(step);
+ if (null != nextStep) nextStep.setPreviousStep(step);
+ return (Traversal.Admin<S2, E2>) this;
+ }
+
+ @Override
+ public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException {
+ if (this.locked) throw Exceptions.traversalIsLocked();
+ final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
+ final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
+ this.steps.remove(index);
+ if (null != previousStep) previousStep.setNextStep(null == nextStep ? EmptyStep.instance() : nextStep);
+ if (null != nextStep) nextStep.setPreviousStep(null == previousStep ? EmptyStep.instance() : previousStep);
+ return (Traversal.Admin<S2, E2>) this;
+ }
+
+ @Override
+ public void setParent(final TraversalParent step) {
+ this.traversalParent = step;
+ }
+
+ @Override
+ public TraversalParent getParent() {
+ return this.traversalParent;
+ }
+
+ @Override
+ public Optional<Graph> getGraph() {
+ return Optional.ofNullable(this.graph);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
new file mode 100644
index 0000000..b93185e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
@@ -0,0 +1,202 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalSideEffects implements TraversalSideEffects {
+
+ protected Map<String, Object> objectMap = new HashMap<>();
+ protected Map<String, Supplier> supplierMap = new HashMap<>();
+ protected UnaryOperator sackSplitOperator = null;
+ protected Supplier sackInitialValue = null;
+
+ public DefaultTraversalSideEffects() {
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void registerSupplier(final String key, final Supplier supplier) {
+ this.supplierMap.put(key, supplier);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key) {
+ return Optional.ofNullable(this.supplierMap.get(key));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void registerSupplierIfAbsent(final String key, final Supplier supplier) {
+ if (!this.supplierMap.containsKey(key))
+ this.supplierMap.put(key, supplier);
+ }
+
+ @Override
+ public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator) {
+ this.sackInitialValue = initialValue;
+ this.sackSplitOperator = splitOperator.orElse(null);
+ }
+
+ @Override
+ public <S> Optional<Supplier<S>> getSackInitialValue() {
+ return Optional.ofNullable(this.sackInitialValue);
+ }
+
+ @Override
+ public <S> Optional<UnaryOperator<S>> getSackSplitOperator() {
+ return Optional.ofNullable(this.sackSplitOperator);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean exists(final String key) {
+ return this.objectMap.containsKey(key) || this.supplierMap.containsKey(key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void set(final String key, final Object value) {
+ SideEffectHelper.validateSideEffect(key, value);
+ this.objectMap.put(key, value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <V> V get(final String key) throws IllegalArgumentException {
+ final V value = (V) this.objectMap.get(key);
+ if (null != value)
+ return value;
+ else {
+ if (this.supplierMap.containsKey(key)) {
+ final V v = (V) this.supplierMap.get(key).get();
+ this.objectMap.put(key, v);
+ return v;
+ } else {
+ throw TraversalSideEffects.Exceptions.sideEffectDoesNotExist(key);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
+ if (this.objectMap.containsKey(key))
+ return (V) this.objectMap.get(key);
+ else if (this.supplierMap.containsKey(key)) {
+ final V value = (V) this.supplierMap.get(key).get();
+ this.objectMap.put(key, value);
+ return value;
+ } else {
+ final V value = orCreate.get();
+ this.objectMap.put(key, value);
+ return value;
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void remove(final String key) {
+ this.objectMap.remove(key);
+ this.supplierMap.remove(key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Set<String> keys() {
+ final Set<String> keys = new HashSet<>();
+ keys.addAll(this.objectMap.keySet());
+ keys.addAll(this.supplierMap.keySet());
+ return Collections.unmodifiableSet(keys);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setLocalVertex(final Vertex vertex) {
+ final Property<Map<String, Object>> property = vertex.property(SIDE_EFFECTS);
+ if (property.isPresent()) {
+ this.objectMap = property.value();
+ } else {
+ this.objectMap = new HashMap<>();
+ vertex.property(SIDE_EFFECTS, this.objectMap);
+ }
+ }
+
+ @Override
+ public void mergeInto(final TraversalSideEffects sideEffects) {
+ this.objectMap.forEach(sideEffects::set);
+ this.supplierMap.forEach(sideEffects::registerSupplierIfAbsent);
+ // TODO: add sack information?
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalSideEffectsString(this);
+ }
+
+ @Override
+ @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+ public DefaultTraversalSideEffects clone() {
+ try {
+ final DefaultTraversalSideEffects sideEffects = (DefaultTraversalSideEffects) super.clone();
+ sideEffects.objectMap = new HashMap<>(this.objectMap);
+ sideEffects.supplierMap = new HashMap<>(this.supplierMap);
+ return sideEffects;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
new file mode 100644
index 0000000..eca4d5d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
@@ -0,0 +1,105 @@
+/*
+ * 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.util;
+
+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.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalStrategies implements TraversalStrategies {
+
+ protected List<TraversalStrategy> traversalStrategies = new ArrayList<>();
+ protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
+
+ @Override
+ public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
+ boolean added = false;
+ for (final TraversalStrategy strategy : strategies) {
+ if (!this.traversalStrategies.contains(strategy)) {
+ this.traversalStrategies.add(strategy);
+ added = true;
+ }
+ }
+ if (added) TraversalStrategies.sortStrategies(this.traversalStrategies);
+ return this;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses) {
+ boolean removed = false;
+ for (final Class<? extends TraversalStrategy> strategyClass : strategyClasses) {
+ final Optional<TraversalStrategy> strategy = this.traversalStrategies.stream().filter(s -> s.getClass().equals(strategyClass)).findAny();
+ if (strategy.isPresent()) {
+ this.traversalStrategies.remove(strategy.get());
+ removed = true;
+ }
+ }
+ if (removed) TraversalStrategies.sortStrategies(this.traversalStrategies);
+ return this;
+ }
+
+ @Override
+ public List<TraversalStrategy> toList() {
+ return Collections.unmodifiableList(this.traversalStrategies);
+ }
+
+ @Override
+ public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
+ this.traversalStrategies.forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+ }
+
+ @Override
+ public TraverserGeneratorFactory getTraverserGeneratorFactory() {
+ return this.traverserGeneratorFactory;
+ }
+
+ @Override
+ public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory) {
+ this.traverserGeneratorFactory = traverserGeneratorFactory;
+ }
+
+ @Override
+ public DefaultTraversalStrategies clone() {
+ try {
+ final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
+ clone.traversalStrategies = new ArrayList<>();
+ clone.traversalStrategies.addAll(this.traversalStrategies);
+ return clone;
+ } catch (final CloneNotSupportedException e) {
+ throw new IllegalStateException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public String toString() {
+ return StringFactory.traversalStrategiesString(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
new file mode 100644
index 0000000..fd580fe
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
@@ -0,0 +1,59 @@
+/*
+ * 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.util;
+
+/**
+ * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
+ * corrected on-the-fly by subtracting upstream durations on every call to stop().
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class DependantMutableMetrics extends MutableMetrics {
+ private long prevDur = 0L;
+ private DependantMutableMetrics upStreamMetrics;
+
+ private DependantMutableMetrics() {
+ // necessary for gryo serialization
+ super();
+ }
+
+ public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
+ super(id, name);
+ this.upStreamMetrics = upStreamMetrics;
+ }
+
+ public void start() {
+ super.start();
+ }
+
+ public void stop() {
+ super.stop();
+ // root step will not have an upstream metrics
+ if (upStreamMetrics != null) {
+ // subtract time that is "double counted" by upstream metrics
+ super.durationNs -= upStreamMetrics.getAndResetIncrementalDur();
+ }
+ }
+
+ public long getAndResetIncrementalDur() {
+ long incrementalDur = super.durationNs - prevDur;
+ prevDur = super.durationNs;
+ return incrementalDur;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index 5d2a6ef..72dbcc3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -18,18 +18,18 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+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.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.structure.Graph;
import java.util.Collections;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
index d41f12b..e82ac1f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.Collections;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
index 48a4405..c0a9175 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
@@ -18,12 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
+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.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
import java.util.Collections;
import java.util.List;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
new file mode 100644
index 0000000..471fc5f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
@@ -0,0 +1,103 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class ImmutableMetrics implements Metrics, Serializable {
+
+ static final TimeUnit SOURCE_UNIT = TimeUnit.NANOSECONDS;
+
+ protected String id;
+ protected String name;
+ protected Map<String, AtomicLong> counts = new HashMap<>();
+ protected long durationNs = 0l;
+ protected final Map<String, Object> annotations = new HashMap<>();
+ protected final Map<String, ImmutableMetrics> nested = new LinkedHashMap<>();
+
+ protected ImmutableMetrics() {
+ }
+
+ @Override
+ public long getDuration(TimeUnit unit) {
+ return unit.convert(this.durationNs, SOURCE_UNIT);
+ }
+
+ @Override
+ public long getCount(String key) {
+ return counts.get(key).get();
+ }
+
+ @Override
+ public Map<String, Long> getCounts() {
+ Map<String, Long> ret = new HashMap<>();
+ for (Map.Entry<String, AtomicLong> count : counts.entrySet()) {
+ ret.put(count.getKey(), count.getValue().get());
+ }
+ return ret;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public Collection<ImmutableMetrics> getNested() {
+ return nested.values();
+ }
+
+ @Override
+ public ImmutableMetrics getNested(String metricsId) {
+ return nested.get(metricsId);
+ }
+
+ @Override
+ public Map<String, Object> getAnnotations() {
+ return annotations;
+ }
+
+ @Override
+ public Object getAnnotation(final String key) {
+ return annotations.get(key);
+ }
+
+ @Override
+ public String toString() {
+ return "ImmutableMetrics{" +
+ "id='" + id + '\'' +
+ ", name='" + name + '\'' +
+ ", counts=" + counts +
+ ", durationNs=" + durationNs +
+ '}';
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
new file mode 100644
index 0000000..6f2c963
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
@@ -0,0 +1,104 @@
+/*
+ * 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.util;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Holds metrics data; typically for .profile()-step analysis. Metrics may be nested. Nesting enables the ability to
+ * capture explicit metrics for multiple distinct operations. Annotations are used to store miscellaneous notes that
+ * might be useful to a developer when examining results, such as index coverage for Steps in a Traversal.
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public interface Metrics {
+
+
+
+
+ /**
+ * Get the duration of execution time taken.
+ *
+ * @param units
+ * @return
+ */
+ public long getDuration(TimeUnit units);
+
+ /**
+ * Get the count for the corresponding countKey.
+ *
+ * @param countKey key for counter to get.
+ * @return
+ */
+ public long getCount(String countKey);
+
+ /**
+ * Get the map of all counters. This method copies the internal map.
+ *
+ * @return a Map where the key is the counter ID and the value is the counter value.
+ */
+ public Map<String, Long> getCounts();
+
+ /**
+ * Name of this Metrics.
+ *
+ * @return name of this Metrics.
+ */
+ public String getName();
+
+ /**
+ * Id of this Metrics.
+ *
+ * @return id of this Metrics.
+ */
+ public String getId();
+
+
+ /**
+ * Get the nested Metrics objects. Metrics will be ordered in the order they were inserted.
+ *
+ * @return the nested Metrics objects.
+ */
+ public Collection<? extends Metrics> getNested();
+
+ /**
+ * Get a nested Metrics object by Id.
+ *
+ * @param metricsId
+ * @return a nested Metrics object.
+ */
+ Metrics getNested(String metricsId);
+
+ /**
+ * Obtain the annotations for this Metrics. Values may be of type String or Number.
+ *
+ * @return the annotations for this Metrics. Modifications to the returned object are persisted in the original.
+ */
+ public Map<String, Object> getAnnotations();
+
+ /**
+ * Obtain the annotation with the specified key. Values may be of type String or Number.
+ *
+ * @param key key of the annotation to obtain.
+ * @return
+ */
+ public Object getAnnotation(String key);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
new file mode 100644
index 0000000..ec5b19c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
@@ -0,0 +1,171 @@
+/*
+ * 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.util;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class MutableMetrics extends ImmutableMetrics implements Cloneable {
+
+ // Note: if you add new members then you probably need to add them to the copy constructor;
+
+ private long tempTime = -1l;
+
+ protected MutableMetrics() {
+ // necessary for gryo serialization
+ }
+
+ public MutableMetrics(final String id, final String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+
+ public void addNested(MutableMetrics metrics) {
+ this.nested.put(metrics.getId(), metrics);
+ }
+
+ public void start() {
+ if (-1 != this.tempTime) {
+ throw new IllegalStateException("Internal Error: Concurrent Metrics start. Stop timer before starting timer.");
+ }
+ this.tempTime = System.nanoTime();
+ }
+
+ public void stop() {
+ if (-1 == this.tempTime)
+ throw new IllegalStateException("Internal Error: Metrics has not been started. Start timer before stopping timer");
+ this.durationNs = this.durationNs + (System.nanoTime() - this.tempTime);
+ this.tempTime = -1;
+ }
+
+ public void incrementCount(String key, final long incr) {
+ AtomicLong count = this.counts.get(key);
+ if (count == null) {
+ count = new AtomicLong();
+ this.counts.put(key, count);
+ }
+ count.addAndGet(incr);
+ }
+
+ public void aggregate(MutableMetrics other) {
+ this.durationNs += other.durationNs;
+ for (Map.Entry<String, AtomicLong> otherCount : other.counts.entrySet()) {
+ AtomicLong thisCount = this.counts.get(otherCount.getKey());
+ if (thisCount == null) {
+ thisCount = new AtomicLong(otherCount.getValue().get());
+ this.counts.put(otherCount.getKey(), thisCount);
+ } else {
+ thisCount.addAndGet(otherCount.getValue().get());
+ }
+ }
+
+ // Merge annotations. If multiple values for a given key are found then append it to a comma-separated list.
+ for (Map.Entry<String, Object> p : other.annotations.entrySet()) {
+ if (this.annotations.containsKey(p.getKey())) {
+ // Strings are concatenated
+ Object existingVal = this.annotations.get(p.getKey());
+ if (existingVal instanceof String) {
+ final List<String> existingValues = Arrays.asList(existingVal.toString().split(","));
+ if (!existingValues.contains(p.getValue())) {
+ // New value. Append to comma-separated list.
+ this.annotations.put(p.getKey(), existingVal.toString() + ',' + p.getValue());
+ }
+ } else {
+ // Numbers are summed
+ Number existingNum = (Number) existingVal;
+ Number otherNum = (Number) p.getValue();
+ Number newVal;
+ if (existingNum instanceof Double || existingNum instanceof Float) {
+ newVal =
+ existingNum.doubleValue() + otherNum.doubleValue();
+ } else {
+ newVal = existingNum.longValue() + otherNum.longValue();
+ }
+ this.annotations.put(p.getKey(), newVal);
+ }
+ } else {
+ this.annotations.put(p.getKey(), p.getValue());
+ }
+ }
+ this.annotations.putAll(other.annotations);
+
+ // Merge nested Metrics
+ other.nested.values().forEach(nested -> {
+ MutableMetrics thisNested = (MutableMetrics) this.nested.get(nested.getId());
+ if (thisNested == null) {
+ thisNested = new MutableMetrics(nested.getId(), nested.getName());
+ this.nested.put(thisNested.getId(), thisNested);
+ }
+ thisNested.aggregate((MutableMetrics) nested);
+ });
+ }
+
+ /**
+ * Set an annotation value. Support exists for Strings and Numbers only. During a merge, Strings are concatenated
+ * into a "," (comma) separated list of distinct values (duplicates are ignored), and Numbers are summed.
+ *
+ * @param key
+ * @param value
+ */
+ public void setAnnotation(String key, Object value) {
+ if (!(value instanceof String) && !(value instanceof Number)) {
+ throw new IllegalArgumentException("Metrics annotations only support String and Number values.");
+ }
+ annotations.put(key, value);
+ }
+
+ @Override
+ public MutableMetrics getNested(String metricsId) {
+ return (MutableMetrics) nested.get(metricsId);
+ }
+
+ public ImmutableMetrics getImmutableClone() {
+ final ImmutableMetrics clone = new ImmutableMetrics();
+ copyMembers(clone);
+ this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).getImmutableClone()));
+ return clone;
+ }
+
+ private void copyMembers(final ImmutableMetrics clone) {
+ clone.id = this.id;
+ clone.name = this.name;
+ clone.durationNs = this.durationNs;
+ for (Map.Entry<String, AtomicLong> c : this.counts.entrySet()) {
+ clone.counts.put(c.getKey(), new AtomicLong(c.getValue().get()));
+ }
+ for (Map.Entry<String, Object> a : this.annotations.entrySet()) {
+ clone.annotations.put(a.getKey(), a.getValue());
+ }
+ }
+
+ @Override
+ public MutableMetrics clone() {
+ final MutableMetrics clone = new MutableMetrics();
+ copyMembers(clone);
+ this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).clone()));
+ return clone;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
index f35a8f6..36b88af 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
new file mode 100644
index 0000000..8ea8d6d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
@@ -0,0 +1,204 @@
+/*
+ * 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.util;
+
+import org.apache.commons.lang.StringUtils;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
+ // toString() specific headers
+ private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
+
+ private boolean dirty = true;
+ private final Map<String, MutableMetrics> metrics = new HashMap<>();
+ private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
+ private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
+
+ /*
+ The following are computed values upon the completion of profiling in order to report the results back to the user
+ */
+ private long totalStepDuration;
+ private Map<String, ImmutableMetrics> computedMetrics;
+
+ public StandardTraversalMetrics() {
+ }
+
+ public void start(final String metricsId) {
+ dirty = true;
+ if (allMetrics.get(metricsId) == null) {
+ System.out.println();
+ }
+ allMetrics.get(metricsId).start();
+ }
+
+ public void stop(final String metricsId) {
+ dirty = true;
+ allMetrics.get(metricsId).stop();
+ }
+
+ public void finish(final String metricsId, final long bulk) {
+ dirty = true;
+ final MutableMetrics metrics = allMetrics.get(metricsId);
+ metrics.stop();
+ metrics.incrementCount(TRAVERSER_COUNT_ID, 1);
+ metrics.incrementCount(ELEMENT_COUNT_ID, bulk);
+ }
+
+ @Override
+ public long getDuration(final TimeUnit unit) {
+ computeTotals();
+ return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
+ }
+
+ @Override
+ public Metrics getMetrics(final int index) {
+ computeTotals();
+ // adjust index to account for the injected profile steps
+ return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
+ }
+
+ @Override
+ public Metrics getMetrics(final String id) {
+ computeTotals();
+ return computedMetrics.get(id);
+ }
+
+ @Override
+ public Collection<ImmutableMetrics> getMetrics() {
+ computeTotals();
+ return computedMetrics.values();
+ }
+
+ @Override
+ public String toString() {
+ computeTotals();
+
+ // Build a pretty table of metrics data.
+
+ // Append headers
+ final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
+ .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
+
+ sb.append("\n=============================================================================================================");
+
+ appendMetrics(computedMetrics.values(), sb, 0);
+
+ // Append total duration
+ sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
+ ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
+
+ return sb.toString();
+ }
+
+ private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
+ // Append each StepMetric's row. indexToLabelMap values are ordered by index.
+ for (Metrics m : metrics) {
+ String rowName = m.getName();
+ for (int ii = 0; ii < indent; ii++) {
+ rowName = " " + rowName;
+ }
+ rowName = StringUtils.abbreviate(rowName, 50);
+ final long itemCount = m.getCount(ELEMENT_COUNT_ID);
+ final long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
+
+ Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
+ if (percentDur != null) {
+ sb.append(String.format("%n%-50s %21d %11d %15.3f %8.2f",
+ rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0, percentDur));
+ } else {
+ sb.append(String.format("%n%-50s %21d %11d %15.3f",
+ rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
+ }
+ appendMetrics(m.getNested(), sb, indent + 1);
+ }
+ }
+
+ private void computeTotals() {
+ if (!dirty) {
+ // already good to go
+ return;
+ }
+
+ // Create temp list of ordered metrics
+ List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
+ for (String label : indexToLabelMap.values()) {
+ // The indexToLabelMap is sorted by index (key)
+ tempMetrics.add(metrics.get(label).clone());
+ }
+
+ // Calculate total duration
+ this.totalStepDuration = 0;
+ tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
+
+ // Assign %'s
+ tempMetrics.forEach(m -> {
+ double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
+ m.setAnnotation(PERCENT_DURATION_KEY, dur);
+ });
+
+ // Store immutable instances of the calculated metrics
+ computedMetrics = new LinkedHashMap<>(metrics.size());
+ tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
+
+ dirty = false;
+ }
+
+ public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
+ final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
+
+ // iterate the incoming TraversalMetrics
+ toMerge.forEachRemaining(inTraversalMetrics -> {
+ // aggregate the internal Metrics
+ inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
+
+ MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
+ if (null == aggregateMetrics) {
+ // need to create a Metrics to aggregate into
+ aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
+
+ newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
+ // Set the index of the Metrics
+ for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
+ if (metricsId.equals(entry.getValue())) {
+ newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
+ break;
+ }
+ }
+ }
+ aggregateMetrics.aggregate(toAggregate);
+ });
+ });
+ return newTraversalMetrics;
+ }
+
+ public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
+ if (isTopLevel) {
+ // The index is necessary to ensure that step order is preserved after a merge.
+ indexToLabelMap.put(index, id);
+ metrics.put(id, newMetrics);
+ }
+ allMetrics.put(profileStepId, newMetrics);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
new file mode 100644
index 0000000..4438543
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
@@ -0,0 +1,57 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StepPosition implements Serializable {
+
+ public int x; // step in traversal length
+ public int y; // depth in traversal nested tree
+ public int z; // breadth in traversal siblings
+ public String parentId; // the traversal holder id
+
+ private static final String DOT = ".";
+ private static final String LEFT_PARENTHESES = "(";
+ private static final String RIGHT_PARENTHESES = ")";
+ private static final String EMPTY_STRING = "";
+
+ private StepPosition(final int x, final int y, final int z, final String parentId) {
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.parentId = parentId;
+ }
+
+ public StepPosition() {
+ this(0, 0, 0, EMPTY_STRING);
+ }
+
+ public String nextXId() {
+ return this.x++ + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
+ }
+
+ @Override
+ public String toString() {
+ return this.x + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 4e71c7e..0ffe53f 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
@@ -18,17 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.StepPosition;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import java.util.ArrayList;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
new file mode 100644
index 0000000..36a105a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
@@ -0,0 +1,66 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A TraversalMatrix provides random, non-linear access to the steps of a traversal by their step id.
+ * This is useful in situations where traversers becomes detached from their traversal (and step) and later need to be re-attached.
+ * A classic use case is {@link org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram} on {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer}.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalMatrix<S, E> {
+
+ private final Map<String, Step<?, ?>> matrix = new HashMap<>();
+ private final Traversal.Admin<S, E> traversal;
+
+ public TraversalMatrix(final Traversal.Admin<S, E> traversal) {
+ this.harvestSteps(this.traversal = traversal);
+ }
+
+ public <A, B, C extends Step<A, B>> C getStepById(final String stepId) {
+ return (C) this.matrix.get(stepId);
+ }
+
+ public Traversal.Admin<S, E> getTraversal() {
+ return this.traversal;
+ }
+
+ private final void harvestSteps(final Traversal.Admin<?, ?> traversal) {
+ for (final Step<?, ?> step : traversal.getSteps()) {
+ this.matrix.put(step.getId(), step);
+ if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
+ this.harvestSteps(globalChild);
+ }
+ /*for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ this.harvestSteps(localChild);
+ }*/
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
new file mode 100644
index 0000000..b2c70cf
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
@@ -0,0 +1,77 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Contains the Metrics gathered for a Traversal as the result of the .profile()-step.
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public interface TraversalMetrics {
+ /**
+ * The side-effect key used to store and retrieve the TraversalMetrics for a given Traversal.
+ */
+ public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
+
+ /**
+ * The MetricsId used to obtain the element count via Metrics.getCount(String countKey)
+ */
+ public static final String ELEMENT_COUNT_ID = "elementCount";
+
+ /**
+ * The MetricsId used to obtain the traverser count via Metrics.getCount(String countKey)
+ */
+ public static final String TRAVERSER_COUNT_ID = "traverserCount";
+
+ /**
+ * The annotation key used to obtain the percent duration via Metrics.getAnnotation(String key)
+ */
+ public static final String PERCENT_DURATION_KEY = "percentDur";
+
+ /**
+ * Get the total duration taken by the Traversal.
+ *
+ * @param unit
+ * @return total duration taken by the Traversal.
+ */
+ public long getDuration(TimeUnit unit);
+
+ /**
+ * Get an individual Metrics object by the index of the profiled Step.
+ *
+ * @param stepIndex
+ * @return an individual Metrics object.
+ */
+ public Metrics getMetrics(final int stepIndex);
+
+ /**
+ * Get an individual Metrics object by the id of the profiled Step.
+ *
+ * @param id
+ * @return an individual Metrics object.
+ */
+ public Metrics getMetrics(final String id);
+
+ public Collection<? extends Metrics> getMetrics();
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
index 43abc0e..2d16fab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
import java.io.Serializable;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
index 7c3d74e..98b3b9f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
@@ -18,8 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.util;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import java.util.NoSuchElementException;
[29/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
deleted file mode 100644
index 36db578..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
+++ /dev/null
@@ -1,183 +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.step;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractStep<S, E> implements Step<S, E> {
-
- protected String label = null;
- protected String id = Traverser.Admin.HALT;
- protected Traversal.Admin traversal;
- protected ExpandableStepIterator<S> starts;
- protected Traverser<E> nextEnd = null;
- protected boolean traverserStepIdSetByChild = false; // TODO: Step.teleport(traverser, step)
-
- protected Step<?, S> previousStep = EmptyStep.instance();
- protected Step<E, ?> nextStep = EmptyStep.instance();
-
- public AbstractStep(final Traversal.Admin traversal) {
- this.traversal = traversal;
- this.starts = new ExpandableStepIterator<S>((Step) this);
- }
-
- @Override
- public void setId(final String id) {
- Objects.nonNull(id);
- this.id = id;
- }
-
- @Override
- public String getId() {
- return this.id;
- }
-
- @Override
- public void setLabel(final String label) {
- Objects.nonNull(label);
- this.label = label;
- }
-
- @Override
- public Optional<String> getLabel() {
- return Optional.ofNullable(this.label);
- }
-
- @Override
- public void reset() {
- this.starts.clear();
- this.nextEnd = null;
- }
-
- @Override
- public void addStarts(final Iterator<Traverser<S>> starts) {
- this.starts.add((Iterator) starts);
- }
-
- @Override
- public void addStart(final Traverser<S> start) {
- this.starts.add((Traverser.Admin<S>) start);
- }
-
- @Override
- public void setPreviousStep(final Step<?, S> step) {
- this.previousStep = step;
- }
-
- @Override
- public Step<?, S> getPreviousStep() {
- return this.previousStep;
- }
-
- @Override
- public void setNextStep(final Step<E, ?> step) {
- this.nextStep = step;
- }
-
- @Override
- public Step<E, ?> getNextStep() {
- return this.nextStep;
- }
-
- @Override
- public Traverser<E> next() {
- if (null != this.nextEnd) {
- try {
- return this.prepareTraversalForNextStep(this.nextEnd);
- } finally {
- this.nextEnd = null;
- }
- } else {
- while (true) {
- final Traverser<E> traverser = this.processNextStart();
- if (0 != traverser.bulk()) {
- return this.prepareTraversalForNextStep(traverser);
- }
- }
- }
- }
-
- @Override
- public boolean hasNext() {
- if (null != this.nextEnd)
- return true;
- else {
- try {
- while (true) {
- this.nextEnd = this.processNextStart();
- if (0 != this.nextEnd.bulk())
- return true;
- else
- this.nextEnd = null;
- }
- } catch (final NoSuchElementException e) {
- return false;
- }
- }
- }
-
- @Override
- public <A, B> Traversal.Admin<A, B> getTraversal() {
- return this.traversal;
- }
-
- @Override
- public void setTraversal(final Traversal.Admin<?, ?> traversal) {
- this.traversal = traversal;
- }
-
- protected abstract Traverser<E> processNextStart() throws NoSuchElementException;
-
- public String toString() {
- return TraversalHelper.makeStepString(this);
- }
-
- @Override
- @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
- public AbstractStep<S, E> clone() {
- try {
- final AbstractStep clone = (AbstractStep) super.clone();
- clone.starts = new ExpandableStepIterator<S>(clone);
- clone.previousStep = EmptyStep.instance();
- clone.nextStep = EmptyStep.instance();
- clone.nextEnd = null;
- return clone;
- } catch (CloneNotSupportedException e) {
- throw new IllegalStateException(e.getMessage(), e);
- }
- }
-
- private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
- if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
- if (null != this.label) traverser.path().addLabel(this.label);
- return traverser;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
new file mode 100644
index 0000000..e8a7141
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
@@ -0,0 +1,33 @@
+/*
+ * 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.step;
+
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface ComparatorHolder<S> {
+
+ public void addComparator(final Comparator<S> comparator);
+
+ public List<Comparator<S>> getComparators();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
deleted file mode 100644
index c6a6702..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
+++ /dev/null
@@ -1,57 +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.step;
-
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ElementFunctionComparator<V> implements Comparator<Element>, Serializable {
-
- private final Function<Element, V> elementFunction;
- private final Comparator<V> valueComparator;
-
- public ElementFunctionComparator(final Function<Element, V> elementFunction, final Comparator<V> valueComparator) {
- this.elementFunction = elementFunction;
- this.valueComparator = valueComparator;
- }
-
- public Function<Element, V> getElementFunction() {
- return this.elementFunction;
- }
-
- public Comparator<V> getValueComparator() {
- return this.valueComparator;
- }
-
- @Override
- public int compare(final Element elementA, final Element elementB) {
- return this.valueComparator.compare(this.elementFunction.apply(elementA), this.elementFunction.apply(elementB));
- }
-
- @Override
- public String toString() {
- return this.valueComparator.toString() + "(" + this.elementFunction + ')';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
deleted file mode 100644
index 1062b9b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
+++ /dev/null
@@ -1,56 +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.step;
-
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ElementValueComparator<V> implements Comparator<Element>, Serializable {
-
- private final String propertyKey;
- private final Comparator<V> valueComparator;
-
- public ElementValueComparator(final String propertyKey, final Comparator<V> valueComparator) {
- this.propertyKey = propertyKey;
- this.valueComparator = valueComparator;
- }
-
- public String getPropertyKey() {
- return this.propertyKey;
- }
-
- public Comparator<V> getValueComparator() {
- return this.valueComparator;
- }
-
- @Override
- public int compare(final Element elementA, final Element elementB) {
- return this.valueComparator.compare(elementA.value(this.propertyKey), elementB.value(this.propertyKey));
- }
-
- @Override
- public String toString() {
- return this.valueComparator.toString() + '(' + this.propertyKey + ')';
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
deleted file mode 100644
index 3a3e9ed..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
+++ /dev/null
@@ -1,142 +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.step;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
-
- private static final EmptyStep INSTANCE = new EmptyStep<>();
-
- public static <S, E> Step<S, E> instance() {
- return INSTANCE;
- }
-
- private EmptyStep() {
- }
-
- @Override
- public void addStarts(final Iterator<Traverser<S>> starts) {
-
- }
-
- @Override
- public void addStart(final Traverser<S> start) {
-
- }
-
- @Override
- public void setPreviousStep(final Step<?, S> step) {
-
- }
-
- @Override
- public void reset() {
-
- }
-
- @Override
- public Step<?, S> getPreviousStep() {
- return INSTANCE;
- }
-
- @Override
- public void setNextStep(final Step<E, ?> step) {
-
- }
-
- @Override
- public Step<E, ?> getNextStep() {
- return INSTANCE;
- }
-
- @Override
- public <A, B> Traversal.Admin<A, B> getTraversal() {
- return EmptyTraversal.instance();
- }
-
- @Override
- public void setTraversal(final Traversal.Admin<?, ?> traversal) {
-
- }
-
- @Override
- @SuppressWarnings("CloneDoesntCallSuperClone")
- public EmptyStep<S, E> clone() {
- return INSTANCE;
- }
-
- @Override
- public Optional<String> getLabel() {
- return Optional.empty();
- }
-
- @Override
- public void setLabel(final String label) {
-
- }
-
- @Override
- public void setId(final String id) {
-
- }
-
- @Override
- public String getId() {
- return Traverser.Admin.HALT;
- }
-
- @Override
- public boolean hasNext() {
- return false;
- }
-
- @Override
- public Traverser<E> next() {
- throw FastNoSuchElementException.instance();
- }
-
- @Override
- public int hashCode() {
- return -1691648095;
- }
-
- @Override
- public boolean equals(final Object object) {
- return object instanceof EmptyStep;
- }
-
- @Override
- public Set<TraverserRequirement> getRequirements() {
- return Collections.emptySet();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 7853fa7..cb1aeec 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,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
deleted file mode 100644
index 19ba213..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
+++ /dev/null
@@ -1,77 +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.step;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.util.iterator.MultiIterator;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-
-import java.io.Serializable;
-import java.util.Iterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
-
- private final TraverserSet<E> traverserSet = new TraverserSet<>();
- private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
- private final Step<?, E> hostStep;
-
- public ExpandableStepIterator(final Step<?, E> hostStep) {
- this.hostStep = hostStep;
- }
-
- @Override
- public boolean hasNext() {
- return !this.traverserSet.isEmpty() || this.hostStep.getPreviousStep().hasNext() || this.traverserIterators.hasNext();
- }
-
- @Override
- public Traverser.Admin<E> next() {
- if (!this.traverserSet.isEmpty())
- return this.traverserSet.remove();
- if (this.traverserIterators.hasNext())
- return this.traverserIterators.next();
- /////////////
- if (this.hostStep.getPreviousStep().hasNext())
- return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
- /////////////
- return this.traverserSet.remove();
- }
-
- public void add(final Iterator<Traverser.Admin<E>> iterator) {
- this.traverserIterators.addIterator(iterator);
- }
-
- public void add(final Traverser.Admin<E> traverser) {
- this.traverserSet.add(traverser);
- }
-
- @Override
- public String toString() {
- return this.traverserSet.toString();
- }
-
- public void clear() {
- this.traverserIterators.clear();
- this.traverserSet.clear();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
new file mode 100644
index 0000000..cd7f493
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
@@ -0,0 +1,33 @@
+/*
+ * 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.step;
+
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface HasContainerHolder {
+
+ public List<HasContainer> getHasContainers();
+
+ public void addHasContainer(final HasContainer hasContainer);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
new file mode 100644
index 0000000..13ce032
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
@@ -0,0 +1,28 @@
+/*
+ * 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.step;
+
+/**
+ * A marker interface for steps that modify the graph.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public interface Mutating {
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
new file mode 100644
index 0000000..db205b6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
@@ -0,0 +1,30 @@
+/*
+ * 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.step;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Ranging {
+
+ public long getLowRange();
+
+ public long getHighRange();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
new file mode 100644
index 0000000..786e161
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
@@ -0,0 +1,28 @@
+/*
+ * 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.step;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface SideEffectCapable {
+
+ public String getSideEffectKey();
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
deleted file mode 100644
index df1ce3a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
+++ /dev/null
@@ -1,57 +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.step;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalComparator<S, E> implements Comparator<S>, Serializable, Cloneable {
-
- private Traversal.Admin<S, E> traversal;
- private final Comparator<E> comparator;
-
- public TraversalComparator(final Traversal.Admin<S, E> traversal, final Comparator<E> comparator) {
- this.traversal = traversal;
- this.comparator = comparator;
- }
-
- @Override
- public String toString() {
- return this.comparator.toString() + "(" + this.traversal + ")";
- }
-
- @Override
- public int compare(final S start1, final S start2) {
- return this.comparator.compare(TraversalUtil.apply(start1, this.traversal), TraversalUtil.apply(start2, this.traversal));
- }
-
- @Override
- public TraversalComparator clone() throws CloneNotSupportedException {
- final TraversalComparator clone = (TraversalComparator) super.clone();
- clone.traversal = this.traversal.clone();
- return clone;
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
new file mode 100644
index 0000000..6eb60a2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
@@ -0,0 +1,31 @@
+/*
+ * 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.step;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalOptionParent<M, S, E> extends TraversalParent {
+
+ public static enum Pick {any, none}
+
+ public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption);
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
index 2a24ad2..bd8ee99 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
@@ -18,9 +18,9 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import java.util.Collections;
import java.util.EnumSet;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
new file mode 100644
index 0000000..f49103d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
@@ -0,0 +1,166 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements TraversalOptionParent<M, S, E> {
+
+ protected Traversal.Admin<S, M> branchTraversal;
+ protected Map<M, List<Traversal.Admin<S, E>>> traversalOptions = new HashMap<>();
+ private boolean first = true;
+
+ public BranchStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ public void setBranchTraversal(final Traversal.Admin<S, M> branchTraversal) {
+ this.branchTraversal = this.integrateChild(branchTraversal);
+ }
+
+ @Override
+ public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
+ if (this.traversalOptions.containsKey(pickToken))
+ this.traversalOptions.get(pickToken).add(traversalOption);
+ else
+ this.traversalOptions.put(pickToken, new ArrayList<>(Collections.singletonList(traversalOption)));
+ traversalOption.addStep(new EndStep(traversalOption));
+ this.integrateChild(traversalOption);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements();
+ }
+
+ @Override
+ public List<Traversal.Admin<S, E>> getGlobalChildren() {
+ return Collections.unmodifiableList(this.traversalOptions.values().stream()
+ .flatMap(list -> list.stream())
+ .collect(Collectors.toList()));
+ }
+
+ @Override
+ public List<Traversal.Admin<S, M>> getLocalChildren() {
+ return Collections.singletonList(this.branchTraversal);
+ }
+
+ @Override
+ protected Iterator<Traverser<E>> standardAlgorithm() {
+ while (true) {
+ if (!this.first) {
+ for (final List<Traversal.Admin<S, E>> options : this.traversalOptions.values()) {
+ for (final Traversal.Admin<S, E> option : options) {
+ if (option.hasNext())
+ return option.getEndStep();
+ }
+ }
+ }
+ this.first = false;
+ ///
+ final Traverser.Admin<S> start = this.starts.next();
+ final M choice = TraversalUtil.apply(start, this.branchTraversal);
+ final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
+ if (null != branch) {
+ branch.forEach(traversal -> {
+ traversal.reset();
+ traversal.addStart(start.split());
+ });
+ }
+ if (choice != Pick.any) {
+ final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
+ if (null != anyBranch)
+ anyBranch.forEach(traversal -> {
+ traversal.reset();
+ traversal.addStart(start.split());
+ });
+ }
+ }
+ }
+
+ @Override
+ protected Iterator<Traverser<E>> computerAlgorithm() {
+ final List<Traverser<E>> ends = new ArrayList<>();
+ final Traverser.Admin<S> start = this.starts.next();
+ final M choice = TraversalUtil.apply(start, this.branchTraversal);
+ final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
+ if (null != branch) {
+ branch.forEach(traversal -> {
+ final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
+ split.setStepId(traversal.getStartStep().getId());
+ ends.add(split);
+ });
+ }
+ if (choice != Pick.any) {
+ final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
+ if (null != anyBranch) {
+ anyBranch.forEach(traversal -> {
+ final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
+ split.setStepId(traversal.getStartStep().getId());
+ ends.add(split);
+ });
+ }
+ }
+ return ends.iterator();
+ }
+
+ @Override
+ public BranchStep<S, E, M> clone() {
+ final BranchStep<S, E, M> clone = (BranchStep<S, E, M>) super.clone();
+ clone.traversalOptions = new HashMap<>(this.traversalOptions.size());
+ for (final Map.Entry<M, List<Traversal.Admin<S, E>>> entry : this.traversalOptions.entrySet()) {
+ final List<Traversal.Admin<S, E>> traversals = entry.getValue();
+ if (traversals.size() > 0) {
+ final List<Traversal.Admin<S, E>> clonedTraversals = clone.traversalOptions.compute(entry.getKey(), (k, v) ->
+ (v == null) ? new ArrayList<>(traversals.size()) : v);
+ for (final Traversal.Admin<S, E> traversal : traversals) {
+ final Traversal.Admin<S, E> clonedTraversal = traversal.clone();
+ clonedTraversals.add(clonedTraversal);
+ clone.integrateChild(clonedTraversal);
+ }
+ }
+ }
+ clone.branchTraversal = this.branchTraversal.clone();
+ clone.integrateChild(clone.branchTraversal);
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.branchTraversal, this.traversalOptions);
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.first = true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
new file mode 100644
index 0000000..09af7e2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.HasNextTraversal;
+
+/**
+ * A step which offers a choice of two or more Traversals to take.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ChooseStep<S, E, M> extends BranchStep<S, E, M> {
+
+ public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, M> choiceTraversal) {
+ super(traversal);
+ this.setBranchTraversal(choiceTraversal);
+ }
+
+ public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> predicateTraversal, final Traversal.Admin<S, E> trueChoice, final Traversal.Admin<S, E> falseChoice) {
+ this(traversal, new HasNextTraversal(predicateTraversal));
+ this.addGlobalChildOption((M) Boolean.TRUE, trueChoice);
+ this.addGlobalChildOption((M) Boolean.FALSE, falseChoice);
+ }
+
+ @Override
+ public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
+ if (Pick.any.equals(pickToken))
+ throw new IllegalArgumentException("Choose step can not have an any-option as only one option per traverser is allowed");
+ if (this.traversalOptions.containsKey(pickToken))
+ throw new IllegalArgumentException("Choose step can only have one traversal per pick token: " + pickToken);
+ super.addGlobalChildOption(pickToken, traversalOption);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
new file mode 100644
index 0000000..2e5ba18
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
@@ -0,0 +1,87 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LocalStep<S, E> extends AbstractStep<S, E> implements TraversalParent {
+
+ private Traversal.Admin<S, E> localTraversal;
+ private boolean first = true;
+
+ public LocalStep(final Traversal.Admin traversal, final Traversal.Admin<S, E> localTraversal) {
+ super(traversal);
+ this.localTraversal = this.integrateChild(localTraversal);
+ }
+
+ @Override
+ public LocalStep<S, E> clone() {
+ final LocalStep<S, E> clone = (LocalStep<S, E>) super.clone();
+ clone.localTraversal = clone.integrateChild(this.localTraversal.clone());
+ clone.first = true;
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.localTraversal);
+ }
+
+ @Override
+ public List<Traversal.Admin<S, E>> getLocalChildren() {
+ return Collections.singletonList(this.localTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.localTraversal.getTraverserRequirements();
+ }
+
+ @Override
+ protected Traverser<E> processNextStart() throws NoSuchElementException {
+ if (this.first) {
+ this.first = false;
+ this.localTraversal.addStart(this.starts.next());
+ }
+ while (true) {
+ if (this.localTraversal.hasNext())
+ return this.localTraversal.getEndStep().next();
+ else if (this.starts.hasNext()) {
+ this.localTraversal.reset();
+ this.localTraversal.addStart(this.starts.next());
+ } else {
+ throw FastNoSuchElementException.instance();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
new file mode 100644
index 0000000..3dc2941
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
@@ -0,0 +1,263 @@
+/*
+ * 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.step.branch;
+
+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.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements TraversalParent {
+
+ private Traversal.Admin<S, S> repeatTraversal = null;
+ private Traversal.Admin<S, ?> untilTraversal = null;
+ private Traversal.Admin<S, ?> emitTraversal = null;
+ public boolean untilFirst = false;
+ public boolean emitFirst = false;
+
+ public RepeatStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+ if (requirements.contains(TraverserRequirement.SINGLE_LOOP))
+ requirements.add(TraverserRequirement.NESTED_LOOP);
+ requirements.add(TraverserRequirement.SINGLE_LOOP);
+ return requirements;
+ }
+
+ @SuppressWarnings("unchecked")
+ public void setRepeatTraversal(final Traversal.Admin<S, S> repeatTraversal) {
+ this.repeatTraversal = repeatTraversal; // .clone();
+ this.repeatTraversal.addStep(new RepeatEndStep(this.repeatTraversal));
+ this.integrateChild(this.repeatTraversal);
+ }
+
+ public void setUntilTraversal(final Traversal.Admin<S, ?> untilTraversal) {
+ if (null == this.repeatTraversal) this.untilFirst = true;
+ this.untilTraversal = this.integrateChild(untilTraversal);
+ }
+
+ public void setEmitTraversal(final Traversal.Admin<S, ?> emitTraversal) {
+ if (null == this.repeatTraversal) this.emitFirst = true;
+ this.emitTraversal = this.integrateChild(emitTraversal);
+ }
+
+ public List<Traversal.Admin<S, S>> getGlobalChildren() {
+ return null == this.repeatTraversal ? Collections.emptyList() : Collections.singletonList(this.repeatTraversal);
+ }
+
+ public List<Traversal.Admin<S, ?>> getLocalChildren() {
+ final List<Traversal.Admin<S, ?>> list = new ArrayList<>();
+ if (null != this.untilTraversal)
+ list.add(this.untilTraversal);
+ if (null != this.emitTraversal)
+ list.add(this.emitTraversal);
+ return list;
+ }
+
+ public final boolean doUntil(final Traverser.Admin<S> traverser, boolean utilFirst) {
+ return utilFirst == this.untilFirst && null != this.untilTraversal && TraversalUtil.test(traverser, this.untilTraversal);
+ }
+
+ public final boolean doEmit(final Traverser.Admin<S> traverser, boolean emitFirst) {
+ return emitFirst == this.emitFirst && null != this.emitTraversal && TraversalUtil.test(traverser, this.emitTraversal);
+ }
+
+ @Override
+ public String toString() {
+ if (this.untilFirst && this.emitFirst)
+ return TraversalHelper.makeStepString(this, untilString(), emitString(), this.repeatTraversal);
+ else if (this.emitFirst)
+ return TraversalHelper.makeStepString(this, emitString(), this.repeatTraversal, untilString());
+ else if (this.untilFirst)
+ return TraversalHelper.makeStepString(this, untilString(), this.repeatTraversal, emitString());
+ else
+ return TraversalHelper.makeStepString(this, this.repeatTraversal, untilString(), emitString());
+ }
+
+ private final String untilString() {
+ return null == this.untilTraversal ? "until(false)" : "until(" + this.untilTraversal + ')';
+ }
+
+ private final String emitString() {
+ return null == this.emitTraversal ? "emit(false)" : "emit(" + this.emitTraversal + ')';
+ }
+
+ /////////////////////////
+
+ @Override
+ public RepeatStep<S> clone() {
+ final RepeatStep<S> clone = (RepeatStep<S>) super.clone();
+ clone.repeatTraversal = clone.integrateChild(this.repeatTraversal.clone());
+ if (null != this.untilTraversal)
+ clone.untilTraversal = clone.integrateChild(this.untilTraversal.clone());
+ if (null != this.emitTraversal)
+ clone.emitTraversal = clone.integrateChild(this.emitTraversal.clone());
+ return clone;
+ }
+
+ @Override
+ protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
+ while (true) {
+ if (this.repeatTraversal.getEndStep().hasNext()) {
+ return this.repeatTraversal.getEndStep();
+ } else {
+ final Traverser.Admin<S> start = this.starts.next();
+ if (doUntil(start, true)) {
+ start.resetLoops();
+ return IteratorUtils.of(start);
+ }
+ this.repeatTraversal.addStart(start);
+ if (doEmit(start, true)) {
+ final Traverser.Admin<S> emitSplit = start.split();
+ emitSplit.resetLoops();
+ return IteratorUtils.of(emitSplit);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
+ final Traverser.Admin<S> start = this.starts.next();
+ if (doUntil(start, true)) {
+ start.resetLoops();
+ start.setStepId(this.getNextStep().getId());
+ return IteratorUtils.of(start);
+ } else {
+ start.setStepId(this.repeatTraversal.getStartStep().getId());
+ if (doEmit(start, true)) {
+ final Traverser.Admin<S> emitSplit = start.split();
+ emitSplit.resetLoops();
+ emitSplit.setStepId(this.getNextStep().getId());
+ return IteratorUtils.of(start, emitSplit);
+ } else {
+ return IteratorUtils.of(start);
+ }
+ }
+ }
+
+ /////////////////////////
+
+ public static <A, B, C extends Traversal<A, B>> C addRepeatToTraversal(final C traversal, final Traversal.Admin<B, B> repeatTraversal) {
+ final Step<?, B> step = traversal.asAdmin().getEndStep();
+ if (step instanceof RepeatStep && null == ((RepeatStep) step).repeatTraversal) {
+ ((RepeatStep<B>) step).setRepeatTraversal(repeatTraversal);
+ } else {
+ final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+ repeatStep.setRepeatTraversal(repeatTraversal);
+ traversal.asAdmin().addStep(repeatStep);
+ }
+ return traversal;
+ }
+
+ public static <A, B, C extends Traversal<A, B>> C addUntilToTraversal(final C traversal, final Traversal.Admin<B, ?> untilPredicate) {
+ final Step<?, B> step = traversal.asAdmin().getEndStep();
+ if (step instanceof RepeatStep && null == ((RepeatStep) step).untilTraversal) {
+ ((RepeatStep<B>) step).setUntilTraversal(untilPredicate);
+ } else {
+ final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+ repeatStep.setUntilTraversal(untilPredicate);
+ traversal.asAdmin().addStep(repeatStep);
+ }
+ return traversal;
+ }
+
+ public static <A, B, C extends Traversal<A, B>> C addEmitToTraversal(final C traversal, final Traversal.Admin<B, ?> emitPredicate) {
+ final Step<?, B> step = traversal.asAdmin().getEndStep();
+ if (step instanceof RepeatStep && null == ((RepeatStep) step).emitTraversal) {
+ ((RepeatStep<B>) step).setEmitTraversal(emitPredicate);
+ } else {
+ final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+ repeatStep.setEmitTraversal(emitPredicate);
+ traversal.asAdmin().addStep(repeatStep);
+ }
+ return traversal;
+ }
+
+ ///////////////////////////////////
+
+ public class RepeatEndStep extends ComputerAwareStep<S, S> {
+
+ public RepeatEndStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
+ while (true) {
+ final Traverser.Admin<S> start = this.starts.next();
+ start.incrLoops(this.getId());
+ if (doUntil(start, false)) {
+ start.resetLoops();
+ return IteratorUtils.of(start);
+ } else {
+ if (!RepeatStep.this.untilFirst && !RepeatStep.this.emitFirst)
+ RepeatStep.this.repeatTraversal.addStart(start);
+ else
+ RepeatStep.this.addStart(start);
+ if (doEmit(start, false)) {
+ final Traverser.Admin<S> emitSplit = start.split();
+ emitSplit.resetLoops();
+ return IteratorUtils.of(emitSplit);
+ }
+ }
+ }
+ }
+
+ @Override
+ protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
+ final Traverser.Admin<S> start = this.starts.next();
+ start.incrLoops(RepeatStep.this.getId());
+ if (doUntil(start, false)) {
+ start.resetLoops();
+ start.setStepId(RepeatStep.this.getNextStep().getId());
+ return IteratorUtils.of(start);
+ } else {
+ start.setStepId(RepeatStep.this.getId());
+ if (doEmit(start, false)) {
+ final Traverser.Admin<S> emitSplit = start.split();
+ emitSplit.resetLoops();
+ emitSplit.setStepId(RepeatStep.this.getNextStep().getId());
+ return IteratorUtils.of(start, emitSplit);
+ }
+ return IteratorUtils.of(start);
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
new file mode 100644
index 0000000..b74beca
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.step.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Collections;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParent.Pick> {
+
+ public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
+ super(traversal);
+ this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
+ for (final Traversal.Admin<?, E> union : unionTraversals) {
+ this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
+ }
+ }
+
+ @Override
+ public void addGlobalChildOption(final Pick pickToken, final Traversal.Admin<S, E> traversalOption) {
+ if (Pick.any != pickToken)
+ throw new IllegalArgumentException("Union step only supports the any token: " + pickToken);
+ super.addGlobalChildOption(pickToken, traversalOption);
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.traversalOptions.getOrDefault(Pick.any, Collections.emptyList()));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
new file mode 100644
index 0000000..0f1f19d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AndStep<S> extends ConjunctionStep<S> implements TraversalParent {
+
+ public AndStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... andTraversals) {
+ super(traversal, andTraversals);
+
+ }
+
+ public static final class AndMarker<S> extends ConjunctionMarker<S> {
+ public AndMarker(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
new file mode 100644
index 0000000..6d95875
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
@@ -0,0 +1,64 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CoinStep<S> extends FilterStep<S> {
+
+ private static final Random RANDOM = new Random();
+ private final double probability;
+
+ public CoinStep(final Traversal.Admin traversal, final double probability) {
+ super(traversal);
+ this.probability = probability;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ long newBulk = 0l;
+ for (int i = 0; i < traverser.bulk(); i++) {
+ if (this.probability >= RANDOM.nextDouble())
+ newBulk++;
+ }
+ if (0 == newBulk) return false;
+ traverser.setBulk(newBulk);
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.probability);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.BULK);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
new file mode 100644
index 0000000..8d8b50e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
@@ -0,0 +1,193 @@
+/*
+ * 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.step.filter;
+
+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.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ConjunctionStep<S> extends AbstractStep<S, S> implements TraversalParent {
+
+ private List<Traversal.Admin<S, ?>> conjunctionTraversals;
+ private final boolean isAnd;
+
+ public ConjunctionStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... conjunctionTraversals) {
+ super(traversal);
+ this.isAnd = this.getClass().equals(AndStep.class);
+ this.conjunctionTraversals = Arrays.asList(conjunctionTraversals);
+ for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+ this.integrateChild(conjunctionTraversal);
+ }
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ while (true) {
+ final Traverser.Admin<S> start = this.starts.next();
+ boolean found = false;
+ for (final Traversal.Admin<S, ?> traversal : this.conjunctionTraversals) {
+ traversal.addStart(start.split());
+ found = traversal.hasNext();
+ traversal.reset();
+ if (this.isAnd) {
+ if (!found)
+ break;
+ } else if (found)
+ break;
+ }
+ if (found) return start;
+ }
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements();
+ }
+
+ @Override
+ public List<Traversal.Admin<S, ?>> getLocalChildren() {
+ return Collections.unmodifiableList(this.conjunctionTraversals);
+ }
+
+ @Override
+ public ConjunctionStep<S> clone() {
+ final ConjunctionStep<S> clone = (ConjunctionStep<S>) super.clone();
+ clone.conjunctionTraversals = new ArrayList<>();
+ for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+ clone.conjunctionTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
+ }
+ return clone;
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.conjunctionTraversals);
+ }
+
+ public boolean isConjunctionHasTree() {
+ for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+ for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
+ if (step instanceof ConjunctionStep) {
+ if (!((ConjunctionStep) step).isConjunctionHasTree())
+ return false;
+ } else if (!(step instanceof HasStep))
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public ConjunctionTree getConjunctionHasTree() {
+ return new ConjunctionTree(this);
+ }
+
+
+ ////////
+
+ public static class ConjunctionMarker<S> extends AbstractStep<S, S> {
+
+ public ConjunctionMarker(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected Traverser<S> processNextStart() throws NoSuchElementException {
+ throw new IllegalStateException("This step should have been removed via a strategy: " + this.getClass().getCanonicalName());
+ }
+ }
+
+ ////////
+
+ public static class ConjunctionTree implements Iterable<ConjunctionTree.Entry> {
+
+ private final List<Entry> tree = new ArrayList<>();
+ private final boolean isAnd;
+
+ public ConjunctionTree(final ConjunctionStep<?> conjunctionStep) {
+ this.isAnd = conjunctionStep.isAnd;
+ for (final Traversal.Admin<?, ?> conjunctionTraversal : conjunctionStep.conjunctionTraversals) {
+ for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
+ if (step instanceof HasStep) {
+ (((HasStep<?>) step).getHasContainers()).forEach(container -> this.tree.add(new Entry(HasContainer.class, container)));
+ } else if (step instanceof ConjunctionStep) {
+ this.tree.add(new Entry(ConjunctionTree.class, ((ConjunctionStep) step).getConjunctionHasTree()));
+ } else {
+ throw new IllegalArgumentException("This conjunction supports more complex steps than HasStep");
+ }
+ }
+ }
+ }
+
+ @Override
+ public String toString() {
+ return (this.isAnd ? "and" : "or") + this.tree.toString();
+ }
+
+ public boolean isAnd() {
+ return this.isAnd;
+ }
+
+ @Override
+ public Iterator<Entry> iterator() {
+ return this.tree.iterator();
+ }
+
+ public static class Entry {
+ private Class entryClass;
+ private Object entryValue;
+
+ public Entry(final Class entryClass, final Object entryValue) {
+ this.entryClass = entryClass;
+ this.entryValue = entryValue;
+ }
+
+ public <V> V getValue() {
+ return (V) this.entryValue;
+ }
+
+ public boolean isHasContainer() {
+ return this.entryClass.equals(HasContainer.class);
+ }
+
+ public boolean isConjunctionTree() {
+ return this.entryClass.equals(ConjunctionTree.class);
+ }
+
+ public String toString() {
+ return this.entryValue.toString();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
new file mode 100644
index 0000000..e9c5dcf
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CyclicPathStep<S> extends FilterStep<S> {
+
+ public CyclicPathStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ return !traverser.path().isSimple();
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return Collections.singleton(TraverserRequirement.PATH);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
new file mode 100644
index 0000000..9357e43
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DedupGlobalStep<S> extends FilterStep<S> implements TraversalParent {
+
+ private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
+ private Set<Object> duplicateSet = new HashSet<>();
+
+ public DedupGlobalStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ traverser.setBulk(1);
+ return this.duplicateSet.add(TraversalUtil.apply(traverser, this.dedupTraversal));
+ }
+
+
+ @Override
+ public List<Traversal<S, Object>> getLocalChildren() {
+ return Collections.singletonList(this.dedupTraversal);
+ }
+
+ @Override
+ public void addLocalChild(final Traversal.Admin dedupTraversal) {
+ this.dedupTraversal = this.integrateChild(dedupTraversal);
+ }
+
+ @Override
+ public DedupGlobalStep<S> clone() {
+ final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
+ clone.duplicateSet = new HashSet<>();
+ clone.dedupTraversal = clone.integrateChild(this.dedupTraversal.clone());
+ return clone;
+ }
+
+ @Override
+ public void reset() {
+ super.reset();
+ this.duplicateSet.clear();
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.dedupTraversal);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
new file mode 100644
index 0000000..332037e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
@@ -0,0 +1,97 @@
+/*
+ * 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.step.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ExceptStep<S> extends FilterStep<S> {
+
+ private final String sideEffectKeyOrPathLabel;
+ private final Collection<S> exceptCollection;
+ private final S exceptObject;
+ private final short choice;
+
+ public ExceptStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
+ this.exceptCollection = null;
+ this.exceptObject = null;
+ this.choice = 0;
+ }
+
+ public ExceptStep(final Traversal.Admin traversal, final Collection<S> exceptionCollection) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = null;
+ this.exceptCollection = exceptionCollection;
+ this.exceptObject = null;
+ this.choice = 1;
+ }
+
+ public ExceptStep(final Traversal.Admin traversal, final S exceptionObject) {
+ super(traversal);
+ this.sideEffectKeyOrPathLabel = null;
+ this.exceptCollection = null;
+ this.exceptObject = exceptionObject;
+ this.choice = 2;
+ }
+
+ @Override
+ protected boolean filter(final Traverser.Admin<S> traverser) {
+ switch (this.choice) {
+ case 0: {
+ final Object except = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
+ traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
+ traverser.path(this.sideEffectKeyOrPathLabel);
+ return except instanceof Collection ?
+ !((Collection) except).contains(traverser.get()) :
+ !except.equals(traverser.get());
+ }
+ case 1:
+ return !this.exceptCollection.contains(traverser.get());
+ default:
+ return !this.exceptObject.equals(traverser.get());
+ }
+ }
+
+ @Override
+ public String toString() {
+ return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
+ }
+
+ @Override
+ public Set<TraverserRequirement> getRequirements() {
+ return null == this.sideEffectKeyOrPathLabel ?
+ Collections.singleton(TraverserRequirement.OBJECT) :
+ Stream.of(TraverserRequirement.OBJECT,
+ TraverserRequirement.SIDE_EFFECTS,
+ TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
+ }
+}
[02/40] incubator-tinkerpop git commit: the traversal steps provided
by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of
traversal. Refactored the process API to reflect this concept. Fixed #592.
Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
index 9805fbf..13441ec 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.strategy;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
index fa624bc..943eeef 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
index ae064c5..8b580b0 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
@@ -28,8 +28,8 @@ import java.util.NoSuchElementException;
import java.util.function.Predicate;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
import static org.junit.Assert.*;
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 9627b3d..ac91e48 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,9 +28,9 @@ import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
import org.codehaus.groovy.tools.shell.Groovysh;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
index 13ebd04..4429a4b 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
index 6714edd..2bb0cf2 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
index 5089bf5..1d768f2 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import java.util.Collection;
import java.util.function.Supplier;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
index b2855de..bddde66 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
@@ -19,11 +19,11 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.giraph;
import org.apache.tinkerpop.gremlin.hadoop.structure.io.ObjectWritable;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
index 7d9ac1b..42997f1 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
@@ -18,11 +18,11 @@
*/
package org.apache.tinkerpop.gremlin.hadoop.process.computer.spark;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index 8ccba89..306d9aa 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -52,51 +52,51 @@ import java.util.Optional;
@Graph.OptIn(Graph.OptIn.SUITE_GROOVY_PROCESS_STANDARD)
@Graph.OptIn(Graph.OptIn.SUITE_GROOVY_PROCESS_COMPUTER)
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
method = "g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
method = "g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
method = "g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
method = "g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
method = "g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
method = "g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
method = "g_V_both_both_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
method = "g_V_repeatXoutX_timesX3X_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
method = "g_V_repeatXoutX_timesX8X_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
method = "g_V_both_both_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
method = "g_V_repeatXoutX_timesX3X_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
method = "g_V_repeatXoutX_timesX8X_count",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
@@ -112,11 +112,11 @@ import java.util.Optional;
method = "shouldHaveConsistentMemoryVertexPropertiesAndExceptions",
reason = "Hadoop does a hard kill on failure and stops threads which stops test cases. Exception handling semantics are correct though.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest$Traversals",
method = "g_V_out_out_grateful_profile",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest$StandardTraversals",
method = "g_V_out_out_grateful_profile",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
public class HadoopGraph implements Graph {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
index d5276c6..46bf38a 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopEdge;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.hadoop.fs.Path;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
index 25f1eff..7186700 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopVertex;
import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.NullWritable;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
index a1d42b6..83bf858 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
index 44f9c17..7fb3791 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.io;
import org.apache.tinkerpop.gremlin.hadoop.structure.hdfs.HiddenFileFilter;
import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
index 49bd8d0..62d8e68 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
@@ -29,7 +29,7 @@ import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
import org.apache.tinkerpop.gremlin.groovy.DefaultImportCustomizerProvider;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
index e17f7ff..45a5d5b 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.giraph;
import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+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;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
index 3cb7de1..a48b4ba 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.hadoop.process.computer.spark;
import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+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;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
deleted file mode 100644
index 4fef2fd..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
+++ /dev/null
@@ -1,238 +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.neo4j.process.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertexProperty;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.javatuples.Pair;
-import org.neo4j.graphdb.Direction;
-import org.neo4j.graphdb.DynamicLabel;
-import org.neo4j.graphdb.Node;
-import org.neo4j.graphdb.ResourceIterator;
-import org.neo4j.graphdb.index.AutoIndexer;
-import org.neo4j.graphdb.schema.IndexDefinition;
-import org.neo4j.tooling.GlobalGraphOperations;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Pieter Martin
- */
-public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
-
- public final List<HasContainer> hasContainers = new ArrayList<>();
-
- public Neo4jGraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
- super(traversal, returnClass, ids);
- this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
- }
-
- private Iterator<? extends Edge> edges() {
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- graph.tx().readWrite();
- // ids are present, filter on them first
- if (this.ids != null && this.ids.length > 0)
- return IteratorUtils.filter(graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
- final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Edge.class);
- return (null == hasContainer) ?
- IteratorUtils.filter(graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
- getEdgesUsingAutomaticIndex(hasContainer).filter(edge -> HasContainer.testAll((Edge) edge, this.hasContainers)).iterator();
- }
-
- private Iterator<? extends Vertex> vertices() {
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- graph.tx().readWrite();
- // ids are present, filter on them first
- if (this.ids != null && this.ids.length > 0)
- return IteratorUtils.filter(graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
- // a label and a property
- final Pair<String, HasContainer> labelHasPair = this.getHasContainerForLabelIndex();
- if (null != labelHasPair)
- return this.getVerticesUsingLabelAndProperty(labelHasPair.getValue0(), labelHasPair.getValue1())
- .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
- // use automatic indices
- final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Vertex.class);
- if (null != hasContainer)
- return this.getVerticesUsingAutomaticIndex(hasContainer)
- .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
- // only labels
- final List<String> labels = this.getLabels();
- if (null != labels)
- return this.getVerticesUsingOnlyLabels(labels).filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
- // linear scan
- return IteratorUtils.filter(graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
- }
-
-
- private Stream<Neo4jVertex> getVerticesUsingLabelAndProperty(final String label, final HasContainer hasContainer) {
- //System.out.println("labelProperty: " + label + ":" + hasContainer);
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- final ResourceIterator<Node> iterator1 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
- final ResourceIterator<Node> iterator2 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
- final Stream<Neo4jVertex> stream1 = StreamFactory.stream(iterator1)
- .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
- .map(node -> new Neo4jVertex(node, graph));
- final Stream<Neo4jVertex> stream2 = StreamFactory.stream(iterator2)
- .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
- .filter(node -> node.getProperty(T.key.getAccessor()).equals(hasContainer.key))
- .map(node -> node.getRelationships(Direction.INCOMING).iterator().next().getStartNode())
- .map(node -> new Neo4jVertex(node, graph));
- return Stream.concat(stream1, stream2);
- }
-
- private Stream<Neo4jVertex> getVerticesUsingOnlyLabels(final List<String> labels) {
- //System.out.println("labels: " + labels);
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- return labels.stream()
- .filter(label -> !label.equals(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL.name()))
- .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(graph.getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
- .filter(node -> !node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL))
- .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
- .map(node -> new Neo4jVertex(node, graph));
- }
-
- private Stream<Neo4jVertex> getVerticesUsingAutomaticIndex(final HasContainer hasContainer) {
- //System.out.println("automatic index: " + hasContainer);
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- return StreamFactory.stream(graph.getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
- .map(node -> node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL) ?
- node.getRelationships(Direction.INCOMING).iterator().next().getStartNode() :
- node)
- .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
- .map(node -> new Neo4jVertex(node, graph));
- }
-
- private Stream<Neo4jEdge> getEdgesUsingAutomaticIndex(final HasContainer hasContainer) {
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- return StreamFactory.stream(graph.getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
- .filter(relationship -> ElementHelper.idExists(relationship.getId(), this.ids))
- .filter(relationship -> !relationship.getType().name().startsWith(Neo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
- .map(relationship -> new Neo4jEdge(relationship, graph));
- }
-
- private Pair<String, HasContainer> getHasContainerForLabelIndex() {
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- for (final HasContainer hasContainer : this.hasContainers) {
- if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq)) {
- for (final IndexDefinition index : graph.getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
- for (final HasContainer hasContainer1 : this.hasContainers) {
- if (!hasContainer1.key.equals(T.label.getAccessor()) && hasContainer1.predicate.equals(Compare.eq)) {
- for (final String key : index.getPropertyKeys()) {
- if (key.equals(hasContainer1.key))
- return Pair.with((String) hasContainer.value, hasContainer1);
- }
- }
- }
- }
- }
- }
- return null;
- }
-
- private List<String> getLabels() {
- for (final HasContainer hasContainer : this.hasContainers) {
- if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq))
- return Arrays.asList(((String) hasContainer.value));
- else if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Contains.within))
- return new ArrayList<>((Collection<String>) hasContainer.value);
- }
- return null;
- }
-
- private HasContainer getHasContainerForAutomaticIndex(final Class<? extends Element> elementClass) {
- final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
- final AutoIndexer<?> indexer = elementClass.equals(Vertex.class) ?
- graph.getBaseGraph().index().getNodeAutoIndexer() :
- graph.getBaseGraph().index().getRelationshipAutoIndexer();
-
- if (!indexer.isEnabled())
- return null;
- final Set<String> indexKeys = indexer.getAutoIndexedProperties();
- for (final HasContainer hasContainer : this.hasContainers) {
- if (hasContainer.predicate.equals(Compare.eq) && indexKeys.contains(hasContainer.key))
- return hasContainer;
- }
- return null;
- }
-
- @Override
- public String toString() {
- if (this.hasContainers.isEmpty())
- return super.toString();
- else
- return 0 == this.ids.length ?
- TraversalHelper.makeStepString(this, this.hasContainers) :
- TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.hasContainers);
- }
-
- /*private String makeCypherQuery() {
- final StringBuilder builder = new StringBuilder("MATCH node WHERE ");
- int counter = 0;
- for (final HasContainer hasContainer : this.hasContainers) {
- if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.EQUAL)) {
- if (counter++ > 0) builder.append(" AND ");
- builder.append("node:").append(hasContainer.value);
- } else {
- if (counter++ > 0) builder.append(" AND ");
- builder.append("node.").append(hasContainer.key).append(" ");
- if (hasContainer.predicate instanceof Compare) {
- builder.append(((Compare) hasContainer.predicate).asString()).append(" ").append(toStringOfValue(hasContainer.value));
- } else if (hasContainer.predicate.equals(Contains.IN)) {
- builder.append("IN [");
- for (Object object : (Collection) hasContainer.value) {
- builder.append(toStringOfValue(object)).append(",");
- }
- builder.replace(builder.length() - 1, builder.length(), "").append("]");
- }
- }
-
- }
- System.out.println(builder);
- return builder.toString();
- }
-
- private String toStringOfValue(final Object value) {
- if (value instanceof String)
- return "'" + value + "'";
- else return value.toString();
- }*/
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
deleted file mode 100644
index 894af7e..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
+++ /dev/null
@@ -1,66 +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.neo4j.process.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
-import org.neo4j.graphdb.Node;
-import org.neo4j.graphdb.Relationship;
-import org.neo4j.graphdb.ResourceIterator;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Neo4jCypherIterator<T> implements Iterator<Map<String, T>> {
-
- private final ResourceIterator<Map<String, T>> iterator;
- private final Neo4jGraph graph;
-
- public Neo4jCypherIterator(final ResourceIterator<Map<String, T>> iterator, final Neo4jGraph graph) {
- this.iterator = iterator;
- this.graph = graph;
- }
-
- @Override
- public boolean hasNext() {
- return this.iterator.hasNext();
- }
-
- @Override
- public Map<String, T> next() {
- return this.iterator.next().entrySet().stream().collect(Collectors.toMap(
- Map.Entry::getKey,
- entry -> {
- final T val = entry.getValue();
- if (Node.class.isAssignableFrom(val.getClass())) {
- return (T) new Neo4jVertex((Node) val, this.graph);
- } else if (Relationship.class.isAssignableFrom(val.getClass())) {
- return (T) new Neo4jEdge((Relationship) val, this.graph);
- } else {
- return val;
- }
- }));
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
deleted file mode 100644
index 14a1bc3..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
+++ /dev/null
@@ -1,69 +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.neo4j.process.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.sideEffect.Neo4jGraphStep;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Pieter Martin
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class Neo4jGraphStepStrategy extends AbstractTraversalStrategy {
-
- private static final Neo4jGraphStepStrategy INSTANCE = new Neo4jGraphStepStrategy();
-
- private Neo4jGraphStepStrategy() {
- }
-
- @Override
- public void apply(final Traversal.Admin<?, ?> traversal) {
- if (traversal.getStartStep() instanceof Neo4jGraphStep) {
- final Neo4jGraphStep neo4jGraphStep = (Neo4jGraphStep) traversal.getStartStep();
- Step<?, ?> currentStep = neo4jGraphStep.getNextStep();
- while (true) {
- if (currentStep instanceof HasContainerHolder) {
- neo4jGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
- if (currentStep.getLabel().isPresent()) {
- final IdentityStep identityStep = new IdentityStep<>(traversal);
- identityStep.setLabel(currentStep.getLabel().get());
- TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
- }
- traversal.removeStep(currentStep);
- } else if (currentStep instanceof IdentityStep) {
- // do nothing
- } else {
- break;
- }
- currentStep = currentStep.getNextStep();
- }
- }
- }
-
- public static Neo4jGraphStepStrategy instance() {
- return INSTANCE;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
new file mode 100644
index 0000000..c89058b
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
@@ -0,0 +1,238 @@
+/*
+ * 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.neo4j.process.traversal.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertexProperty;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.javatuples.Pair;
+import org.neo4j.graphdb.Direction;
+import org.neo4j.graphdb.DynamicLabel;
+import org.neo4j.graphdb.Node;
+import org.neo4j.graphdb.ResourceIterator;
+import org.neo4j.graphdb.index.AutoIndexer;
+import org.neo4j.graphdb.schema.IndexDefinition;
+import org.neo4j.tooling.GlobalGraphOperations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Pieter Martin
+ */
+public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
+
+ public final List<HasContainer> hasContainers = new ArrayList<>();
+
+ public Neo4jGraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
+ super(traversal, returnClass, ids);
+ this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
+ }
+
+ private Iterator<? extends Edge> edges() {
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ graph.tx().readWrite();
+ // ids are present, filter on them first
+ if (this.ids != null && this.ids.length > 0)
+ return IteratorUtils.filter(graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
+ final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Edge.class);
+ return (null == hasContainer) ?
+ IteratorUtils.filter(graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
+ getEdgesUsingAutomaticIndex(hasContainer).filter(edge -> HasContainer.testAll((Edge) edge, this.hasContainers)).iterator();
+ }
+
+ private Iterator<? extends Vertex> vertices() {
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ graph.tx().readWrite();
+ // ids are present, filter on them first
+ if (this.ids != null && this.ids.length > 0)
+ return IteratorUtils.filter(graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+ // a label and a property
+ final Pair<String, HasContainer> labelHasPair = this.getHasContainerForLabelIndex();
+ if (null != labelHasPair)
+ return this.getVerticesUsingLabelAndProperty(labelHasPair.getValue0(), labelHasPair.getValue1())
+ .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+ // use automatic indices
+ final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Vertex.class);
+ if (null != hasContainer)
+ return this.getVerticesUsingAutomaticIndex(hasContainer)
+ .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+ // only labels
+ final List<String> labels = this.getLabels();
+ if (null != labels)
+ return this.getVerticesUsingOnlyLabels(labels).filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+ // linear scan
+ return IteratorUtils.filter(graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+ }
+
+
+ private Stream<Neo4jVertex> getVerticesUsingLabelAndProperty(final String label, final HasContainer hasContainer) {
+ //System.out.println("labelProperty: " + label + ":" + hasContainer);
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ final ResourceIterator<Node> iterator1 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
+ final ResourceIterator<Node> iterator2 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
+ final Stream<Neo4jVertex> stream1 = StreamFactory.stream(iterator1)
+ .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+ .map(node -> new Neo4jVertex(node, graph));
+ final Stream<Neo4jVertex> stream2 = StreamFactory.stream(iterator2)
+ .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+ .filter(node -> node.getProperty(T.key.getAccessor()).equals(hasContainer.key))
+ .map(node -> node.getRelationships(Direction.INCOMING).iterator().next().getStartNode())
+ .map(node -> new Neo4jVertex(node, graph));
+ return Stream.concat(stream1, stream2);
+ }
+
+ private Stream<Neo4jVertex> getVerticesUsingOnlyLabels(final List<String> labels) {
+ //System.out.println("labels: " + labels);
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ return labels.stream()
+ .filter(label -> !label.equals(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL.name()))
+ .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(graph.getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
+ .filter(node -> !node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL))
+ .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+ .map(node -> new Neo4jVertex(node, graph));
+ }
+
+ private Stream<Neo4jVertex> getVerticesUsingAutomaticIndex(final HasContainer hasContainer) {
+ //System.out.println("automatic index: " + hasContainer);
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ return StreamFactory.stream(graph.getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+ .map(node -> node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL) ?
+ node.getRelationships(Direction.INCOMING).iterator().next().getStartNode() :
+ node)
+ .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+ .map(node -> new Neo4jVertex(node, graph));
+ }
+
+ private Stream<Neo4jEdge> getEdgesUsingAutomaticIndex(final HasContainer hasContainer) {
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ return StreamFactory.stream(graph.getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+ .filter(relationship -> ElementHelper.idExists(relationship.getId(), this.ids))
+ .filter(relationship -> !relationship.getType().name().startsWith(Neo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
+ .map(relationship -> new Neo4jEdge(relationship, graph));
+ }
+
+ private Pair<String, HasContainer> getHasContainerForLabelIndex() {
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ for (final HasContainer hasContainer : this.hasContainers) {
+ if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq)) {
+ for (final IndexDefinition index : graph.getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
+ for (final HasContainer hasContainer1 : this.hasContainers) {
+ if (!hasContainer1.key.equals(T.label.getAccessor()) && hasContainer1.predicate.equals(Compare.eq)) {
+ for (final String key : index.getPropertyKeys()) {
+ if (key.equals(hasContainer1.key))
+ return Pair.with((String) hasContainer.value, hasContainer1);
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private List<String> getLabels() {
+ for (final HasContainer hasContainer : this.hasContainers) {
+ if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq))
+ return Arrays.asList(((String) hasContainer.value));
+ else if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Contains.within))
+ return new ArrayList<>((Collection<String>) hasContainer.value);
+ }
+ return null;
+ }
+
+ private HasContainer getHasContainerForAutomaticIndex(final Class<? extends Element> elementClass) {
+ final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+ final AutoIndexer<?> indexer = elementClass.equals(Vertex.class) ?
+ graph.getBaseGraph().index().getNodeAutoIndexer() :
+ graph.getBaseGraph().index().getRelationshipAutoIndexer();
+
+ if (!indexer.isEnabled())
+ return null;
+ final Set<String> indexKeys = indexer.getAutoIndexedProperties();
+ for (final HasContainer hasContainer : this.hasContainers) {
+ if (hasContainer.predicate.equals(Compare.eq) && indexKeys.contains(hasContainer.key))
+ return hasContainer;
+ }
+ return null;
+ }
+
+ @Override
+ public String toString() {
+ if (this.hasContainers.isEmpty())
+ return super.toString();
+ else
+ return 0 == this.ids.length ?
+ TraversalHelper.makeStepString(this, this.hasContainers) :
+ TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.hasContainers);
+ }
+
+ /*private String makeCypherQuery() {
+ final StringBuilder builder = new StringBuilder("MATCH node WHERE ");
+ int counter = 0;
+ for (final HasContainer hasContainer : this.hasContainers) {
+ if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.EQUAL)) {
+ if (counter++ > 0) builder.append(" AND ");
+ builder.append("node:").append(hasContainer.value);
+ } else {
+ if (counter++ > 0) builder.append(" AND ");
+ builder.append("node.").append(hasContainer.key).append(" ");
+ if (hasContainer.predicate instanceof Compare) {
+ builder.append(((Compare) hasContainer.predicate).asString()).append(" ").append(toStringOfValue(hasContainer.value));
+ } else if (hasContainer.predicate.equals(Contains.IN)) {
+ builder.append("IN [");
+ for (Object object : (Collection) hasContainer.value) {
+ builder.append(toStringOfValue(object)).append(",");
+ }
+ builder.replace(builder.length() - 1, builder.length(), "").append("]");
+ }
+ }
+
+ }
+ System.out.println(builder);
+ return builder.toString();
+ }
+
+ private String toStringOfValue(final Object value) {
+ if (value instanceof String)
+ return "'" + value + "'";
+ else return value.toString();
+ }*/
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
new file mode 100644
index 0000000..dadf250
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
@@ -0,0 +1,66 @@
+/*
+ * 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.neo4j.process.traversal.step.util;
+
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
+import org.neo4j.graphdb.Node;
+import org.neo4j.graphdb.Relationship;
+import org.neo4j.graphdb.ResourceIterator;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class Neo4jCypherIterator<T> implements Iterator<Map<String, T>> {
+
+ private final ResourceIterator<Map<String, T>> iterator;
+ private final Neo4jGraph graph;
+
+ public Neo4jCypherIterator(final ResourceIterator<Map<String, T>> iterator, final Neo4jGraph graph) {
+ this.iterator = iterator;
+ this.graph = graph;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return this.iterator.hasNext();
+ }
+
+ @Override
+ public Map<String, T> next() {
+ return this.iterator.next().entrySet().stream().collect(Collectors.toMap(
+ Map.Entry::getKey,
+ entry -> {
+ final T val = entry.getValue();
+ if (Node.class.isAssignableFrom(val.getClass())) {
+ return (T) new Neo4jVertex((Node) val, this.graph);
+ } else if (Relationship.class.isAssignableFrom(val.getClass())) {
+ return (T) new Neo4jEdge((Relationship) val, this.graph);
+ } else {
+ return val;
+ }
+ }));
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
new file mode 100644
index 0000000..e16e34c
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
@@ -0,0 +1,68 @@
+/*
+ * 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.neo4j.process.traversal.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.sideEffect.Neo4jGraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Pieter Martin
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Neo4jGraphStepStrategy extends AbstractTraversalStrategy {
+
+ private static final Neo4jGraphStepStrategy INSTANCE = new Neo4jGraphStepStrategy();
+
+ private Neo4jGraphStepStrategy() {
+ }
+
+ @Override
+ public void apply(final Traversal.Admin<?, ?> traversal) {
+ if (traversal.getStartStep() instanceof Neo4jGraphStep) {
+ final Neo4jGraphStep neo4jGraphStep = (Neo4jGraphStep) traversal.getStartStep();
+ Step<?, ?> currentStep = neo4jGraphStep.getNextStep();
+ while (true) {
+ if (currentStep instanceof HasContainerHolder) {
+ neo4jGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
+ if (currentStep.getLabel().isPresent()) {
+ final IdentityStep identityStep = new IdentityStep<>(traversal);
+ identityStep.setLabel(currentStep.getLabel().get());
+ TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
+ }
+ traversal.removeStep(currentStep);
+ } else if (currentStep instanceof IdentityStep) {
+ // do nothing
+ } else {
+ break;
+ }
+ currentStep = currentStep.getNextStep();
+ }
+ }
+ }
+
+ public static Neo4jGraphStepStrategy instance() {
+ return INSTANCE;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
index 47acfb4..8c2b434 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
@@ -21,13 +21,13 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
import org.apache.commons.configuration.BaseConfiguration;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.util.Neo4jCypherIterator;
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.strategy.Neo4jGraphStepStrategy;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.util.Neo4jCypherIterator;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.strategy.optimization.Neo4jGraphStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -70,12 +70,12 @@ import java.util.stream.Stream;
specific = "property(single,k,v)",
reason = "Neo4j throws a NodeNotFoundException instead of the desired IllegalStateException.")
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexTest$Traversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexTest$Traversals",
method = "g_V_addVXlabel_animal_age_0X",
reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator."
)
@Graph.OptOut(
- test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddVertexTest$StandardTraversals",
+ test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddVertexTest$StandardTraversals",
method = "g_V_addVXlabel_animal_age_0X",
reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator."
)
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
index c43906c..78c532f 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.neo4j.structure;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
import org.apache.tinkerpop.gremlin.structure.Element;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
index 21fd957..95b6455 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.neo4j.structure;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
import org.apache.tinkerpop.gremlin.structure.Element;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.Property;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
index 2cc6f03..48fbf4e 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.neo4j;
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.junit.After;
import org.junit.Before;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
index 8dcb6a0..498a2d8 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
@@ -19,7 +19,7 @@
package org.apache.tinkerpop.gremlin.neo4j.process;
import org.apache.tinkerpop.gremlin.neo4j.BaseNeo4jGraphTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.junit.Test;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
index 85d6585..c7dee34 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
import org.apache.tinkerpop.gremlin.neo4j.BaseNeo4jGraphTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.structure.Contains;
import org.apache.tinkerpop.gremlin.structure.Vertex;
import org.apache.tinkerpop.gremlin.structure.VertexProperty;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
index 600a320..31dd121 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
@@ -18,7 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.tinkergraph.process.computer;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
index ada39bb..790d4d0 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
@@ -18,13 +18,13 @@
*/
package org.apache.tinkerpop.gremlin.tinkergraph.process.computer;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
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.computer.util.VertexProgramHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
import org.apache.tinkerpop.gremlin.structure.Edge;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
deleted file mode 100644
index b5699a8..0000000
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
+++ /dev/null
@@ -1,117 +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.tinkergraph.process.graph.traversal.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements HasContainerHolder {
-
- public final List<HasContainer> hasContainers = new ArrayList<>();
-
- public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
- super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
- if (originalGraphStep.getLabel().isPresent())
- this.setLabel(originalGraphStep.getLabel().get());
- this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
- }
-
- private Iterator<? extends Edge> edges() {
- final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
- final HasContainer indexedContainer = getIndexKey(Edge.class);
- // ids are present, filter on them first
- if (this.ids != null && this.ids.length > 0)
- return this.iteratorList(graph.edges(this.ids));
- else
- return null == indexedContainer ?
- this.iteratorList(graph.edges()) :
- TinkerHelper.queryEdgeIndex(graph, indexedContainer.key, indexedContainer.value).stream()
- .filter(edge -> HasContainer.testAll(edge, this.hasContainers))
- .collect(Collectors.<Edge>toList()).iterator();
- }
-
- private Iterator<? extends Vertex> vertices() {
- final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
- final HasContainer indexedContainer = getIndexKey(Vertex.class);
- // ids are present, filter on them first
- if (this.ids != null && this.ids.length > 0)
- return this.iteratorList(graph.vertices(this.ids));
- else
- return null == indexedContainer ?
- this.iteratorList(graph.vertices()) :
- TinkerHelper.queryVertexIndex(graph, indexedContainer.key, indexedContainer.value).stream()
- .filter(vertex -> HasContainer.testAll(vertex, this.hasContainers))
- .collect(Collectors.<Vertex>toList()).iterator();
- }
-
- private HasContainer getIndexKey(final Class<? extends Element> indexedClass) {
- final Set<String> indexedKeys = ((TinkerGraph) this.getTraversal().getGraph().get()).getIndexedKeys(indexedClass);
- return this.hasContainers.stream()
- .filter(c -> indexedKeys.contains(c.key) && c.predicate.equals(Compare.eq))
- .findAny()
- .orElseGet(() -> null);
- }
-
- public String toString() {
- if (this.hasContainers.isEmpty())
- return super.toString();
- else
- return 0 == this.ids.length ?
- TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), this.hasContainers) :
- TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids), this.hasContainers);
- }
-
- private final <E extends Element> Iterator<E> iteratorList(final Iterator<E> iterator) {
- final List<E> list = new ArrayList<>();
- while (iterator.hasNext()) {
- final E e = iterator.next();
- if (HasContainer.testAll(e, this.hasContainers))
- list.add(e);
- }
- return list.iterator();
- }
-
- @Override
- public List<HasContainer> getHasContainers() {
- return this.hasContainers;
- }
-
- @Override
- public void addHasContainer(final HasContainer hasContainer) {
- this.hasContainers.add(hasContainer);
- }
-}