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 00cb0a2900a Fix extractionFns on number-wrapping dimension selectors.
(#15761)
00cb0a2900a is described below
commit 00cb0a2900a4cc8248532327aba521add9cc91b4
Author: Gian Merlino <[email protected]>
AuthorDate: Fri Jan 26 06:26:13 2024 -0800
Fix extractionFns on number-wrapping dimension selectors. (#15761)
When an ExtractionFn is used on top of a numeric column, it wasn't applied
to
nulls (nulls are returned as-is). This patch fixes it.
---
.../segment/DoubleWrappingDimensionSelector.java | 8 +-
.../segment/FloatWrappingDimensionSelector.java | 8 +-
.../segment/LongWrappingDimensionSelector.java | 8 +-
.../segment/WrappingDimensionSelectorTest.java | 139 +++++++++++++++++++++
4 files changed, 148 insertions(+), 15 deletions(-)
diff --git
a/processing/src/main/java/org/apache/druid/segment/DoubleWrappingDimensionSelector.java
b/processing/src/main/java/org/apache/druid/segment/DoubleWrappingDimensionSelector.java
index 4f1dac049f6..a4dbcf6fbdf 100644
---
a/processing/src/main/java/org/apache/druid/segment/DoubleWrappingDimensionSelector.java
+++
b/processing/src/main/java/org/apache/druid/segment/DoubleWrappingDimensionSelector.java
@@ -43,12 +43,10 @@ public class DoubleWrappingDimensionSelector extends
BaseSingleValueDimensionSel
@Override
protected String getValue()
{
- if (selector.isNull()) {
- return null;
- } else if (extractionFn == null) {
- return String.valueOf(selector.getDouble());
+ if (extractionFn == null) {
+ return selector.isNull() ? null : String.valueOf(selector.getDouble());
} else {
- return extractionFn.apply(selector.getDouble());
+ return selector.isNull() ? extractionFn.apply(null) :
extractionFn.apply(selector.getDouble());
}
}
diff --git
a/processing/src/main/java/org/apache/druid/segment/FloatWrappingDimensionSelector.java
b/processing/src/main/java/org/apache/druid/segment/FloatWrappingDimensionSelector.java
index ec5f958dab9..6455dc8e227 100644
---
a/processing/src/main/java/org/apache/druid/segment/FloatWrappingDimensionSelector.java
+++
b/processing/src/main/java/org/apache/druid/segment/FloatWrappingDimensionSelector.java
@@ -40,12 +40,10 @@ public class FloatWrappingDimensionSelector extends
BaseSingleValueDimensionSele
@Override
protected String getValue()
{
- if (selector.isNull()) {
- return null;
- } else if (extractionFn == null) {
- return String.valueOf(selector.getFloat());
+ if (extractionFn == null) {
+ return selector.isNull() ? null : String.valueOf(selector.getFloat());
} else {
- return extractionFn.apply(selector.getFloat());
+ return selector.isNull() ? extractionFn.apply(null) :
extractionFn.apply(selector.getFloat());
}
}
diff --git
a/processing/src/main/java/org/apache/druid/segment/LongWrappingDimensionSelector.java
b/processing/src/main/java/org/apache/druid/segment/LongWrappingDimensionSelector.java
index de25d2ebd87..37e4ec79de2 100644
---
a/processing/src/main/java/org/apache/druid/segment/LongWrappingDimensionSelector.java
+++
b/processing/src/main/java/org/apache/druid/segment/LongWrappingDimensionSelector.java
@@ -40,12 +40,10 @@ public class LongWrappingDimensionSelector extends
BaseSingleValueDimensionSelec
@Override
protected String getValue()
{
- if (selector.isNull()) {
- return null;
- } else if (extractionFn == null) {
- return String.valueOf(selector.getLong());
+ if (extractionFn == null) {
+ return selector.isNull() ? null : String.valueOf(selector.getLong());
} else {
- return extractionFn.apply(selector.getLong());
+ return selector.isNull() ? extractionFn.apply(null) :
extractionFn.apply(selector.getLong());
}
}
diff --git
a/processing/src/test/java/org/apache/druid/segment/WrappingDimensionSelectorTest.java
b/processing/src/test/java/org/apache/druid/segment/WrappingDimensionSelectorTest.java
index 8ba3425807d..fd4ebf69b30 100644
---
a/processing/src/test/java/org/apache/druid/segment/WrappingDimensionSelectorTest.java
+++
b/processing/src/test/java/org/apache/druid/segment/WrappingDimensionSelectorTest.java
@@ -20,10 +20,13 @@
package org.apache.druid.segment;
import org.apache.druid.common.config.NullHandling;
+import org.apache.druid.query.extraction.DimExtractionFn;
import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.Assert;
import org.junit.Test;
+import javax.annotation.Nullable;
+
public class WrappingDimensionSelectorTest extends InitializedNullHandlingTest
{
@Test
@@ -39,8 +42,10 @@ public class WrappingDimensionSelectorTest extends
InitializedNullHandlingTest
lngSelector.increment();
if (NullHandling.sqlCompatible()) {
Assert.assertTrue(lngSelector.isNull());
+ Assert.assertNull(lngWrapSelector.getValue());
} else {
Assert.assertEquals(0L, lngSelector.getLong());
+ Assert.assertEquals("0", lngWrapSelector.getValue());
}
lngSelector.increment();
@@ -69,8 +74,10 @@ public class WrappingDimensionSelectorTest extends
InitializedNullHandlingTest
dblSelector.increment();
if (NullHandling.sqlCompatible()) {
Assert.assertTrue(dblSelector.isNull());
+ Assert.assertNull(dblWrapSelector.getValue());
} else {
Assert.assertEquals(0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("0.0", dblWrapSelector.getValue());
}
dblSelector.increment();
@@ -99,8 +106,10 @@ public class WrappingDimensionSelectorTest extends
InitializedNullHandlingTest
flSelector.increment();
if (NullHandling.sqlCompatible()) {
Assert.assertTrue(flSelector.isNull());
+ Assert.assertNull(flWrapSelector.getValue());
} else {
Assert.assertEquals(0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("0.0", flWrapSelector.getValue());
}
flSelector.increment();
@@ -115,4 +124,134 @@ public class WrappingDimensionSelectorTest extends
InitializedNullHandlingTest
Assert.assertEquals(-45.0f, flSelector.getFloat(), 0);
Assert.assertEquals("-45.0", flWrapSelector.getValue());
}
+
+ @Test
+ public void testLongWrappingDimensionSelectorExtractionFn()
+ {
+ Long[] vals = new Long[]{24L, null, 50L, 0L, -60L};
+ TestNullableLongColumnSelector lngSelector = new
TestNullableLongColumnSelector(vals);
+ final TestExtractionFn extractionFn = new TestExtractionFn();
+
+ LongWrappingDimensionSelector lngWrapSelector = new
LongWrappingDimensionSelector(lngSelector, extractionFn);
+ Assert.assertEquals(24L, lngSelector.getLong());
+ Assert.assertEquals("24x", lngWrapSelector.getValue());
+
+ lngSelector.increment();
+ if (NullHandling.sqlCompatible()) {
+ Assert.assertTrue(lngSelector.isNull());
+ Assert.assertEquals("nullx", lngWrapSelector.getValue());
+ } else {
+ Assert.assertEquals(0L, lngSelector.getLong());
+ Assert.assertEquals("0x", lngWrapSelector.getValue());
+ }
+
+ lngSelector.increment();
+ Assert.assertEquals(50L, lngSelector.getLong());
+ Assert.assertEquals("50x", lngWrapSelector.getValue());
+
+ lngSelector.increment();
+ Assert.assertEquals(0L, lngSelector.getLong());
+ Assert.assertEquals("0x", lngWrapSelector.getValue());
+
+ lngSelector.increment();
+ Assert.assertEquals(-60L, lngSelector.getLong());
+ Assert.assertEquals("-60x", lngWrapSelector.getValue());
+ }
+
+ @Test
+ public void testDoubleWrappingDimensionSelectorExtractionFn()
+ {
+ Double[] vals = new Double[]{32.0d, null, 5.0d, 0.0d, -45.0d};
+ TestNullableDoubleColumnSelector dblSelector = new
TestNullableDoubleColumnSelector(vals);
+ final TestExtractionFn extractionFn = new TestExtractionFn();
+
+ DoubleWrappingDimensionSelector dblWrapSelector = new
DoubleWrappingDimensionSelector(dblSelector, extractionFn);
+ Assert.assertEquals(32.0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("32.0x", dblWrapSelector.getValue());
+
+ dblSelector.increment();
+ if (NullHandling.sqlCompatible()) {
+ Assert.assertTrue(dblSelector.isNull());
+ Assert.assertEquals("nullx", dblWrapSelector.getValue());
+ } else {
+ Assert.assertEquals(0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("0.0x", dblWrapSelector.getValue());
+ }
+
+ dblSelector.increment();
+ Assert.assertEquals(5.0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("5.0x", dblWrapSelector.getValue());
+
+ dblSelector.increment();
+ Assert.assertEquals(0.0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("0.0x", dblWrapSelector.getValue());
+
+ dblSelector.increment();
+ Assert.assertEquals(-45.0d, dblSelector.getDouble(), 0);
+ Assert.assertEquals("-45.0x", dblWrapSelector.getValue());
+ }
+
+ @Test
+ public void testFloatWrappingDimensionSelectorExtractionFn()
+ {
+ Float[] vals = new Float[]{32.0f, null, 5.0f, 0.0f, -45.0f};
+ TestNullableFloatColumnSelector flSelector = new
TestNullableFloatColumnSelector(vals);
+ final TestExtractionFn extractionFn = new TestExtractionFn();
+
+ FloatWrappingDimensionSelector flWrapSelector = new
FloatWrappingDimensionSelector(flSelector, extractionFn);
+ Assert.assertEquals(32.0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("32.0x", flWrapSelector.getValue());
+
+ flSelector.increment();
+ if (NullHandling.sqlCompatible()) {
+ Assert.assertTrue(flSelector.isNull());
+ Assert.assertEquals("nullx", flWrapSelector.getValue());
+ } else {
+ Assert.assertEquals(0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("0.0x", flWrapSelector.getValue());
+ }
+
+ flSelector.increment();
+ Assert.assertEquals(5.0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("5.0x", flWrapSelector.getValue());
+
+ flSelector.increment();
+ Assert.assertEquals(0.0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("0.0x", flWrapSelector.getValue());
+
+ flSelector.increment();
+ Assert.assertEquals(-45.0f, flSelector.getFloat(), 0);
+ Assert.assertEquals("-45.0x", flWrapSelector.getValue());
+ }
+
+ /**
+ * Concats {@link String#valueOf(int)} with "x".
+ */
+ private static class TestExtractionFn extends DimExtractionFn
+ {
+ @Override
+ public byte[] getCacheKey()
+ {
+ throw new UnsupportedOperationException();
+ }
+
+ @Nullable
+ @Override
+ public String apply(@Nullable String value)
+ {
+ return value + "x";
+ }
+
+ @Override
+ public boolean preservesOrdering()
+ {
+ return false;
+ }
+
+ @Override
+ public ExtractionType getExtractionType()
+ {
+ return ExtractionType.MANY_TO_ONE;
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]