package com.linkedin.thirdeye.client.pinot;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.linkedin.pinot.client.TextTable;
import com.linkedin.thirdeye.api.TimeSpec;
import com.linkedin.thirdeye.client.BaseThirdEyeResponse;
import com.linkedin.thirdeye.client.MetricFunction;
import com.linkedin.thirdeye.client.ThirdEyeRequest;
import com.linkedin.thirdeye.client.ThirdEyeResponseRow;
public class PinotThirdEyeResponse extends BaseThirdEyeResponse {
private final Map<MetricFunction, Integer> metricFuncToIdMapping;
private List<ThirdEyeResponseRow> responseRows;
private List<String[]> rows;
public PinotThirdEyeResponse(ThirdEyeRequest request, List<String[]> rows, TimeSpec dataTimeSpec) {
super(request, dataTimeSpec);
this.rows = rows;
this.responseRows = new ArrayList<>(rows.size());
this.metricFuncToIdMapping = new HashMap<>();
for (int i = 0; i < metricFunctions.size(); i++) {
metricFuncToIdMapping.put(metricFunctions.get(i), i + groupKeyColumns.size());
}
for (String[] row : rows) {
int timeBucketId = -1;
List<String> dimensions = new ArrayList<>();
if (!groupKeyColumns.isEmpty()) {
for (int i = 0; i < groupKeyColumns.size(); i++) {
if (request.getGroupByTimeGranularity() != null && i == 0) {
timeBucketId = Integer.parseInt(row[i]);
} else {
dimensions.add(row[i]);
}
}
}
List<Double> metrics = new ArrayList<>();
for (int i = 0; i < metricFunctions.size(); i++) {
metrics.add(Double.parseDouble(row[groupKeyColumns.size() + i]));
}
ThirdEyeResponseRow responseRow = new ThirdEyeResponseRow(timeBucketId, dimensions, metrics);
responseRows.add(responseRow);
}
}
@Override
public int getNumRowsFor(MetricFunction metricFunction) {
return rows.size();
}
@Override
public Map<String, String> getRow(MetricFunction metricFunction, int rowId) {
Map<String, String> rowMap = new HashMap<>();
String[] rowValues = rows.get(rowId);
for (int i = 0; i < groupKeyColumns.size(); i++) {
String groupByKey = groupKeyColumns.get(i);
rowMap.put(groupByKey, rowValues[i]);
}
rowMap.put(metricFunction.toString(), rowValues[metricFuncToIdMapping.get(metricFunction)]);
return rowMap;
}
@Override
public String toString() {
TextTable textTable = new TextTable();
textTable.addHeader(allColumnNames);
for (String[] row : rows) {
textTable.addRow(row);
}
return textTable.toString();
}
@Override
public int getNumRows() {
return rows.size();
}
@Override
public ThirdEyeResponseRow getRow(int rowId) {
return responseRows.get(rowId);
}
}