|
29 | 29 | import org.apache.druid.segment.NilColumnValueSelector; |
30 | 30 | import org.apache.druid.segment.column.ColumnCapabilities; |
31 | 31 | import org.apache.druid.segment.column.ValueType; |
| 32 | +import org.apache.druid.segment.column.ValueTypes; |
32 | 33 | import org.apache.druid.segment.vector.MultiValueDimensionVectorSelector; |
33 | 34 | import org.apache.druid.segment.vector.SingleValueDimensionVectorSelector; |
34 | 35 | import org.apache.druid.segment.vector.VectorObjectSelector; |
@@ -57,28 +58,49 @@ public DimensionSelector makeDimensionSelector(DimensionSpec dimensionSpec) |
57 | 58 | return dimensionSelectors.computeIfAbsent( |
58 | 59 | dimensionSpec, |
59 | 60 | spec -> { |
60 | | - if (spec.mustDecorate()) { |
| 61 | + if (spec.mustDecorate() || spec.getExtractionFn() != null) { |
61 | 62 | throw DruidException.defensive("Only non-decorated dimensions can be vectorized."); |
62 | 63 | } |
63 | | - final ColumnCapabilities capabilities = cursor.vectorColumnSelectorFactory |
64 | | - .getColumnCapabilities(dimensionSpec.getDimension()); |
| 64 | + |
| 65 | + final String columnName = dimensionSpec.getDimension(); |
| 66 | + final ColumnCapabilities capabilities = cursor.vectorColumnSelectorFactory.getColumnCapabilities(columnName); |
| 67 | + |
65 | 68 | if (capabilities == null) { |
66 | 69 | return DimensionSelector.nilSelector(); |
67 | | - } else if (ColumnProcessors.useDictionaryEncodedSelector(capabilities)) { |
68 | | - if (capabilities.hasMultipleValues().isMaybeTrue()) { |
69 | | - final MultiValueDimensionVectorSelector vectorSelector = |
70 | | - cursor.vectorColumnSelectorFactory.makeMultiValueDimensionSelector(spec); |
71 | | - return new ShimMultiValueDimensionSelector(cursor, vectorSelector); |
| 70 | + } else if (capabilities.is(ValueType.STRING)) { |
| 71 | + if (ColumnProcessors.useDictionaryEncodedSelector(capabilities)) { |
| 72 | + // Dictionary-encoded string column. |
| 73 | + if (capabilities.hasMultipleValues().isMaybeTrue()) { |
| 74 | + final MultiValueDimensionVectorSelector vectorSelector = |
| 75 | + cursor.vectorColumnSelectorFactory.makeMultiValueDimensionSelector(spec); |
| 76 | + return new ShimMultiValueDimensionSelector(cursor, vectorSelector); |
| 77 | + } else { |
| 78 | + final SingleValueDimensionVectorSelector vectorSelector = |
| 79 | + cursor.vectorColumnSelectorFactory.makeSingleValueDimensionSelector(spec); |
| 80 | + return new ShimSingleValueDimensionSelector(cursor, vectorSelector); |
| 81 | + } |
72 | 82 | } else { |
73 | | - final SingleValueDimensionVectorSelector vectorSelector = |
74 | | - cursor.vectorColumnSelectorFactory.makeSingleValueDimensionSelector(spec); |
75 | | - return new ShimSingleValueDimensionSelector(cursor, vectorSelector); |
| 83 | + // Non-dictionary encoded string column. Possibly an expression virtual column. |
| 84 | + final VectorObjectSelector vectorObjectSelector = |
| 85 | + cursor.vectorColumnSelectorFactory.makeObjectSelector(spec.getDimension()); |
| 86 | + return new ShimVectorObjectDimSelector( |
| 87 | + cursor, |
| 88 | + vectorObjectSelector, |
| 89 | + capabilities.hasMultipleValues().isMaybeTrue() |
| 90 | + ); |
76 | 91 | } |
| 92 | + } else if (capabilities.isNumeric()) { |
| 93 | + // Caller requested a dimension selector on top of a numeric column. |
| 94 | + return ValueTypes.makeNumericWrappingDimensionSelector( |
| 95 | + capabilities.getType(), |
| 96 | + makeColumnValueSelector(columnName), |
| 97 | + null /* No extractionFn; we checked above that extractionFn is not present. */ |
| 98 | + ); |
77 | 99 | } else { |
78 | | - // Non-dictionary encoded column, like virtual columns. |
79 | | - VectorObjectSelector vectorObjectSelector = |
80 | | - cursor.vectorColumnSelectorFactory.makeObjectSelector(spec.getDimension()); |
81 | | - return new ShimVectorObjectDimSelector(cursor, vectorObjectSelector, capabilities.hasMultipleValues().isMaybeTrue()); |
| 100 | + // Array or complex. Callers should be calling makeColumnValueSelector instead for these types. If they do |
| 101 | + // call makeDimensionSelector for some reason, give them a column full of nulls, since that's what |
| 102 | + // QueryableIndexColumnSelectorFactory would do. |
| 103 | + return DimensionSelector.nilSelector(); |
82 | 104 | } |
83 | 105 | } |
84 | 106 | ); |
|
0 commit comments