/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* 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.linkedin.pinot.queries;
import com.linkedin.pinot.common.metrics.ServerMetrics;
import com.linkedin.pinot.common.query.QueryExecutor;
import com.linkedin.pinot.common.segment.ReadMode;
import com.linkedin.pinot.core.data.manager.config.FileBasedInstanceDataManagerConfig;
import com.linkedin.pinot.core.data.manager.offline.FileBasedInstanceDataManager;
import com.linkedin.pinot.core.data.manager.offline.TableDataManagerProvider;
import com.linkedin.pinot.core.indexsegment.IndexSegment;
import com.linkedin.pinot.core.indexsegment.columnar.ColumnarSegmentLoader;
import com.linkedin.pinot.core.query.executor.ServerQueryExecutorV1Impl;
import com.linkedin.pinot.core.startree.hll.HllConfig;
import com.linkedin.pinot.core.startree.hll.SegmentWithHllIndexCreateHelper;
import com.linkedin.pinot.util.TestUtils;
import com.yammer.metrics.core.MetricsRegistry;
import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TestHelper implements AutoCloseable {
private static final Logger LOGGER = LoggerFactory.getLogger(TestHelper.class);
static final String AVRO_DATA = "data/test_data-sv.avro";
// package-visible since this is package-internal testing helper
final String tableName;
static final String TIME_COLUMN = "daysSinceEpoch";
static final TimeUnit TIME_UNIT = TimeUnit.DAYS;
final ServerMetrics serverMetrics;
final FileBasedInstanceDataManager instanceDataManager;
final PropertiesConfiguration serverConf;
final QueryExecutor queryExecutor;
TestHelper(@Nonnull String tableName, @Nullable PropertiesConfiguration serverConf)
throws IOException {
this.tableName = Objects.requireNonNull(tableName, "Table name should not be null");
if (serverConf != null) {
this.serverConf = serverConf;
} else {
this.serverConf = new TestingServerPropertiesBuilder(tableName).build();
}
this.serverConf.setDelimiterParsingDisabled(false);
serverMetrics = new ServerMetrics(new MetricsRegistry());
TableDataManagerProvider.setServerMetrics(serverMetrics);
instanceDataManager = FileBasedInstanceDataManager.getInstanceDataManager();
queryExecutor = new ServerQueryExecutorV1Impl(false);
}
void init()
throws ConfigurationException, IllegalAccessException, ClassNotFoundException, InstantiationException {
instanceDataManager.init(new FileBasedInstanceDataManagerConfig(serverConf.subset("pinot.server.instance")));
instanceDataManager.start();
queryExecutor.init(serverConf.subset("pinot.server.query.executor"), instanceDataManager, serverMetrics);
}
SegmentWithHllIndexCreateHelper buildLoadDefaultHllSegment(HllConfig hllConfig)
throws Exception {
SegmentWithHllIndexCreateHelper helper = buildDefaultHllSegment(hllConfig);
loadSegment(helper.getSegmentDirectory());
return helper;
}
IndexSegment loadSegment(File indexDir)
throws Exception {
IndexSegment indexSegment = ColumnarSegmentLoader.load(indexDir, ReadMode.mmap);
instanceDataManager.getTableDataManager(tableName).addSegment(indexSegment);
return indexSegment;
}
SegmentWithHllIndexCreateHelper buildDefaultHllSegment(HllConfig hllConfig)
throws Exception {
return buildHllSegment(this.tableName, TestUtils.getFileFromResourceUrl(getClass().getClassLoader().getResource(AVRO_DATA)),
TIME_COLUMN, TIME_UNIT, "testSegment", hllConfig, true);
}
SegmentWithHllIndexCreateHelper buildHllSegment(String tableName, String avroData, String timeColumn, TimeUnit timeUnit,
String testSegment, HllConfig hllConfig, boolean enableStarTree)
throws Exception {
SegmentWithHllIndexCreateHelper helper =
new SegmentWithHllIndexCreateHelper(tableName, avroData, timeColumn, timeUnit, testSegment);
helper.build(enableStarTree, hllConfig);
return helper;
}
@Override
public void close() {
queryExecutor.shutDown();
instanceDataManager.shutDown();
}
}