use of com.facebook.presto.operator.JoinProbe.JoinProbeFactory in project presto by prestodb.
the class TestLookupJoinPageBuilder method testDifferentPositions.
@Test
public void testDifferentPositions() {
int entries = 100;
BlockBuilder blockBuilder = BIGINT.createFixedSizeBlockBuilder(entries);
for (int i = 0; i < entries; i++) {
BIGINT.writeLong(blockBuilder, i);
}
Block block = blockBuilder.build();
Page page = new Page(block);
JoinProbeFactory joinProbeFactory = new JoinProbeFactory(new int[] { 0 }, ImmutableList.of(0), OptionalInt.empty());
LookupSource lookupSource = new TestLookupSource(ImmutableList.of(BIGINT), page);
LookupJoinPageBuilder lookupJoinPageBuilder = new LookupJoinPageBuilder(ImmutableList.of(BIGINT));
// empty
JoinProbe probe = joinProbeFactory.createJoinProbe(page);
Page output = lookupJoinPageBuilder.build(probe);
assertEquals(output.getChannelCount(), 2);
assertTrue(output.getBlock(0) instanceof DictionaryBlock);
assertEquals(output.getPositionCount(), 0);
lookupJoinPageBuilder.reset();
// the probe covers non-sequential positions
probe = joinProbeFactory.createJoinProbe(page);
for (int joinPosition = 0; probe.advanceNextPosition(); joinPosition++) {
if (joinPosition % 2 == 1) {
continue;
}
lookupJoinPageBuilder.appendRow(probe, lookupSource, joinPosition);
}
output = lookupJoinPageBuilder.build(probe);
assertEquals(output.getChannelCount(), 2);
assertTrue(output.getBlock(0) instanceof DictionaryBlock);
assertEquals(output.getPositionCount(), entries / 2);
for (int i = 0; i < entries / 2; i++) {
assertEquals(output.getBlock(0).getLong(i), i * 2);
assertEquals(output.getBlock(1).getLong(i), i * 2);
}
lookupJoinPageBuilder.reset();
// the probe covers everything
probe = joinProbeFactory.createJoinProbe(page);
for (int joinPosition = 0; probe.advanceNextPosition(); joinPosition++) {
lookupJoinPageBuilder.appendRow(probe, lookupSource, joinPosition);
}
output = lookupJoinPageBuilder.build(probe);
assertEquals(output.getChannelCount(), 2);
assertFalse(output.getBlock(0) instanceof DictionaryBlock);
assertEquals(output.getPositionCount(), entries);
for (int i = 0; i < entries; i++) {
assertEquals(output.getBlock(0).getLong(i), i);
assertEquals(output.getBlock(1).getLong(i), i);
}
lookupJoinPageBuilder.reset();
// the probe covers some sequential positions
probe = joinProbeFactory.createJoinProbe(page);
for (int joinPosition = 0; probe.advanceNextPosition(); joinPosition++) {
if (joinPosition < 10 || joinPosition >= 50) {
continue;
}
lookupJoinPageBuilder.appendRow(probe, lookupSource, joinPosition);
}
output = lookupJoinPageBuilder.build(probe);
assertEquals(output.getChannelCount(), 2);
assertFalse(output.getBlock(0) instanceof DictionaryBlock);
assertEquals(output.getPositionCount(), 40);
for (int i = 10; i < 50; i++) {
assertEquals(output.getBlock(0).getLong(i - 10), i);
assertEquals(output.getBlock(1).getLong(i - 10), i);
}
}
use of com.facebook.presto.operator.JoinProbe.JoinProbeFactory in project presto by prestodb.
the class TestLookupJoinPageBuilder method testCrossJoinWithEmptyBuild.
@Test
public void testCrossJoinWithEmptyBuild() {
BlockBuilder blockBuilder = BIGINT.createBlockBuilder(null, 1);
BIGINT.writeLong(blockBuilder, 0);
Page page = new Page(blockBuilder.build());
// nothing on the build side so we don't append anything
LookupSource lookupSource = new TestLookupSource(ImmutableList.of(), page);
JoinProbe probe = (new JoinProbeFactory(new int[] { 0 }, ImmutableList.of(0), OptionalInt.empty())).createJoinProbe(page);
LookupJoinPageBuilder lookupJoinPageBuilder = new LookupJoinPageBuilder(ImmutableList.of(BIGINT));
// append the same row many times should also flush in the end
probe.advanceNextPosition();
for (int i = 0; i < 300_000; i++) {
lookupJoinPageBuilder.appendRow(probe, lookupSource, 0);
}
assertTrue(lookupJoinPageBuilder.isFull());
}
use of com.facebook.presto.operator.JoinProbe.JoinProbeFactory in project presto by prestodb.
the class TestLookupJoinPageBuilder method testPageBuilder.
@Test
public void testPageBuilder() {
int entries = 10_000;
BlockBuilder blockBuilder = BIGINT.createBlockBuilder(null, entries);
for (int i = 0; i < entries; i++) {
BIGINT.writeLong(blockBuilder, i);
}
Block block = blockBuilder.build();
Page page = new Page(block, block);
JoinProbeFactory joinProbeFactory = new JoinProbeFactory(new int[] { 0, 1 }, ImmutableList.of(0, 1), OptionalInt.empty());
JoinProbe probe = joinProbeFactory.createJoinProbe(page);
LookupSource lookupSource = new TestLookupSource(ImmutableList.of(BIGINT, BIGINT), page);
LookupJoinPageBuilder lookupJoinPageBuilder = new LookupJoinPageBuilder(ImmutableList.of(BIGINT, BIGINT));
int joinPosition = 0;
while (!lookupJoinPageBuilder.isFull() && probe.advanceNextPosition()) {
lookupJoinPageBuilder.appendRow(probe, lookupSource, joinPosition++);
lookupJoinPageBuilder.appendNullForBuild(probe);
}
assertFalse(lookupJoinPageBuilder.isEmpty());
Page output = lookupJoinPageBuilder.build(probe);
assertEquals(output.getChannelCount(), 4);
assertTrue(output.getBlock(0) instanceof DictionaryBlock);
assertTrue(output.getBlock(1) instanceof DictionaryBlock);
for (int i = 0; i < output.getPositionCount(); i++) {
assertFalse(output.getBlock(0).isNull(i));
assertFalse(output.getBlock(1).isNull(i));
assertEquals(output.getBlock(0).getLong(i), i / 2);
assertEquals(output.getBlock(1).getLong(i), i / 2);
if (i % 2 == 0) {
assertFalse(output.getBlock(2).isNull(i));
assertFalse(output.getBlock(3).isNull(i));
assertEquals(output.getBlock(2).getLong(i), i / 2);
assertEquals(output.getBlock(3).getLong(i), i / 2);
} else {
assertTrue(output.getBlock(2).isNull(i));
assertTrue(output.getBlock(3).isNull(i));
}
}
assertTrue(lookupJoinPageBuilder.toString().contains("positionCount=" + output.getPositionCount()));
lookupJoinPageBuilder.reset();
assertTrue(lookupJoinPageBuilder.isEmpty());
}
Aggregations