This is an automated email from the ASF dual-hosted git repository.
abhishek pushed a commit to branch 27.0.0
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/27.0.0 by this push:
new dd3a4a4962 fixes for nested virtual column array element vector
selectors and fixes for variant and nested variant numeric columns (#14693)
dd3a4a4962 is described below
commit dd3a4a4962147e6ab60c4824524ad76134d9642e
Author: Clint Wylie <[email protected]>
AuthorDate: Fri Jul 28 23:11:47 2023 -0700
fixes for nested virtual column array element vector selectors and fixes
for variant and nested variant numeric columns (#14693)
* fix issue with nested virtual column array element vector selectors when
input is numeric array but output is non-numeric
* add vector value selector for mixed numeric type variant and nested
variant fields, tests
---
.../nested/CompressedNestedDataComplexColumn.java | 19 ++++-
.../nested/NestedFieldDictionaryEncodedColumn.java | 82 ++++++++++++++++++++--
.../apache/druid/segment/nested/VariantColumn.java | 76 ++++++++++++++++++++
.../segment/virtual/NestedFieldVirtualColumn.java | 11 +++
.../druid/query/scan/NestedDataScanQueryTest.java | 20 +-----
.../timeseries/NestedDataTimeseriesQueryTest.java | 66 +++++++++--------
.../nested/NestedFieldColumnSelectorsTest.java | 17 +++--
.../test/resources/nested-all-types-test-data.json | 14 ++--
.../sql/calcite/CalciteNestedDataQueryTest.java | 20 +++++-
9 files changed, 252 insertions(+), 73 deletions(-)
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
b/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
index 4c37264560..7b0e99db5f 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/CompressedNestedDataComplexColumn.java
@@ -22,6 +22,7 @@ package org.apache.druid.segment.nested;
import com.google.common.base.Preconditions;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
import com.google.common.primitives.Doubles;
import org.apache.druid.collections.bitmap.ImmutableBitmap;
import org.apache.druid.java.util.common.IAE;
@@ -822,7 +823,23 @@ public abstract class
CompressedNestedDataComplexColumn<TStringDictionary extend
String field = getField(path);
int index = fields.indexOf(field);
if (index < 0) {
- return null;
+ if (!path.isEmpty() && path.get(path.size() - 1) instanceof
NestedPathArrayElement) {
+ final String arrayField = getField(path.subList(0, path.size() - 1));
+ index = fields.indexOf(arrayField);
+ }
+ if (index < 0) {
+ return null;
+ }
+ Set<ColumnType> arrayTypes =
FieldTypeInfo.convertToSet(fieldInfo.getTypes(index).getByteValue());
+ Set<ColumnType> elementTypes =
Sets.newHashSetWithExpectedSize(arrayTypes.size());
+ for (ColumnType type : arrayTypes) {
+ if (type.isArray()) {
+ elementTypes.add((ColumnType) type.getElementType());
+ } else {
+ elementTypes.add(type);
+ }
+ }
+ return elementTypes;
}
return
FieldTypeInfo.convertToSet(fieldInfo.getTypes(index).getByteValue());
}
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
b/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
index dd883efcdb..e13b86e070 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/NestedFieldDictionaryEncodedColumn.java
@@ -26,8 +26,8 @@ import com.google.common.primitives.Doubles;
import com.google.common.primitives.Floats;
import org.apache.druid.collections.bitmap.ImmutableBitmap;
import org.apache.druid.common.guava.GuavaUtils;
+import org.apache.druid.error.DruidException;
import org.apache.druid.java.util.common.StringUtils;
-import org.apache.druid.java.util.common.UOE;
import org.apache.druid.math.expr.ExprEval;
import org.apache.druid.math.expr.ExpressionType;
import org.apache.druid.query.extraction.ExtractionFn;
@@ -43,6 +43,7 @@ import org.apache.druid.segment.LongColumnSelector;
import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.DictionaryEncodedColumn;
import org.apache.druid.segment.column.StringUtf8DictionaryEncodedColumn;
+import org.apache.druid.segment.column.TypeSignature;
import org.apache.druid.segment.column.Types;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.data.ColumnarDoubles;
@@ -889,7 +890,9 @@ public class
NestedFieldDictionaryEncodedColumn<TStringDictionary extends Indexe
longsColumn.get(valueVector, offsets,
offset.getCurrentVectorSize());
}
- nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ if (nullIterator != null) {
+ nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ }
id = offset.getId();
}
@@ -942,15 +945,84 @@ public class
NestedFieldDictionaryEncodedColumn<TStringDictionary extends Indexe
doublesColumn.get(valueVector, offsets,
offset.getCurrentVectorSize());
}
- nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ if (nullIterator != null) {
+ nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ }
id = offset.getId();
}
};
}
- throw new UOE("Cannot make vector value selector for [%s] typed nested
field", types);
+ throw DruidException.defensive("Cannot make vector value selector for
[%s] typed nested field", types);
+ }
+ if
(FieldTypeInfo.convertToSet(types.getByteValue()).stream().allMatch(TypeSignature::isNumeric))
{
+ return new BaseDoubleVectorValueSelector(offset)
+ {
+ private final double[] valueVector = new
double[offset.getMaxVectorSize()];
+ private final int[] idVector = new int[offset.getMaxVectorSize()];
+ @Nullable
+ private boolean[] nullVector = null;
+ private int id = ReadableVectorInspector.NULL_ID;
+
+ @Nullable
+ private PeekableIntIterator nullIterator = nullBitmap != null ?
nullBitmap.peekableIterator() : null;
+ private int offsetMark = -1;
+ @Override
+ public double[] getDoubleVector()
+ {
+ computeVectorsIfNeeded();
+ return valueVector;
+ }
+
+ @Nullable
+ @Override
+ public boolean[] getNullVector()
+ {
+ computeVectorsIfNeeded();
+ return nullVector;
+ }
+
+ private void computeVectorsIfNeeded()
+ {
+ if (id == offset.getId()) {
+ return;
+ }
+
+ if (offset.isContiguous()) {
+ if (offset.getStartOffset() < offsetMark) {
+ nullIterator = nullBitmap.peekableIterator();
+ }
+ offsetMark = offset.getStartOffset() +
offset.getCurrentVectorSize();
+ column.get(idVector, offset.getStartOffset(),
offset.getCurrentVectorSize());
+ } else {
+ final int[] offsets = offset.getOffsets();
+ if (offsets[offsets.length - 1] < offsetMark) {
+ nullIterator = nullBitmap.peekableIterator();
+ }
+ offsetMark = offsets[offsets.length - 1];
+ column.get(idVector, offsets, offset.getCurrentVectorSize());
+ }
+ for (int i = 0; i < offset.getCurrentVectorSize(); i++) {
+ final int globalId = dictionary.get(idVector[i]);
+ if (globalId == 0) {
+ continue;
+ }
+ if (globalId < adjustDoubleId) {
+ valueVector[i] = globalLongDictionary.get(globalId -
adjustLongId).doubleValue();
+ } else {
+ valueVector[i] = globalDoubleDictionary.get(globalId -
adjustDoubleId).doubleValue();
+ }
+ }
+
+ if (nullIterator != null) {
+ nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ }
+
+ id = offset.getId();
+ }
+ };
}
- throw new UOE("Cannot make vector value selector for variant typed [%s]
nested field", types);
+ throw DruidException.defensive("Cannot make vector value selector for
variant typed [%s] nested field", types);
}
@Override
diff --git
a/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
b/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
index 820527b91d..bf7cf0605a 100644
---
a/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
+++
b/processing/src/main/java/org/apache/druid/segment/nested/VariantColumn.java
@@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.IntArraySet;
import it.unimi.dsi.fastutil.ints.IntSet;
import org.apache.druid.collections.bitmap.ImmutableBitmap;
import org.apache.druid.common.guava.GuavaUtils;
+import org.apache.druid.error.DruidException;
import org.apache.druid.java.util.common.IAE;
import org.apache.druid.java.util.common.StringUtils;
import org.apache.druid.math.expr.ExprEval;
@@ -53,11 +54,14 @@ import org.apache.druid.segment.data.ReadableOffset;
import org.apache.druid.segment.data.SingleIndexedInt;
import org.apache.druid.segment.filter.BooleanValueMatcher;
import
org.apache.druid.segment.historical.SingleValueHistoricalDimensionSelector;
+import org.apache.druid.segment.vector.BaseDoubleVectorValueSelector;
import org.apache.druid.segment.vector.MultiValueDimensionVectorSelector;
import org.apache.druid.segment.vector.ReadableVectorInspector;
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.VectorSelectorUtils;
+import org.apache.druid.segment.vector.VectorValueSelector;
import org.roaringbitmap.PeekableIntIterator;
import javax.annotation.Nullable;
@@ -757,6 +761,78 @@ public class VariantColumn<TStringDictionary extends
Indexed<ByteBuffer>>
throw new UnsupportedOperationException();
}
+ @Override
+ public VectorValueSelector makeVectorValueSelector(ReadableVectorOffset
offset)
+ {
+ if
(FieldTypeInfo.convertToSet(variantTypes.getByteValue()).stream().allMatch(x ->
x.isNumeric())) {
+ return new BaseDoubleVectorValueSelector(offset)
+ {
+ private final double[] valueVector = new
double[offset.getMaxVectorSize()];
+ private final int[] idVector = new int[offset.getMaxVectorSize()];
+ @Nullable
+ private boolean[] nullVector = null;
+ private int id = ReadableVectorInspector.NULL_ID;
+
+ @Nullable
+ private PeekableIntIterator nullIterator = nullValueBitmap != null ?
nullValueBitmap.peekableIterator() : null;
+ private int offsetMark = -1;
+ @Override
+ public double[] getDoubleVector()
+ {
+ computeVectorsIfNeeded();
+ return valueVector;
+ }
+
+ @Nullable
+ @Override
+ public boolean[] getNullVector()
+ {
+ computeVectorsIfNeeded();
+ return nullVector;
+ }
+
+ private void computeVectorsIfNeeded()
+ {
+ if (id == offset.getId()) {
+ return;
+ }
+
+ if (offset.isContiguous()) {
+ if (offset.getStartOffset() < offsetMark) {
+ nullIterator = nullValueBitmap.peekableIterator();
+ }
+ offsetMark = offset.getStartOffset() +
offset.getCurrentVectorSize();
+ encodedValueColumn.get(idVector, offset.getStartOffset(),
offset.getCurrentVectorSize());
+ } else {
+ final int[] offsets = offset.getOffsets();
+ if (offsets[offsets.length - 1] < offsetMark) {
+ nullIterator = nullValueBitmap.peekableIterator();
+ }
+ offsetMark = offsets[offsets.length - 1];
+ encodedValueColumn.get(idVector, offsets,
offset.getCurrentVectorSize());
+ }
+ for (int i = 0; i < offset.getCurrentVectorSize(); i++) {
+ int dictId = idVector[i];
+ if (dictId == 0) {
+ valueVector[i] = 0.0;
+ } else if (dictId < adjustDoubleId) {
+ valueVector[i] = longDictionary.get(dictId -
adjustLongId).doubleValue();
+ } else {
+ valueVector[i] = doubleDictionary.get(dictId -
adjustDoubleId).doubleValue();
+ }
+ }
+
+ if (nullIterator != null) {
+ nullVector = VectorSelectorUtils.populateNullVector(nullVector,
offset, nullIterator);
+ }
+
+ id = offset.getId();
+ }
+ };
+ }
+ throw DruidException.defensive("Cannot make vector value selector for
variant typed [%s] column", variantTypes);
+ }
+
@Override
public VectorObjectSelector makeVectorObjectSelector(ReadableVectorOffset
offset)
{
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 c1834e1eb0..897f71c8ff 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
@@ -54,6 +54,7 @@ import org.apache.druid.segment.column.ColumnIndexSupplier;
import org.apache.druid.segment.column.ColumnType;
import org.apache.druid.segment.column.DictionaryEncodedColumn;
import org.apache.druid.segment.column.NumericColumn;
+import org.apache.druid.segment.column.Types;
import org.apache.druid.segment.column.ValueType;
import org.apache.druid.segment.column.ValueTypes;
import org.apache.druid.segment.data.IndexedInts;
@@ -524,12 +525,22 @@ public class NestedFieldVirtualColumn implements
VirtualColumn
leastRestrictiveType =
ColumnType.leastRestrictiveType(leastRestrictiveType, type);
}
}
+ if (leastRestrictiveType != null && leastRestrictiveType.isNumeric() &&
!Types.isNumeric(expectedType)) {
+ return ExpressionVectorSelectors.castValueSelectorToObject(
+ offset,
+ columnName,
+ complexColumn.makeVectorValueSelector(parts, offset),
+ leastRestrictiveType,
+ expectedType == null ? ColumnType.STRING : expectedType
+ );
+ }
final VectorObjectSelector objectSelector =
complexColumn.makeVectorObjectSelector(parts, offset);
if (leastRestrictiveType != null && leastRestrictiveType.isArray() &&
!expectedType.isArray()) {
final ExpressionType elementType =
ExpressionType.fromColumnTypeStrict(leastRestrictiveType.getElementType());
final ExpressionType castTo =
ExpressionType.fromColumnTypeStrict(expectedType);
return makeVectorArrayToScalarObjectSelector(offset, objectSelector,
elementType, castTo);
}
+
return objectSelector;
}
// not a nested column, but we can still do stuff if the path is the
'root', indicated by an empty path parts
diff --git
a/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
b/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
index 53bb1b11c4..b4fe9ce869 100644
---
a/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
+++
b/processing/src/test/java/org/apache/druid/query/scan/NestedDataScanQueryTest.java
@@ -785,28 +785,12 @@ public class NestedDataScanQueryTest extends
InitializedNullHandlingTest
Assert.assertEquals(resultsRealtime.size(), resultsSegments.size());
if (NullHandling.replaceWithDefault()) {
Assert.assertEquals(
- "["
- + "[1672531200000, null, 0, 0.0, true, 51, 1, [], [51, -35], {a=700,
b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5}, {l=[a,
b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null], null,
[true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1,
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2,
3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, null, 2, 0.0, false, b, b, 2, b, {a=200, b={x=b,
y=1.1, z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}, [1, 2, 3]],
z={a=[5.5], b=false}}, [a, b, c], [null, b], [2, 3], null, [3.3, 4.4, 5.5],
[999.0, null, 5.5], [null, null, 2.2], [true, true], [null, [null], []],
[{x=3}, {x=4}], null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234,
c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null],
[{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, a, 1, 1.0, true, 1, 1, 1, 1, {a=100, b={x=a,
y=1.1, z=[1, 2, 3, 4]}}, {x=1234, y=[{l=[a, b, c], m=a, n=1}, {l=[a, b, c],
m=a, n=1}], z={a=[1.1, 2.2, 3.3], b=true}}, [a, b], [a, b], [1, 2, 3], [1,
null, 3], [1.1, 2.2, 3.3], [1.1, 2.2, null], [a, 1, 2.2], [true, false, true],
[[1, 2, null], [3, 4]], [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1,
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2,
3.3], [], {}, [null, null], [{}, {}, {}], [...]
- + "[1672531200000, b, 4, 3.3, true, 1, {}, 4, 1, {a=400, b={x=d,
y=1.1, z=[3, 4]}}, {x=1234, z={a=[1.1, 2.2, 3.3], b=true}}, [d, e], [b, b], [1,
4], [1], [2.2, 3.3, 4.0], null, [a, b, c], [null, false, true], [[1, 2], [3,
4], [5, 6, 7]], [{x=null}, {x=2}], null, hello, 1234, 1.234, {x=1, y=hello,
z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {},
[null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, c, 0, 4.4, true, hello, {}, [], hello, {a=500,
b={x=e, z=[1, 2, 3, 4]}}, {x=11, y=[], z={a=[null], b=false}}, null, null, [1,
2, 3], [], [1.1, 2.2, 3.3], null, null, [false], null, [{x=1000}, {y=2000}],
null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a,
b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b,
x=1, y=1.3}], 1], "
- + "[1672531200000, d, 5, 5.9, false, null, a, 6, null, {a=600,
b={x=f, y=1.1, z=[6, 7, 8, 9]}}, null, [a, b], null, null, [null, 2, 9], null,
[999.0, 5.5, null], [a, 1, 2.2], [], [[1], [1, 2, null]], [{a=1}, {b=2}], null,
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c],
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1,
y=1.3}], 1], "
- + "[1672531200000, null, 3, 2.0, null, 3.0, 3.3, 3, 3.0, {a=300},
{x=4, y=[{l=[], m=100, n=3}, {l=[a]}, {l=[b], n=[]}], z={a=[], b=true}}, [b,
c], [d, null, b], [1, 2, 3, 4], [1, 2, 3], [1.1, 3.3], [null, 2.2, null], [1,
null, 1], [true, null, true], [[1], null, [1, 2, 3]], [null, {x=2}], null,
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c],
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1,
y=1.3}], 1]"
- + "]",
+ "[[1672531200000, null, 0, 0.0, true, 51, -0.13, 1, [], [51, -35],
{a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5},
{l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null],
null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234,
{x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1,
2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1],
[1672531200000, null, 2, 0.0, false, b [...]
resultsSegments.get(0).getEvents().toString()
);
} else {
Assert.assertEquals(
- "["
- + "[1672531200000, null, null, null, true, 51, 1, [], [51, -35],
{a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100, n=5},
{l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null, [null],
null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234, 1.234,
{x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1,
2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, , 2, null, false, b, b, 2, b, {a=200, b={x=b,
y=1.1, z=[2, 4, 6]}}, {x=10, y=[{l=[b, b, c], m=b, n=2}, [1, 2, 3]],
z={a=[5.5], b=false}}, [a, b, c], [null, b], [2, 3], null, [3.3, 4.4, 5.5],
[999.0, null, 5.5], [null, null, 2.2], [true, true], [null, [null], []],
[{x=3}, {x=4}], null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234,
c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null],
[{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, a, 1, 1.0, true, 1, 1, 1, 1, {a=100, b={x=a,
y=1.1, z=[1, 2, 3, 4]}}, {x=1234, y=[{l=[a, b, c], m=a, n=1}, {l=[a, b, c],
m=a, n=1}], z={a=[1.1, 2.2, 3.3], b=true}}, [a, b], [a, b], [1, 2, 3], [1,
null, 3], [1.1, 2.2, 3.3], [1.1, 2.2, null], [a, 1, 2.2], [true, false, true],
[[1, 2, null], [3, 4]], [{x=1}, {x=2}], null, hello, 1234, 1.234, {x=1,
y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2,
3.3], [], {}, [null, null], [{}, {}, {}], [...]
- + "[1672531200000, b, 4, 3.3, true, 1, {}, 4, 1, {a=400, b={x=d,
y=1.1, z=[3, 4]}}, {x=1234, z={a=[1.1, 2.2, 3.3], b=true}}, [d, e], [b, b], [1,
4], [1], [2.2, 3.3, 4.0], null, [a, b, c], [null, false, true], [[1, 2], [3,
4], [5, 6, 7]], [{x=null}, {x=2}], null, hello, 1234, 1.234, {x=1, y=hello,
z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {},
[null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
- + "[1672531200000, c, null, 4.4, true, hello, {}, [], hello, {a=500,
b={x=e, z=[1, 2, 3, 4]}}, {x=11, y=[], z={a=[null], b=false}}, null, null, [1,
2, 3], [], [1.1, 2.2, 3.3], null, null, [false], null, [{x=1000}, {y=2000}],
null, hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a,
b, c], [1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b,
x=1, y=1.3}], 1], "
- + "[1672531200000, d, 5, 5.9, false, null, a, 6, null, {a=600,
b={x=f, y=1.1, z=[6, 7, 8, 9]}}, null, [a, b], null, null, [null, 2, 9], null,
[999.0, 5.5, null], [a, 1, 2.2], [], [[1], [1, 2, null]], [{a=1}, {b=2}], null,
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c],
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1,
y=1.3}], 1], "
- + "[1672531200000, null, 3, 2.0, null, 3.0, 3.3, 3, 3.0, {a=300},
{x=4, y=[{l=[], m=100, n=3}, {l=[a]}, {l=[b], n=[]}], z={a=[], b=true}}, [b,
c], [d, null, b], [1, 2, 3, 4], [1, 2, 3], [1.1, 3.3], [null, 2.2, null], [1,
null, 1], [true, null, true], [[1], null, [1, 2, 3]], [null, {x=2}], null,
hello, 1234, 1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c],
[1, 2, 3], [1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1,
y=1.3}], 1]"
- + "]",
+ "[[1672531200000, null, null, null, true, 51, -0.13, 1, [], [51,
-35], {a=700, b={x=g, y=1.1, z=[9, null, 9, 9]}}, {x=400, y=[{l=[null], m=100,
n=5}, {l=[a, b, c], m=a, n=1}], z={}}, null, [a, b], null, [2, 3], null,
[null], null, [true, false, true], null, [{x=1}, {x=2}], null, hello, 1234,
1.234, {x=1, y=hello, z={a=1.1, b=1234, c=[a, b, c]}}, [a, b, c], [1, 2, 3],
[1.1, 2.2, 3.3], [], {}, [null, null], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1],
[1672531200000, , 2, null, false, [...]
resultsSegments.get(0).getEvents().toString()
);
}
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 60de2c0e23..ac63221472 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
@@ -21,6 +21,7 @@ package org.apache.druid.query.timeseries;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import org.apache.druid.common.config.NullHandling;
import org.apache.druid.guice.NestedDataModule;
import org.apache.druid.java.util.common.DateTimes;
import org.apache.druid.java.util.common.Intervals;
@@ -38,6 +39,8 @@ import org.apache.druid.query.filter.AndDimFilter;
import org.apache.druid.query.filter.EqualityFilter;
import org.apache.druid.query.filter.Filter;
import org.apache.druid.query.filter.FilterTuning;
+import org.apache.druid.query.filter.NullFilter;
+import org.apache.druid.query.filter.OrDimFilter;
import org.apache.druid.segment.Segment;
import org.apache.druid.segment.TestHelper;
import org.apache.druid.segment.column.ColumnType;
@@ -140,13 +143,13 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
public void testSums()
{
/*
- "long":1, "double":1.0, "obj":{"a": 100, "b": {"x": "a", "y":
1.1, "z": [1, 2, 3, 4]}},
- "long":2, "obj":{"a": 200, "b": {"x": "b", "y":
1.1, "z": [2, 4, 6]}},
- "long":3, "double":2.0, "obj":{"a": 300},
- "long":4, "double":3.3, "obj":{"a": 400, "b": {"x": "d", "y":
1.1, "z": [3, 4]}},
- "long": null, "double":4.4, "obj":{"a": 500, "b": {"x": "e", "z":
[1, 2, 3, 4]}},
- "long":5, "double":5.9, "obj":{"a": 600, "b": {"x": "f", "y":
1.1, "z": [6, 7, 8, 9]}},
- "double":null, "obj":{"a": 700, "b": {"x": "g", "y":
1.1, "z": [9, null, 9, 9]}},
+ "long":1, "double":1.0, "variantNumeric": 1, "obj":{"a": 100,
"b": {"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}}, "complexObj":{"x": 1234, ...}
+ "long":2, "variantNumeric": 1.1, "obj":{"a": 200,
"b": {"x": "b", "y": 1.1, "z": [2, 4, 6]}}, "complexObj":{"x": 10, ... }
+ "long":3, "double":2.0, "variantNumeric": 1.0, "obj":{"a": 300},
"complexObj":{"x": 4.4, ... }
+ "long":4, "double":3.3, "obj":{"a": 400,
"b": {"x": "d", "y": 1.1, "z": [3, 4]}}, "complexObj":{"x": 1234,... }
+ "long": null, "double":4.4, "variantNumeric": -1000, "obj":{"a": 500,
"b": {"x": "e", "z": [1, 2, 3, 4]}}, "complexObj":{"x": 11, ... }
+ "long":5, "double":5.9, "variantNumeric": 3.33, "obj":{"a": 600,
"b": {"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},
+ "double":null, "variantNumeric": -0.13, "obj":{"a": 700,
"b": {"x": "g", "y": 1.1, "z": [9, null, 9, 9]}}, "complexObj":{"x": 400, ... }
*/
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
@@ -157,12 +160,15 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
new
DoubleSumAggregatorFactory("sumDouble", "double"),
new
LongSumAggregatorFactory("sumNestedLong", "v0"),
new
DoubleSumAggregatorFactory("sumNestedDouble", "v1"),
- new
DoubleSumAggregatorFactory("sumNestedLongFromArray", "v2")
+ new
DoubleSumAggregatorFactory("sumNestedLongFromArray", "v2"),
+ new
DoubleSumAggregatorFactory("sumVariantNumeric", "variantNumeric"),
+ new
DoubleSumAggregatorFactory("sumNestedVariantNumeric", "v3")
)
.virtualColumns(
new NestedFieldVirtualColumn("obj",
"$.a", "v0", ColumnType.LONG),
new NestedFieldVirtualColumn("obj",
"$.b.y", "v1", ColumnType.DOUBLE),
- new NestedFieldVirtualColumn("obj",
"$.b.z[0]", "v2", ColumnType.LONG)
+ new NestedFieldVirtualColumn("obj",
"$.b.z[0]", "v2", ColumnType.LONG),
+ new
NestedFieldVirtualColumn("complexObj", "$.x", "v3", ColumnType.DOUBLE)
)
.context(getContext())
.build();
@@ -179,6 +185,8 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
.put("sumNestedLong", 5600L)
.put("sumNestedDouble", 11.0)
.put("sumNestedLongFromArray", 44.0)
+ .put("sumVariantNumeric", -1987.3999999999999)
+ .put("sumNestedVariantNumeric", 5786.8)
.build()
)
)
@@ -190,7 +198,7 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
public void testSumsNoVectorize()
{
if (QueryContexts.Vectorize.FORCE.equals(vectorize)) {
- // variant types cannot vectorize aggregators
+ // variant types cannot vectorize aggregators because string wrapper for
numbers is not supported for vectorize
return;
}
/*
@@ -236,15 +244,17 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterLong()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
.filters(
- new AndDimFilter(
- new EqualityFilter("long",
ColumnType.LONG, 2L, null),
- new EqualityFilter("v0",
ColumnType.LONG, 2L, null)
+ new OrDimFilter(
+ new AndDimFilter(
+ new EqualityFilter("long",
ColumnType.LONG, 2L, null),
+ new EqualityFilter("v0",
ColumnType.LONG, 2L, null)
+ ),
+ NullFilter.forColumn("long"),
+ NullFilter.forColumn("v1")
)
)
.virtualColumns(
@@ -253,6 +263,12 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
"$.",
"v0",
ColumnType.LONG
+ ),
+ new NestedFieldVirtualColumn(
+ "obj",
+ "$.b.z[1]",
+ "v1",
+ ColumnType.STRING
)
)
.aggregators(new
CountAggregatorFactory("count"))
@@ -264,7 +280,7 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
new Result<>(
DateTimes.of("2023-01-01T00:00:00.000Z"),
new TimeseriesResultValue(
- ImmutableMap.of("count", 2L)
+ ImmutableMap.of("count", NullHandling.replaceWithDefault()
? 6L : 8L)
)
)
)
@@ -274,8 +290,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantAsString()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -312,8 +326,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantAsStringNoIndexes()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -350,8 +362,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantAsLong()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -388,8 +398,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantAsLongNoIndexes()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -426,8 +434,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantArrayAsString()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -464,8 +470,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantArrayAsDouble()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -502,8 +506,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantArrayAsArray()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -540,8 +542,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantArrayStringArray()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
@@ -575,8 +575,6 @@ public class NestedDataTimeseriesQueryTest extends
InitializedNullHandlingTest
@Test
public void testFilterVariantArrayStringArrayNoIndexes()
{
- // this doesn't really have anything to do with nested columns
- // just a smoke test to make sure everything else is sane
TimeseriesQuery query = Druids.newTimeseriesQueryBuilder()
.dataSource("test_datasource")
.intervals(Collections.singletonList(Intervals.ETERNITY))
diff --git
a/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
b/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
index 282b403ff9..86455f12c6 100644
---
a/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
+++
b/processing/src/test/java/org/apache/druid/segment/nested/NestedFieldColumnSelectorsTest.java
@@ -21,9 +21,9 @@ package org.apache.druid.segment.nested;
import com.fasterxml.jackson.databind.Module;
import com.google.common.collect.ImmutableList;
+import org.apache.druid.error.DruidException;
import org.apache.druid.guice.NestedDataModule;
import org.apache.druid.java.util.common.Intervals;
-import org.apache.druid.java.util.common.UOE;
import org.apache.druid.java.util.common.granularity.Granularities;
import org.apache.druid.java.util.common.guava.Sequence;
import org.apache.druid.java.util.common.guava.Yielder;
@@ -51,6 +51,7 @@ import org.apache.druid.segment.vector.VectorCursor;
import org.apache.druid.segment.vector.VectorObjectSelector;
import org.apache.druid.segment.vector.VectorValueSelector;
import org.apache.druid.segment.virtual.NestedFieldVirtualColumn;
+import org.apache.druid.testing.InitializedNullHandlingTest;
import org.junit.After;
import org.junit.Assert;
import org.junit.Rule;
@@ -60,7 +61,7 @@ import org.junit.rules.TemporaryFolder;
import java.io.IOException;
import java.util.List;
-public class NestedFieldColumnSelectorsTest
+public class NestedFieldColumnSelectorsTest extends InitializedNullHandlingTest
{
private static final String NESTED_LONG_FIELD = "long";
private static final String NESTED_DOUBLE_FIELD = "double";
@@ -179,8 +180,12 @@ public class NestedFieldColumnSelectorsTest
Assert.assertNotNull(doubleValueSelector);
Assert.assertTrue(doubleValueSelector instanceof
BaseDoubleVectorValueSelector);
- Assert.assertThrows(UOE.class, () ->
factory.makeValueSelector(NESTED_MIXED_NUMERIC_FIELD));
- Assert.assertThrows(UOE.class, () ->
factory.makeValueSelector(NESTED_MIXED_FIELD));
+ Assert.assertThrows(DruidException.class, () ->
factory.makeValueSelector(NESTED_MIXED_FIELD));
+
+ VectorValueSelector mixedNumericValueSelector = factory.makeValueSelector(
+ NESTED_MIXED_NUMERIC_FIELD
+ );
+ Assert.assertTrue(mixedNumericValueSelector instanceof
BaseDoubleVectorValueSelector);
// can also make single value dimension selectors for all nested column
types
SingleValueDimensionVectorSelector longDimensionSelector =
factory.makeSingleValueDimensionSelector(
@@ -193,10 +198,10 @@ public class NestedFieldColumnSelectorsTest
);
Assert.assertNotNull(doubleDimensionSelector);
- SingleValueDimensionVectorSelector mixedNumericValueSelector =
factory.makeSingleValueDimensionSelector(
+ SingleValueDimensionVectorSelector mixedNumericDimensionValueSelector =
factory.makeSingleValueDimensionSelector(
DefaultDimensionSpec.of(NESTED_MIXED_NUMERIC_FIELD)
);
- Assert.assertNotNull(mixedNumericValueSelector);
+ Assert.assertNotNull(mixedNumericDimensionValueSelector);
SingleValueDimensionVectorSelector mixedValueSelector =
factory.makeSingleValueDimensionSelector(
DefaultDimensionSpec.of(NESTED_MIXED_FIELD)
diff --git a/processing/src/test/resources/nested-all-types-test-data.json
b/processing/src/test/resources/nested-all-types-test-data.json
index e7219e42a4..34d92b52ae 100644
--- a/processing/src/test/resources/nested-all-types-test-data.json
+++ b/processing/src/test/resources/nested-all-types-test-data.json
@@ -1,7 +1,7 @@
-{"timestamp": "2023-01-01T00:00:00", "str":"a", "long":1, "double":1.0,
"bool": true, "variant": 1, "variantEmptyObj":1,
"variantEmtpyArray":1, "variantWithArrays": 1, "obj":{"a": 100, "b":
{"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}}, "complexObj":{"x": 1234, "y":
[{"l": ["a", "b", "c"], "m": "a", "n": 1},{"l": ["a", "b", "c"], "m": "a", "n":
1}], "z": {"a": [1.1, 2.2, 3.3], "b": true}}, "arrayString": ["a", "b"],
"arrayStringNulls": ["a", "b"], [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"", "long":2,
"bool": false, "variant": "b", "variantEmptyObj":"b",
"variantEmtpyArray":2, "variantWithArrays": "b", "obj":{"a": 200, "b":
{"x": "b", "y": 1.1, "z": [2, 4, 6]}}, "complexObj":{"x": 10, "y":
[{"l": ["b", "b", "c"], "m": "b", "n": 2}, [1, 2, 3]],
"z": {"a": [5.5], "b": false}}, "arrayString": ["a", "b",
"c"], "arrayStringNulls": [null, "b"], [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"null", "long":3, "double":2.0,
"variant": 3.0, "variantEmptyObj":3.3,
"variantEmtpyArray":3, "variantWithArrays": 3.0, "obj":{"a": 300},
"complexObj":{"x": 4, "y": [{"l":
[], "m": 100, "n": 3},{"l": ["a"]}, {"l": ["b"], "n": []}],
"z": {"a": [], "b": true}}, "arrayString": ["b", "c"],
"arrayStringNulls": ["d", null, "b"], [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"b", "long":4, "double":3.3,
"bool": true, "variant": "1", "variantEmptyObj":{},
"variantEmtpyArray":4, "variantWithArrays": "1", "obj":{"a": 400, "b":
{"x": "d", "y": 1.1, "z": [3, 4]}}, "complexObj":{"x": 1234,
"z": {"a": [1.1, 2.2, 3.3], "b": true}}, "arrayString": ["d", "e"],
"arrayStringNulls": ["b", "b"], [...]
-{"timestamp": "2023-01-01T00:00:00", "str":"c", "long": null, "double":4.4,
"bool": true, "variant": "hello", "variantEmptyObj":{},
"variantEmtpyArray":[], "variantWithArrays": "hello", "obj":{"a": 500, "b":
{"x": "e", "z": [1, 2, 3, 4]}}, "complexObj":{"x": 11, "y": [],
"z": {"a": [null], "b": false}}, "arrayString": null,
[...]
-{"timestamp": "2023-01-01T00:00:00", "str":"d", "long":5, "double":5.9,
"bool": false, "variantEmptyObj":"a",
"variantEmtpyArray":6, "obj":{"a": 600, "b":
{"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},
"arrayString": ["a", "b"],
"arrayStringNulls": null, [...]
-{"timestamp": "2023-01-01T00:00:00", "str":null,
"double":null, "bool": true, "variant": 51, "variantEmptyObj":1,
"variantEmtpyArray":[], "variantWithArrays": [51, -35], "obj":{"a": 700, "b":
{"x": "g", "y": 1.1, "z": [9, null, 9, 9]}}, "complexObj":{"x": 400, "y":
[{"l": [null], "m": 100, "n": 5},{"l": ["a", "b", "c"], "m": "a", "n": 1}],
"z": {}},
"arrayStringNulls": ["a", "b"], [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"a", "long":1, "double":1.0,
"bool": true, "variant": 1, "variantNumeric": 1,
"variantEmptyObj":1, "variantEmtpyArray":1, "variantWithArrays": 1,
"obj":{"a": 100, "b": {"x": "a", "y": 1.1, "z": [1, 2, 3, 4]}},
"complexObj":{"x": 1234, "y": [{"l": ["a", "b", "c"], "m": "a", "n": 1},{"l":
["a", "b", "c"], "m": "a", "n": 1}], "z": {"a": [1.1, 2.2, 3.3], "b": true}},
"arrayString": ["a", "b"], "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"", "long":2,
"bool": false, "variant": "b", "variantNumeric": 1.1,
"variantEmptyObj":"b", "variantEmtpyArray":2, "variantWithArrays": "b",
"obj":{"a": 200, "b": {"x": "b", "y": 1.1, "z": [2, 4, 6]}},
"complexObj":{"x": 10, "y": [{"l": ["b", "b", "c"], "m": "b", "n": 2}, [1, 2,
3]], "z": {"a": [5.5], "b": false}},
"arrayString": ["a", "b", "c"], "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"null", "long":3, "double":2.0,
"variant": 3.0, "variantNumeric": 1.0,
"variantEmptyObj":3.3, "variantEmtpyArray":3, "variantWithArrays": 3.0,
"obj":{"a": 300},
"complexObj":{"x": 4.4, "y": [{"l": [], "m": 100, "n": 3},{"l": ["a"]}, {"l":
["b"], "n": []}], "z": {"a": [], "b": true}},
"arrayString": ["b", "c"], "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"b", "long":4, "double":3.3,
"bool": true, "variant": "1",
"variantEmptyObj":{}, "variantEmtpyArray":4, "variantWithArrays": "1",
"obj":{"a": 400, "b": {"x": "d", "y": 1.1, "z": [3, 4]}},
"complexObj":{"x": 1234,
"z": {"a": [1.1, 2.2, 3.3], "b": true}},
"arrayString": ["d", "e"], "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"c", "long": null, "double":4.4,
"bool": true, "variant": "hello", "variantNumeric": -1000,
"variantEmptyObj":{}, "variantEmtpyArray":[], "variantWithArrays": "hello",
"obj":{"a": 500, "b": {"x": "e", "z": [1, 2, 3, 4]}},
"complexObj":{"x": 11, "y": [],
"z": {"a": [null], "b": false}},
"arrayString": null, [...]
+{"timestamp": "2023-01-01T00:00:00", "str":"d", "long":5, "double":5.9,
"bool": false, "variantNumeric": 3.33,
"variantEmptyObj":"a", "variantEmtpyArray":6,
"obj":{"a": 600, "b": {"x": "f", "y": 1.1, "z": [6, 7, 8, 9]}},
"arrayString": ["a", "b"], "arrayStringN [...]
+{"timestamp": "2023-01-01T00:00:00", "str":null,
"double":null, "bool": true, "variant": 51, "variantNumeric": -0.13,
"variantEmptyObj":1, "variantEmtpyArray":[], "variantWithArrays": [51, -35],
"obj":{"a": 700, "b": {"x": "g", "y": 1.1, "z": [9, null, 9, 9]}},
"complexObj":{"x": 400, "y": [{"l": [null], "m": 100, "n": 5},{"l": ["a", "b",
"c"], "m": "a", "n": 1}], "z": {}},
"arrayStringN [...]
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 93e542345e..899c44b0e1 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
@@ -5646,6 +5646,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
"variant",
"variantEmptyObj",
"variantEmtpyArray",
+ "variantNumeric",
"variantWithArrays"
)
.resultFormat(ScanQuery.ResultFormat.RESULT_FORMAT_COMPACTED_LIST)
@@ -5661,6 +5662,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
0.0D,
"true",
"51",
+ -0.13D,
"1",
"[]",
"[51,-35]",
@@ -5698,6 +5700,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
0.0D,
"false",
"b",
+ 1.1D,
"\"b\"",
"2",
"b",
@@ -5735,6 +5738,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
1.0D,
"true",
"1",
+ 1.0D,
"1",
"1",
"1",
@@ -5772,6 +5776,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
3.3D,
"true",
"1",
+ 0.0D,
"{}",
"4",
"1",
@@ -5809,6 +5814,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
4.4D,
"true",
"hello",
+ -1000.0D,
"{}",
"[]",
"hello",
@@ -5846,6 +5852,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
5.9D,
"false",
"",
+ 3.33D,
"\"a\"",
"6",
null,
@@ -5883,11 +5890,12 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
2.0D,
"",
"3.0",
+ 1.0D,
"3.3",
"3",
"3.0",
"{\"a\":300}",
-
"{\"x\":4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
+
"{\"x\":4.4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
"[\"b\",\"c\"]",
"[\"d\",null,\"b\"]",
"[1,2,3,4]",
@@ -5922,6 +5930,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
null,
"true",
"51",
+ -0.13D,
"1",
"[]",
"[51,-35]",
@@ -5959,6 +5968,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
null,
"false",
"b",
+ 1.1D,
"\"b\"",
"2",
"b",
@@ -5996,6 +6006,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
1.0D,
"true",
"1",
+ 1.0D,
"1",
"1",
"1",
@@ -6033,6 +6044,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
3.3D,
"true",
"1",
+ null,
"{}",
"4",
"1",
@@ -6070,6 +6082,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
4.4D,
"true",
"hello",
+ -1000.0D,
"{}",
"[]",
"hello",
@@ -6107,6 +6120,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
5.9D,
"false",
null,
+ 3.33D,
"\"a\"",
"6",
null,
@@ -6144,11 +6158,12 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
2.0D,
null,
"3.0",
+ 1.0D,
"3.3",
"3",
"3.0",
"{\"a\":300}",
-
"{\"x\":4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
+
"{\"x\":4.4,\"y\":[{\"l\":[],\"m\":100,\"n\":3},{\"l\":[\"a\"]},{\"l\":[\"b\"],\"n\":[]}],\"z\":{\"a\":[],\"b\":true}}",
"[\"b\",\"c\"]",
"[\"d\",null,\"b\"]",
"[1,2,3,4]",
@@ -6182,6 +6197,7 @@ public class CalciteNestedDataQueryTest extends
BaseCalciteQueryTest
.add("double", ColumnType.DOUBLE)
.add("bool", ColumnType.STRING)
.add("variant", ColumnType.STRING)
+ .add("variantNumeric", ColumnType.DOUBLE)
.add("variantEmptyObj", ColumnType.NESTED_DATA)
.add("variantEmtpyArray", ColumnType.LONG_ARRAY)
.add("variantWithArrays", ColumnType.STRING_ARRAY)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]