/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.operator; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.PageBuilder; import com.facebook.presto.spi.block.Block; import com.facebook.presto.spi.type.Type; import java.util.List; // This class exists as template for code generation and for testing public class TwoChannelJoinProbe implements JoinProbe { public static class TwoChannelJoinProbeFactory implements JoinProbeFactory { private final List<Type> types; public TwoChannelJoinProbeFactory(List<Type> types) { this.types = types; } @Override public JoinProbe createJoinProbe(LookupSource lookupSource, Page page) { return new TwoChannelJoinProbe(types, lookupSource, page); } } private final LookupSource lookupSource; private final int positionCount; private final Type typeA; private final Type typeB; private final Block blockA; private final Block blockB; private final Block probeBlockA; private final Block probeBlockB; private final Block[] probeBlocks; private final Page page; private final Page probePage; private int position = -1; public TwoChannelJoinProbe(List<Type> types, LookupSource lookupSource, Page page) { this.lookupSource = lookupSource; this.positionCount = page.getPositionCount(); this.typeA = types.get(0); this.typeB = types.get(1); this.blockA = page.getBlock(0); this.blockB = page.getBlock(1); this.probeBlockA = blockA; this.probeBlockB = blockB; this.probeBlocks = new Block[2]; probeBlocks[0] = probeBlockA; probeBlocks[1] = probeBlockB; this.page = page; this.probePage = new Page(probeBlocks); } @Override public int getOutputChannelCount() { return 2; } @Override public void appendTo(PageBuilder pageBuilder) { typeA.appendTo(blockA, position, pageBuilder.getBlockBuilder(0)); typeB.appendTo(blockB, position, pageBuilder.getBlockBuilder(1)); } @Override public boolean advanceNextPosition() { position++; return position < positionCount; } @Override public long getCurrentJoinPosition() { if (currentRowContainsNull()) { return -1; } return lookupSource.getJoinPosition(position, probePage, page); } private boolean currentRowContainsNull() { if (probeBlockA.isNull(position)) { return true; } if (probeBlockB.isNull(position)) { return true; } return false; } @Override public int getPosition() { return position; } @Override public Page getPage() { return page; } }