/* * 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.tests.tpch; import com.facebook.presto.spi.ConnectorHandleResolver; import com.facebook.presto.spi.NodeManager; import com.facebook.presto.spi.SystemTable; import com.facebook.presto.spi.connector.Connector; import com.facebook.presto.spi.connector.ConnectorContext; import com.facebook.presto.spi.connector.ConnectorFactory; import com.facebook.presto.spi.connector.ConnectorIndexProvider; import com.facebook.presto.spi.connector.ConnectorMetadata; import com.facebook.presto.spi.connector.ConnectorNodePartitioningProvider; import com.facebook.presto.spi.connector.ConnectorRecordSetProvider; import com.facebook.presto.spi.connector.ConnectorSplitManager; import com.facebook.presto.spi.connector.ConnectorTransactionHandle; import com.facebook.presto.spi.transaction.IsolationLevel; import com.facebook.presto.tpch.TpchNodePartitioningProvider; import com.facebook.presto.tpch.TpchRecordSetProvider; import com.facebook.presto.tpch.TpchSplitManager; import com.facebook.presto.tpch.TpchTransactionHandle; import com.google.common.collect.ImmutableSet; import java.util.Map; import java.util.Set; import static com.google.common.base.MoreObjects.firstNonNull; import static java.util.Objects.requireNonNull; public class IndexedTpchConnectorFactory implements ConnectorFactory { private final TpchIndexSpec indexSpec; private final int defaultSplitsPerNode; public IndexedTpchConnectorFactory(TpchIndexSpec indexSpec, int defaultSplitsPerNode) { this.indexSpec = requireNonNull(indexSpec, "indexSpec is null"); this.defaultSplitsPerNode = defaultSplitsPerNode; } @Override public String getName() { return "tpch_indexed"; } @Override public ConnectorHandleResolver getHandleResolver() { return new TpchIndexHandleResolver(); } @Override public Connector create(String connectorId, Map<String, String> properties, ConnectorContext context) { int splitsPerNode = getSplitsPerNode(properties); TpchIndexedData indexedData = new TpchIndexedData(connectorId, indexSpec); NodeManager nodeManager = context.getNodeManager(); return new Connector() { @Override public ConnectorTransactionHandle beginTransaction(IsolationLevel isolationLevel, boolean readOnly) { return TpchTransactionHandle.INSTANCE; } @Override public ConnectorMetadata getMetadata(ConnectorTransactionHandle transactionHandle) { return new TpchIndexMetadata(connectorId, indexedData); } @Override public ConnectorSplitManager getSplitManager() { return new TpchSplitManager(nodeManager, splitsPerNode); } @Override public ConnectorRecordSetProvider getRecordSetProvider() { return new TpchRecordSetProvider(); } @Override public ConnectorIndexProvider getIndexProvider() { return new TpchIndexProvider(indexedData); } @Override public Set<SystemTable> getSystemTables() { return ImmutableSet.of(new ExampleSystemTable()); } @Override public ConnectorNodePartitioningProvider getNodePartitioningProvider() { return new TpchNodePartitioningProvider(nodeManager, splitsPerNode); } }; } private int getSplitsPerNode(Map<String, String> properties) { try { return Integer.parseInt(firstNonNull(properties.get("tpch.splits-per-node"), String.valueOf(defaultSplitsPerNode))); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid property tpch.splits-per-node"); } } }