Github user mpollmeier commented on the issue:

    https://github.com/apache/tinkerpop/pull/715
  
    `emit` modifies the behaviour of the repeat traversal, and I am unsure why 
that is. Let me explain what I know and hopefully you or someone else can fill 
the blanks. 
    
    Let's take my toy graph `v5 <- v3 <- v1 <- v0 -> v2 -> v4 -> v6` since it's 
easier to see where you are with a simple println of the vertex. Without emit, 
this PR does what it's supposed to do: DFS. First the even numbers, then the 
odds. 
    
    ```
    graph = TinkerGraph.open()
    v0 = graph.addVertex("l0")
    v1 = graph.addVertex("l1")
    v2 = graph.addVertex("l1")
    v3 = graph.addVertex("l2")
    v4 = graph.addVertex("l2")
    v5 = graph.addVertex("l3")
    v6 = graph.addVertex("l3")
    v0.addEdge("e", v2)
    v2.addEdge("e", v4)
    v4.addEdge("e", v6)
    v0.addEdge("e", v1)
    v1.addEdge("e", v3)
    v3.addEdge("e", v5)
    graph.traversal().V(v0).repeat(sideEffect{println("inside repeat at " + 
it)}.out()).times(3)
    inside repeat at v[0]
    inside repeat at v[2]
    inside repeat at v[4]
    ==>v[6]
    inside repeat at v[1]
    inside repeat at v[3]
    ==>v[5]
    ```
    
    However if I add an `emit()` it becomes BFS again:
    
    ```
    graph.traversal().V(v0).emit().repeat(sideEffect{println("inside repeat at 
" + it)}.out()).times(3)
    ==>v[0]
    inside repeat at v[0]
    ==>v[2]
    inside repeat at v[2]
    ==>v[1]
    inside repeat at v[1]
    ==>v[4]
    inside repeat at v[4]
    ==>v[6]
    ==>v[3]
    inside repeat at v[3]
    ==>v[5]
    ```
    
    I tried to understand it in the debugger, and the core difference seems to 
be the behaviour of `this.starts.hasNext()` in 
`RepeatEndStep.standardAlgorithm`, which is an `ExpandableStepIterator`. 
    * without emit, `hasNext` finds that 
`this.hostStep.getPreviousStep().hasNext()` is true, because it asks it's 
`previousStep` (which is a `VertexStep(OUT)`), which in turns has some results 
for `processNextStart`. 
    * with emit, the above chain returns false, which in turn leads to a 
NoSuchElementException, which short-circuits and `while (true)` loop, which 
results in losing DFS semantics.
    
    I don't know where these different semantics derive from. 



---

Reply via email to