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() {