/* * 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.index; import com.facebook.presto.operator.DriverFactory; import com.facebook.presto.operator.OperatorFactory; import com.facebook.presto.spi.Page; import com.facebook.presto.spi.type.Type; import com.facebook.presto.sql.planner.plan.PlanNodeId; import com.google.common.collect.ImmutableList; import java.util.List; import java.util.Optional; import java.util.OptionalInt; import static com.facebook.presto.operator.index.PageBufferOperator.PageBufferOperatorFactory; import static com.facebook.presto.operator.index.PagesIndexBuilderOperator.PagesIndexBuilderOperatorFactory; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; public class IndexBuildDriverFactoryProvider { private final int pipelineId; private final int outputOperatorId; private final PlanNodeId planNodeId; private final boolean inputDriver; private final List<OperatorFactory> coreOperatorFactories; private final List<Type> outputTypes; private final Optional<DynamicTupleFilterFactory> dynamicTupleFilterFactory; public IndexBuildDriverFactoryProvider(int pipelineId, int outputOperatorId, PlanNodeId planNodeId, boolean inputDriver, List<OperatorFactory> coreOperatorFactories, Optional<DynamicTupleFilterFactory> dynamicTupleFilterFactory) { requireNonNull(planNodeId, "planNodeId is null"); requireNonNull(coreOperatorFactories, "coreOperatorFactories is null"); checkArgument(!coreOperatorFactories.isEmpty(), "coreOperatorFactories is empty"); requireNonNull(dynamicTupleFilterFactory, "dynamicTupleFilterFactory is null"); this.pipelineId = pipelineId; this.outputOperatorId = outputOperatorId; this.planNodeId = planNodeId; this.inputDriver = inputDriver; this.coreOperatorFactories = ImmutableList.copyOf(coreOperatorFactories); this.outputTypes = ImmutableList.copyOf(this.coreOperatorFactories.get(this.coreOperatorFactories.size() - 1).getTypes()); this.dynamicTupleFilterFactory = dynamicTupleFilterFactory; } public int getPipelineId() { return pipelineId; } public List<Type> getOutputTypes() { return outputTypes; } public DriverFactory createSnapshot(int pipelineId, IndexSnapshotBuilder indexSnapshotBuilder) { checkArgument(indexSnapshotBuilder.getOutputTypes().equals(outputTypes)); return new DriverFactory( pipelineId, inputDriver, false, ImmutableList.<OperatorFactory>builder() .addAll(coreOperatorFactories) .add(new PagesIndexBuilderOperatorFactory(outputOperatorId, planNodeId, indexSnapshotBuilder)) .build(), OptionalInt.empty()); } public DriverFactory createStreaming(PageBuffer pageBuffer, Page indexKeyTuple) { ImmutableList.Builder<OperatorFactory> operatorFactories = ImmutableList.<OperatorFactory>builder() .addAll(coreOperatorFactories); if (dynamicTupleFilterFactory.isPresent()) { // Bind in a dynamic tuple filter if necessary operatorFactories.add(dynamicTupleFilterFactory.get().filterWithTuple(indexKeyTuple)); } operatorFactories.add(new PageBufferOperatorFactory(outputOperatorId, planNodeId, pageBuffer)); return new DriverFactory(pipelineId, inputDriver, false, operatorFactories.build(), OptionalInt.empty()); } }