use of org.apache.druid.segment.vector.VectorObjectSelector in project druid by druid-io.
the class ExpressionVectorSelectorsTest method sanityTestVectorizedExpressionSelectors.
public static void sanityTestVectorizedExpressionSelectors(String expression, @Nullable ExpressionType outputType, QueryableIndex index, Closer closer, int rowsPerSegment) {
final List<Object> results = new ArrayList<>(rowsPerSegment);
final VirtualColumns virtualColumns = VirtualColumns.create(ImmutableList.of(new ExpressionVirtualColumn("v", expression, ExpressionType.toColumnType(outputType), TestExprMacroTable.INSTANCE)));
final QueryableIndexStorageAdapter storageAdapter = new QueryableIndexStorageAdapter(index);
VectorCursor cursor = storageAdapter.makeVectorCursor(null, index.getDataInterval(), virtualColumns, false, 512, null);
ColumnCapabilities capabilities = virtualColumns.getColumnCapabilities(storageAdapter, "v");
int rowCount = 0;
if (capabilities.isDictionaryEncoded().isTrue()) {
SingleValueDimensionVectorSelector selector = cursor.getColumnSelectorFactory().makeSingleValueDimensionSelector(DefaultDimensionSpec.of("v"));
while (!cursor.isDone()) {
int[] row = selector.getRowVector();
for (int i = 0; i < selector.getCurrentVectorSize(); i++, rowCount++) {
results.add(selector.lookupName(row[i]));
}
cursor.advance();
}
} else {
VectorValueSelector selector = null;
VectorObjectSelector objectSelector = null;
if (outputType != null && outputType.isNumeric()) {
selector = cursor.getColumnSelectorFactory().makeValueSelector("v");
} else {
objectSelector = cursor.getColumnSelectorFactory().makeObjectSelector("v");
}
while (!cursor.isDone()) {
boolean[] nulls;
switch(outputType.getType()) {
case LONG:
nulls = selector.getNullVector();
long[] longs = selector.getLongVector();
for (int i = 0; i < selector.getCurrentVectorSize(); i++, rowCount++) {
results.add(nulls != null && nulls[i] ? null : longs[i]);
}
break;
case DOUBLE:
// special case to test floats just to get coverage on getFloatVector
if ("float2".equals(expression)) {
nulls = selector.getNullVector();
float[] floats = selector.getFloatVector();
for (int i = 0; i < selector.getCurrentVectorSize(); i++, rowCount++) {
results.add(nulls != null && nulls[i] ? null : (double) floats[i]);
}
} else {
nulls = selector.getNullVector();
double[] doubles = selector.getDoubleVector();
for (int i = 0; i < selector.getCurrentVectorSize(); i++, rowCount++) {
results.add(nulls != null && nulls[i] ? null : doubles[i]);
}
}
break;
case STRING:
Object[] objects = objectSelector.getObjectVector();
for (int i = 0; i < objectSelector.getCurrentVectorSize(); i++, rowCount++) {
results.add(objects[i]);
}
break;
}
cursor.advance();
}
}
closer.register(cursor);
Sequence<Cursor> cursors = new QueryableIndexStorageAdapter(index).makeCursors(null, index.getDataInterval(), virtualColumns, Granularities.ALL, false, null);
int rowCountCursor = cursors.map(nonVectorized -> {
final ColumnValueSelector nonSelector = nonVectorized.getColumnSelectorFactory().makeColumnValueSelector("v");
int rows = 0;
while (!nonVectorized.isDone()) {
Assert.assertEquals(StringUtils.format("Failed at row %s", rows), nonSelector.getObject(), results.get(rows));
rows++;
nonVectorized.advance();
}
return rows;
}).accumulate(0, (acc, in) -> acc + in);
Assert.assertTrue(rowCountCursor > 0);
Assert.assertEquals(rowCountCursor, rowCount);
}
use of org.apache.druid.segment.vector.VectorObjectSelector in project druid by druid-io.
the class ApproximateHistogramFoldingVectorAggregatorTest method setup.
@Before
public void setup() {
h1 = new ApproximateHistogram(5);
h2 = new ApproximateHistogram(5);
for (int i = 0; i < 5; ++i) {
h1.offer(FLOATS[i]);
}
for (int i = 5; i < FLOATS.length; ++i) {
h2.offer(FLOATS[i]);
}
VectorObjectSelector vectorObjectSelector = createMock(VectorObjectSelector.class);
expect(vectorObjectSelector.getObjectVector()).andReturn(new Object[] { h1, null, h2, null }).anyTimes();
EasyMock.replay(vectorObjectSelector);
vectorColumnSelectorFactory = createMock(VectorColumnSelectorFactory.class);
expect(vectorColumnSelectorFactory.makeObjectSelector("field")).andReturn(vectorObjectSelector).anyTimes();
expect(vectorColumnSelectorFactory.getColumnCapabilities("field")).andReturn(new ColumnCapabilitiesImpl().setType(ApproximateHistogramAggregatorFactory.TYPE));
expect(vectorColumnSelectorFactory.getColumnCapabilities("string_field")).andReturn(new ColumnCapabilitiesImpl().setType(ColumnType.STRING));
expect(vectorColumnSelectorFactory.getColumnCapabilities("double_field")).andReturn(new ColumnCapabilitiesImpl().setType(ColumnType.STRING));
EasyMock.replay(vectorColumnSelectorFactory);
}
use of org.apache.druid.segment.vector.VectorObjectSelector in project druid by druid-io.
the class VirtualColumns method makeVectorObjectSelector.
/**
* Create a column vector object selector.
*
* @throws IllegalArgumentException if the virtual column does not exist (see {@link #exists(String)}
*/
public VectorObjectSelector makeVectorObjectSelector(String columnName, VectorColumnSelectorFactory factory) {
final VirtualColumn virtualColumn = getVirtualColumnForSelector(columnName);
final VectorObjectSelector selector = virtualColumn.makeVectorObjectSelector(columnName, factory);
Preconditions.checkNotNull(selector, "selector");
return selector;
}
use of org.apache.druid.segment.vector.VectorObjectSelector in project druid by druid-io.
the class ComplexColumn method makeVectorObjectSelector.
@Override
default VectorObjectSelector makeVectorObjectSelector(ReadableVectorOffset offset) {
return new VectorObjectSelector() {
final Object[] vector = new Object[offset.getMaxVectorSize()];
private int id = ReadableVectorInspector.NULL_ID;
@Override
public Object[] getObjectVector() {
if (id == offset.getId()) {
return vector;
}
if (offset.isContiguous()) {
final int startOffset = offset.getStartOffset();
final int vectorSize = offset.getCurrentVectorSize();
for (int i = 0; i < vectorSize; i++) {
vector[i] = getRowValue(startOffset + i);
}
} else {
final int[] offsets = offset.getOffsets();
final int vectorSize = offset.getCurrentVectorSize();
for (int i = 0; i < vectorSize; i++) {
vector[i] = getRowValue(offsets[i]);
}
}
id = offset.getId();
return vector;
}
@Override
public int getCurrentVectorSize() {
return offset.getCurrentVectorSize();
}
@Override
public int getMaxVectorSize() {
return offset.getMaxVectorSize();
}
};
}
use of org.apache.druid.segment.vector.VectorObjectSelector in project druid by druid-io.
the class BaseFilterTest method selectColumnValuesMatchingFilterUsingVectorVirtualColumnCursor.
private List<String> selectColumnValuesMatchingFilterUsingVectorVirtualColumnCursor(final DimFilter filter, final String virtualColumn, final String selectColumn) {
final Expr parsedIdentifier = Parser.parse(selectColumn, TestExprMacroTable.INSTANCE);
try (final VectorCursor cursor = makeVectorCursor(makeFilter(filter))) {
final ExpressionType outputType = parsedIdentifier.getOutputType(cursor.getColumnSelectorFactory());
final List<String> values = new ArrayList<>();
if (outputType.is(ExprType.STRING)) {
final VectorObjectSelector objectSelector = cursor.getColumnSelectorFactory().makeObjectSelector(virtualColumn);
while (!cursor.isDone()) {
final Object[] rowVector = objectSelector.getObjectVector();
for (int i = 0; i < cursor.getCurrentVectorSize(); i++) {
values.add((String) rowVector[i]);
}
cursor.advance();
}
} else {
final VectorValueSelector valueSelector = cursor.getColumnSelectorFactory().makeValueSelector(virtualColumn);
while (!cursor.isDone()) {
final boolean[] nulls = valueSelector.getNullVector();
if (outputType.is(ExprType.DOUBLE)) {
final double[] doubles = valueSelector.getDoubleVector();
for (int i = 0; i < cursor.getCurrentVectorSize(); i++) {
if (nulls != null && nulls[i]) {
values.add(null);
} else {
values.add(String.valueOf(doubles[i]));
}
}
} else {
final long[] longs = valueSelector.getLongVector();
for (int i = 0; i < cursor.getCurrentVectorSize(); i++) {
if (nulls != null && nulls[i]) {
values.add(null);
} else {
values.add(String.valueOf(longs[i]));
}
}
}
cursor.advance();
}
}
return values;
}
}
Aggregations