Hi, `coalesce` was discussed way back when `optional` was first discussed. @Daniel's comment seems to show that `coalesce` was not what we wanted. @Marko's comment indicated "Ah smart. The reason choose works and coalesce doesn't is because one uses globalTraversals and the other uses localTraversals"
Do there comments still hold? Thanks Pieter On 21/10/2016 23:42, Marko A. Rodriguez (JIRA) wrote: > [ > https://issues.apache.org/jira/browse/TINKERPOP-1506?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15596463#comment-15596463 > ] > > Marko A. Rodriguez commented on TINKERPOP-1506: > ----------------------------------------------- > > Huh. I just reailzed we can implement {{optional()}} using {{ColesceStep}} > and we don't have this problem. > > {code} > gremlin> g.inject(1).coalesce(addV('twin'),identity()) > ==>v[0] > gremlin> g.V() > ==>v[0] > {code} > > Thus, {{optional(x)}} -> {{coalesce(x,identity())}}. Easy fix. Any objections > to this direction? > > >> Optional/Coalesce should not allow sideEffect traversals. >> --------------------------------------------------------- >> >> Key: TINKERPOP-1506 >> URL: https://issues.apache.org/jira/browse/TINKERPOP-1506 >> Project: TinkerPop >> Issue Type: Improvement >> Components: process >> Affects Versions: 3.1.4, 3.2.2 >> Reporter: Marko A. Rodriguez >> >> It took me a long time to realize what was wrong with a traversal I wrote >> that used {{optional(blah.sideEffect.blah)}}. {{optional()}} maps to >> {{ChooseStep}} under the hood and the provide traversal is first tested for >> a {{hasNext()}}. If so, the it plays itself out. The problem is that if >> there is a side-effect in the traversal child, then it gets executed twice. >> {code} >> gremlin> g = TinkerGraph.open().traversal() >> ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] >> gremlin> g.inject(1).optional(addV('twin')) >> ==>v[1] >> gremlin> g.V().valueMap(true) >> ==>[id:0,label:twin] >> ==>[id:1,label:twin] >> {code} >> We should NOT allow {{optional()}} to have {{SideEffectStep}} steps in it so >> as not to cause unexpected behavior. {{StandardVerificationStrategy}} can >> analyze and throw an exception if necessary. >> Also, {{coalesce()}} has a similar problem, though perhaps it can be a >> useful 'technique.' >> {code} >> gremlin> g = TinkerGraph.open().traversal() >> ==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard] >> gremlin> g.inject(1).coalesce(addV('twin1').limit(0), addV('twin2')) >> ==>v[1] >> gremlin> g.V().valueMap(true) >> ==>[id:0,label:twin1] >> ==>[id:1,label:twin2] >> gremlin> >> {code} > > > -- > This message was sent by Atlassian JIRA > (v6.3.4#6332)