package com.linkedin.thirdeye.client;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.linkedin.thirdeye.client.ThirdEyeRequest.ThirdEyeRequestBuilder;
public class ResponseParserUtils {
public static ThirdEyeCacheRegistry CACHE_REGISTRY_INSTANCE = ThirdEyeCacheRegistry.getInstance();
public static final Logger LOGGER = LoggerFactory.getLogger(ResponseParserUtils.class);
public static String TIME_DIMENSION_JOINER_ESCAPED = "\\|";
public static String TIME_DIMENSION_JOINER = "|";
public static String OTHER = "OTHER";
public static String UNKNOWN = "UNKNOWN";
public static Map<String, ThirdEyeResponseRow> createResponseMapByTimeAndDimension(
ThirdEyeResponse thirdEyeResponse) {
Map<String, ThirdEyeResponseRow> responseMap;
responseMap = new HashMap<>();
int numRows = thirdEyeResponse.getNumRows();
for (int i = 0; i < numRows; i++) {
ThirdEyeResponseRow thirdEyeResponseRow = thirdEyeResponse.getRow(i);
String key =
computeTimeDimensionValues(thirdEyeResponseRow.getTimeBucketId(), thirdEyeResponseRow.getDimensions());
responseMap.put(key, thirdEyeResponseRow);
}
return responseMap;
}
public static Map<String, ThirdEyeResponseRow> createResponseMapByTime(
ThirdEyeResponse thirdEyeResponse) {
Map<String, ThirdEyeResponseRow> responseMap;
responseMap = new HashMap<>();
int numRows = thirdEyeResponse.getNumRows();
for (int i = 0; i < numRows; i++) {
ThirdEyeResponseRow thirdEyeResponseRow = thirdEyeResponse.getRow(i);
responseMap.put(String.valueOf(thirdEyeResponseRow.getTimeBucketId()), thirdEyeResponseRow);
}
return responseMap;
}
public static Map<String, ThirdEyeResponseRow> createResponseMapByDimension(
ThirdEyeResponse thirdEyeResponse) {
Map<String, ThirdEyeResponseRow> responseMap;
responseMap = new HashMap<>();
int numRows = thirdEyeResponse.getNumRows();
for (int i = 0; i < numRows; i++) {
ThirdEyeResponseRow thirdEyeResponseRow = thirdEyeResponse.getRow(i);
responseMap.put(thirdEyeResponseRow.getDimensions().get(0), thirdEyeResponseRow);
}
return responseMap;
}
public static List<Double> getMetricSums(ThirdEyeResponse response) {
ThirdEyeRequest request = response.getRequest();
ThirdEyeRequestBuilder requestBuilder = ThirdEyeRequest.newBuilder();
requestBuilder.setStartTimeInclusive(request.getStartTimeInclusive());
requestBuilder.setEndTimeExclusive(request.getEndTimeExclusive());
requestBuilder.setFilterSet(request.getFilterSet());
requestBuilder.setMetricFunctions(request.getMetricFunctions());
ThirdEyeRequest metricSumsRequest = requestBuilder.build("metricSums");
ThirdEyeResponse metricSumsResponse = null;
try {
metricSumsResponse =
CACHE_REGISTRY_INSTANCE.getQueryCache().getQueryResult(metricSumsRequest);
} catch (Exception e) {
LOGGER.error("Caught exception when executing metric sums request", e);
}
List<Double> metricSums = metricSumsResponse.getRow(0).getMetrics();
return metricSums;
}
public static Map<Integer, List<Double>> getMetricSumsByTime(ThirdEyeResponse response) {
ThirdEyeRequest request = response.getRequest();
Map<Integer, List<Double>> metricSums = new HashMap<>();
ThirdEyeRequestBuilder requestBuilder = ThirdEyeRequest.newBuilder();
requestBuilder.setStartTimeInclusive(request.getStartTimeInclusive());
requestBuilder.setEndTimeExclusive(request.getEndTimeExclusive());
requestBuilder.setFilterSet(request.getFilterSet());
requestBuilder.setGroupByTimeGranularity(request.getGroupByTimeGranularity());
requestBuilder.setMetricFunctions(request.getMetricFunctions());
ThirdEyeRequest metricSumsRequest = requestBuilder.build("metricSums");
ThirdEyeResponse metricSumsResponse = null;
try {
metricSumsResponse =
CACHE_REGISTRY_INSTANCE.getQueryCache().getQueryResult(metricSumsRequest);
} catch (Exception e) {
LOGGER.error("Caught exception when executing metric sums request", e);
}
for (int i = 0; i < metricSumsResponse.getNumRows(); i++) {
ThirdEyeResponseRow row = metricSumsResponse.getRow(i);
metricSums.put(row.getTimeBucketId(), row.getMetrics());
}
return metricSums;
}
public static String computeTimeDimensionValue(int timeBucketId, String dimensionValue) {
return timeBucketId + TIME_DIMENSION_JOINER + dimensionValue;
}
public static String computeTimeDimensionValues(int timeBucketId, List<String> dimensionValues) {
if (dimensionValues == null || dimensionValues.size() == 0) {
return Integer.toString(timeBucketId);
} else if (dimensionValues.size() == 1) {
return computeTimeDimensionValue(timeBucketId, dimensionValues.get(0));
} else {
StringBuilder sb = new StringBuilder(Integer.toString(timeBucketId)).append(TIME_DIMENSION_JOINER);
String separator = "";
for (String dimensionValue : dimensionValues) {
sb.append(separator).append(dimensionValue);
separator = TIME_DIMENSION_JOINER;
}
return sb.toString();
}
}
public static String extractFirstDimensionValue(String timeDimensionValue) {
String[] tokens = timeDimensionValue.split(TIME_DIMENSION_JOINER_ESCAPED);
String dimensionValue = tokens.length < 2 ? "" : tokens[1];
return dimensionValue;
}
public static List<String> extractDimensionValues(String timeDimensionValues) {
String[] tokens = timeDimensionValues.split(TIME_DIMENSION_JOINER_ESCAPED);
if (tokens.length < 2) {
return Collections.emptyList();
} else {
List<String> res = new ArrayList<>(tokens.length - 1);
for (int i = 1; i < tokens.length; ++i) {
res.add(tokens[i]);
}
return res;
}
}
}