I'd say TinkerGraph demonstrates the expected behavior - I guess we don't have a test that enforces that?
On Sat, Jan 21, 2017 at 3:23 PM, pieter-gmail <pieter.mar...@gmail.com> wrote: > Ok, thanks. > > Its tricky as it messes with the laziness and visibility of the queries. > Can really think of a solution though. > > Cheers > Pieter > > On 21/01/2017 21:14, Daniel Kuppitz wrote: > > Hi Pieter, > > > > forEachRemaining iterates over the result and hence I would expect the > > result to be 2. Otherwise you would / should end up with an endless loop. > > However, the same behavior is seen when you replace forEachRemaining > with a > > sideEffect lambda step. Not sure what the expected behavior is / should > be, > > but I think I prefer the way it's done now. > > > > Cheers, > > Daniel > > > > > > On Sat, Jan 21, 2017 at 7:30 PM, pieter-gmail <pieter.mar...@gmail.com> > > wrote: > > > >> Hi, > >> > >> I need to clarify the expected semantics of gremlin's lazy iteration > >> semantics. > >> The following gremlin is what highlighted it. > >> > >> ``` > >> @Test > >> public void testLazy() { > >> final TinkerGraph graph = TinkerGraph.open(); > >> final Vertex a1 = graph.addVertex(T.label, "A"); > >> final Vertex b1 = graph.addVertex(T.label, "B"); > >> final Vertex c1 = graph.addVertex(T.label, "C"); > >> a1.addEdge("ab", b1); > >> a1.addEdge("ac", c1); > >> > >> AtomicInteger count = new AtomicInteger(0); > >> graph.traversal().V(a1).bothE().forEachRemaining(edge -> { > >> a1.addEdge("ab", b1); > >> //a1.addEdge("ac", c1); > >> count.getAndIncrement(); > >> }); > >> Assert.assertEquals(2, count.get()); > >> } > >> > >> ``` > >> > >> On TinkerGraph the count is always 2. > >> > >> On Sqlg's Postgresql dialect the `bothE` first traverses the 'ac' edges > >> adds in a 'ab' edge and then traverses the 'ab' edges and ends up with a > >> count of 3. > >> > >> On Sqlg's HSQLDB and H2 dialects the `bothE` first traverses the 'ab' > >> edges adds in a 'ab' edge then traverses the 'ac' edges and ends up with > >> a count of 2. > >> > >> So for Sqlg the added edge will be seen by subsequent traversals due to > >> the lazy nature but the order affects the result. > >> > >> TinkerGraph seems to get both 'ab' and 'ac' edges upfront and does not > >> subsequently see the added edge. A bit like it has a hidden barrier step > >> before the `forEachRemaining`. > >> > >> What is the expected semantics in this situation? > >> Is a traversal that traverses an element that has been modified earlier > >> in the same traversal suppose to see the change? > >> > >> Thanks > >> Pieter > >> > >> > >