package com.linkedin.thirdeye.autoload.pinot.metrics;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import com.linkedin.pinot.common.data.MetricFieldSpec;
import com.linkedin.pinot.common.data.Schema;
import com.linkedin.pinot.common.data.TimeGranularitySpec;
import com.linkedin.pinot.common.data.TimeGranularitySpec.TimeFormat;
import com.linkedin.thirdeye.api.MetricType;
import com.linkedin.thirdeye.api.TimeGranularity;
import com.linkedin.thirdeye.datalayer.dto.DashboardConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.DatasetConfigDTO;
import com.linkedin.thirdeye.datalayer.dto.MetricConfigDTO;
import com.linkedin.thirdeye.datalayer.pojo.DashboardConfigBean;
import com.linkedin.thirdeye.datalayer.pojo.DatasetConfigBean;
import com.linkedin.thirdeye.util.ThirdEyeUtils;
public class ConfigGenerator {
private static final String PDT_TIMEZONE = "US/Pacific";
public static DatasetConfigDTO generateDatasetConfig(String dataset, Schema schema) {
List<String> dimensions = schema.getDimensionNames();
TimeGranularitySpec timeSpec = schema.getTimeFieldSpec().getOutgoingGranularitySpec();
// Create DatasetConfig
DatasetConfigDTO datasetConfigDTO = new DatasetConfigDTO();
datasetConfigDTO.setDataset(dataset);
datasetConfigDTO.setDimensions(dimensions);
datasetConfigDTO.setTimeColumn(timeSpec.getName());
datasetConfigDTO.setTimeDuration(timeSpec.getTimeUnitSize());
datasetConfigDTO.setTimeUnit(timeSpec.getTimeType());
datasetConfigDTO.setTimeFormat(timeSpec.getTimeFormat());
datasetConfigDTO.setExpectedDelay(getExpectedDelayFromTimeunit(timeSpec.getTimeType()));
if (timeSpec.getTimeFormat().startsWith(TimeFormat.SIMPLE_DATE_FORMAT.toString())) {
datasetConfigDTO.setTimezone(PDT_TIMEZONE);
}
return datasetConfigDTO;
}
private static TimeGranularity getExpectedDelayFromTimeunit(TimeUnit timeUnit) {
TimeGranularity expectedDelay = null;
switch (timeUnit) {
case HOURS:
case MILLISECONDS:
case MINUTES:
case SECONDS:
expectedDelay = DatasetConfigBean.DEFAULT_HOURLY_EXPECTED_DELAY;
break;
case DAYS:
default:
expectedDelay = DatasetConfigBean.DEFAULT_DAILY_EXPECTED_DELAY;
break;
}
return expectedDelay;
}
public static MetricConfigDTO generateMetricConfig(MetricFieldSpec metricFieldSpec, String dataset) {
MetricConfigDTO metricConfigDTO = new MetricConfigDTO();
String metric = metricFieldSpec.getName();
metricConfigDTO.setName(metric);
metricConfigDTO.setAlias(ThirdEyeUtils.constructMetricAlias(dataset, metric));
metricConfigDTO.setDataset(dataset);
metricConfigDTO.setDatatype(MetricType.valueOf(metricFieldSpec.getDataType().toString()));
return metricConfigDTO;
}
public static DashboardConfigDTO generateDefaultDashboardConfig(String dataset, List<Long> metricIds) {
DashboardConfigDTO dashboardConfigDTO = new DashboardConfigDTO();
String dashboardName = DashboardConfigBean.DEFAULT_DASHBOARD_PREFIX + dataset;
dashboardConfigDTO.setName(dashboardName);
dashboardConfigDTO.setDataset(dataset);
dashboardConfigDTO.setMetricIds(metricIds);
return dashboardConfigDTO;
}
public static List<Long> getMetricIdsFromMetricConfigs(List<MetricConfigDTO> metricConfigs) {
List<Long> metricIds = new ArrayList<>();
for (MetricConfigDTO metricConfig : metricConfigs) {
metricIds.add(metricConfig.getId());
}
return metricIds;
}
}