package org.openmrs.module.reporting.web.cohorts; import java.util.List; import javax.servlet.http.HttpSession; import org.openmrs.api.context.Context; import org.openmrs.module.reporting.cohort.definition.CohortDefinition; import org.openmrs.module.reporting.cohort.definition.SqlCohortDefinition; import org.openmrs.module.reporting.cohort.definition.service.CohortDefinitionService; import org.openmrs.module.reporting.cohort.query.service.CohortQueryService; import org.openmrs.module.reporting.evaluation.parameter.Parameter; import org.openmrs.web.WebConstants; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.context.request.WebRequest; @Controller public class SqlCohortDefinitionController { @RequestMapping("/module/reporting/cohorts/sqlCohortDefinition") public void showForm(ModelMap model, @RequestParam(value="uuid", required=false) String uuid, @RequestParam(value="copyFromUuid", required=false) String copyFromUuid) { if (uuid == null) { SqlCohortDefinition sqlCohortDefinition = new SqlCohortDefinition("SELECT patient_id FROM patient WHERE patient.voided = false"); model.addAttribute("definition", sqlCohortDefinition); } else { CohortDefinition def = Context.getService(CohortDefinitionService.class).getDefinitionByUuid(uuid); if (def instanceof SqlCohortDefinition) { SqlCohortDefinition definition = (SqlCohortDefinition) def; model.addAttribute("definition", definition); } else { throw new RuntimeException("This definition is not of the right class"); } } } @RequestMapping("/module/reporting/cohorts/sqlCohortDefinitionAssignQueryString") public String saveQueryString( HttpSession httpSession, WebRequest webRequest, @RequestParam("uuid") String uuid, @RequestParam("queryString") String queryString) { CohortDefinition def = Context.getService(CohortDefinitionService.class).getDefinitionByUuid(uuid); SqlCohortDefinition definition = (SqlCohortDefinition) def; definition.setQuery(queryString); // Add all new named parameters to the definition before saving. List<Parameter> parameters = Context.getService(CohortQueryService.class).getNamedParameters(queryString); for (Parameter parameter : parameters) { if (definition.getParameter(parameter.getName()) == null) definition.addParameter(parameter); } // Save the sql cohort definition Context.getService(CohortDefinitionService.class).saveDefinition(definition); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "reporting.SqlCohortDefinition.saved"); httpSession.setAttribute(WebConstants.OPENMRS_MSG_ARGS, queryString); return "redirect:sqlCohortDefinition.form?uuid=" + uuid; } /** * Copies the SQL cohort definition with the given uuid into another one with the same * parameters and searches, but blank name/description and SQL string */ @RequestMapping("/module/reporting/cohorts/sqlCohortDefinitionClone") public String cloneDefinition(WebRequest request, @RequestParam("name") String name, @RequestParam(value="description", required=false) String description, @RequestParam("copyFromUuid") String copyFromUuid) { CohortDefinition def = Context.getService(CohortDefinitionService.class).getDefinitionByUuid(copyFromUuid); SqlCohortDefinition from = (SqlCohortDefinition) def; SqlCohortDefinition clone = new SqlCohortDefinition(); clone.setId(null); clone.setUuid(null); clone.setName(name); clone.setDescription(description); clone.setParameters(from.getParameters()); clone.setQuery(from.getQuery()); Context.getService(CohortDefinitionService.class).saveDefinition(clone); request.setAttribute(WebConstants.OPENMRS_MSG_ATTR, "Saved as a new copy", WebRequest.SCOPE_SESSION); return "redirect:sqlCohortDefinition.form?uuid=" + clone.getUuid(); } }