package org.activityinfo.ui.client.component.report.view; import com.extjs.gxt.ui.client.data.RpcProxy; import com.google.gwt.user.client.rpc.AsyncCallback; import org.activityinfo.legacy.client.Dispatcher; import org.activityinfo.legacy.shared.Log; import org.activityinfo.legacy.shared.command.DimensionType; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.legacy.shared.command.PivotSites; import org.activityinfo.legacy.shared.command.result.Bucket; import org.activityinfo.legacy.shared.reports.content.DayCategory; import org.activityinfo.legacy.shared.reports.content.EntityCategory; 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 java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Loads drill down rows */ public class DrillDownProxy extends RpcProxy<List<DrillDownRow>> { private Dispatcher dispatcher; private Filter filter; private final Dimension siteDimension = new Dimension(DimensionType.Site); private final Dimension partnerDimension = new Dimension(DimensionType.Partner); private final Dimension locationDimension = new Dimension(DimensionType.Location); private final DateDimension dateDimension = new DateDimension(DateUnit.DAY); private final Dimension indicatorDimension = new Dimension(DimensionType.Indicator); private final Set<Dimension> dims; public DrillDownProxy(Dispatcher dispatcher) { this.dispatcher = dispatcher; dims = new HashSet<>(); dims.add(siteDimension); dims.add(partnerDimension); dims.add(locationDimension); dims.add(dateDimension); dims.add(indicatorDimension); } public void setFilter(Filter filter) { this.filter = filter; } @Override protected void load(Object loadConfig, final AsyncCallback<List<DrillDownRow>> callback) { PivotSites query = new PivotSites(dims, filter); dispatcher.execute(query, new AsyncCallback<PivotSites.PivotResult>() { @Override public void onFailure(Throwable caught) { callback.onFailure(caught); } @Override public void onSuccess(PivotSites.PivotResult result) { try { callback.onSuccess(toRows(result)); } catch (Throwable caught) { Log.error(caught.getMessage(), caught); callback.onFailure(caught); } } }); } private List<DrillDownRow> toRows(PivotSites.PivotResult result) { List<DrillDownRow> rows = new ArrayList<>(); for (Bucket bucket : result.getBuckets()) { DrillDownRow row = new DrillDownRow(getEntity(bucket, siteDimension).getId()); row.set("partner", getEntity(bucket, partnerDimension).getLabel()); row.set("location", getEntity(bucket, locationDimension).getLabel()); row.set("date", getDate(bucket)); row.set("indicator", getEntity(bucket, indicatorDimension).getLabel()); row.set("value", bucket.doubleValue()); rows.add(row); } return rows; } private String getDate(Bucket bucket) { DayCategory dayCategory = (DayCategory) bucket.getCategory(dateDimension); return dayCategory.getLabel(); } private EntityCategory getEntity(Bucket bucket, Dimension dim) { return ((EntityCategory) bucket.getCategory(dim)); } }