This is an automated email from the ASF dual-hosted git repository.

xuzifu666 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/main by this push:
     new 0a39568b16 [CALCITE-4868] Elasticsearch adapter fails if GROUP BY is 
followed by ORDER BY
0a39568b16 is described below

commit 0a39568b167592ded8db1128b5838982ffe264f3
Author: Yu Xu <[email protected]>
AuthorDate: Fri Apr 10 10:01:52 2026 +0800

    [CALCITE-4868] Elasticsearch adapter fails if GROUP BY is followed by ORDER 
BY
---
 .../src/main/java/org/apache/calcite/util/Bug.java |  6 ---
 .../adapter/elasticsearch/ElasticsearchTable.java  |  6 ++-
 .../elasticsearch/AggregationAndSortTest.java      | 43 +++++++++++++++++++---
 3 files changed, 43 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/org/apache/calcite/util/Bug.java 
b/core/src/main/java/org/apache/calcite/util/Bug.java
index 6d13a13d67..8f23ce7b1c 100644
--- a/core/src/main/java/org/apache/calcite/util/Bug.java
+++ b/core/src/main/java/org/apache/calcite/util/Bug.java
@@ -165,12 +165,6 @@ public abstract class Bug {
    * fixed. */
   public static final boolean CALCITE_4213_FIXED = false;
 
-  /** Whether
-   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4868";>[CALCITE-4868]
-   * Elasticsearch adapter fails if GROUP BY is followed by ORDER BY</a> is
-   * fixed. */
-  public static final boolean CALCITE_4868_FIXED = false;
-
   /** Whether
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5422";>[CALCITE-5422]
    * MILLISECOND and MICROSECOND units in INTERVAL literal</a> is fixed. */
diff --git 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java
 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java
index db8441636b..29ad974fd5 100644
--- 
a/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java
+++ 
b/elasticsearch/src/main/java/org/apache/calcite/adapter/elasticsearch/ElasticsearchTable.java
@@ -208,8 +208,12 @@ private Enumerable<Object> aggregate(List<String> ops,
 
     // due to ES aggregation format. fields in "order by" clause should go 
first
     // if "order by" is missing. order in "group by" is un-important
+    // Only include fields that are actually in groupBy list, exclude 
aggregation aliases
     final Set<String> orderedGroupBy = new LinkedHashSet<>();
-    
orderedGroupBy.addAll(sort.stream().map(Map.Entry::getKey).collect(Collectors.toList()));
+    sort.stream()
+        .map(Map.Entry::getKey)
+        .filter(groupBy::contains)
+        .forEach(orderedGroupBy::add);
     orderedGroupBy.addAll(groupBy);
 
     // construct nested aggregations node(s)
diff --git 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/AggregationAndSortTest.java
 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/AggregationAndSortTest.java
index 1d4dd0e1cd..3ddf3c82cc 100644
--- 
a/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/AggregationAndSortTest.java
+++ 
b/elasticsearch/src/test/java/org/apache/calcite/adapter/elasticsearch/AggregationAndSortTest.java
@@ -21,14 +21,12 @@
 import org.apache.calcite.schema.impl.ViewTable;
 import org.apache.calcite.test.CalciteAssert;
 import org.apache.calcite.test.ElasticsearchChecker;
-import org.apache.calcite.util.Bug;
 
 import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableMap;
 
-import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.ResourceAccessMode;
@@ -86,8 +84,13 @@ public static void setupInstance() throws Exception {
   }
 
   private static Connection createConnection() throws SQLException {
+    return createConnectionWithConformance("JAVA", "DEFAULT");
+  }
+
+  private static Connection createConnectionWithConformance(String lex, String 
conformance)
+      throws SQLException {
     final Connection connection =
-        DriverManager.getConnection("jdbc:calcite:lex=JAVA");
+        DriverManager.getConnection("jdbc:calcite:lex=" + lex + 
";conformance=" + conformance);
     final SchemaPlus root =
         connection.unwrap(CalciteConnection.class).getRootSchema();
 
@@ -468,9 +471,11 @@ private static Connection createConnection() throws 
SQLException {
             + "cat6=null; cat5=2\n");
   }
 
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4868";>[CALCITE-4868]
+   * Elasticsearch adapter fails if GROUP BY is followed by ORDER BY</a>.
+   */
   @Test void testOrderByWithGroupBy() {
-    // Once CALCITE-4868 is fixed, we can enable this test
-    Assumptions.assumeTrue(Bug.CALCITE_4868_FIXED, "CALCITE-4868");
     CalciteAssert.that()
         .with(AggregationAndSortTest::createConnection)
         .query("select cat6, cat5 from view group by cat6, cat5 "
@@ -479,4 +484,32 @@ private static Connection createConnection() throws 
SQLException {
             + "cat6=null; cat5=1\n"
             + "cat6=text1; cat5=null\n");
   }
+
+  /** Test case for
+   * <a 
href="https://issues.apache.org/jira/browse/CALCITE-4868";>[CALCITE-4868]
+   * Elasticsearch adapter fails if GROUP BY is followed by ORDER BY</a>.
+   */
+  @Test void testSortAggregation() {
+    // Test ORDER BY alias (isSortByAlias)
+    CalciteAssert.that()
+        .with(AggregationAndSortTest::createConnection)
+        .query("select cat5, max(val1) as MAX_VAL1 from view"
+            + " group by cat5 order by MAX_VAL1 desc, cat5 desc")
+        .returns("cat5=2; MAX_VAL1=7.0\ncat5=1; MAX_VAL1=1.0\ncat5=null; 
MAX_VAL1=null\n");
+
+    // Test ORDER BY ordinal (isSortByOrdinal)
+    CalciteAssert.that()
+        .with(AggregationAndSortTest::createConnection)
+        .query("select cat5, max(val1) as MAX_VAL1 from view"
+            + " group by cat5 order by 2 desc, 1 desc")
+        .returns("cat5=2; MAX_VAL1=7.0\ncat5=1; MAX_VAL1=1.0\ncat5=null; 
MAX_VAL1=null\n");
+
+    // Test GROUP BY alias (isGroupByAlias) with ORDER BY alias
+    // Uses BABEL conformance which supports GROUP BY alias
+    CalciteAssert.that()
+        .with(() -> createConnectionWithConformance("JAVA", "BABEL"))
+        .query("select cat5 as CAT, max(val1) as MAX_VAL1 from view"
+            + " group by CAT order by MAX_VAL1 desc, CAT desc")
+        .returns("CAT=2; MAX_VAL1=7.0\nCAT=1; MAX_VAL1=1.0\nCAT=null; 
MAX_VAL1=null\n");
+  }
 }

Reply via email to