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 e7d2e8b914 fix bug filtering nested columns with expression filters 
(#14096)
e7d2e8b914 is described below

commit e7d2e8b914bf89a780490de109b8b7850b0e141f
Author: Clint Wylie <[email protected]>
AuthorDate: Mon Apr 17 14:21:32 2023 -0700

    fix bug filtering nested columns with expression filters (#14096)
---
 .../segment/nested/NestedCommonFormatColumn.java   |  3 +-
 .../segment/nested/NestedDataComplexTypeSerde.java |  3 +-
 .../serde/NestedCommonFormatColumnPartSerde.java   |  5 +++
 .../nested/NestedDataColumnSupplierTest.java       | 46 ++++++++++++++--------
 .../nested/NestedDataColumnSupplierV4Test.java     | 21 +++++-----
 .../sql/calcite/CalciteNestedDataQueryTest.java    | 44 +++++++++++++++++++++
 6 files changed, 95 insertions(+), 27 deletions(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedCommonFormatColumn.java
 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedCommonFormatColumn.java
index b52670c148..4d20437c50 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedCommonFormatColumn.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedCommonFormatColumn.java
@@ -136,9 +136,10 @@ public interface NestedCommonFormatColumn extends 
BaseColumn
                                      .setDictionaryValuesSorted(true)
                                      .setDictionaryValuesUnique(true)
                                      .setHasBitmapIndexes(true)
+                                     .setFilterable(true)
                                      .setHasNulls(hasNulls);
       }
-      return 
ColumnCapabilitiesImpl.createDefault().setType(logicalType).setHasNulls(hasNulls);
+      return 
ColumnCapabilitiesImpl.createDefault().setType(logicalType).setHasNulls(hasNulls).setFilterable(true);
     }
   }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataComplexTypeSerde.java
 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataComplexTypeSerde.java
index a35aa93c25..f1f298e088 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/nested/NestedDataComplexTypeSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/nested/NestedDataComplexTypeSerde.java
@@ -106,6 +106,7 @@ public class NestedDataComplexTypeSerde extends 
ComplexMetricSerde
     }
     builder.setComplexColumnSupplier(supplier);
     builder.setColumnFormat(new NestedColumnFormatV4());
+    builder.setFilterable(true);
   }
 
   @Override
@@ -187,7 +188,7 @@ public class NestedDataComplexTypeSerde extends 
ComplexMetricSerde
     @Override
     public ColumnCapabilities toColumnCapabilities()
     {
-      return 
ColumnCapabilitiesImpl.createDefault().setType(ColumnType.NESTED_DATA).setHasNulls(true);
+      return 
ColumnCapabilitiesImpl.createDefault().setType(ColumnType.NESTED_DATA).setHasNulls(true).setFilterable(true);
     }
   }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/serde/NestedCommonFormatColumnPartSerde.java
 
b/processing/src/main/java/org/apache/druid/segment/serde/NestedCommonFormatColumnPartSerde.java
index 4585364fae..13366f43bf 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/serde/NestedCommonFormatColumnPartSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/serde/NestedCommonFormatColumnPartSerde.java
@@ -121,6 +121,7 @@ public class NestedCommonFormatColumnPartSerde implements 
ColumnPartSerde
         builder.setStandardTypeColumnSupplier(supplier);
         builder.setIndexSupplier(supplier, true, false);
         builder.setColumnFormat(new 
NestedCommonFormatColumn.Format(logicalType, 
capabilitiesBuilder.hasNulls().isTrue()));
+        builder.setFilterable(true);
       });
     }
     if (logicalType.is(ValueType.LONG)) {
@@ -140,6 +141,7 @@ public class NestedCommonFormatColumnPartSerde implements 
ColumnPartSerde
         builder.setStandardTypeColumnSupplier(supplier);
         builder.setIndexSupplier(supplier, true, false);
         builder.setColumnFormat(new 
NestedCommonFormatColumn.Format(logicalType, 
capabilitiesBuilder.hasNulls().isTrue()));
+        builder.setFilterable(true);
       });
     }
     if (logicalType.is(ValueType.DOUBLE)) {
@@ -159,6 +161,7 @@ public class NestedCommonFormatColumnPartSerde implements 
ColumnPartSerde
         builder.setStandardTypeColumnSupplier(supplier);
         builder.setIndexSupplier(supplier, true, false);
         builder.setColumnFormat(new 
NestedCommonFormatColumn.Format(logicalType, 
capabilitiesBuilder.hasNulls().isTrue()));
+        builder.setFilterable(true);
       });
     }
     if (logicalType.isArray()) {
@@ -178,6 +181,7 @@ public class NestedCommonFormatColumnPartSerde implements 
ColumnPartSerde
         builder.setType(logicalType);
         builder.setStandardTypeColumnSupplier(supplier);
         builder.setColumnFormat(new 
NestedCommonFormatColumn.Format(logicalType, 
capabilitiesBuilder.hasNulls().isTrue()));
+        builder.setFilterable(true);
       });
     }
     return (buffer, builder, columnConfig) -> {
@@ -198,6 +202,7 @@ public class NestedCommonFormatColumnPartSerde implements 
ColumnPartSerde
       builder.setType(logicalType);
       builder.setStandardTypeColumnSupplier(supplier);
       builder.setColumnFormat(new NestedCommonFormatColumn.Format(logicalType, 
hasNulls));
+      builder.setFilterable(true);
     };
   }
 
diff --git 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierTest.java
 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierTest.java
index d8c385232a..b771d4411a 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierTest.java
@@ -48,7 +48,9 @@ import org.apache.druid.segment.ObjectColumnSelector;
 import org.apache.druid.segment.SimpleAscendingOffset;
 import org.apache.druid.segment.TestHelper;
 import org.apache.druid.segment.column.ColumnBuilder;
+import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnConfig;
+import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnIndexSupplier;
 import org.apache.druid.segment.column.ColumnType;
 import org.apache.druid.segment.column.DruidPredicateIndex;
@@ -56,6 +58,8 @@ import org.apache.druid.segment.column.NullValueIndex;
 import org.apache.druid.segment.column.StringValueSetIndex;
 import org.apache.druid.segment.data.BitmapSerdeFactory;
 import org.apache.druid.segment.data.RoaringBitmapSerdeFactory;
+import org.apache.druid.segment.serde.ColumnPartSerde;
+import org.apache.druid.segment.serde.NestedCommonFormatColumnPartSerde;
 import org.apache.druid.segment.vector.BitmapVectorOffset;
 import org.apache.druid.segment.vector.NoFilterVectorOffset;
 import org.apache.druid.segment.vector.VectorObjectSelector;
@@ -245,16 +249,21 @@ public class NestedDataColumnSupplierTest extends 
InitializedNullHandlingTest
   public void testBasicFunctionality() throws IOException
   {
     ColumnBuilder bob = new ColumnBuilder();
-    bob.setFileMapper(fileMapper);
-    NestedDataColumnSupplier supplier = NestedDataColumnSupplier.read(
+    NestedCommonFormatColumnPartSerde partSerde = 
NestedCommonFormatColumnPartSerde.createDeserializer(
+        ColumnType.NESTED_DATA,
         false,
-        baseBuffer,
-        bob,
-        ALWAYS_USE_INDEXES,
-        bitmapSerdeFactory,
-        ByteOrder.nativeOrder()
+        ByteOrder.nativeOrder(),
+        RoaringBitmapSerdeFactory.getInstance()
     );
-    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
supplier.get()) {
+    bob.setFileMapper(fileMapper);
+    ColumnPartSerde.Deserializer deserializer = partSerde.getDeserializer();
+    deserializer.read(baseBuffer, bob, ALWAYS_USE_INDEXES);
+    final ColumnHolder holder = bob.build();
+    final ColumnCapabilities capabilities = holder.getCapabilities();
+    Assert.assertEquals(ColumnType.NESTED_DATA, capabilities.toColumnType());
+    Assert.assertTrue(capabilities.isFilterable());
+    Assert.assertTrue(holder.getColumnFormat() instanceof 
NestedCommonFormatColumn.Format);
+    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
holder.getColumn()) {
       smokeTest(column);
     }
   }
@@ -263,16 +272,21 @@ public class NestedDataColumnSupplierTest extends 
InitializedNullHandlingTest
   public void testArrayFunctionality() throws IOException
   {
     ColumnBuilder bob = new ColumnBuilder();
-    bob.setFileMapper(arrayFileMapper);
-    NestedDataColumnSupplier supplier = NestedDataColumnSupplier.read(
+    NestedCommonFormatColumnPartSerde partSerde = 
NestedCommonFormatColumnPartSerde.createDeserializer(
+        ColumnType.NESTED_DATA,
         false,
-        arrayBaseBuffer,
-        bob,
-        () -> 0,
-        bitmapSerdeFactory,
-        ByteOrder.nativeOrder()
+        ByteOrder.nativeOrder(),
+        RoaringBitmapSerdeFactory.getInstance()
     );
-    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
supplier.get()) {
+    bob.setFileMapper(arrayFileMapper);
+    ColumnPartSerde.Deserializer deserializer = partSerde.getDeserializer();
+    deserializer.read(arrayBaseBuffer, bob, ALWAYS_USE_INDEXES);
+    final ColumnHolder holder = bob.build();
+    final ColumnCapabilities capabilities = holder.getCapabilities();
+    Assert.assertEquals(ColumnType.NESTED_DATA, capabilities.toColumnType());
+    Assert.assertTrue(capabilities.isFilterable());
+    Assert.assertTrue(holder.getColumnFormat() instanceof 
NestedCommonFormatColumn.Format);
+    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
holder.getColumn()) {
       smokeTestArrays(column);
     }
   }
diff --git 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierV4Test.java
 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierV4Test.java
index 4ac538f661..f8d9dc4033 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierV4Test.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/nested/NestedDataColumnSupplierV4Test.java
@@ -48,6 +48,7 @@ import org.apache.druid.segment.SimpleAscendingOffset;
 import org.apache.druid.segment.TestHelper;
 import org.apache.druid.segment.column.BitmapColumnIndex;
 import org.apache.druid.segment.column.ColumnBuilder;
+import org.apache.druid.segment.column.ColumnCapabilities;
 import org.apache.druid.segment.column.ColumnHolder;
 import org.apache.druid.segment.column.ColumnIndexSupplier;
 import org.apache.druid.segment.column.ColumnType;
@@ -55,6 +56,8 @@ import org.apache.druid.segment.column.DruidPredicateIndex;
 import org.apache.druid.segment.column.NullValueIndex;
 import org.apache.druid.segment.column.StringValueSetIndex;
 import org.apache.druid.segment.column.TypeStrategy;
+import org.apache.druid.segment.serde.ColumnPartSerde;
+import org.apache.druid.segment.serde.ComplexColumnPartSerde;
 import org.apache.druid.segment.writeout.SegmentWriteOutMediumFactory;
 import org.apache.druid.segment.writeout.TmpFileSegmentWriteOutMediumFactory;
 import org.apache.druid.testing.InitializedNullHandlingTest;
@@ -214,15 +217,15 @@ public class NestedDataColumnSupplierV4Test extends 
InitializedNullHandlingTest
   {
     ColumnBuilder bob = new ColumnBuilder();
     bob.setFileMapper(fileMapper);
-    NestedDataColumnSupplierV4 supplier = NestedDataColumnSupplierV4.read(
-        baseBuffer,
-        bob,
-        NestedFieldColumnIndexSupplierTest.ALWAYS_USE_INDEXES,
-        NestedDataComplexTypeSerde.OBJECT_MAPPER,
-        new OnlyPositionalReadsTypeStrategy<>(ColumnType.LONG.getStrategy()),
-        new OnlyPositionalReadsTypeStrategy<>(ColumnType.DOUBLE.getStrategy())
-    );
-    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
supplier.get()) {
+    ComplexColumnPartSerde partSerde = 
ComplexColumnPartSerde.createDeserializer(NestedDataComplexTypeSerde.TYPE_NAME);
+    ColumnPartSerde.Deserializer deserializer = partSerde.getDeserializer();
+    deserializer.read(baseBuffer, bob, 
NestedFieldColumnIndexSupplierTest.ALWAYS_USE_INDEXES);
+    final ColumnHolder holder = bob.build();
+    final ColumnCapabilities capabilities = holder.getCapabilities();
+    Assert.assertEquals(ColumnType.NESTED_DATA, capabilities.toColumnType());
+    Assert.assertTrue(capabilities.isFilterable());
+    Assert.assertTrue(holder.getColumnFormat() instanceof 
NestedDataComplexTypeSerde.NestedColumnFormatV4);
+    try (NestedDataComplexColumn column = (NestedDataComplexColumn) 
holder.getColumn()) {
       smokeTest(column);
     }
   }
diff --git 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java
 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java
index 99b15fdc30..5c7729eb60 100644
--- 
a/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java
+++ 
b/sql/src/test/java/org/apache/druid/sql/calcite/CalciteNestedDataQueryTest.java
@@ -2177,6 +2177,50 @@ public class CalciteNestedDataQueryTest extends 
BaseCalciteQueryTest
     );
   }
 
+  @Test
+  public void testGroupByPathSelectorFilterCoalesce()
+  {
+    cannotVectorize();
+    testQuery(
+        "SELECT "
+        + "JSON_VALUE(nest, '$.x'), "
+        + "SUM(cnt) "
+        + "FROM druid.nested WHERE COALESCE(JSON_VALUE(nest, '$.x'), '0') = 
'100' GROUP BY 1",
+        ImmutableList.of(
+            GroupByQuery.builder()
+                        .setDataSource(DATA_SOURCE)
+                        .setInterval(querySegmentSpec(Filtration.eternity()))
+                        .setGranularity(Granularities.ALL)
+                        .setVirtualColumns(
+                            new NestedFieldVirtualColumn("nest", "$.x", "v0", 
ColumnType.STRING)
+                        )
+                        .setDimensions(
+                            dimensions(
+                                new DefaultDimensionSpec("v0", "d0")
+                            )
+                        )
+                        .setDimFilter(
+                            expressionFilter(
+                                
"case_searched(notnull(json_value(\"nest\",'$.x', 
'STRING')),(json_value(\"nest\",'$.x', 'STRING') == '100'),0)"
+                            )
+                        )
+                        .setAggregatorSpecs(aggregators(new 
LongSumAggregatorFactory("a0", "cnt")))
+                        .setContext(QUERY_CONTEXT_DEFAULT)
+                        .build()
+        ),
+        ImmutableList.of(
+            new Object[]{
+                "100",
+                2L
+            }
+        ),
+        RowSignature.builder()
+                    .add("EXPR$0", ColumnType.STRING)
+                    .add("EXPR$1", ColumnType.LONG)
+                    .build()
+    );
+  }
+
   @Test
   public void testJsonAndArrayAgg()
   {


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

Reply via email to