[ https://issues.apache.org/jira/browse/TINKERPOP-1506?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Marko A. Rodriguez reassigned TINKERPOP-1506: --------------------------------------------- Assignee: Marko A. Rodriguez > 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 > Assignee: Marko A. Rodriguez > Fix For: 3.3.0 > > > 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)