I don't see any issues. Which version are you talking about?
*gremlin> Gremlin.version()*
*==>3.2.7-SNAPSHOT*
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).repeat(out()).until(__.not(outE())).values('name')
==>lop
==>vadas
==>ripple
==>lop
gremlin> g.V(1).repeat(out()).until(outE().count().is(0)).values('name')
==>lop
==>vadas
==>ripple
==>lop
gremlin>
g.V(1).repeat(out()).until(__.not(outE())).values('name').it
erate().toString()
==>[TinkerGraphStep(vertex,[1]), RepeatStep([VertexStep(OUT,vertex),
RepeatEndStep],until([NotStep([VertexStep(OUT,edge)])]),emit(false)),
PropertiesStep([name],value)]
gremlin>
g.V(1).repeat(out()).until(outE().count().is(0)).values('nam
e').iterate().toString()
==>[TinkerGraphStep(vertex,[1]), RepeatStep([VertexStep(OUT,vertex),
RepeatEndStep],until([NotStep([VertexStep(OUT,edge)])]),emit(false)),
PropertiesStep([name],value)]
*gremlin> Gremlin.version()*
*==>3.3.1-SNAPSHOT*
gremlin> g = TinkerFactory.createModern().traversal()
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V(1).repeat(out()).until(__.not(outE())).values('name')
==>lop
==>vadas
==>ripple
==>lop
gremlin> g.V(1).repeat(out()).until(outE().count().is(0)).values('name')
==>lop
==>vadas
==>ripple
==>lop
gremlin>
g.V(1).repeat(out()).until(__.not(outE())).values('name').it
erate().toString()
==>[TinkerGraphStep(vertex,[1]), RepeatStep([VertexStep(OUT,vertex),
RepeatEndStep],until([NotStep([VertexStep(OUT,edge)])]),emit(false)),
PropertiesStep([name],value)]
gremlin>
g.V(1).repeat(out()).until(outE().count().is(0)).values('nam
e').iterate().toString()
==>[TinkerGraphStep(vertex,[1]), RepeatStep([VertexStep(OUT,vertex),
RepeatEndStep],until([NotStep([VertexStep(OUT,edge)])]),emit(false)),
PropertiesStep([name],value)]
Cheers,
Daniel
On Mon, Oct 30, 2017 at 1:53 AM, pieter gmail <pieter.mar...@gmail.com>
wrote:
Hi,
Whilst optimizing the NotStep I came across what looks to me like a bug
in
TraversalHelper.replaceStep or perhaps rather in CountStrategy.
The test below shows the bug.
@Test
public void g_VX1X_repeatXoutX_untilXoutE_count_isX0XX_name() {
Graph graph = TinkerFactory.createModern();
final Traversal<Vertex, String> traversal1 = graph.traversal()
.V(convertToVertexId(graph, "marko"))
.repeat(__.out())
.until(__.not(__.outE()))
.values("name");
checkResults(Arrays.asList("lop", "lop", "ripple", "vadas"),
traversal1);
List<VertexStep> vertexSteps = TraversalHelper.getStepsOfAssi
gnableClassRecursively(VertexStep.class, traversal1.asAdmin());
VertexStep vertexStep = vertexSteps.stream().filter(s ->
s.returnsEdge()).findAny().get();
Assert.assertEquals(EmptyStep.instance(),
vertexStep.getPreviousStep());
final Traversal<Vertex, String> traversal2 = graph.traversal()
.V(convertToVertexId(graph, "marko"))
.repeat(__.out())
.until(__.outE().count().is(0))
.values("name");
checkResults(Arrays.asList("lop", "lop", "ripple", "vadas"),
traversal2);
vertexSteps = TraversalHelper.getStepsOfAssi
gnableClassRecursively(VertexStep.class, traversal2.asAdmin());
vertexStep = vertexSteps.stream().filter(s ->
s.returnsEdge()).findAny().get();
//This fails because the vertexStep's previous step is the
NotStepwhen it should be an EmptyStep.
Assert.assertEquals(EmptyStep.instance(),
vertexStep.getPreviousStep());
}
traversal1 and traversal2 should be the same as the CountStrategy will
replace the __.outE().count().is(0) with __.not(__.outE())
The CountStrategy does what its suppose to do however then it calls
TraversalHelper.replaceStep(prev, new NotStep<>(traversal, inner),
traversal); the traversal's VertexStep gets its previousStep set to the
NotStep. This is because of the way TraversalHelper.replaceStep is
implemented.
I am not sure whether the fix should be in replaceStep or rather in
CountStrategy.
Thanks
Pieter