[ 
https://issues.apache.org/jira/browse/TINKERPOP-2980?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ken Hu closed TINKERPOP-2980.
-----------------------------
    Fix Version/s: 3.8.0
         Assignee: Ken Hu
       Resolution: Fixed

This is no longer relevant after the fix in TINKEROP-3196

> LocalStep's "object-local" behavior is not clearly described in the doc
> -----------------------------------------------------------------------
>
>                 Key: TINKERPOP-2980
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2980
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: documentation
>    Affects Versions: 3.6.5
>            Reporter: Norio Akagi
>            Assignee: Ken Hu
>            Priority: Major
>             Fix For: 3.8.0
>
>
> LocalStep is supposed to handle solutions locally, but what it actually does 
> is unclear from the documentation.
> What LocalStep actually does is,
>  * it just processes {{TraverserSet}} as it is (they are kept bulked, without 
> being split).
>  * So when there are same elements in the previous Step's output and as long 
> as they are bulked into a {{{}TraverserSet{}}}, it is processed in 
> "object-local" manner.
>  * How {{TraverserSet}} is bulked ? It relies upon {{LazyBarrierStrategy}} 
> which inserts {{{}noOpBarrierStep{}}}, that handles the bulking.
>  * Or we can explicitly add {{barrier()}} step to make the bulking happen
> This creates some discrepancies that users may not easily see. As an 
> illustration, this is the regular "object-local" behavior.
> {noformat}
> gremlin> g.V().in().out()
> ==>v[3]
> ==>v[3]
> ==>v[3]
> ==>v[2]
> ==>v[2]
> ==>v[2]
> ==>v[4]
> ==>v[4]
> ==>v[4]
> ==>v[5]
> ==>v[5]
> ==>v[3]
> ==>v[3]
> ==>v[3]
> gremlin> g.V().in().out().local(count())
> ==>6
> ==>3
> ==>3
> ==>2{noformat}
> You can see that the same objects (vertices) are processed locally. However, 
> there is a case that it does not work in the way.
> For example, you can disable the Strategy
> {noformat}
> gremlin> 
> g.withoutStrategies(LazyBarrierStrategy.class).V().in().out().local(count())
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1
> ==>1{noformat}
> then we are seeing "solution-local" behavior, each single solution processed 
> locally. Likewise, there is a case that LazyBarrierStrategy does not kick in.
> {noformat}
> gremlin> g.V(1,1,1).local(count())
> ==>1
> ==>1
> ==>1{noformat}
> It relies upon {{LazyBarrierStrategy}} but it would not be apparent to users. 
> Furthermore, GraphProviders have freedom to drop any TinkerPop's strategies, 
> so if {{LazyBarrierStrategy}} is dropped, local always works in 
> solution-local manner.
> There is a description in the doc that users may use {{map}} or 
> {{{}flatMap{}}}. This can work, but many users may already be using local for 
> "solution-local" without noticing. Also there are subtle differences among 
> them.
> (1) {{map}} only emits one solution per each incoming input, while working in 
> solution-local
> {noformat}
> gremlin> g.V().map(out()).path()
> ==>[v[1],v[3]]
> ==>[v[4],v[5]]
> ==>[v[6],v[3]]{noformat}
> (2) {{flatMap }}can stream all solutions and solution-local, but only leaves 
> the last element in Path unlike {{local}}
> {noformat}
> gremlin> g.V().flatMap(out().out()).path()
> ==>[v[1],v[5]]
> ==>[v[1],v[3]]{noformat}
> This {{flatMap's}} behavior is not documented but there are use-cases that 
> users intentionally use flatMap for this feature.
> So while in the documentation we recommend use these 2 instead of local, in 
> some case it's not easy to migrate. At this point, I think
>  * We should clarify in the doc that
>  ** What {{barrier() / noOpBarrierStep}} does and how it makes impact on 
> {{local()}}
>  ** How{{ LazyBarrierStrategy }}is related to {{barrier() / noOpBarrierStep}} 
>  ** what is different between {{{}map{}}}, {{flatMap}} and {{{}local{}}}, 
> including Path handling
> and instead of describing local() as internal use when implementing Strategy, 
> we should tell users to use it whenever they understand how it works and what 
> they are doing with local().



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to