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:
- *
- * - Issue #387: {@code GROUP BY} / {@code HAVING} require aggregate semantics, not only AST field propagation.
- * - Issue #387: {@code REDUCED} support aligned with next-pipeline query-form policy.
- *
- *
- */
- 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() {