[ https://issues.apache.org/jira/browse/TINKERPOP-1506?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15597581#comment-15597581 ]
Daniel Kuppitz commented on TINKERPOP-1506: ------------------------------------------- These comments still hold true. {{optional}} and {{coalesce}} are not interchangeable. {noformat} gremlin> g.V().coalesce(out("knows"), identity()).coalesce(out("created"), identity()).path() ==>[v[1],v[2],v[2]] ==>[v[1],v[4],v[5]] ==>[v[1],v[4],v[3]] ==>[v[2],v[2],v[2]] ==>[v[3],v[3],v[3]] ==>[v[4],v[4],v[5]] ==>[v[4],v[4],v[3]] ==>[v[5],v[5],v[5]] ==>[v[6],v[6],v[3]] gremlin> g.V().optional(out("knows")).optional(out("created")).path() ==>[v[1],v[2]] ==>[v[1],v[4],v[5]] ==>[v[1],v[4],v[3]] ==>[v[2]] ==>[v[3]] ==>[v[4],v[5]] ==>[v[4],v[3]] ==>[v[5]] ==>[v[6],v[3]] {noformat} > 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)