From 54f3fc67951ed84af440e00909ff128006ed1af9 Mon Sep 17 00:00:00 2001 From: xuyu <1206332514@qq.com> Date: Thu, 6 Mar 2025 23:44:43 +0800 Subject: [PATCH] [CALCITE-6876] Druid Adapter support more functions --- .../calcite/adapter/druid/DruidQuery.java | 8 ++++++- .../apache/calcite/test/DruidAdapterIT.java | 24 +++++++++++++++++++ 2 files changed, 31 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 a393d0e0a66..522ac00cb42 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 DEFAULT_OPERATORS_LIST = ImmutableList.builder() @@ -120,6 +120,12 @@ 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.DEGREES, "degrees")) .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 fe8419da801..0e649dcf0c1 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() {