use of com.facebook.presto.common.Page in project presto by prestodb.
the class DruidSegmentPageSource method getNextPage.
@Override
public Page getNextPage() {
batchId++;
int batchSize = segmentReader.nextBatch();
if (batchSize <= 0) {
close();
return null;
}
Block[] blocks = new Block[columns.size()];
for (int i = 0; i < blocks.length; i++) {
DruidColumnHandle columnHandle = (DruidColumnHandle) columns.get(i);
blocks[i] = new LazyBlock(batchSize, new SegmentBlockLoader(columnHandle.getColumnType(), columnHandle.getColumnName()));
}
Page page = new Page(batchSize, blocks);
completedBytes += page.getSizeInBytes();
completedPositions += page.getPositionCount();
return page;
}
use of com.facebook.presto.common.Page in project presto by prestodb.
the class AggregatedOrcPageSource method getNextPage.
@Override
public Page getNextPage() {
if (completed) {
return null;
}
long start = System.nanoTime();
Block[] blocks = new Block[columnHandles.size()];
for (int fieldId = 0; fieldId < blocks.length; fieldId++) {
HiveColumnHandle columnHandle = columnHandles.get(fieldId);
Aggregation aggregation = columnHandle.getPartialAggregation().get();
int columnIndex = columnHandle.getHiveColumnIndex();
Type type = typeManager.getType(columnHandle.getTypeSignature());
BlockBuilder blockBuilder = type.createBlockBuilder(null, batchSize, 0);
FunctionHandle functionHandle = aggregation.getFunctionHandle();
if (functionResolution.isCountFunction(functionHandle)) {
if (aggregation.getArguments().isEmpty()) {
blockBuilder = blockBuilder.writeLong(footer.getNumberOfRows());
} else {
writeNonNullCount(columnIndex, blockBuilder);
}
completedBytes += INTEGER.getFixedSize();
} else if (functionResolution.isMaxFunction(functionHandle)) {
writeMinMax(columnIndex, type, columnHandle.getHiveType(), blockBuilder, false);
} else if (functionResolution.isMinFunction(functionHandle)) {
writeMinMax(columnIndex, type, columnHandle.getHiveType(), blockBuilder, true);
} else {
throw new UnsupportedOperationException(aggregation.getFunctionHandle().toString() + " is not supported");
}
blocks[fieldId] = blockBuilder.build();
}
completed = true;
readTimeNanos += System.nanoTime() - start;
return new Page(batchSize, blocks);
}
use of com.facebook.presto.common.Page in project presto by prestodb.
the class OrcFileWriter method appendRows.
@Override
public void appendRows(Page dataPage) {
Block[] blocks = new Block[fileInputColumnIndexes.length];
for (int i = 0; i < fileInputColumnIndexes.length; i++) {
int inputColumnIndex = fileInputColumnIndexes[i];
if (inputColumnIndex < 0) {
blocks[i] = new RunLengthEncodedBlock(nullBlocks.get(i), dataPage.getPositionCount());
} else {
blocks[i] = dataPage.getBlock(inputColumnIndex);
}
}
Page page = new Page(dataPage.getPositionCount(), blocks);
try {
orcWriter.write(page);
rowCount += page.getPositionCount();
} catch (IOException | UncheckedIOException e) {
throw new PrestoException(HIVE_WRITER_DATA_ERROR, e);
}
}
use of com.facebook.presto.common.Page in project presto by prestodb.
the class ParquetTester method assertPageSource.
private static void assertPageSource(List<Type> types, Iterator<?>[] valuesByField, ConnectorPageSource pageSource, Optional<Long> maxReadBlockSize) {
Page page;
while ((page = pageSource.getNextPage()) != null) {
if (maxReadBlockSize.isPresent()) {
assertTrue(page.getPositionCount() == 1 || page.getSizeInBytes() <= maxReadBlockSize.get());
}
for (int field = 0; field < page.getChannelCount(); field++) {
Block block = page.getBlock(field);
for (int i = 0; i < block.getPositionCount(); i++) {
assertTrue(valuesByField[field].hasNext());
Object expected = valuesByField[field].next();
Object actual = decodeObject(types.get(field), block, i);
assertEquals(actual, expected);
}
}
}
}
use of com.facebook.presto.common.Page in project presto by prestodb.
the class TestMergingPageIterator method testMerging.
@Test
public void testMerging() {
List<Type> types = ImmutableList.of(INTEGER, INTEGER);
List<Integer> sortIndexes = ImmutableList.of(1);
List<SortOrder> sortOrders = ImmutableList.of(SortOrder.ASC_NULLS_FIRST);
List<List<Page>> pageLists = new ArrayList<>();
PageBuilder pageBuilder = new PageBuilder(types);
for (int i = 0; i < 10; i++) {
Iterator<Integer> values = IntStream.range(0, 1000).map(ignored -> ThreadLocalRandom.current().nextInt(100_000)).mapToObj(n -> ((n % 100) == 0) ? null : n).sorted(nullsFirst(naturalOrder())).iterator();
List<Page> pages = new ArrayList<>();
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 100; k++) {
Integer n = values.next();
pageBuilder.declarePosition();
if (n == null) {
pageBuilder.getBlockBuilder(0).appendNull();
pageBuilder.getBlockBuilder(1).appendNull();
} else {
INTEGER.writeLong(pageBuilder.getBlockBuilder(0), n);
INTEGER.writeLong(pageBuilder.getBlockBuilder(1), n * 22L);
}
}
pages.add(pageBuilder.build());
pageBuilder.reset();
}
pageLists.add(pages);
assertFalse(values.hasNext());
}
List<Iterator<Page>> pages = pageLists.stream().map(List::iterator).collect(toList());
Iterator<Page> iterator = new MergingPageIterator(pages, types, sortIndexes, sortOrders);
List<Long> values = new ArrayList<>();
while (iterator.hasNext()) {
Page page = iterator.next();
for (int i = 0; i < page.getPositionCount(); i++) {
if (page.getBlock(0).isNull(i)) {
assertTrue(page.getBlock(1).isNull(i));
values.add(null);
} else {
long x = INTEGER.getLong(page.getBlock(0), i);
long y = INTEGER.getLong(page.getBlock(1), i);
assertEquals(y, x * 22);
values.add(x);
}
}
}
assertThat(values).isSortedAccordingTo(nullsFirst(naturalOrder()));
}
Aggregations