Search in sources :

Example 1 with LookupSourceSupplierFactory

use of com.facebook.presto.sql.gen.JoinCompiler.LookupSourceSupplierFactory in project presto by prestodb.

the class TestJoinProbeCompiler method testSingleChannel.

@Test(dataProvider = "hashEnabledValues")
public void testSingleChannel(boolean hashEnabled) throws Exception {
    taskContext.addPipelineContext(0, true, true).addDriverContext();
    ImmutableList<Type> types = ImmutableList.of(VARCHAR, DOUBLE);
    ImmutableList<Type> outputTypes = ImmutableList.of(VARCHAR);
    List<Integer> outputChannels = ImmutableList.of(0);
    LookupSourceSupplierFactory lookupSourceSupplierFactory = joinCompiler.compileLookupSourceFactory(types, Ints.asList(0));
    // crate hash strategy with a single channel blocks -- make sure there is some overlap in values
    List<Block> varcharChannel = ImmutableList.of(BlockAssertions.createStringSequenceBlock(10, 20), BlockAssertions.createStringSequenceBlock(20, 30), BlockAssertions.createStringSequenceBlock(15, 25));
    List<Block> extraUnusedDoubleChannel = ImmutableList.of(BlockAssertions.createDoubleSequenceBlock(10, 20), BlockAssertions.createDoubleSequenceBlock(20, 30), BlockAssertions.createDoubleSequenceBlock(15, 25));
    LongArrayList addresses = new LongArrayList();
    for (int blockIndex = 0; blockIndex < varcharChannel.size(); blockIndex++) {
        Block block = varcharChannel.get(blockIndex);
        for (int positionIndex = 0; positionIndex < block.getPositionCount(); positionIndex++) {
            addresses.add(encodeSyntheticAddress(blockIndex, positionIndex));
        }
    }
    Optional<Integer> hashChannel = Optional.empty();
    List<List<Block>> channels = ImmutableList.of(varcharChannel, extraUnusedDoubleChannel);
    if (hashEnabled) {
        ImmutableList.Builder<Block> hashChannelBuilder = ImmutableList.builder();
        for (Block block : varcharChannel) {
            hashChannelBuilder.add(TypeUtils.getHashBlock(ImmutableList.<Type>of(VARCHAR), block));
        }
        types = ImmutableList.of(VARCHAR, DOUBLE, BigintType.BIGINT);
        hashChannel = Optional.of(2);
        channels = ImmutableList.of(varcharChannel, extraUnusedDoubleChannel, hashChannelBuilder.build());
        outputChannels = ImmutableList.of(0, 2);
        outputTypes = ImmutableList.of(VARCHAR, BigintType.BIGINT);
    }
    LookupSource lookupSource = lookupSourceSupplierFactory.createLookupSourceSupplier(taskContext.getSession().toConnectorSession(), addresses, channels, hashChannel, Optional.empty()).get();
    JoinProbeCompiler joinProbeCompiler = new JoinProbeCompiler();
    JoinProbeFactory probeFactory = joinProbeCompiler.internalCompileJoinProbe(types, outputChannels, Ints.asList(0), hashChannel);
    Page page = SequencePageBuilder.createSequencePage(types, 10, 10, 10);
    Page outputPage = new Page(page.getBlock(0));
    if (hashEnabled) {
        page = new Page(page.getBlock(0), page.getBlock(1), TypeUtils.getHashBlock(ImmutableList.of(VARCHAR), page.getBlock(0)));
        outputPage = new Page(page.getBlock(0), page.getBlock(2));
    }
    JoinProbe joinProbe = probeFactory.createJoinProbe(lookupSource, page);
    // verify channel count
    assertEquals(joinProbe.getOutputChannelCount(), outputChannels.size());
    PageBuilder pageBuilder = new PageBuilder(outputTypes);
    for (int position = 0; position < page.getPositionCount(); position++) {
        assertTrue(joinProbe.advanceNextPosition());
        pageBuilder.declarePosition();
        joinProbe.appendTo(pageBuilder);
        assertEquals(joinProbe.getCurrentJoinPosition(), lookupSource.getJoinPosition(position, page, page));
    }
    assertFalse(joinProbe.advanceNextPosition());
    assertPageEquals(outputTypes, pageBuilder.build(), outputPage);
}
Also used : LookupSource(com.facebook.presto.operator.LookupSource) LongArrayList(it.unimi.dsi.fastutil.longs.LongArrayList) ImmutableList(com.google.common.collect.ImmutableList) Page(com.facebook.presto.spi.Page) SequencePageBuilder(com.facebook.presto.SequencePageBuilder) PageBuilder(com.facebook.presto.spi.PageBuilder) JoinProbe(com.facebook.presto.operator.JoinProbe) Type(com.facebook.presto.spi.type.Type) BigintType(com.facebook.presto.spi.type.BigintType) JoinProbeFactory(com.facebook.presto.operator.JoinProbeFactory) Block(com.facebook.presto.spi.block.Block) LongArrayList(it.unimi.dsi.fastutil.longs.LongArrayList) ImmutableList(com.google.common.collect.ImmutableList) List(java.util.List) LookupSourceSupplierFactory(com.facebook.presto.sql.gen.JoinCompiler.LookupSourceSupplierFactory) Test(org.testng.annotations.Test)

Example 2 with LookupSourceSupplierFactory

use of com.facebook.presto.sql.gen.JoinCompiler.LookupSourceSupplierFactory in project presto by prestodb.

the class PagesIndex method createLookupSourceSupplier.

public LookupSourceSupplier createLookupSourceSupplier(Session session, List<Integer> joinChannels, Optional<Integer> hashChannel, Optional<JoinFilterFunctionFactory> filterFunctionFactory, Optional<List<Integer>> outputChannels) {
    List<List<Block>> channels = ImmutableList.copyOf(this.channels);
    if (!joinChannels.isEmpty()) {
        try {
            LookupSourceSupplierFactory lookupSourceFactory = joinCompiler.compileLookupSourceFactory(types, joinChannels, outputChannels);
            return lookupSourceFactory.createLookupSourceSupplier(session.toConnectorSession(), valueAddresses, channels, hashChannel, filterFunctionFactory);
        } catch (Exception e) {
            log.error(e, "Lookup source compile failed for types=%s error=%s", types, e);
        }
    }
    // if compilation fails
    PagesHashStrategy hashStrategy = new SimplePagesHashStrategy(types, outputChannels.orElse(rangeList(types.size())), channels, joinChannels, hashChannel);
    return new JoinHashSupplier(session.toConnectorSession(), hashStrategy, valueAddresses, channels, filterFunctionFactory);
}
Also used : LongArrayList(it.unimi.dsi.fastutil.longs.LongArrayList) ObjectArrayList(it.unimi.dsi.fastutil.objects.ObjectArrayList) ImmutableList(com.google.common.collect.ImmutableList) ImmutableCollectors.toImmutableList(com.facebook.presto.util.ImmutableCollectors.toImmutableList) List(java.util.List) LookupSourceSupplierFactory(com.facebook.presto.sql.gen.JoinCompiler.LookupSourceSupplierFactory)

Aggregations

LookupSourceSupplierFactory (com.facebook.presto.sql.gen.JoinCompiler.LookupSourceSupplierFactory)2 ImmutableList (com.google.common.collect.ImmutableList)2 LongArrayList (it.unimi.dsi.fastutil.longs.LongArrayList)2 List (java.util.List)2 SequencePageBuilder (com.facebook.presto.SequencePageBuilder)1 JoinProbe (com.facebook.presto.operator.JoinProbe)1 JoinProbeFactory (com.facebook.presto.operator.JoinProbeFactory)1 LookupSource (com.facebook.presto.operator.LookupSource)1 Page (com.facebook.presto.spi.Page)1 PageBuilder (com.facebook.presto.spi.PageBuilder)1 Block (com.facebook.presto.spi.block.Block)1 BigintType (com.facebook.presto.spi.type.BigintType)1 Type (com.facebook.presto.spi.type.Type)1 ImmutableCollectors.toImmutableList (com.facebook.presto.util.ImmutableCollectors.toImmutableList)1 ObjectArrayList (it.unimi.dsi.fastutil.objects.ObjectArrayList)1 Test (org.testng.annotations.Test)1