From f18c8b591df4ad7cf7a3295380a60e7f93944998 Mon Sep 17 00:00:00 2001 From: Dwitry Date: Fri, 12 Oct 2018 16:38:44 +0300 Subject: [PATCH] Bug: Keep traversal history when using `RANGE` Signed-off-by: Dwitry dwitry@users.noreply.github.com --- .../org/opencypher/gremlin/queries/RangeTest.java | 14 ++++++++++++++ .../translation/ir/rewrite/CosmosDbFlavor.scala | 2 +- .../translation/walker/ExpressionWalker.scala | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/testware/integration-tests/src/test/java/org/opencypher/gremlin/queries/RangeTest.java b/testware/integration-tests/src/test/java/org/opencypher/gremlin/queries/RangeTest.java index c3d3d117..48acf12c 100644 --- a/testware/integration-tests/src/test/java/org/opencypher/gremlin/queries/RangeTest.java +++ b/testware/integration-tests/src/test/java/org/opencypher/gremlin/queries/RangeTest.java @@ -19,6 +19,7 @@ import static java.util.Collections.emptyMap; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.groups.Tuple.tuple; import java.util.List; import java.util.Map; @@ -99,6 +100,19 @@ public void threeExpressions() throws Exception { .containsExactly(asList(2L, 4L)); } + @Test + public void keepTraversalHistory() throws Exception { + String cypher = "WITH ['a', 'b'] AS a UNWIND range(1, 2) as r RETURN r, a"; + List> results = submitAndGet(cypher); + + assertThat(results) + .extracting("r", "a") + .containsExactly( + tuple(1L, asList("a", "b")), + tuple(2L, asList("a", "b")) + ); + } + @Test public void compileTimeValidations() throws Exception { assertThatThrownBy(() -> submitAndGet("RETURN range(0, 10001) as r")) diff --git a/translation/src/main/scala/org/opencypher/gremlin/translation/ir/rewrite/CosmosDbFlavor.scala b/translation/src/main/scala/org/opencypher/gremlin/translation/ir/rewrite/CosmosDbFlavor.scala index 4a7393c7..22dfb0f6 100644 --- a/translation/src/main/scala/org/opencypher/gremlin/translation/ir/rewrite/CosmosDbFlavor.scala +++ b/translation/src/main/scala/org/opencypher/gremlin/translation/ir/rewrite/CosmosDbFlavor.scala @@ -41,7 +41,7 @@ object CosmosDbFlavor extends GremlinRewriter { private def rewriteRange(steps: Seq[GremlinStep]): Seq[GremlinStep] = { replace({ - case Repeat(SideEffect(aggregation) :: Nil) :: Until(untilTraversal) :: Cap(_) :: rest => + case Repeat(SideEffect(aggregation) :: Nil) :: Until(untilTraversal) :: SelectK(_) :: rest => (aggregation, untilTraversal) match { case (Loops :: Is(Gte(start: Long)) :: Aggregate(_) :: Nil, Loops :: Is(Gt(end: Long)) :: Nil) => val range = start until (end + 1) diff --git a/translation/src/main/scala/org/opencypher/gremlin/translation/walker/ExpressionWalker.scala b/translation/src/main/scala/org/opencypher/gremlin/translation/walker/ExpressionWalker.scala index 91d747b9..1ef60a7d 100644 --- a/translation/src/main/scala/org/opencypher/gremlin/translation/walker/ExpressionWalker.scala +++ b/translation/src/main/scala/org/opencypher/gremlin/translation/walker/ExpressionWalker.scala @@ -543,7 +543,7 @@ private class ExpressionWalker[T, P](context: WalkerContext[T, P], g: GremlinSte ) ) .until(untilCondition) - .cap(rangeLabel) + .select(rangeLabel) } private def size(args: Seq[Expression]): GremlinSteps[T, P] = {