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

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


The following commit(s) were added to refs/heads/master by this push:
     new 557f3f6f57d add array column type support to EXTEND operator (#15458)
557f3f6f57d is described below

commit 557f3f6f57df8ff5042b86d098ec356c77e426ad
Author: Clint Wylie <[email protected]>
AuthorDate: Wed Dec 6 23:21:35 2023 -0800

    add array column type support to EXTEND operator (#15458)
---
 .../org/apache/druid/data/input/impl/JsonInputFormat.java   | 12 ++++++++++++
 .../main/java/org/apache/druid/catalog/model/Columns.java   | 12 ++++++++++++
 .../apache/druid/sql/calcite/external/ExtendOperator.java   |  6 +++---
 .../org/apache/druid/sql/calcite/external/Externals.java    |  2 ++
 .../org/apache/druid/sql/calcite/table/RowSignatures.java   |  3 +++
 .../apache/druid/sql/calcite/IngestTableFunctionTest.java   | 13 +++++++++----
 6 files changed, 41 insertions(+), 7 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/data/input/impl/JsonInputFormat.java
 
b/processing/src/main/java/org/apache/druid/data/input/impl/JsonInputFormat.java
index dc8957cc1dc..07f658f99e1 100644
--- 
a/processing/src/main/java/org/apache/druid/data/input/impl/JsonInputFormat.java
+++ 
b/processing/src/main/java/org/apache/druid/data/input/impl/JsonInputFormat.java
@@ -215,4 +215,16 @@ public class JsonInputFormat extends NestedInputFormat
         useJsonNodeReader
     );
   }
+
+  @Override
+  public String toString()
+  {
+    return "JsonInputFormat{" +
+           "featureSpec=" + featureSpec +
+           ", keepNullColumns=" + keepNullColumns +
+           ", lineSplittable=" + lineSplittable +
+           ", assumeNewlineDelimited=" + assumeNewlineDelimited +
+           ", useJsonNodeReader=" + useJsonNodeReader +
+           '}';
+  }
 }
diff --git a/server/src/main/java/org/apache/druid/catalog/model/Columns.java 
b/server/src/main/java/org/apache/druid/catalog/model/Columns.java
index 0bc0f71bc1b..e19f0052ed5 100644
--- a/server/src/main/java/org/apache/druid/catalog/model/Columns.java
+++ b/server/src/main/java/org/apache/druid/catalog/model/Columns.java
@@ -38,6 +38,10 @@ public class Columns
   public static final String BIGINT = "BIGINT";
   public static final String FLOAT = "FLOAT";
   public static final String DOUBLE = "DOUBLE";
+  public static final String VARCHAR_ARRAY = "VARCHAR ARRAY";
+  public static final String BIGINT_ARRAY = "BIGINT ARRAY";
+  public static final String FLOAT_ARRAY = "FLOAT ARRAY";
+  public static final String DOUBLE_ARRAY = "DOUBLE ARRAY";
   public static final String TIMESTAMP = "TIMESTAMP";
 
   public static final Set<String> NUMERIC_TYPES =
@@ -52,6 +56,10 @@ public class Columns
         .put(FLOAT, ColumnType.FLOAT)
         .put(DOUBLE, ColumnType.DOUBLE)
         .put(VARCHAR, ColumnType.STRING)
+        .put(VARCHAR_ARRAY, ColumnType.STRING_ARRAY)
+        .put(BIGINT_ARRAY, ColumnType.LONG_ARRAY)
+        .put(FLOAT_ARRAY, ColumnType.FLOAT_ARRAY)
+        .put(DOUBLE_ARRAY, ColumnType.DOUBLE_ARRAY)
         .build();
 
   public static final Map<ColumnType, String> DRUID_TO_SQL_TYPES =
@@ -60,6 +68,10 @@ public class Columns
       .put(ColumnType.FLOAT, FLOAT)
       .put(ColumnType.DOUBLE, DOUBLE)
       .put(ColumnType.STRING, VARCHAR)
+      .put(ColumnType.STRING_ARRAY, VARCHAR_ARRAY)
+      .put(ColumnType.LONG_ARRAY, BIGINT_ARRAY)
+      .put(ColumnType.FLOAT_ARRAY, FLOAT_ARRAY)
+      .put(ColumnType.DOUBLE_ARRAY, DOUBLE_ARRAY)
       .build();
 
   private Columns()
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/external/ExtendOperator.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/external/ExtendOperator.java
index c2162491e5b..14d5ca63e93 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/external/ExtendOperator.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/external/ExtendOperator.java
@@ -70,14 +70,14 @@ public class ExtendOperator extends SqlInternalOperator
   @Override
   public SqlNode rewriteCall(SqlValidator validator, SqlCall call)
   {
-    SqlBasicCall tableOpCall = (SqlBasicCall) call.operand(0);
+    SqlBasicCall tableOpCall = call.operand(0);
     if (!(tableOpCall.getOperator() instanceof SqlCollectionTableOperator)) {
       throw new ISE("First argument to EXTEND must be TABLE");
     }
 
     // The table function must be a Druid-defined table macro function
     // which is aware of the EXTEND schema.
-    SqlBasicCall tableFnCall = (SqlBasicCall) tableOpCall.operand(0);
+    SqlBasicCall tableFnCall = tableOpCall.operand(0);
     if (!(tableFnCall.getOperator() instanceof 
SchemaAwareUserDefinedTableMacro)) {
       // May be an unresolved function.
       throw new IAE(
@@ -89,7 +89,7 @@ public class ExtendOperator extends SqlInternalOperator
     // Move the schema from the second operand of EXTEND into a member
     // function of a shim table macro.
     SchemaAwareUserDefinedTableMacro tableFn = 
(SchemaAwareUserDefinedTableMacro) tableFnCall.getOperator();
-    SqlNodeList schema = (SqlNodeList) call.operand(1);
+    SqlNodeList schema = call.operand(1);
     SqlCall newCall = tableFn.rewriteCall(tableFnCall, schema);
 
     // Create a new TABLE(table_fn) node to replace the EXTEND node. After 
this,
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/external/Externals.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/external/Externals.java
index 0063253efcd..598bdf97375 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/external/Externals.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/external/Externals.java
@@ -292,6 +292,8 @@ public class Externals
       case FLOAT:
       case REAL:
         return SqlType.FLOAT.name();
+      case ARRAY:
+        return convertType(name, dataType.getComponentTypeSpec()) + " " + 
SqlType.ARRAY.name();
       default:
         throw unsupportedType(name, dataType);
     }
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/table/RowSignatures.java 
b/sql/src/main/java/org/apache/druid/sql/calcite/table/RowSignatures.java
index 87519c75374..528a0a4a0b5 100644
--- a/sql/src/main/java/org/apache/druid/sql/calcite/table/RowSignatures.java
+++ b/sql/src/main/java/org/apache/druid/sql/calcite/table/RowSignatures.java
@@ -151,6 +151,9 @@ public class RowSignatures
               case DOUBLE:
                 type = Calcites.createSqlArrayTypeWithNullability(typeFactory, 
SqlTypeName.DOUBLE, nullNumeric);
                 break;
+              case FLOAT:
+                type = Calcites.createSqlArrayTypeWithNullability(typeFactory, 
SqlTypeName.FLOAT, nullNumeric);
+                break;
               default:
                 throw new ISE("valueType[%s] not translatable", columnType);
             }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/IngestTableFunctionTest.java 
b/sql/src/test/java/org/apache/druid/sql/calcite/IngestTableFunctionTest.java
index 0b2131197d3..558625a10b3 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/IngestTableFunctionTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/IngestTableFunctionTest.java
@@ -27,6 +27,7 @@ import org.apache.druid.catalog.model.Columns;
 import org.apache.druid.data.input.impl.CsvInputFormat;
 import org.apache.druid.data.input.impl.HttpInputSource;
 import org.apache.druid.data.input.impl.HttpInputSourceConfig;
+import org.apache.druid.data.input.impl.JsonInputFormat;
 import org.apache.druid.data.input.impl.LocalInputSource;
 import org.apache.druid.data.input.impl.systemfield.SystemFields;
 import org.apache.druid.java.util.common.ISE;
@@ -398,11 +399,15 @@ public class IngestTableFunctionTest extends 
CalciteIngestionDmlTest
             SystemFields.none(),
             new HttpInputSourceConfig(null)
         ),
-        new CsvInputFormat(ImmutableList.of("x", "y", "z"), null, false, 
false, 0),
+        new JsonInputFormat(null, null, null, null, null),
         RowSignature.builder()
                     .add("x", ColumnType.STRING)
                     .add("y", ColumnType.STRING)
                     .add("z", ColumnType.NESTED_DATA)
+                    .add("a", ColumnType.STRING_ARRAY)
+                    .add("b", ColumnType.LONG_ARRAY)
+                    .add("c", ColumnType.FLOAT_ARRAY)
+                    .add("d", ColumnType.DOUBLE_ARRAY)
                     .build()
         );
     testIngestionQuery()
@@ -410,8 +415,8 @@ public class IngestTableFunctionTest extends 
CalciteIngestionDmlTest
              "FROM TABLE(http(userName => 'bob',\n" +
             "                 password => 'secret',\n" +
              "                uris => ARRAY['http://foo.com/bar.json'],\n" +
-             "                format => 'csv'))\n" +
-             "     EXTEND (x VARCHAR, y VARCHAR, z TYPE('COMPLEX<json>'))\n" +
+             "                format => 'json'))\n" +
+             "     EXTEND (x VARCHAR, y VARCHAR, z TYPE('COMPLEX<json>'), a 
VARCHAR ARRAY, b BIGINT ARRAY, c FLOAT ARRAY, d DOUBLE ARRAY)\n" +
              "PARTITIONED BY ALL TIME")
         .authentication(CalciteTests.SUPER_USER_AUTH_RESULT)
         .expectTarget("dst", httpDataSource.getSignature())
@@ -420,7 +425,7 @@ public class IngestTableFunctionTest extends 
CalciteIngestionDmlTest
             newScanQueryBuilder()
                 .dataSource(httpDataSource)
                 .intervals(querySegmentSpec(Filtration.eternity()))
-                .columns("x", "y", "z")
+                .columns("a", "b", "c", "d", "x", "y", "z")
                 
.context(CalciteIngestionDmlTest.PARTITIONED_BY_ALL_TIME_QUERY_CONTEXT)
                 .build()
          )


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to