You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by Marko Rodriguez <ok...@gmail.com> on 2015/08/01 01:07:28 UTC
Re: incubator-tinkerpop git commit: implemented LoopsStep
Hi Daniel,
Can you not put this into master/. We have yet to solve the nested loop problem which will require a stack. Can you branch this into a feature branch?
Thanks,
Marko.
http://markorodriguez.com
On Jul 31, 2015, at 3:13 PM, dkuppitz@apache.org wrote:
> Repository: incubator-tinkerpop
> Updated Branches:
> refs/heads/master acbe9b116 -> d63d4c503
>
>
> implemented LoopsStep
>
>
> Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
> Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/d63d4c50
> Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/d63d4c50
> Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/d63d4c50
>
> Branch: refs/heads/master
> Commit: d63d4c5036f4d886b17fb2fe93dba3698be03003
> Parents: acbe9b1
> Author: Daniel Kuppitz <da...@hotmail.com>
> Authored: Fri Jul 31 23:13:13 2015 +0200
> Committer: Daniel Kuppitz <da...@hotmail.com>
> Committed: Fri Jul 31 23:13:13 2015 +0200
>
> ----------------------------------------------------------------------
> CHANGELOG.asciidoc | 1 +
> .../traversal/dsl/graph/GraphTraversal.java | 147 +++---------------
> .../gremlin/process/traversal/dsl/graph/__.java | 27 ++--
> .../process/traversal/lambda/LoopTraversal.java | 54 -------
> .../step/filter/WherePredicateStep.java | 10 +-
> .../process/traversal/step/map/LoopsStep.java | 37 +++++
> .../traversal/step/map/LoopsStepTest.java | 40 +++++
> .../traversal/step/map/GroovyLoopsTest.groovy | 56 +++++++
> .../step/sideEffect/GroovyProfileTest.groovy | 2 +-
> .../process/GroovyProcessComputerSuite.java | 1 +
> .../process/GroovyProcessStandardSuite.java | 1 +
> .../gremlin/process/ProcessComputerSuite.java | 23 +--
> .../gremlin/process/ProcessStandardSuite.java | 2 +
> .../process/traversal/step/map/LoopsTest.java | 152 +++++++++++++++++++
> .../traversal/step/sideEffect/ProfileTest.java | 21 ++-
> 15 files changed, 338 insertions(+), 236 deletions(-)
> ----------------------------------------------------------------------
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/CHANGELOG.asciidoc
> ----------------------------------------------------------------------
> diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
> index bc6d55b..3d44e58 100644
> --- a/CHANGELOG.asciidoc
> +++ b/CHANGELOG.asciidoc
> @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
> TinkerPop 3.1.0 (NOT OFFICIALLY RELEASED YET)
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> +* Added `LoopsStep` to make the loop counter accessible within `repeat()`, `until()` and `emit()`.
> * Gephi Plugin no longer requires manual insert of `store` steps to visualize a traversal.
> * Gephi Plugin visualizes `Path` objects.
> * Added configuration options to Gephi Plugin for setting the size of nodes visualized.
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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
> index 008a46c..b58501e 100644
> --- 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
> @@ -18,137 +18,22 @@
> */
> package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
>
> -import org.apache.tinkerpop.gremlin.process.traversal.Order;
> -import org.apache.tinkerpop.gremlin.process.traversal.P;
> -import org.apache.tinkerpop.gremlin.process.traversal.Path;
> -import org.apache.tinkerpop.gremlin.process.traversal.Pop;
> -import org.apache.tinkerpop.gremlin.process.traversal.Scope;
> -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.lambda.ElementValueTraversal;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.FunctionTraverser;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.PredicateTraverser;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.TokenTraversal;
> -import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
> +import org.apache.tinkerpop.gremlin.process.traversal.*;
> +import org.apache.tinkerpop.gremlin.process.traversal.lambda.*;
> 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.TraversalParent;
> -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.ConjunctionStep;
> -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.DropStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
> -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.NotStep;
> -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.SampleGlobalStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TailGlobalStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
> -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.CoalesceStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantStep;
> -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.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.MapKeysStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapValuesStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep;
> -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.PropertyKeyStep;
> -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.TailLocalStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalFlatMapStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalMapStep;
> -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.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.TraversalSideEffectStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
> -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.HasContainer;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.util.NoOpBarrierStep;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.util.TraversalComparator;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.branch.*;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.*;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.*;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.util.*;
> import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
> -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.Property;
> -import org.apache.tinkerpop.gremlin.structure.PropertyType;
> -import org.apache.tinkerpop.gremlin.structure.T;
> -import org.apache.tinkerpop.gremlin.structure.Vertex;
> -import org.apache.tinkerpop.gremlin.structure.VertexProperty;
> +import org.apache.tinkerpop.gremlin.structure.*;
> import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
>
> -import java.util.Arrays;
> -import java.util.Comparator;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Map;
> -import java.util.Optional;
> -import java.util.function.BiFunction;
> -import java.util.function.BinaryOperator;
> -import java.util.function.Consumer;
> -import java.util.function.Function;
> -import java.util.function.Predicate;
> +import java.util.*;
> +import java.util.function.*;
>
> /**
> * @author Marko A. Rodriguez (http://markorodriguez.com)
> @@ -517,14 +402,18 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
> return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
> }
>
> + public default GraphTraversal<S, Integer> loops() {
> + return this.asAdmin().addStep(new LoopsStep<>(this.asAdmin()));
> + }
> +
> /**
> * Map the {@link Traverser} to a {@link Map} projection of sideEffect values, map values, and/or path values.
> *
> - * @param pop if there are multiple objects referenced in the path, the {@link Pop} to use.
> + * @param pop if there are multiple objects referenced in the path, the {@link Pop} to use.
> * @param selectKey1 the first key to project
> * @param selectKey2 the second key to project
> * @param otherSelectKeys the third+ keys to project
> - * @param <E2> the type of the objects projected
> + * @param <E2> the type of the objects projected
> * @return the traversal with an appended {@link SelectStep}.
> */
> public default <E2> GraphTraversal<S, Map<String, E2>> select(final Pop pop, final String selectKey1, final String selectKey2, String... otherSelectKeys) {
> @@ -541,7 +430,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
> * @param selectKey1 the first key to project
> * @param selectKey2 the second key to project
> * @param otherSelectKeys the third+ keys to project
> - * @param <E2> the type of the objects projected
> + * @param <E2> the type of the objects projected
> * @return the traversal with an appended {@link SelectStep}.
> */
> public default <E2> GraphTraversal<S, Map<String, E2>> select(final String selectKey1, final String selectKey2, String... otherSelectKeys) {
> @@ -983,7 +872,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
> }
>
> public default GraphTraversal<S, E> times(final int maxLoops) {
> - return this.until(new LoopTraversal(maxLoops));
> + return this.until(__.loops().is(maxLoops));
> }
>
> public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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
> index 3d49d7a..e2d9e80 100644
> --- 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
> @@ -18,28 +18,14 @@
> */
> package org.apache.tinkerpop.gremlin.process.traversal.dsl.graph;
>
> -import org.apache.tinkerpop.gremlin.process.traversal.P;
> -import org.apache.tinkerpop.gremlin.process.traversal.Path;
> -import org.apache.tinkerpop.gremlin.process.traversal.Pop;
> -import org.apache.tinkerpop.gremlin.process.traversal.Scope;
> -import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
> -import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
> +import org.apache.tinkerpop.gremlin.process.traversal.*;
> 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.T;
> -import org.apache.tinkerpop.gremlin.structure.Vertex;
> -import org.apache.tinkerpop.gremlin.structure.VertexProperty;
> +import org.apache.tinkerpop.gremlin.structure.*;
>
> import java.util.Iterator;
> import java.util.List;
> import java.util.Map;
> -import java.util.function.BiFunction;
> -import java.util.function.BinaryOperator;
> -import java.util.function.Consumer;
> -import java.util.function.Function;
> -import java.util.function.Predicate;
> +import java.util.function.*;
>
> /**
> * @author Marko A. Rodriguez (http://markorodriguez.com)
> @@ -301,6 +287,13 @@ public class __ {
> }
>
> /**
> + * @see {@link GraphTraversal#loops()}
> + */
> + public static <A> GraphTraversal<A, Integer> loops() {
> + return __.<A>start().loops();
> + }
> +
> + /**
> * @see {@link GraphTraversal#select(Pop, String)}
> */
> public static <A, B> GraphTraversal<A, B> select(final Pop pop, final String selectKey) {
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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
> deleted file mode 100644
> index 59321f2..0000000
> --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.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.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 + ')';
> - }
> -
> - @Override
> - public int hashCode() {
> - return this.getClass().hashCode() ^ Long.hashCode(this.maxLoops);
> - }
> -}
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
> ----------------------------------------------------------------------
> diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
> index 3fd974f..bd4ef03 100644
> --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
> +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java
> @@ -31,15 +31,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.ConjunctionP;
> import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
> import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
>
> -import java.util.ArrayList;
> -import java.util.Collection;
> -import java.util.Collections;
> -import java.util.EnumSet;
> -import java.util.HashSet;
> -import java.util.Iterator;
> -import java.util.List;
> -import java.util.Optional;
> -import java.util.Set;
> +import java.util.*;
>
> /**
> * @author Marko A. Rodriguez (http://markorodriguez.com)
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStep.java
> ----------------------------------------------------------------------
> diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStep.java
> new file mode 100644
> index 0000000..2db9ab9
> --- /dev/null
> +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStep.java
> @@ -0,0 +1,37 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements. See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership. The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License. You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either 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;
> +
> +/**
> + * @author Daniel Kuppitz (http://gremlin.guru)
> + */
> +public final class LoopsStep<S> extends MapStep<S, Integer> {
> +
> + public LoopsStep(final Traversal.Admin traversal) {
> + super(traversal);
> + }
> +
> + @Override
> + protected Integer map(final Traverser.Admin<S> traverser) {
> + return traverser.loops();
> + }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStepTest.java
> ----------------------------------------------------------------------
> diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStepTest.java
> new file mode 100644
> index 0000000..ea11673
> --- /dev/null
> +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsStepTest.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.map;
> +
> +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
> +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
> +import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest;
> +
> +import java.util.Collections;
> +import java.util.List;
> +
> +/**
> + * @author Daniel Kuppitz (http://gremlin.guru)
> + */
> +public class LoopsStepTest extends StepTest {
> +
> + @Override
> + protected List<Traversal> getTraversals() {
> + return Collections.singletonList(__.loops());
> + }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyLoopsTest.groovy
> ----------------------------------------------------------------------
> diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyLoopsTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyLoopsTest.groovy
> new file mode 100644
> index 0000000..6704a51
> --- /dev/null
> +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyLoopsTest.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.map
> +
> +import org.apache.tinkerpop.gremlin.process.traversal.Path
> +import org.apache.tinkerpop.gremlin.process.traversal.Traversal
> +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
> +import org.apache.tinkerpop.gremlin.structure.Vertex
> +
> +/**
> + * @author Daniel Kuppitz (http://gremlin.guru)
> + */
> +public abstract class GroovyLoopsTest {
> +
> + public static class Traversals extends LoopsTest {
> +
> + @Override
> + Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX(
> + final Object v1Id) {
> + TraversalScriptHelper.compute("g.V(v1Id).repeat(__.both.simplePath).until(has('name', 'peter').or.loops.is(3)).has('name', 'peter').path.by('name')", g, "v1Id", v1Id)
> + }
> +
> + @Override
> + Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX(
> + final Object v1Id) {
> + TraversalScriptHelper.compute("g.V(v1Id).repeat(__.both.simplePath).until(has('name', 'peter').or.loops.is(2)).has('name', 'peter').path.by('name')", g, "v1Id", v1Id)
> + }
> +
> + @Override
> + Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX(
> + final Object v1Id) {
> + TraversalScriptHelper.compute("g.V(v1Id).repeat(__.both.simplePath).until(has('name', 'peter').and.loops.is(3)).has('name', 'peter').path.by('name')", g, "v1Id", v1Id)
> + }
> +
> + @Override
> + Traversal<Vertex, String> get_g_V_emitXhasXname_markoX_or_loops_isX2XX_repeatXoutX_valuesXnameX() {
> + TraversalScriptHelper.compute("g.V.emit(has('name', 'marko').or.loops.is(2)).repeat(__.out).name", g)
> + }
> + }
> +}
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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
> index 4efbbcf..1edbc54 100644
> --- 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
> @@ -35,7 +35,7 @@ public abstract class GroovyProfileTest {
> }
>
> @Override
> - public Traversal<Vertex, Vertex> get_g_V_repeat_both_profile() {
> + public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile() {
> TraversalScriptHelper.compute("g.V.repeat(__.both()).times(3).profile()", g);
> }
>
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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 6a24469..dfde060 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
> @@ -105,6 +105,7 @@ public class GroovyProcessComputerSuite extends ProcessComputerSuite {
> GroovyConstantTest.Traversals.class,
> GroovyCountTest.Traversals.class,
> GroovyFoldTest.Traversals.class,
> + GroovyLoopsTest.Traversals.class,
> GroovyMapTest.Traversals.class,
> GroovyMapKeysTest.Traversals.class,
> GroovyMapValuesTest.Traversals.class,
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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 ef97c97..729b5df 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
> @@ -77,6 +77,7 @@ public class GroovyProcessStandardSuite extends ProcessStandardSuite {
> GroovyConstantTest.Traversals.class,
> GroovyCountTest.Traversals.class,
> GroovyFoldTest.Traversals.class,
> + GroovyLoopsTest.Traversals.class,
> GroovyMapTest.Traversals.class,
> GroovyMapKeysTest.Traversals.class,
> GroovyMapValuesTest.Traversals.class,
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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 a14fc25..f859267 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
> @@ -41,27 +41,7 @@ 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.TailTest;
> 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.CoalesceTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.ConstantTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapKeysTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
> -import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapValuesTest;
> -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.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.map.*;
> 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;
> @@ -130,6 +110,7 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
> CountTest.Traversals.class,
> FlatMapTest.Traversals.class,
> FoldTest.Traversals.class,
> + LoopsTest.Traversals.class,
> MapTest.Traversals.class,
> MapKeysTest.Traversals.class,
> MapValuesTest.Traversals.class,
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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 4c9d8e6..c380391 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
> @@ -83,6 +83,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
> CountTest.Traversals.class,
> FlatMapTest.Traversals.class,
> FoldTest.Traversals.class,
> + LoopsTest.Traversals.class,
> MapTest.Traversals.class,
> MapKeysTest.Traversals.class,
> MapValuesTest.Traversals.class,
> @@ -168,6 +169,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
> CountTest.class,
> FlatMapTest.class,
> FoldTest.class,
> + LoopsTest.class,
> MapTest.class,
> MapKeysTest.class,
> MapValuesTest.class,
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsTest.java
> ----------------------------------------------------------------------
> diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsTest.java
> new file mode 100644
> index 0000000..298260d
> --- /dev/null
> +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LoopsTest.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.GremlinProcessRunner;
> +import org.apache.tinkerpop.gremlin.process.traversal.Path;
> +import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
> +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
> +import org.apache.tinkerpop.gremlin.structure.Vertex;
> +import org.junit.Test;
> +import org.junit.runner.RunWith;
> +
> +import java.util.Arrays;
> +
> +import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
> +import static org.junit.Assert.*;
> +
> +/**
> + * @author Daniel Kuppitz (http://gremlin.guru)
> + */
> +@RunWith(GremlinProcessRunner.class)
> +public abstract class LoopsTest extends AbstractGremlinProcessTest {
> +
> + /*
> + g.V(1).repeat(both().simplePath()).until(has('name', 'peter').or().loops().is(3)).has('name', 'peter').path().by('name').
> + forEachRemaining(System.out::println);
> + System.out.println('--');
> + g.V(v1Id).repeat(both().simplePath()).until(has('name', 'peter').or().loops().is(2)).has('name', 'peter').path().by('name').
> + forEachRemaining(System.out::println);
> + System.out.println('--');
> + g.V(v1Id).repeat(both().simplePath()).until(has('name', 'peter').and().loops().is(3)).has('name', 'peter').path().by('name').
> + forEachRemaining(System.out::println);
> + System.out.println('--');
> + g.V().emit(has('name', 'marko').or().loops().is(2)).repeat(out()).values('name').
> + forEachRemaining(System.out::println);
> + */
> + public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX(final Object v1Id);
> +
> + public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX(final Object v1Id);
> +
> + public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX(final Object v1Id);
> +
> + public abstract Traversal<Vertex, String> get_g_V_emitXhasXname_markoX_or_loops_isX2XX_repeatXoutX_valuesXnameX();
> +
> + @Test
> + @LoadGraphWith(MODERN)
> + public void g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX() {
> + final Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX(convertToVertexId("marko"));
> + printTraversalForm(traversal);
> + int paths = 0;
> + boolean has3 = false, has4 = false;
> + while (traversal.hasNext()) {
> + final Path path = traversal.next();
> + switch (path.size()) {
> + case 3:
> + assertEquals("marko", path.get(0));
> + assertEquals("lop", path.get(1));
> + assertEquals("peter", path.get(2));
> + has3 = true;
> + break;
> + case 4:
> + assertEquals("marko", path.get(0));
> + assertEquals("josh", path.get(1));
> + assertEquals("lop", path.get(2));
> + assertEquals("peter", path.get(3));
> + has4 = true;
> + break;
> + }
> + paths++;
> + }
> + assertTrue(has3 && has4);
> + assertEquals(2, paths);
> + }
> +
> + @Test
> + @LoadGraphWith(MODERN)
> + public void g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX() {
> + final Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX(convertToVertexId("marko"));
> + printTraversalForm(traversal);
> + assertTrue(traversal.hasNext());
> + final Path path = traversal.next();
> + assertEquals(3, path.size());
> + assertEquals("marko", path.get(0));
> + assertEquals("lop", path.get(1));
> + assertEquals("peter", path.get(2));
> + assertFalse(traversal.hasNext());
> + }
> +
> + @Test
> + @LoadGraphWith(MODERN)
> + public void g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX() {
> + final Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX(convertToVertexId("marko"));
> + printTraversalForm(traversal);
> + assertTrue(traversal.hasNext());
> + final Path path = traversal.next();
> + assertEquals(4, path.size());
> + assertEquals("marko", path.get(0));
> + assertEquals("josh", path.get(1));
> + assertEquals("lop", path.get(2));
> + assertEquals("peter", path.get(3));
> + assertFalse(traversal.hasNext());
> + }
> +
> + @Test
> + @LoadGraphWith(MODERN)
> + public void g_V_emitXhasXname_markoX_or_loops_isX2XX_repeatXoutX_valuesXnameX() {
> + final Traversal<Vertex, String> traversal = get_g_V_emitXhasXname_markoX_or_loops_isX2XX_repeatXoutX_valuesXnameX();
> + printTraversalForm(traversal);
> + checkResults(Arrays.asList("marko", "ripple", "lop"), traversal);
> + }
> +
> + public static class Traversals extends LoopsTest {
> +
> + @Override
> + public Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX3XX_hasXname_peterX_path_byXnameX(final Object v1Id) {
> + return g.V(v1Id).repeat(__.both().simplePath()).until(__.has("name", "peter").or().loops().is(3)).has("name", "peter").path().by("name");
> + }
> +
> + @Override
> + public Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_or_loops_isX2XX_hasXname_peterX_path_byXnameX(final Object v1Id) {
> + return g.V(v1Id).repeat(__.both().simplePath()).until(__.has("name", "peter").or().loops().is(2)).has("name", "peter").path().by("name");
> + }
> +
> + @Override
> + public Traversal<Vertex, Path> get_g_VX1X_repeatXboth_simplePathX_untilXhasXname_peterX_and_loops_isX3XX_hasXname_peterX_path_byXnameX(final Object v1Id) {
> + return g.V(v1Id).repeat(__.both().simplePath()).until(__.has("name", "peter").and().loops().is(3)).has("name", "peter").path().by("name");
> + }
> +
> + @Override
> + public Traversal<Vertex, String> get_g_V_emitXhasXname_markoX_or_loops_isX2XX_repeatXoutX_valuesXnameX() {
> + return g.V().emit(__.has("name", "marko").or().loops().is(2)).repeat(__.out()).values("name");
> + }
> + }
> +}
> \ No newline at end of file
>
> http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/d63d4c50/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
> index 0a76d4e..84fa2bb 100644
> --- 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
> @@ -57,7 +57,7 @@ import static org.junit.Assert.*;
> public abstract class ProfileTest extends AbstractGremlinProcessTest {
> public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profile();
>
> - public abstract Traversal<Vertex, Vertex> get_g_V_repeat_both_profile();
> + public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile();
>
> public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
>
> @@ -189,7 +189,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
> @LoadGraphWith(MODERN)
> @IgnoreEngine(TraversalEngine.Type.COMPUTER)
> public void g_V_repeat_both_modern_profile() {
> - final Traversal<Vertex, Vertex> traversal = get_g_V_repeat_both_profile();
> + final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profile();
> printTraversalForm(traversal);
>
> traversal.iterate();
> @@ -209,13 +209,24 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
> assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
>
> // Test the nested global metrics of the repeat step
> - final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
> + final Metrics loopsStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
> + assertEquals(96, loopsStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
> + assertEquals(96, loopsStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> + assertTrue("Times should be positive.", loopsStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
> +
> + final Metrics isStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
> + // TODO: the following 2 assertions are pretty questionable (see issue TINKERPOP3-763)
> + assertEquals(0, isStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
> + assertEquals(0, isStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> + assertTrue("Times should be positive.", isStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
> +
> + final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[2];
> assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
> assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
>
> - final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
> + final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[3];
> assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
> assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
> @@ -319,7 +330,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
> }
>
> @Override
> - public Traversal<Vertex, Vertex> get_g_V_repeat_both_profile() {
> + public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile() {
> return g.V().repeat(both()).times(3).profile();
> }
>
>