package org.activityinfo.server.endpoint.rest;
import com.google.common.collect.Sets;
import org.activityinfo.legacy.shared.command.DimensionType;
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.command.Month;
import org.activityinfo.legacy.shared.command.PivotSites;
import org.activityinfo.legacy.shared.command.result.Bucket;
import org.activityinfo.legacy.shared.reports.model.DateDimension;
import org.activityinfo.legacy.shared.reports.model.DateUnit;
import org.activityinfo.legacy.shared.reports.model.Dimension;
import org.activityinfo.server.command.DispatcherSync;
import org.activityinfo.server.report.util.DateUtilCalendarImpl;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import java.util.List;
import java.util.Set;
public class CubeResource {
private final DispatcherSync dispatcherSync;
public CubeResource(DispatcherSync dispatcherSync) {
this.dispatcherSync = dispatcherSync;
}
@GET
@Produces("application/json")
public List<Bucket> pivot(@QueryParam("dimension") List<String> dimensions, @QueryParam("form") List<Integer> forms,
@QueryParam("month") String monthName) {
Filter filter = new Filter();
if(forms.size() == 0) {
throw new WebApplicationException(Response
.status(Response.Status.BAD_REQUEST)
.entity("Must specify at least one ?form={formId}").build());
}
filter.addRestriction(DimensionType.Activity, forms);
if(monthName != null) {
Month month = Month.parseMonth(monthName);
filter.setDateRange(new DateUtilCalendarImpl().monthRange(month));
}
Set<Dimension> pivotDimensions = Sets.newHashSet();
if(forms.size() == 0) {
throw new WebApplicationException(Response
.status(Response.Status.BAD_REQUEST)
.entity("Must specify at least one ?dimension={indicator|form|database|...}").build());
}
for(String dimension : dimensions) {
switch(dimension) {
case "indicator":
pivotDimensions.add(new Dimension(DimensionType.Indicator));
break;
case "site":
pivotDimensions.add(new Dimension(DimensionType.Site));
break;
case "month":
pivotDimensions.add(new DateDimension(DateUnit.MONTH));
break;
default:
throw new WebApplicationException(Response
.status(Response.Status.BAD_REQUEST)
.entity("Invalid dimension '" + dimension + "'").build());
}
}
PivotSites query = new PivotSites();
query.setFilter(filter);
query.setDimensions(pivotDimensions);
PivotSites.PivotResult result = dispatcherSync.execute(query);
return result.getBuckets();
}
}