/**
* 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.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.api.PatientSetService.BooleanOperator;
import org.openmrs.report.EvaluationContext;
/**
* @deprecated see reportingcompatibility module
*/
@Deprecated
public class CompoundPatientFilter extends AbstractPatientFilter implements PatientFilter {
protected static final Log log = LogFactory.getLog(CompoundPatientFilter.class);
private BooleanOperator operator;
private List<PatientFilter> filters;
public CompoundPatientFilter() {
}
public CompoundPatientFilter(BooleanOperator operator, List<PatientFilter> filters) {
this.operator = operator;
this.filters = filters;
}
public List<PatientFilter> getFilters() {
return filters;
}
public void setFilters(List<PatientFilter> filters) {
this.filters = filters;
}
public BooleanOperator getOperator() {
return operator;
}
public void setOperator(BooleanOperator operator) {
this.operator = operator;
}
public Cohort filter(Cohort input, EvaluationContext context) {
if (operator == BooleanOperator.AND) {
Cohort temp = input;
for (PatientFilter pf : filters) {
temp = pf.filter(temp, context);
}
return temp;
} else {
Set<Integer> ptIds = new HashSet<Integer>();
for (PatientFilter pf : filters) {
ptIds.addAll(pf.filter(input, context).getMemberIds());
log.debug("or " + pf.getName() + " (" + pf.toString() + ")");
}
Cohort ret = new Cohort();
ret.setMemberIds(ptIds);
return ret;
}
}
public Cohort filterInverse(Cohort input, EvaluationContext context) {
if (operator == BooleanOperator.AND) {
// NOT(AND(x, y)) -> OR(NOT x, NOT y)
Set<Integer> ptIds = new HashSet<Integer>();
for (PatientFilter pf : filters)
ptIds.addAll(pf.filterInverse(input, context).getMemberIds());
Cohort ret = new Cohort();
ret.setMemberIds(ptIds);
return ret;
} else {
// NOT(OR(x, y)) -> AND(NOT x, NOT y)
Cohort temp = input;
for (PatientFilter pf : filters) {
temp = pf.filterInverse(temp, context);
}
return temp;
}
}
public String getDescription() {
if (super.getDescription() != null)
return super.getDescription();
else {
StringBuilder ret = new StringBuilder();
for (Iterator<PatientFilter> i = filters.iterator(); i.hasNext();) {
PatientFilter pf = i.next();
ret.append("[").append(pf.getName() == null ? pf.getDescription() : pf.getName()).append("]");
if (i.hasNext())
ret.append(" " + operator + " ");
}
return ret.toString();
}
}
public boolean isReadyToRun() {
return operator != null && filters != null;
}
}