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

abhishek 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 94fb41a4df fix nested field virtual column array column element vector 
object selector (#14729)
94fb41a4df is described below

commit 94fb41a4dfcd2383da2d9fa8fed3a895ecb55e3c
Author: Clint Wylie <[email protected]>
AuthorDate: Wed Aug 2 04:38:24 2023 -0700

    fix nested field virtual column array column element vector object selector 
(#14729)
    
    Fixes a case I missed in #14688 when the return type is STRING but its 
coming from a top level array typed column instead of a nested array column 
while making a vector object selector.
    
    Also while here I noticed that the internal JSON_VALUE functions for array 
types were named inconsistently with the non-array functions, so I renamed 
them. These are not documented so it should not be disruptive in any way, since 
they are only used internally for rewrites while planning to make the correctly 
virtual column.
    
    JSON_VALUE_RETURNING_ARRAY_VARCHAR -> JSON_VALUE_ARRAY_VARCHAR
    JSON_VALUE_RETURNING_ARRAY_BIGINT -> JSON_VALUE_ARRAY_BIGINT
    JSON_VALUE_RETURNING_ARRAY_DOUBLE -> JSON_VALUE_ARRAY_DOUBLE
    The internal non-array functions are JSON_VALUE_VARCHAR, JSON_VALUE_BIGINT, 
and JSON_VALUE_DOUBLE.
---
 .../segment/virtual/NestedFieldVirtualColumn.java  | 14 ++++++-
 .../timeseries/NestedDataTimeseriesQueryTest.java  | 49 ++++++++++++++++++++++
 .../builtin/NestedDataOperatorConversions.java     |  6 +--
 3 files changed, 64 insertions(+), 5 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
index 897f71c8ff..9a93c9428e 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/virtual/NestedFieldVirtualColumn.java
@@ -535,7 +535,11 @@ public class NestedFieldVirtualColumn implements 
VirtualColumn
         );
       }
       final VectorObjectSelector objectSelector = 
complexColumn.makeVectorObjectSelector(parts, offset);
-      if (leastRestrictiveType != null && leastRestrictiveType.isArray() && 
!expectedType.isArray()) {
+      if (leastRestrictiveType != null &&
+          leastRestrictiveType.isArray() &&
+          expectedType != null &&
+          !expectedType.isArray()
+      ) {
         final ExpressionType elementType = 
ExpressionType.fromColumnTypeStrict(leastRestrictiveType.getElementType());
         final ExpressionType castTo = 
ExpressionType.fromColumnTypeStrict(expectedType);
         return makeVectorArrayToScalarObjectSelector(offset, objectSelector, 
elementType, castTo);
@@ -575,6 +579,12 @@ public class NestedFieldVirtualColumn implements 
VirtualColumn
 
     if (parts.size() == 1 && parts.get(0) instanceof NestedPathArrayElement && 
column instanceof VariantColumn) {
       final VariantColumn<?> arrayColumn = (VariantColumn<?>) column;
+      final ExpressionType elementType = ExpressionType.fromColumnTypeStrict(
+          arrayColumn.getLogicalType().isArray() ? 
arrayColumn.getLogicalType().getElementType() : arrayColumn.getLogicalType()
+      );
+      final ExpressionType castTo = expectedType == null
+                                    ? ExpressionType.STRING
+                                    : 
ExpressionType.fromColumnTypeStrict(expectedType);
       VectorObjectSelector arraySelector = 
arrayColumn.makeVectorObjectSelector(offset);
       final int elementNumber = ((NestedPathArrayElement) 
parts.get(0)).getIndex();
       if (elementNumber < 0) {
@@ -595,7 +605,7 @@ public class NestedFieldVirtualColumn implements 
VirtualColumn
               if (maybeArray instanceof Object[]) {
                 Object[] anArray = (Object[]) maybeArray;
                 if (elementNumber < anArray.length) {
-                  elements[i] = anArray[elementNumber];
+                  elements[i] = ExprEval.ofType(elementType, 
anArray[elementNumber]).castTo(castTo).value();
                 } else {
                   elements[i] = null;
                 }
diff --git 
a/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
 
b/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
index ac63221472..130654d092 100644
--- 
a/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
+++ 
b/processing/src/test/java/org/apache/druid/query/timeseries/NestedDataTimeseriesQueryTest.java
@@ -287,6 +287,55 @@ public class NestedDataTimeseriesQueryTest extends 
InitializedNullHandlingTest
     );
   }
 
+  @Test
+  public void testFilterLongArrayElementFilters()
+  {
+    TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
+                                  .dataSource("test_datasource")
+                                  
.intervals(Collections.singletonList(Intervals.ETERNITY))
+                                  .filters(
+                                      new AndDimFilter(
+                                          NullFilter.forColumn("v0"),
+                                          NullFilter.forColumn("v1"),
+                                          NullFilter.forColumn("v2")
+                                      )
+                                  )
+                                  .virtualColumns(
+                                      new NestedFieldVirtualColumn(
+                                          "arrayLongNulls",
+                                          "$[1]",
+                                          "v0",
+                                          ColumnType.STRING
+                                      ),
+                                      new NestedFieldVirtualColumn(
+                                          "arrayLongNulls",
+                                          "$[1]",
+                                          "v1",
+                                          ColumnType.LONG
+                                      ),
+                                      new NestedFieldVirtualColumn(
+                                          "arrayStringNulls",
+                                          "$[1]",
+                                          "v2",
+                                          ColumnType.LONG
+                                      )
+                                  )
+                                  .aggregators(new 
CountAggregatorFactory("count"))
+                                  .context(getContext())
+                                  .build();
+    runResults(
+        query,
+        ImmutableList.of(
+            new Result<>(
+                DateTimes.of("2023-01-01T00:00:00.000Z"),
+                new TimeseriesResultValue(
+                    ImmutableMap.of("count", 8L)
+                )
+            )
+        )
+    );
+  }
+
   @Test
   public void testFilterVariantAsString()
   {
diff --git 
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
 
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
index 77a33e266c..2870221386 100644
--- 
a/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
+++ 
b/sql/src/main/java/org/apache/druid/sql/calcite/expression/builtin/NestedDataOperatorConversions.java
@@ -557,7 +557,7 @@ public class NestedDataOperatorConversions
 
   public static class JsonValueReturningArrayBigIntOperatorConversion extends 
JsonValueReturningArrayTypeOperatorConversion
   {
-    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_RETURNING_ARRAY_BIGINT", SqlTypeName.BIGINT);
+    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_ARRAY_BIGINT", SqlTypeName.BIGINT);
 
     public JsonValueReturningArrayBigIntOperatorConversion()
     {
@@ -567,7 +567,7 @@ public class NestedDataOperatorConversions
 
   public static class JsonValueReturningArrayDoubleOperatorConversion extends 
JsonValueReturningArrayTypeOperatorConversion
   {
-    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_RETURNING_ARRAY_DOUBLE", SqlTypeName.DOUBLE);
+    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_ARRAY_DOUBLE", SqlTypeName.DOUBLE);
 
     public JsonValueReturningArrayDoubleOperatorConversion()
     {
@@ -577,7 +577,7 @@ public class NestedDataOperatorConversions
 
   public static class JsonValueReturningArrayVarcharOperatorConversion extends 
JsonValueReturningArrayTypeOperatorConversion
   {
-    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_RETURNING_ARRAY_VARCHAR", SqlTypeName.VARCHAR);
+    static final SqlFunction FUNCTION = 
buildArrayFunction("JSON_VALUE_ARRAY_VARCHAR", SqlTypeName.VARCHAR);
 
     public JsonValueReturningArrayVarcharOperatorConversion()
     {


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

Reply via email to