package com.linkedin.thirdeye.client.timeseries;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.linkedin.thirdeye.api.TimeGranularity;
import com.linkedin.thirdeye.client.MetricExpression;
public class TimeSeriesRequest {
private String collectionName;
private List<MetricExpression> metricExpressions;
/**
* Dimensions to group by. multiple dimensions will generate multiple client requests, as opposed
* to a single request grouped by multiple dimensions (not supported).
*/
private List<String> groupByDimensions;
/**
* easy way to represent AND of multiple dimensions
* for example
* filterMap = new HashMap
* filterMap.put("country", "us")
* filterMap.put("device", "android")
* is equivalent to setting filterClause country='us' and device='android'
*/
private Multimap<String, String> filterSet;
/**
* Allows one to specify complex boolean expressions, advanced usage
*/
private String filterClause;
// TIME RELATED PARAMETERs
private DateTime start;
private DateTime end;
private TimeGranularity aggregationTimeGranularity;
private boolean isEndDateInclusive = false;
public TimeSeriesRequest() {
}
/** TODO use builder pattern? */
public TimeSeriesRequest(TimeSeriesRequest timeSeriesRequest) {
this.collectionName = timeSeriesRequest.collectionName;
if (timeSeriesRequest.metricExpressions != null) {
this.metricExpressions = new ArrayList<>(timeSeriesRequest.metricExpressions);
}
if (timeSeriesRequest.groupByDimensions != null) {
this.groupByDimensions = new ArrayList<>(timeSeriesRequest.groupByDimensions);
}
if (timeSeriesRequest.filterSet != null) {
this.filterSet = ArrayListMultimap.create(timeSeriesRequest.filterSet);
}
this.filterClause = timeSeriesRequest.filterClause;
this.start = timeSeriesRequest.start;
this.end = timeSeriesRequest.end;
if (timeSeriesRequest.aggregationTimeGranularity != null) {
this.aggregationTimeGranularity =
new TimeGranularity(timeSeriesRequest.aggregationTimeGranularity.getSize(),
timeSeriesRequest.aggregationTimeGranularity.getUnit());
}
this.isEndDateInclusive = timeSeriesRequest.isEndDateInclusive;
}
public String getCollectionName() {
return collectionName;
}
public void setCollectionName(String collectionName) {
this.collectionName = collectionName;
}
public List<MetricExpression> getMetricExpressions() {
return metricExpressions;
}
public void setMetricExpressions(List<MetricExpression> metricExpressions) {
this.metricExpressions = metricExpressions;
}
public List<String> getGroupByDimensions() {
return groupByDimensions;
}
public void setGroupByDimensions(List<String> groupByDimensions) {
this.groupByDimensions = groupByDimensions;
}
public Multimap<String, String> getFilterSet() {
return filterSet;
}
public void setFilterSet(Multimap<String, String> filterSet) {
this.filterSet = filterSet;
}
public String getFilterClause() {
return filterClause;
}
public void setFilterClause(String filterClause) {
this.filterClause = filterClause;
}
/** Get start time, inclusive. */
public DateTime getStart() {
return start;
}
/** Set start time, inclusive. */
public void setStart(DateTime start) {
this.start = start;
}
public DateTime getEnd() {
return end;
}
public void setEnd(DateTime end) {
this.end = end;
}
public TimeGranularity getAggregationTimeGranularity() {
return aggregationTimeGranularity;
}
public void setAggregationTimeGranularity(TimeGranularity aggregationTimeGranularity) {
this.aggregationTimeGranularity = aggregationTimeGranularity;
}
public boolean isEndDateInclusive() {
return isEndDateInclusive;
}
public void setEndDateInclusive(boolean includeEndDate) {
this.isEndDateInclusive = includeEndDate;
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this).add("collectionName", collectionName)
.add("metricExpressions", metricExpressions).add("groupByDimensions", groupByDimensions)
.add("filterSet", filterSet).add("filterClause", filterClause).add("start", start)
.add("end", end).add("aggregationTimeGranularity", aggregationTimeGranularity).toString();
}
}