[ 
https://issues.apache.org/jira/browse/TINKERPOP-1429?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15493448#comment-15493448
 ] 

Marko A. Rodriguez edited comment on TINKERPOP-1429 at 9/15/16 2:22 PM:
------------------------------------------------------------------------

I don't quite understand the toy graph example from @dkuppitz, but what I do 
notice is that a reducing barrier step is being used inside a local child 
traversal. {{where}} compiles to {{TraversalFilterStep}} which resets its 
internal "local" child traversal after each incoming traverser is processed. 
Thus, for each incoming traverser, the a new {{count()}} is calculated which, 
at most will be 1.

Here is a simple example on the MODERN graph.

{code}
// GOOD
gremlin> 
g.V().branch(label()).option("software",count()).option("person",count())
==>2
==>4
// GOOD
gremlin> 
g.V().branch(label()).option("software",count().is(2)).option("person",count().is(4))
==>2
==>4
// UNEXPECTED
gremlin> 
g.V().where(branch(label()).option("software",count().is(2)).option("person",count().is(4)))
gremlin>
{code}

Now watch this:

{code}
gremlin> 
g.V().where(branch(label()).option("software",count().is(1)).option("person",count().is(4)))
==>v[3]
==>v[5]
{code}

For that local traversal, there is 1 software! Thus, {{v[3]}} and {{v[5]}} go 
through the filter.

I know this is confusing to users. I don't know how to make clear that 
distinction between global and local processing, where *global* means, process 
the entire stream and *local* means process the stream created by a single 
input traverser. Both are important concepts and are needed, but it just 
entails that sometimes a nested traversal is "per traverser" (local) and 
sometimes "per traversers" (global). ......

Does this clear up the ISSUE or is there still something deeper I'm missing?



was (Author: okram):
I don't quite understand the toy graph example from @dkuppitz, but what I do 
notice is that a reducing barrier step is being used inside a local child 
option. {{where}} compiles to {{TraversalFilterStep}} which resets its internal 
"local" child traversal after each incoming traverser is processed. Thus, for 
each incoming traverser, the a new {{count()}} is calculated which, at most 
will be 1.

Here is a simple example on the MODERN graph.

{code}
// GOOD
gremlin> 
g.V().branch(label()).option("software",count()).option("person",count())
==>2
==>4
// GOOD
gremlin> 
g.V().branch(label()).option("software",count().is(2)).option("person",count().is(4))
==>2
==>4
// UNEXPECTED
gremlin> 
g.V().where(branch(label()).option("software",count().is(2)).option("person",count().is(4)))
gremlin>
{code}

Now watch this:

{code}
gremlin> 
g.V().where(branch(label()).option("software",count().is(1)).option("person",count().is(4)))
==>v[3]
==>v[5]
{code}

For that local traversal, there is 1 software! Thus, {{v[3]}} and {{v[5]}} go 
through the filter.

I know this is confusing to users. I don't know how to make clear that 
distinction between global and local processing, where *global* means, process 
the entire stream and *local* means process the stream created by a single 
input traverser. Both are important concepts and are needed, but it just 
entails that sometimes a nested traversal is "per traverser" (local) and 
sometimes "per traversers" (global). ......

Does this clear up the ISSUE or is there still something deeper I'm missing?


> Branch step inside where step misbehaves
> ----------------------------------------
>
>                 Key: TINKERPOP-1429
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-1429
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: process
>    Affects Versions: 3.0.1-incubating
>            Reporter: Jordi Chacon
>
> https://groups.google.com/forum/#!topic/gremlin-users/0LSvVRtjERg



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to