/**
* The contents of this file are subject to the OpenMRS Public License
* Version 1.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://license.openmrs.org
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* Copyright (C) OpenMRS, LLC. All Rights Reserved.
*/
package org.openmrs.reporting;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openmrs.Cohort;
import org.openmrs.Concept;
import org.openmrs.Drug;
import org.openmrs.api.PatientSetService;
import org.openmrs.api.PatientSetService.GroupMethod;
import org.openmrs.api.context.Context;
import org.openmrs.report.EvaluationContext;
import org.openmrs.util.OpenmrsUtil;
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public class DrugOrderFilter extends CachingPatientFilter {
private static final long serialVersionUID = 1L;
protected final Log log = LogFactory.getLog(getClass());
private List<Drug> drugList;
private List<Concept> drugSets;
private PatientSetService.GroupMethod anyOrAll;
private Integer withinLastDays;
private Integer withinLastMonths;
private Integer untilDaysAgo;
private Integer untilMonthsAgo;
private Date sinceDate;
private Date untilDate;
public DrugOrderFilter() {
super.setType("Patient Filter");
super.setSubType("Drug Order Filter");
}
@Override
public String getCacheKey() {
StringBuilder sb = new StringBuilder();
sb.append(getClass().getName()).append(".");
sb.append(getAnyOrAll()).append(".");
sb.append(
OpenmrsUtil.fromDateHelper(null, withinLastDays, withinLastMonths, untilDaysAgo, untilMonthsAgo, sinceDate,
untilDate)).append(".");
sb.append(
OpenmrsUtil.toDateHelper(null, withinLastDays, withinLastMonths, untilDaysAgo, untilMonthsAgo, sinceDate,
untilDate)).append(".");
if (getDrugListToUse() != null)
for (Drug d : getDrugListToUse())
sb.append(d.getDrugId()).append(",");
return sb.toString();
}
public String getDescription() {
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Context.getLocale());
StringBuffer ret = new StringBuffer();
boolean currentlyCase = getWithinLastDays() != null && getWithinLastDays() == 0
&& (getWithinLastMonths() == null || getWithinLastMonths() == 0);
if (currentlyCase)
ret.append("Patients currently ");
else
ret.append("Patients ");
if (getDrugListToUse() == null || getDrugListToUse().size() == 0) {
if (getAnyOrAll() == GroupMethod.NONE)
ret.append(currentlyCase ? "taking no drugs" : "who never took any drugs");
else
ret.append(currentlyCase ? "taking any drugs" : "ever taking any drugs");
} else {
if (getDrugListToUse().size() == 1) {
if (getAnyOrAll() == GroupMethod.NONE)
ret.append("not taking ");
else
ret.append("taking ");
ret.append(getDrugListToUse().get(0).getName());
} else {
ret.append("taking " + getAnyOrAll() + " of [");
for (Iterator<Drug> i = getDrugListToUse().iterator(); i.hasNext();) {
ret.append(i.next().getName());
if (i.hasNext())
ret.append(" , ");
}
ret.append("]");
}
}
if (!currentlyCase)
if (getWithinLastDays() != null || getWithinLastMonths() != null) {
ret.append(" withing the last");
if (getWithinLastMonths() != null)
ret.append(" " + getWithinLastMonths() + " months");
if (getWithinLastDays() != null)
ret.append(" " + getWithinLastDays() + " days");
}
if (getSinceDate() != null)
ret.append(" since " + df.format(getSinceDate()));
if (getUntilDate() != null)
ret.append(" until " + df.format(getUntilDate()));
return ret.toString();
}
@Override
public Cohort filterImpl(EvaluationContext context) {
List<Integer> drugIds = new ArrayList<Integer>();
if (getDrugListToUse() != null)
for (Drug d : getDrugListToUse())
drugIds.add(d.getDrugId());
log.debug("filtering with these ids " + drugIds);
Collection<Integer> patientIds = context == null ? null : context.getBaseCohort().getMemberIds();
return Context.getPatientSetService().getPatientsHavingDrugOrder(
patientIds,
drugIds,
getAnyOrAll(),
OpenmrsUtil.fromDateHelper(null, getWithinLastDays(), getWithinLastMonths(), getUntilDaysAgo(),
getUntilMonthsAgo(), getSinceDate(), getUntilDate()),
OpenmrsUtil.toDateHelper(null, getWithinLastDays(), getWithinLastMonths(), getUntilDaysAgo(),
getUntilMonthsAgo(), getSinceDate(), getUntilDate()));
}
public boolean isReadyToRun() {
return true;
}
public List<Drug> getDrugListToUse() {
List<Drug> drugList = getDrugList();
List<Concept> drugSets = getDrugSets();
if (drugList == null && drugSets == null)
return null;
List<Drug> ret = new ArrayList<Drug>();
if (drugList != null)
ret.addAll(drugList);
if (drugSets != null) {
Set<Concept> generics = new HashSet<Concept>();
for (Concept drugSet : drugSets) {
List<Concept> list = Context.getConceptService().getConceptsByConceptSet(drugSet);
generics.addAll(list);
}
for (Concept generic : generics) {
ret.addAll(Context.getConceptService().getDrugsByConcept(generic));
}
}
return ret;
}
// getters and setters
public PatientSetService.GroupMethod getAnyOrAll() {
return anyOrAll;
}
public void setAnyOrAll(PatientSetService.GroupMethod anyOrAll) {
this.anyOrAll = anyOrAll;
}
public List<Drug> getDrugList() {
return drugList;
}
public void setDrugList(List<Drug> drugList) {
this.drugList = drugList;
}
public Date getSinceDate() {
return sinceDate;
}
public void setSinceDate(Date sinceDate) {
this.sinceDate = sinceDate;
}
public Date getUntilDate() {
return untilDate;
}
public void setUntilDate(Date untilDate) {
this.untilDate = untilDate;
}
public Integer getUntilDaysAgo() {
return untilDaysAgo;
}
public void setUntilDaysAgo(Integer untilDaysAgo) {
this.untilDaysAgo = untilDaysAgo;
}
public Integer getUntilMonthsAgo() {
return untilMonthsAgo;
}
public void setUntilMonthsAgo(Integer untilMonthsAgo) {
this.untilMonthsAgo = untilMonthsAgo;
}
public Integer getWithinLastDays() {
return withinLastDays;
}
public void setWithinLastDays(Integer withinLastDays) {
this.withinLastDays = withinLastDays;
}
public Integer getWithinLastMonths() {
return withinLastMonths;
}
public void setWithinLastMonths(Integer withinLastMonths) {
this.withinLastMonths = withinLastMonths;
}
public List<Concept> getDrugSets() {
return drugSets;
}
public void setDrugSets(List<Concept> drugSets) {
this.drugSets = drugSets;
}
}