package org.rakam.report.realtime;
import com.fasterxml.jackson.annotation.JsonCreator;
import io.netty.handler.codec.http.HttpResponseStatus;
import org.rakam.server.http.annotations.ApiParam;
import org.rakam.util.RakamException;
import org.rakam.util.ValidationUtil;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;
import static com.google.common.base.Preconditions.checkNotNull;
import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST;
import static java.lang.String.format;
public class RealTimeReport {
@NotNull public final String name;
@NotNull public final String table_name;
public final Set<String> collections;
public final String filter;
public final Set<Measure> measures;
public final Set<String> dimensions;
@JsonCreator
public RealTimeReport(@ApiParam("name") String name,
@ApiParam("measures") Set<Measure> measures,
@ApiParam("table_name") String tableName,
@ApiParam("collections") Set<String> collections,
@ApiParam(value = "filter", required = false) String filter,
@ApiParam(value = "dimensions", required = false) Set<String> dimensions) {
this.name = checkNotNull(name, "name is required");
this.table_name = checkNotNull(tableName, "table_name is required");
this.collections = checkNotNull(collections, "collections is required");
this.filter = filter;
this.measures = checkNotNull(measures, "measures is required");
this.dimensions = dimensions;
if(this.measures.isEmpty()) {
throw new RakamException("There must be at least one measure", BAD_REQUEST);
}
for (Measure measure : measures) {
if (dimensions.stream().anyMatch(dimension -> dimension.equals(measure.column))) {
throw new RakamException(format("Column %s in dimension cannot be also in measures", measure.column), BAD_REQUEST);
}
}
ValidationUtil.checkArgument(!collections.isEmpty(), "collections is empty");
}
public static class Measure {
public final String column;
public final AggregationType aggregation;
@JsonCreator
public Measure(@ApiParam("column") String column, @ApiParam("aggregation") AggregationType aggregation) {
this.column = column;
this.aggregation = aggregation;
}
@Override
public boolean equals(Object o)
{
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Measure measure = (Measure) o;
if (!column.equals(measure.column)) {
return false;
}
return aggregation == measure.aggregation;
}
@Override
public int hashCode()
{
int result = column.hashCode();
result = 31 * result + aggregation.hashCode();
return result;
}
}
}