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 d96a9c1e6f add missing selectors for explicit null columns (#12834)
d96a9c1e6f is described below

commit d96a9c1e6f657e957d5971a252627cc7441b1a42
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Jul 29 19:08:58 2022 -0700

    add missing selectors for explicit null columns (#12834)
---
 .../apache/druid/segment/DimensionSelector.java    |   6 +
 .../druid/segment/serde/NullColumnPartSerde.java   |  16 ++-
 .../segment/serde/NullColumnPartSerdeTest.java     | 139 +++++++++++++++++++++
 3 files changed, 160 insertions(+), 1 deletion(-)

diff --git 
a/processing/src/main/java/org/apache/druid/segment/DimensionSelector.java 
b/processing/src/main/java/org/apache/druid/segment/DimensionSelector.java
index f47ea8cca9..ba5b202cba 100644
--- a/processing/src/main/java/org/apache/druid/segment/DimensionSelector.java
+++ b/processing/src/main/java/org/apache/druid/segment/DimensionSelector.java
@@ -311,6 +311,12 @@ public interface DimensionSelector extends 
ColumnValueSelector<Object>, Dimensio
       {
         // nothing to inspect
       }
+
+      @Override
+      public boolean isNull()
+      {
+        return NullHandling.sqlCompatible();
+      }
     }
   }
 }
diff --git 
a/processing/src/main/java/org/apache/druid/segment/serde/NullColumnPartSerde.java
 
b/processing/src/main/java/org/apache/druid/segment/serde/NullColumnPartSerde.java
index 12e47eef73..95df716b2c 100644
--- 
a/processing/src/main/java/org/apache/druid/segment/serde/NullColumnPartSerde.java
+++ 
b/processing/src/main/java/org/apache/druid/segment/serde/NullColumnPartSerde.java
@@ -33,6 +33,8 @@ import 
org.apache.druid.segment.vector.MultiValueDimensionVectorSelector;
 import org.apache.druid.segment.vector.NilVectorSelector;
 import org.apache.druid.segment.vector.ReadableVectorOffset;
 import org.apache.druid.segment.vector.SingleValueDimensionVectorSelector;
+import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorValueSelector;
 
 import javax.annotation.Nullable;
 import java.nio.channels.WritableByteChannel;
@@ -204,7 +206,19 @@ public class NullColumnPartSerde implements ColumnPartSerde
         ReadableVectorOffset vectorOffset
     )
     {
-      throw new RuntimeException("This method should not be called for 
null-only columns");
+      throw new UnsupportedOperationException("This method should not be 
called for null-only columns");
+    }
+
+    @Override
+    public VectorValueSelector makeVectorValueSelector(ReadableVectorOffset 
offset)
+    {
+      return NilVectorSelector.create(offset);
+    }
+
+    @Override
+    public VectorObjectSelector makeVectorObjectSelector(ReadableVectorOffset 
offset)
+    {
+      return NilVectorSelector.create(offset);
     }
 
     @Override
diff --git 
a/processing/src/test/java/org/apache/druid/segment/serde/NullColumnPartSerdeTest.java
 
b/processing/src/test/java/org/apache/druid/segment/serde/NullColumnPartSerdeTest.java
index d57dda4889..4329bedf12 100644
--- 
a/processing/src/test/java/org/apache/druid/segment/serde/NullColumnPartSerdeTest.java
+++ 
b/processing/src/test/java/org/apache/druid/segment/serde/NullColumnPartSerdeTest.java
@@ -21,12 +21,26 @@ package org.apache.druid.segment.serde;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.druid.common.config.NullHandling;
 import org.apache.druid.jackson.DefaultObjectMapper;
+import org.apache.druid.segment.ColumnValueSelector;
+import org.apache.druid.segment.DimensionSelector;
+import org.apache.druid.segment.SimpleAscendingOffset;
+import org.apache.druid.segment.column.BaseColumn;
 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.DictionaryEncodedColumn;
+import org.apache.druid.segment.column.Types;
 import org.apache.druid.segment.column.ValueType;
+import org.apache.druid.segment.data.ReadableOffset;
 import org.apache.druid.segment.data.RoaringBitmapSerdeFactory;
+import org.apache.druid.segment.vector.NoFilterVectorOffset;
+import org.apache.druid.segment.vector.ReadableVectorOffset;
+import org.apache.druid.segment.vector.SingleValueDimensionVectorSelector;
+import org.apache.druid.segment.vector.VectorObjectSelector;
+import org.apache.druid.segment.vector.VectorValueSelector;
 import org.apache.druid.testing.InitializedNullHandlingTest;
 import org.junit.Assert;
 import org.junit.Test;
@@ -53,6 +67,7 @@ public class NullColumnPartSerdeTest extends 
InitializedNullHandlingTest
     final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.DOUBLE);
     partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
     final ColumnCapabilities columnCapabilities = 
builder.build().getCapabilities();
+    Assert.assertTrue(Types.is(columnCapabilities, ValueType.DOUBLE));
     Assert.assertTrue(columnCapabilities.hasNulls().isTrue());
     Assert.assertTrue(columnCapabilities.hasMultipleValues().isFalse());
     Assert.assertTrue(columnCapabilities.isFilterable());
@@ -61,4 +76,128 @@ public class NullColumnPartSerdeTest extends 
InitializedNullHandlingTest
     Assert.assertTrue(columnCapabilities.areDictionaryValuesSorted().isTrue());
     Assert.assertTrue(columnCapabilities.areDictionaryValuesUnique().isTrue());
   }
+
+  @Test
+  public void testDimensionSelector()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.STRING);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+
+    BaseColumn theColumn = holder.getColumn();
+    Assert.assertTrue(theColumn instanceof DictionaryEncodedColumn);
+    DictionaryEncodedColumn dictionaryEncodedColumn = 
(DictionaryEncodedColumn) theColumn;
+
+    ReadableOffset offset = new SimpleAscendingOffset(10);
+    DimensionSelector dimensionSelector = 
dictionaryEncodedColumn.makeDimensionSelector(
+        offset,
+        null
+    );
+    Assert.assertNull(dimensionSelector.getObject());
+    Assert.assertEquals(1, dimensionSelector.getRow().size());
+    Assert.assertEquals(0, dimensionSelector.getRow().get(0));
+  }
+
+  @Test
+  public void testDimensionVectorSelector()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.STRING);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+
+    BaseColumn theColumn = holder.getColumn();
+    Assert.assertTrue(theColumn instanceof DictionaryEncodedColumn);
+    DictionaryEncodedColumn dictionaryEncodedColumn = 
(DictionaryEncodedColumn) theColumn;
+
+    ReadableVectorOffset vectorOffset = new NoFilterVectorOffset(8, 0, 10);
+
+    SingleValueDimensionVectorSelector vectorSelector =
+        
dictionaryEncodedColumn.makeSingleValueDimensionVectorSelector(vectorOffset);
+
+    int[] rowVector = vectorSelector.getRowVector();
+    for (int i = 0; i < vectorOffset.getCurrentVectorSize(); i++) {
+      Assert.assertEquals(0, rowVector[i]);
+      Assert.assertNull(vectorSelector.lookupName(rowVector[i]));
+    }
+
+    Assert.assertThrows(UnsupportedOperationException.class, () -> {
+      
dictionaryEncodedColumn.makeMultiValueDimensionVectorSelector(vectorOffset);
+    });
+  }
+
+  @Test
+  public void testVectorObjectSelector()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.STRING);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+
+    BaseColumn theColumn = holder.getColumn();
+
+    ReadableVectorOffset vectorOffset = new NoFilterVectorOffset(8, 0, 10);
+
+    VectorObjectSelector objectSelector = 
theColumn.makeVectorObjectSelector(vectorOffset);
+    Object[] vector = objectSelector.getObjectVector();
+    for (int i = 0; i < vectorOffset.getCurrentVectorSize(); i++) {
+      Assert.assertNull(vector[i]);
+    }
+  }
+
+  @Test
+  public void testColumnValueSelector()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.DOUBLE);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+
+    BaseColumn theColumn = holder.getColumn();
+
+    ReadableOffset offset = new SimpleAscendingOffset(10);
+    ColumnValueSelector valueSelector = 
theColumn.makeColumnValueSelector(offset);
+
+    if (NullHandling.sqlCompatible()) {
+      Assert.assertTrue(valueSelector.isNull());
+    } else {
+      Assert.assertFalse(valueSelector.isNull());
+    }
+    Assert.assertEquals(0.0, valueSelector.getDouble(), 0.0);
+  }
+
+  @Test
+  public void testVectorValueSelector()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.DOUBLE);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+
+    BaseColumn theColumn = holder.getColumn();
+    ReadableVectorOffset vectorOffset = new NoFilterVectorOffset(8, 0, 10);
+
+    VectorValueSelector selector = 
theColumn.makeVectorValueSelector(vectorOffset);
+    double[] vector = selector.getDoubleVector();
+    boolean[] nulls = selector.getNullVector();
+    for (int i = 0; i < vectorOffset.getCurrentVectorSize(); i++) {
+      Assert.assertEquals(0.0, vector[i], 0.0);
+      if (NullHandling.sqlCompatible()) {
+        Assert.assertTrue(nulls[i]);
+      } else {
+        Assert.assertFalse(nulls[i]);
+      }
+    }
+  }
+
+  @Test
+  public void testIndexSupplier()
+  {
+    final NullColumnPartSerde partSerde = new NullColumnPartSerde(10, new 
RoaringBitmapSerdeFactory(null));
+    final ColumnBuilder builder = new 
ColumnBuilder().setType(ValueType.DOUBLE);
+    partSerde.getDeserializer().read(Mockito.mock(ByteBuffer.class), builder, 
Mockito.mock(ColumnConfig.class));
+    ColumnHolder holder = builder.build();
+    Assert.assertNull(holder.getIndexSupplier());
+  }
 }


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

Reply via email to