@Override public <T> T getObject(int position, Class<T> clazz) { if (clazz != Block.class) { throw new IllegalArgumentException("clazz must be Block.class"); } checkReadablePosition(position); return clazz.cast(new SingleRowBlock(getFieldBlockOffset(position), getRawFieldBlocks())); }
@Override public Block copyRegion(int position, int length) { int positionCount = getPositionCount(); checkValidRegion(positionCount, position, length); int startFieldBlockOffset = getFieldBlockOffset(position); int endFieldBlockOffset = getFieldBlockOffset(position + length); int fieldBlockLength = endFieldBlockOffset - startFieldBlockOffset; Block[] newBlocks = new Block[numFields]; for (int i = 0; i < numFields; i++) { newBlocks[i] = getRawFieldBlocks()[i].copyRegion(startFieldBlockOffset, fieldBlockLength); } int[] newOffsets = compactOffsets(getFieldBlockOffsets(), position + getOffsetBase(), length); boolean[] rowIsNull = getRowIsNull(); boolean[] newRowIsNull = rowIsNull == null ? null : compactArray(rowIsNull, position + getOffsetBase(), length); if (arraySame(newBlocks, getRawFieldBlocks()) && newOffsets == getFieldBlockOffsets() && newRowIsNull == rowIsNull) { return this; } return createRowBlockInternal(0, length, newRowIsNull, newOffsets, newBlocks); }
@Override public long getRegionSizeInBytes(int position, int length) { int positionCount = getPositionCount(); checkValidRegion(positionCount, position, length); int startFieldBlockOffset = getFieldBlockOffset(position); int endFieldBlockOffset = getFieldBlockOffset(position + length); int fieldBlockLength = endFieldBlockOffset - startFieldBlockOffset; long regionSizeInBytes = (Integer.BYTES + Byte.BYTES) * (long) length; for (int i = 0; i < numFields; i++) { regionSizeInBytes += getRawFieldBlocks()[i].getRegionSizeInBytes(startFieldBlockOffset, fieldBlockLength); } return regionSizeInBytes; }
public static ColumnarRow toColumnarRow(Block block) { requireNonNull(block, "block is null"); if (block instanceof DictionaryBlock) { return toColumnarRow((DictionaryBlock) block); } if (block instanceof RunLengthEncodedBlock) { return toColumnarRow((RunLengthEncodedBlock) block); } if (!(block instanceof AbstractRowBlock)) { throw new IllegalArgumentException("Invalid row block: " + block.getClass().getName()); } AbstractRowBlock rowBlock = (AbstractRowBlock) block; // get fields for visible region int firstRowPosition = rowBlock.getFieldBlockOffset(0); int totalRowCount = rowBlock.getFieldBlockOffset(block.getPositionCount()) - firstRowPosition; Block[] fieldBlocks = new Block[rowBlock.numFields]; for (int i = 0; i < fieldBlocks.length; i++) { fieldBlocks[i] = rowBlock.getRawFieldBlocks()[i].getRegion(firstRowPosition, totalRowCount); } return new ColumnarRow(block, fieldBlocks); }
@Override public Block getSingleValueBlock(int position) { checkReadablePosition(position); int startFieldBlockOffset = getFieldBlockOffset(position); int endFieldBlockOffset = getFieldBlockOffset(position + 1); int fieldBlockLength = endFieldBlockOffset - startFieldBlockOffset; Block[] newBlocks = new Block[numFields]; for (int i = 0; i < numFields; i++) { newBlocks[i] = getRawFieldBlocks()[i].copyRegion(startFieldBlockOffset, fieldBlockLength); } boolean[] newRowIsNull = new boolean[] {isNull(position)}; int[] newOffsets = new int[] {0, fieldBlockLength}; return createRowBlockInternal(0, 1, newRowIsNull, newOffsets, newBlocks); }
@Override public long getEstimatedDataSizeForStats(int position) { checkReadablePosition(position); if (isNull(position)) { return 0; } Block[] rawFieldBlocks = getRawFieldBlocks(); long size = 0; for (int i = 0; i < numFields; i++) { size += rawFieldBlocks[i].getEstimatedDataSizeForStats(getFieldBlockOffset(position)); } return size; }
@Override public long getPositionsSizeInBytes(boolean[] positions) { checkValidPositions(positions, getPositionCount()); int usedPositionCount = 0; boolean[] fieldPositions = new boolean[getRawFieldBlocks()[0].getPositionCount()]; for (int i = 0; i < positions.length; i++) { if (positions[i]) { usedPositionCount++; int startFieldBlockOffset = getFieldBlockOffset(i); int endFieldBlockOffset = getFieldBlockOffset(i + 1); for (int j = startFieldBlockOffset; j < endFieldBlockOffset; j++) { fieldPositions[j] = true; } } } long sizeInBytes = 0; for (int j = 0; j < numFields; j++) { sizeInBytes += getRawFieldBlocks()[j].getPositionsSizeInBytes(fieldPositions); } return sizeInBytes + (Integer.BYTES + Byte.BYTES) * (long) usedPositionCount; }
@Override public BlockBuilder appendStructureInternal(Block block, int position) { if (!(block instanceof AbstractRowBlock)) { throw new IllegalArgumentException(); } AbstractRowBlock rowBlock = (AbstractRowBlock) block; BlockBuilder entryBuilder = this.beginBlockEntry(); int fieldBlockOffset = rowBlock.getFieldBlockOffset(position); for (int i = 0; i < rowBlock.numFields; i++) { if (rowBlock.getRawFieldBlocks()[i].isNull(fieldBlockOffset)) { entryBuilder.appendNull(); } else { rowBlock.getRawFieldBlocks()[i].writePositionTo(fieldBlockOffset, entryBuilder); } } closeEntry(); return this; }
@Override public Block copyPositions(int[] positions, int offset, int length) { checkArrayRange(positions, offset, length); int[] newOffsets = new int[length + 1]; boolean[] newRowIsNull = new boolean[length]; IntArrayList fieldBlockPositions = new IntArrayList(length); for (int i = 0; i < length; i++) { int position = positions[offset + i]; if (isNull(position)) { newRowIsNull[i] = true; newOffsets[i + 1] = newOffsets[i]; } else { newOffsets[i + 1] = newOffsets[i] + 1; fieldBlockPositions.add(getFieldBlockOffset(position)); } } Block[] newBlocks = new Block[numFields]; for (int i = 0; i < numFields; i++) { newBlocks[i] = getRawFieldBlocks()[i].copyPositions(fieldBlockPositions.elements(), 0, fieldBlockPositions.size()); } return createRowBlockInternal(0, length, newRowIsNull, newOffsets, newBlocks); }