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, [email protected] 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 <[email protected]> > Authored: Fri Jul 31 23:13:13 2015 +0200 > Committer: Daniel Kuppitz <[email protected]> > 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(); > } > >
