You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2018/08/13 18:43:11 UTC
[30/50] tinkerpop git commit: TINKERPOP-1878 Testing for DISTINCT
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/a9b5e570
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/a9b5e570
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/a9b5e570
Branch: refs/heads/TINKERPOP-1878
Commit: a9b5e57057b1f9b48eddf98750a1c95bc794a010
Parents: f02333a
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Fri Jan 26 16:56:14 2018 -0500
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Mon Aug 13 14:39:23 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/a9b5e570/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/a9b5e570/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"));
+ }
}