package org.activityinfo.legacy.shared.impl; import com.bedatadriven.rebar.sql.annotations.Sql; import com.bedatadriven.rebar.sql.client.SqlResultCallback; import com.bedatadriven.rebar.sql.client.SqlResultSet; import com.bedatadriven.rebar.sql.client.SqlResultSetRow; import com.bedatadriven.rebar.sql.client.SqlTransaction; import com.bedatadriven.rebar.sql.client.query.SqlQuery; import com.extjs.gxt.ui.client.data.BaseListLoadResult; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.gwt.user.client.rpc.AsyncCallback; import org.activityinfo.legacy.shared.command.DimensionType; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.legacy.shared.command.GetActivityForm; import org.activityinfo.legacy.shared.command.GetActivityForms; import org.activityinfo.legacy.shared.command.result.ActivityFormResults; import org.activityinfo.legacy.shared.command.result.ListResult; import org.activityinfo.legacy.shared.model.ActivityFormDTO; import org.activityinfo.promise.Promise; import javax.annotation.Nullable; import java.util.List; import java.util.logging.Logger; public class GetActivityFormsHandler implements CommandHandlerAsync<GetActivityForms, ActivityFormResults> { private static final Logger LOGGER = Logger.getLogger(GetActivityFormsHandler.class.getName()); @Override public void execute(GetActivityForms command, final ExecutionContext context, final AsyncCallback<ActivityFormResults> callback) { composeQuery(command.getFilter()) .execute(context.getTransaction(), new SqlResultCallback() { @Override public void onSuccess(SqlTransaction tx, SqlResultSet results) { Promise.map(results.getRows(), new Function<SqlResultSetRow, Promise<ActivityFormDTO>>() { @Override public Promise<ActivityFormDTO> apply(SqlResultSetRow input) { return fetchForm(context, input.getInt("activityId")); } }).then(new Function<List<ActivityFormDTO>, ActivityFormResults>() { @Override public ActivityFormResults apply(List<ActivityFormDTO> input) { return new ActivityFormResults(input); } }).then(callback); } }); } private SqlQuery composeQuery(Filter filter) { if(filter.isRestricted(DimensionType.Indicator)) { return SqlQuery.selectDistinct() .appendColumn("i.activityId") .from(Tables.INDICATOR, "i") .leftJoin(Tables.ACTIVITY, "a").on("a.activityId=i.activityId") .where("indicatorId").in(filter.getRestrictions(DimensionType.Indicator)) .whereTrue("i.dateDeleted is NULL") .whereTrue("a.dateDeleted is NULL"); } else if(filter.isRestricted(DimensionType.Activity)) { return SqlQuery.selectDistinct() .appendColumn("activityId") .from(Tables.ACTIVITY) .whereTrue("dateDeleted is NULL") .where("activityId").in(filter.getRestrictions(DimensionType.Activity)); } else if(filter.isRestricted(DimensionType.Database)) { return SqlQuery.selectDistinct() .appendColumn("activityId") .from(Tables.ACTIVITY) .whereTrue("dateDeleted is NULL") .where("databaseId").in(filter.getRestrictions(DimensionType.Database)); } else { LOGGER.warning("No restrictions specified, returning empty set. Filter = " + filter); return SqlQuery.select("activityId").from(Tables.ACTIVITY).whereTrue("0=1"); } } private Promise<ActivityFormDTO> fetchForm(ExecutionContext context, int activityId) { final Promise<ActivityFormDTO> form = new Promise<>(); context.execute(new GetActivityForm(activityId), new AsyncCallback<ActivityFormDTO>() { @Override public void onFailure(Throwable caught) { form.reject(caught); } @Override public void onSuccess(ActivityFormDTO result) { form.resolve(result); } }); return form; } }