You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by vo...@apache.org on 2022/05/10 05:36:25 UTC

[drill] branch master updated: DRILL-8210: Add substring convertlet

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

volodymyr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/drill.git


The following commit(s) were added to refs/heads/master by this push:
     new f6fa97864d DRILL-8210: Add substring convertlet
f6fa97864d is described below

commit f6fa97864d1b7c06a7e6878bce2121afdf76e522
Author: Volodymyr Vysotskyi <vv...@gmail.com>
AuthorDate: Sat May 7 18:32:20 2022 +0300

    DRILL-8210: Add substring convertlet
---
 .../exec/planner/sql/DrillConvertletTable.java     | 40 ++++++++++++++--------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillConvertletTable.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillConvertletTable.java
index f7c525ba5f..5797cf2e01 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillConvertletTable.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/DrillConvertletTable.java
@@ -36,10 +36,8 @@ import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlNumericLiteral;
 import org.apache.calcite.sql.SqlOperator;
-import org.apache.calcite.sql.SqlOperatorBinding;
 import org.apache.calcite.sql.fun.SqlStdOperatorTable;
 import org.apache.calcite.sql.parser.SqlParserPos;
-import org.apache.calcite.sql.type.SqlReturnTypeInference;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.sql2rel.SqlRexConvertlet;
 import org.apache.calcite.sql2rel.SqlRexConvertletTable;
@@ -54,16 +52,15 @@ import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableMap;
 public class DrillConvertletTable implements SqlRexConvertletTable {
 
   public static final SqlRexConvertletTable INSTANCE = new DrillConvertletTable();
-  private static final DrillSqlOperator CastHighOp = new DrillSqlOperator("CastHigh", 1, false,
-      new SqlReturnTypeInference() {
-        @Override
-        public RelDataType inferReturnType(SqlOperatorBinding opBinding) {
-          return TypeInferenceUtils.createCalciteTypeWithNullability(
-              opBinding.getTypeFactory(),
-              SqlTypeName.ANY,
-              opBinding.getOperandType(0).isNullable());
-        }
-      }, false);
+
+  private static final DrillSqlOperator CAST_HIGH_OP = new DrillSqlOperator(
+    "CastHigh",
+    new ArrayList<>(),
+    Checker.getChecker(1, 1), false,
+    opBinding -> TypeInferenceUtils.createCalciteTypeWithNullability(
+      opBinding.getTypeFactory(),
+      SqlTypeName.ANY,
+      opBinding.getOperandType(0).isNullable()), false);
 
   private final Map<SqlOperator, SqlRexConvertlet> operatorToConvertletMap;
 
@@ -71,6 +68,7 @@ public class DrillConvertletTable implements SqlRexConvertletTable {
     operatorToConvertletMap = ImmutableMap.<SqlOperator, SqlRexConvertlet>builder()
         .put(SqlStdOperatorTable.EXTRACT, extractConvertlet())
         .put(SqlStdOperatorTable.SQRT, sqrtConvertlet())
+        .put(SqlStdOperatorTable.SUBSTRING, substringConvertlet())
         .put(SqlStdOperatorTable.COALESCE, coalesceConvertlet())
         .put(SqlStdOperatorTable.TIMESTAMP_DIFF, timestampDiffConvertlet())
         .put(SqlStdOperatorTable.ROW, rowConvertlet())
@@ -155,6 +153,18 @@ public class DrillConvertletTable implements SqlRexConvertletTable {
     };
   }
 
+  private static SqlRexConvertlet substringConvertlet() {
+    return (cx, call) -> {
+      List<RexNode> exprs = call.getOperandList().stream()
+        .map(cx::convertExpression)
+        .collect(Collectors.toList());
+
+      RelDataType returnType = TypeInferenceUtils.createCalciteTypeWithNullability(cx.getTypeFactory(),
+        SqlTypeName.VARCHAR, exprs.get(0).getType().isNullable());
+      return cx.getRexBuilder().makeCall(returnType, SqlStdOperatorTable.SUBSTRING, exprs);
+    };
+  }
+
   /**
    * Rewrites COALESCE function into CASE WHEN IS NOT NULL operand1 THEN operand1...
    * all Calcite interval representations correctly.
@@ -219,7 +229,7 @@ public class DrillConvertletTable implements SqlRexConvertletTable {
   private static SqlNode expandAvg(final SqlNode arg) {
     SqlNode sum = DrillCalciteSqlAggFunctionWrapper.SUM.createCall(SqlParserPos.ZERO, arg);
     SqlNode count = SqlStdOperatorTable.COUNT.createCall(SqlParserPos.ZERO, arg);
-    SqlNode sumAsDouble = CastHighOp.createCall(SqlParserPos.ZERO, sum);
+    SqlNode sumAsDouble = CAST_HIGH_OP.createCall(SqlParserPos.ZERO, sum);
     return SqlStdOperatorTable.DIVIDE.createCall(SqlParserPos.ZERO, sumAsDouble, count);
   }
 
@@ -254,7 +264,7 @@ public class DrillConvertletTable implements SqlRexConvertletTable {
     final SqlParserPos pos = SqlParserPos.ZERO;
 
     // cast the argument to double
-    final SqlNode castHighArg = CastHighOp.createCall(pos, arg);
+    final SqlNode castHighArg = CAST_HIGH_OP.createCall(pos, arg);
     final SqlNode argSquared =
         SqlStdOperatorTable.MULTIPLY.createCall(pos, castHighArg, castHighArg);
     final SqlNode sumArgSquared =
@@ -282,7 +292,7 @@ public class DrillConvertletTable implements SqlRexConvertletTable {
               pos, count, one);
     }
     final SqlNode diffAsDouble =
-        CastHighOp.createCall(pos, diff);
+        CAST_HIGH_OP.createCall(pos, diff);
     final SqlNode div =
         SqlStdOperatorTable.DIVIDE.createCall(
             pos, diffAsDouble, denominator);