TINKERPOP-1878 Testing for DISTINCT Refactoring around the distinct and ordering - much less code there now.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/3e29b24c Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/3e29b24c Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/3e29b24c Branch: refs/heads/TINKERPOP-1878 Commit: 3e29b24ccc26c31bf69f86a8c659f8fdc27dfd85 Parents: a205706 Author: Stephen Mallette <sp...@genoprime.com> Authored: Fri Jan 26 16:56:14 2018 -0500 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Mon Apr 23 14:21:04 2018 -0400 ---------------------------------------------------------------------- .../sparql/SparqlToGremlinTranspiler.java | 44 ++++++++------------ .../dsl/sparql/SparqlTraversalSourceTest.java | 23 ++++++++++ 2 files changed, 41 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3e29b24c/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java ---------------------------------------------------------------------- diff --git a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java index 1b28a1d..67ac1e1 100644 --- a/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java +++ b/sparql-gremlin/src/main/java/org/apache/tinkerpop/gremlin/sparql/SparqlToGremlinTranspiler.java @@ -107,39 +107,28 @@ public class SparqlToGremlinTranspiler { final List<String> vars = query.getResultVars(); if (!query.isQueryResultStar() && !query.hasGroupBy()) { - // the result sizes have special handling to get the right signatures of select() called. perhaps this - // could be refactored to work more nicely - switch (vars.size()) { + final String[] all = new String[vars.size()]; + vars.toArray(all); + if (query.isDistinct()) { + traversal = traversal.dedup(all); + } + + // apply ordering from ORDER BY + orderingIndex.forEach((k, v) -> traversal = traversal.order().by(__.select(k), v)); + + // the result sizes have special handling to get the right signatures of select() called. + switch (all.length) { case 0: throw new IllegalStateException(); case 1: - if (query.isDistinct()) - traversal = traversal.dedup(vars.get(0)); - - orderingIndex.forEach((k, v) -> traversal = traversal.order().by(__.select(k), v)); - traversal = traversal.select(vars.get(0)); - + traversal = traversal.select(all[0]); break; case 2: - if (query.isDistinct()) - traversal = traversal.dedup(vars.get(0), vars.get(1)); - - orderingIndex.forEach((k, v) -> traversal = traversal.order().by(__.select(k), v)); - traversal = traversal.select(vars.get(0), vars.get(1)); - + traversal = traversal.select(all[0], all[1]); break; default: - final String[] all = new String[vars.size()]; - vars.toArray(all); - if (query.isDistinct()) - traversal = traversal.dedup(all); - - orderingIndex.forEach((k, v) -> traversal = traversal.order().by(__.select(k), v)); - - // just some shenanigans to get the right signature of select() called final String[] others = Arrays.copyOfRange(all, 2, vars.size()); - traversal = traversal.select(vars.get(0), vars.get(1), others); - + traversal = traversal.select(all[0], all[1], others); break; } } @@ -207,7 +196,10 @@ public class SparqlToGremlinTranspiler { for (SortCondition sortCondition : sortingConditions) { final Expr expr = sortCondition.getExpression(); - orderingIndex.put(expr.getVarName(), sortCondition.getDirection() == 1 ? Order.incr : Order.decr); + + // by default, the sort will be ascending. getDirection() returns -2 if the DESC/ASC isn't + // supplied - weird + orderingIndex.put(expr.getVarName(), sortCondition.getDirection() == -1 ? Order.decr : Order.incr); } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3e29b24c/sparql-gremlin/src/test/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/dsl/sparql/SparqlTraversalSourceTest.java ---------------------------------------------------------------------- diff --git a/sparql-gremlin/src/test/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/dsl/sparql/SparqlTraversalSourceTest.java b/sparql-gremlin/src/test/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/dsl/sparql/SparqlTraversalSourceTest.java index 4092e58..56d62c9 100644 --- a/sparql-gremlin/src/test/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/dsl/sparql/SparqlTraversalSourceTest.java +++ b/sparql-gremlin/src/test/java/org/apache/tinkerpop/gremlin/sparql/process/traversal/dsl/sparql/SparqlTraversalSourceTest.java @@ -111,4 +111,27 @@ public class SparqlTraversalSourceTest { assertEquals(x.get("b"), _g.V(4).next()); assertEquals(x.get("c"), _g.V(3).next()); } + + @Test + public void shouldDistinct() { + final List<?> x = g.sparql( + "SELECT DISTINCT ?name\n" + + "WHERE {\n" + + " ?a e:created ?b .\n" + + " ?a v:name ?name .\n" + + "}").toList(); + assertThat(x, containsInAnyOrder("marko", "josh", "peter")); + } + + @Test + public void shouldDistinctAndOrder() { + final List<?> x = g.sparql( + "SELECT DISTINCT ?name\n" + + "WHERE {\n" + + " ?a e:created ?b .\n" + + " ?a v:name ?name .\n" + + "}" + + "ORDER BY ?name").toList(); + assertThat(x, contains("josh", "marko", "peter")); + } }