You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by as...@apache.org on 2025/03/10 08:27:34 UTC

(calcite) branch main updated: [CALCITE-6876] Druid Adapter support more functions

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

asolimando 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 569ed6b1f7 [CALCITE-6876] Druid Adapter support more functions
569ed6b1f7 is described below

commit 569ed6b1f73da6ac0ae09b95bac9429e25893d7c
Author: xuyu <12...@qq.com>
AuthorDate: Thu Mar 6 23:44:43 2025 +0800

    [CALCITE-6876] Druid Adapter support more functions
    
    Co-authored-by: Alessandro Solimando <al...@gmail.com>
---
 .../apache/calcite/adapter/druid/DruidQuery.java   |  7 ++++++-
 .../org/apache/calcite/test/DruidAdapterIT.java    | 24 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
index a393d0e0a6..e6aa27b6bd 100644
--- a/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
+++ b/druid/src/main/java/org/apache/calcite/adapter/druid/DruidQuery.java
@@ -101,7 +101,7 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
   /**
    * Provides a standard list of supported Calcite operators that can be converted to
    * Druid Expressions. This can be used as is or re-adapted based on underline
-   * engine operator syntax.
+   * engine operator syntax. Methods can refer to https://druid.apache.org/docs/latest/querying/
    */
   public static final List<DruidSqlOperatorConverter> DEFAULT_OPERATORS_LIST =
       ImmutableList.<DruidSqlOperatorConverter>builder()
@@ -120,6 +120,11 @@ public class DruidQuery extends AbstractRelNode implements BindableRel {
           .add(new DirectOperatorConversion(SqlStdOperatorTable.SIN, "sin"))
           .add(new DirectOperatorConversion(SqlStdOperatorTable.COS, "cos"))
           .add(new DirectOperatorConversion(SqlStdOperatorTable.TAN, "tan"))
+          .add(new DirectOperatorConversion(SqlStdOperatorTable.COT, "cot"))
+          .add(new DirectOperatorConversion(SqlStdOperatorTable.ASIN, "asin"))
+          .add(new DirectOperatorConversion(SqlStdOperatorTable.ACOS, "acos"))
+          .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN, "atan"))
+          .add(new DirectOperatorConversion(SqlStdOperatorTable.ATAN2, "atan2"))
           .add(new DirectOperatorConversion(SqlStdOperatorTable.CASE, "case_searched"))
           .add(new DirectOperatorConversion(SqlStdOperatorTable.CHAR_LENGTH, "strlen"))
           .add(new DirectOperatorConversion(SqlStdOperatorTable.CHARACTER_LENGTH, "strlen"))
diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
index a1b70dd0e5..9d06fc2c60 100644
--- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
+++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java
@@ -3969,6 +3969,30 @@ private void testCountWithApproxDistinct(boolean approx, String sql, String expe
             + "filter=[AND(>(SIN($91), 0.9129452507276277E0), >(COS($90), 0.40808206181339196E0), =(FLOOR(TAN($91)), 2.0E0), "
             + "<(ABS(-(TAN($91), /(SIN($91), COS($91)))), 1.0E-6))], "
             + "groups=[{}], aggs=[[COUNT()]])");
+
+    final String sql1 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + " WHERE "
+        + "COT(\"store_cost\") > COT(20) AND ASIN(\"store_sales\") > ASIN(1) "
+        + "AND FLOOR(ACOS(\"store_cost\")) = 2 "
+        + "AND ABS(ATAN(\"store_cost\") - ATAN(\"store_cost\") / ATAN(\"store_cost\")) < 10e-7";
+    sql(sql1, FOODMART)
+        .returnsOrdered("EXPR$0=0")
+        .explainContains("PLAN=EnumerableInterpreter\n"
+            + "  DruidQuery(table=[[foodmart, foodmart]], "
+            + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+            + "filter=[AND(>(COT($91), 0.4469951089489167E0), >(ASIN($90), 1.5707963267948966E0), =(FLOOR(ACOS($91)), 2.0E0), "
+            + "<(ABS(-(ATAN($91), /(ATAN($91), ATAN($91)))), 1.0E-6))], "
+            + "groups=[{}], aggs=[[COUNT()]])");
+
+    final String sql2 = "SELECT COUNT(*) FROM " + FOODMART_TABLE + " WHERE "
+        + "FLOOR(ATAN2(\"store_cost\", \"store_cost\")) = 2 ";
+    sql(sql2, FOODMART)
+        .returnsOrdered("EXPR$0=0")
+        .explainContains("PLAN=EnumerableInterpreter\n"
+            + "  DruidQuery(table=[[foodmart, foodmart]], "
+            + "intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], "
+            + "filter=[=(FLOOR(ATAN2($91, $91)), 2.0E0)], "
+            + "groups=[{}], aggs=[[COUNT()]])");
+
   }
 
   @Test void testCastLiteralToTimestamp() {