[
https://issues.apache.org/jira/browse/TINKERPOP-1349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15353494#comment-15353494
]
Marko A. Rodriguez commented on TINKERPOP-1349:
-----------------------------------------------
{code}
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> graph.io(gryo()).readGraph('data/grateful-dead.kryo')
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:808 edges:8049], standard]
gremlin> g.getStrategies().removeStrategies(RepeatUnrollStrategy)
==>strategies[ConnectiveStrategy, RangeByIsCountStrategy,
IdentityRemovalStrategy, IncidentToAdjacentStrategy,
AdjacentToIncidentStrategy, FilterRankingStrategy, MatchPredicateStrategy,
TinkerGraphStepStrategy, ProfileStrategy, StandardVerificationStrategy]
gremlin> //
==>true
gremlin> clock(5){g.V().repeat(out()).times(3).count().next()}
==>262.0667158
gremlin> clock(5){g.V().out().out().out().count().next()}
==>909.0318090000001
gremlin>
clock(5){g.V().out().barrier().out().barrier().out().barrier().count().next()}
==>6.0667501999999995
gremlin>
{code}
{{RepeatStep}} is a lazy barrier in that it will only barrier up to the full
child traversal being drained as it can't "back drain" a traversal.
Finally, with {{RepeatUnrollStrategy}} added back:
{code}
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> graph.io(gryo()).readGraph('data/grateful-dead.kryo')
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[tinkergraph[vertices:808 edges:8049], standard]
gremlin> //
==>true
gremlin> clockWithResult(5){g.V().repeat(out()).times(3).count().next()}
==>5.263927799999999
==>14465066
gremlin>
gremlin> g.V().repeat(out()).times(3).count().explain()
==>Traversal Explanation
================================================================================================================================
Original Traversal [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
ConnectiveStrategy [D] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
RangeByIsCountStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
IdentityRemovalStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
IncidentToAdjacentStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
AdjacentToIncidentStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
FilterRankingStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
MatchPredicateStrategy [O] [GraphStep(vertex,[]),
RepeatStep([VertexStep(OUT,vertex), RepeatEndStep],until(loops(3)),emi
t(false)), CountGlobalStep]
RepeatUnrollStrategy [O] [GraphStep(vertex,[]),
VertexStep(OUT,vertex), NoOpBarrierStep, VertexStep(OUT,vertex), NoOpB
arrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, CountGlobalStep]
TinkerGraphStepStrategy [P] [TinkerGraphStep(vertex,[]),
VertexStep(OUT,vertex), NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, CountGlobalStep]
ProfileStrategy [F] [TinkerGraphStep(vertex,[]),
VertexStep(OUT,vertex), NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, CountGlobalStep]
StandardVerificationStrategy [V] [TinkerGraphStep(vertex,[]),
VertexStep(OUT,vertex), NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, CountGlobalStep]
Final Traversal [TinkerGraphStep(vertex,[]),
VertexStep(OUT,vertex), NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, VertexStep(OUT,vertex),
NoOpBarrierStep, CountGlobalStep]
gremlin>
{code}
Huh, just realized a nice optimization, if the step after last step of the
unroll is a {{BarrierStep}}, then the last {{NoOpBarrierStep}} is not needed.
> RepeatUnrollStrategy should unroll loops while maintaining equivalent
> semantics.
> --------------------------------------------------------------------------------
>
> Key: TINKERPOP-1349
> URL: https://issues.apache.org/jira/browse/TINKERPOP-1349
> Project: TinkerPop
> Issue Type: Improvement
> Components: process
> Affects Versions: 3.2.0-incubating
> Reporter: Marko A. Rodriguez
> Assignee: Marko A. Rodriguez
> Fix For: 3.2.0-incubating
>
>
> Create {{RepeatUnrollStrategy}} that will unroll patterns such as:
> {code}
> repeat(out()).times(3)
> // ->
> out().barrier().out().barrier().out().barrier()
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)