diff --git a/src/main/java/fr/inria/corese/core/next/query/impl/sparql/bridge/CoreseAstQueryBuilder.java b/src/main/java/fr/inria/corese/core/next/query/impl/sparql/bridge/CoreseAstQueryBuilder.java index 60e7fe949..df0dc8983 100644 --- a/src/main/java/fr/inria/corese/core/next/query/impl/sparql/bridge/CoreseAstQueryBuilder.java +++ b/src/main/java/fr/inria/corese/core/next/query/impl/sparql/bridge/CoreseAstQueryBuilder.java @@ -103,7 +103,6 @@ public Query toNextQuery(AskQueryAst askQueryAst) { */ public Query toNextQuery(SelectQueryAst selectQueryAst) { Objects.requireNonNull(selectQueryAst, "selectQueryAst"); - rejectUnsupportedSelectClauses(selectQueryAst); WhereCompiler compiler = whereCompiler.withPrologue(selectQueryAst.prologue()); Query query = createQuery( @@ -114,6 +113,7 @@ public Query toNextQuery(SelectQueryAst selectQueryAst) { compiler); applyGroupBy(query, selectQueryAst.solutionModifier(), compiler); applyProjection(query, selectQueryAst.projection(), compiler); + // Full deduplication or preserving cardinality is permitted by SELECT REDUCED. query.setDistinct(selectQueryAst.solutionModifier().distinct()); applyOrderBy(query, selectQueryAst.solutionModifier(), compiler); applyHaving(query, selectQueryAst.solutionModifier(), compiler); @@ -220,23 +220,6 @@ private static void rejectUnsupportedAskClauses(AskQueryAst askQueryAst) { } } - /** - * Rejects unsupported clauses for {@code SELECT} queries. - * - *

Planned roadmap items: - *

- *

- */ - private static void rejectUnsupportedSelectClauses(SelectQueryAst selectQueryAst) { - SolutionModifierAst solutionModifier = selectQueryAst.solutionModifier(); - if (solutionModifier.reduced()) { - throw new UnsupportedQueryFeatureException("REDUCED is not supported yet by the next pipeline for SELECT"); - } - } - /** * Rejects unsupported clauses for {@code DESCRIBE} queries. * diff --git a/src/test/java/fr/inria/corese/core/next/query/impl/sparql/execution/NextSparqlPipelineExecutorTest.java b/src/test/java/fr/inria/corese/core/next/query/impl/sparql/execution/NextSparqlPipelineExecutorTest.java index 16577a1d6..1fe7a2103 100644 --- a/src/test/java/fr/inria/corese/core/next/query/impl/sparql/execution/NextSparqlPipelineExecutorTest.java +++ b/src/test/java/fr/inria/corese/core/next/query/impl/sparql/execution/NextSparqlPipelineExecutorTest.java @@ -90,6 +90,36 @@ void selectJoinRunsEndToEnd() { assertFalse(result.hasNext()); } + @Test + @DisplayName("SELECT REDUCED executes and returns projected bindings") + void selectReducedExecutesAndReturnsBindings() { + try (var result = executor.evaluateTuple(""" + SELECT REDUCED ?name WHERE { + VALUES (?name ?id) { ("Alice" 1) ("Bob" 3) } + } ORDER BY ?name + """)) { + assertEquals(List.of("name"), result.getBindingNames()); + assertTrue(result.hasNext()); + assertEquals(valueFactory.createLiteral("Alice"), result.next().getValue("name")); + assertTrue(result.hasNext()); + assertEquals(valueFactory.createLiteral("Bob"), result.next().getValue("name")); + assertFalse(result.hasNext()); + } + } + + @Test + @DisplayName("SELECT REDUCED * executes without error") + void selectReducedStarExecutes() { + try (var result = executor.evaluateTuple(""" + SELECT REDUCED * WHERE { VALUES ?name { "Alice" } } + """)) { + assertEquals(List.of("name"), result.getBindingNames()); + assertTrue(result.hasNext()); + assertEquals(valueFactory.createLiteral("Alice"), result.next().getValue("name")); + assertFalse(result.hasNext()); + } + } + @Test @DisplayName("FILTER evaluates native numeric expressions") void filterRunsThroughNativeExpressionEvaluator() {