private void writeColumnarRow(ColumnarRow columnarRow) { // record nulls for (int position = 0; position < columnarRow.getPositionCount(); position++) { boolean present = !columnarRow.isNull(position); presentStream.writeBoolean(present); if (present) { nonNullValueCount++; } } // write field values for (int i = 0; i < structFields.size(); i++) { ColumnWriter columnWriter = structFields.get(i); Block fieldBlock = columnarRow.getField(i); if (fieldBlock.getPositionCount() > 0) { columnWriter.writeBlock(fieldBlock); } } }
private void writeColumnarRow(ColumnarRow columnarRow) { // record nulls for (int position = 0; position < columnarRow.getPositionCount(); position++) { boolean present = !columnarRow.isNull(position); presentStream.writeBoolean(present); if (present) { nonNullValueCount++; } } // write field values for (int i = 0; i < structFields.size(); i++) { ColumnWriter columnWriter = structFields.get(i); Block fieldBlock = columnarRow.getField(i); if (fieldBlock.getPositionCount() > 0) { columnWriter.writeBlock(fieldBlock); } } }
@Override public Block apply(Block block) { ColumnarRow rowBlock = toColumnarRow(block); Block[] fields = new Block[coercers.length]; int[] ids = new int[rowBlock.getField(0).getPositionCount()]; for (int i = 0; i < coercers.length; i++) { if (coercers[i] != null) { fields[i] = coercers[i].apply(rowBlock.getField(i)); } else if (i < rowBlock.getFieldCount()) { fields[i] = rowBlock.getField(i); } else { fields[i] = new DictionaryBlock(nullBlocks[i], ids); } } boolean[] valueIsNull = new boolean[rowBlock.getPositionCount()]; for (int i = 0; i < rowBlock.getPositionCount(); i++) { valueIsNull[i] = rowBlock.isNull(i); } return RowBlock.fromFieldBlocks(valueIsNull.length, Optional.of(valueIsNull), fields); } }
@Override public void deserialize(Block block, int index, MultimapAggregationState state) { state.reset(); ColumnarRow columnarRow = toColumnarRow(arrayType.getObject(block, index)); Block keys = columnarRow.getField(KEY_CHANNEL); Block values = columnarRow.getField(VALUE_CHANNEL); for (int i = 0; i < columnarRow.getPositionCount(); i++) { state.add(keys, values, i); } } }
@Override public void deserialize(Block block, int index, MultimapAggregationState state) { state.reset(); ColumnarRow columnarRow = toColumnarRow(arrayType.getObject(block, index)); Block keys = columnarRow.getField(KEY_CHANNEL); Block values = columnarRow.getField(VALUE_CHANNEL); for (int i = 0; i < columnarRow.getPositionCount(); i++) { state.add(keys, values, i); } } }
private static <T> void assertColumnarRow(Block block, T[] expectedValues) { ColumnarRow columnarRow = toColumnarRow(block); assertEquals(columnarRow.getPositionCount(), expectedValues.length); for (int fieldId = 0; fieldId < FIELD_COUNT; fieldId++) { Block fieldBlock = columnarRow.getField(fieldId); int elementsPosition = 0; for (int position = 0; position < expectedValues.length; position++) { T expectedRow = expectedValues[position]; assertEquals(columnarRow.isNull(position), expectedRow == null); if (expectedRow == null) { continue; } Object expectedElement = Array.get(expectedRow, fieldId); assertBlockPosition(fieldBlock, elementsPosition, expectedElement); elementsPosition++; } } }
private static <T> void assertColumnarRow(Block block, T[] expectedValues) { ColumnarRow columnarRow = toColumnarRow(block); assertEquals(columnarRow.getPositionCount(), expectedValues.length); for (int fieldId = 0; fieldId < FIELD_COUNT; fieldId++) { Block fieldBlock = columnarRow.getField(fieldId); int elementsPosition = 0; for (int position = 0; position < expectedValues.length; position++) { T expectedRow = expectedValues[position]; assertEquals(columnarRow.isNull(position), expectedRow == null); if (expectedRow == null) { continue; } Object expectedElement = Array.get(expectedRow, fieldId); assertBlockPosition(fieldBlock, elementsPosition, expectedElement); elementsPosition++; } } }