mirror of https://github.com/apache/druid.git
fixes for nested virtual column array element vector selectors and fixes for variant and nested variant numeric columns
* 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
This commit is contained in:
parent
6517fc2796
commit
5f72f4f37d
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
throw new UOE("Cannot make vector value selector for variant typed [%s] 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 DruidException.defensive("Cannot make vector value selector for variant typed [%s] nested field", types);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
|
||||
+ "[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, 1.1, 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, 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], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], [1672531200000, b, 4, 3.3, true, 1, 0.0, {}, 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, -1000, {}, [], 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, 3.33, 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, 1.0, 3.3, 3, 3.0, {a=300}, {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], [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]]",
|
||||
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], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], "
|
||||
+ "[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, b, 1.1, 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, 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], [{}, {}, {}], [{a=b, x=1, y=1.3}], 1], [1672531200000, b, 4, 3.3, true, 1, null, {}, 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, -1000, {}, [], 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, 3.33, 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, 1.0, 3.3, 3, 3.0, {a=300}, {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], [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]]",
|
||||
resultsSegments.get(0).getEvents().toString()
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"], "arrayLong":[1, 2, 3], "arrayLongNulls":[1, null,3], "arrayDouble":[1.1, 2.2, 3.3], "arrayDoubleNulls":[1.1, 2.2, null], "arrayVariant":["a", 1, 2.2], "arrayBool":[true, false, true], "arrayNestedLong":[[1, 2, null], [3, 4]], "arrayObject":[{"x": 1},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayLong":[2, 3], "arrayDouble":[3.3, 4.4, 5.5], "arrayDoubleNulls":[999, null, 5.5], "arrayVariant":[null, null, 2.2], "arrayBool":[true, true], "arrayNestedLong":[null, [null], []], "arrayObject":[{"x": 3},{"x":4}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayLong":[1, 2, 3, 4], "arrayLongNulls":[1, 2, 3], "arrayDouble":[1.1, 3.3], "arrayDoubleNulls":[null, 2.2, null], "arrayVariant":[1, null, 1], "arrayBool":[true, null, true], "arrayNestedLong":[[1], null, [1, 2, 3]], "arrayObject":[null,{"x":2}], "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayLong":[1, 4], "arrayLongNulls":[1], "arrayDouble":[2.2, 3.3, 4.0], "arrayVariant":["a", "b", "c"], "arrayBool":[null, false, true], "arrayNestedLong":[[1, 2], [3, 4], [5, 6, 7]], "arrayObject":[{"x": null},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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, "arrayLong":[1, 2, 3], "arrayLongNulls":[], "arrayDouble":[1.1, 2.2, 3.3], "arrayDoubleNulls":null, "arrayBool":[false], "arrayObject":[{"x": 1000},{"y":2000}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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, "arrayLongNulls":[null, 2, 9], "arrayDouble":null, "arrayDoubleNulls":[999, 5.5, null], "arrayVariant":["a", 1, 2.2], "arrayBool":[], "arrayNestedLong":[[1], [1, 2, null]], "arrayObject":[{"a": 1},{"b":2}], "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayLong":null, "arrayLongNulls":[2, 3], "arrayDoubleNulls":[null], "arrayVariant":null, "arrayBool":[true, false, true], "arrayNestedLong":null, "arrayObject":[{"x": 1},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayStringNulls": ["a", "b"], "arrayLong":[1, 2, 3], "arrayLongNulls":[1, null,3], "arrayDouble":[1.1, 2.2, 3.3], "arrayDoubleNulls":[1.1, 2.2, null], "arrayVariant":["a", 1, 2.2], "arrayBool":[true, false, true], "arrayNestedLong":[[1, 2, null], [3, 4]], "arrayObject":[{"x": 1},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayStringNulls": [null, "b"], "arrayLong":[2, 3], "arrayDouble":[3.3, 4.4, 5.5], "arrayDoubleNulls":[999, null, 5.5], "arrayVariant":[null, null, 2.2], "arrayBool":[true, true], "arrayNestedLong":[null, [null], []], "arrayObject":[{"x": 3},{"x":4}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayStringNulls": ["d", null, "b"], "arrayLong":[1, 2, 3, 4], "arrayLongNulls":[1, 2, 3], "arrayDouble":[1.1, 3.3], "arrayDoubleNulls":[null, 2.2, null], "arrayVariant":[1, null, 1], "arrayBool":[true, null, true], "arrayNestedLong":[[1], null, [1, 2, 3]], "arrayObject":[null,{"x":2}], "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayLong":[1, 4], "arrayLongNulls":[1], "arrayDouble":[2.2, 3.3, 4.0], "arrayVariant":["a", "b", "c"], "arrayBool":[null, false, true], "arrayNestedLong":[[1, 2], [3, 4], [5, 6, 7]], "arrayObject":[{"x": null},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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, "arrayLong":[1, 2, 3], "arrayLongNulls":[], "arrayDouble":[1.1, 2.2, 3.3], "arrayDoubleNulls":null, "arrayBool":[false], "arrayObject":[{"x": 1000},{"y":2000}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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"], "arrayStringNulls": null, "arrayLongNulls":[null, 2, 9], "arrayDouble":null, "arrayDoubleNulls":[999, 5.5, null], "arrayVariant":["a", 1, 2.2], "arrayBool":[], "arrayNestedLong":[[1], [1, 2, null]], "arrayObject":[{"a": 1},{"b":2}], "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
{"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": {}}, "arrayStringNulls": ["a", "b"], "arrayLong":null, "arrayLongNulls":[2, 3], "arrayDoubleNulls":[null], "arrayVariant":null, "arrayBool":[true, false, true], "arrayNestedLong":null, "arrayObject":[{"x": 1},{"x":2}], "null": null, "cstr": "hello", "clong": 1234, "cdouble": 1.234, "cObj":{"x": 1, "y": "hello", "z": {"a": 1.1, "b": 1234, "c": ["a", "b", "c"]}}, "cstringArray": ["a", "b", "c"], "cLongArray": [1, 2, 3], "cDoubleArray": [1.1, 2.2, 3.3], "cEmptyArray":[], "cEmptyObj":{}, "cNullArray": [null, null], "cEmptyObjectArray": [{},{},{}], "cObjectArray": [{"a":"b", "x":1, "y":1.3}]}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue