package edu.ualberta.med.biobank.common.reports.filters.types;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Conjunction;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.Restrictions;
import edu.ualberta.med.biobank.common.reports.ReportsUtil;
import edu.ualberta.med.biobank.common.reports.filters.FilterOperator;
import edu.ualberta.med.biobank.common.reports.filters.FilterType;
import edu.ualberta.med.biobank.model.ReportFilterValue;
public class StringFilterType implements FilterType {
@Override
public void addCriteria(Criteria criteria, String aliasedProperty,
FilterOperator op, List<ReportFilterValue> values) {
switch (op) {
case IS_SET: {
FilterTypeUtil.checkValues(values, 0, 0);
criteria.add(Restrictions.isNotNull(aliasedProperty));
}
break;
case IS_NOT_SET: {
FilterTypeUtil.checkValues(values, 0, 0);
criteria.add(ReportsUtil.isNotSet(aliasedProperty));
}
break;
case MATCHES:
FilterTypeUtil.checkValues(values, 0, 1);
for (ReportFilterValue value : values) {
criteria.add(Restrictions.like(aliasedProperty,
value.getValue()));
break;
}
break;
case MATCHES_ANY: {
Disjunction or = Restrictions.disjunction();
for (ReportFilterValue value : values) {
or.add(Restrictions.like(aliasedProperty, value.getValue()));
}
criteria.add(or);
}
break;
case MATCHES_ALL:
for (ReportFilterValue value : values) {
criteria.add(Restrictions.like(aliasedProperty,
value.getValue()));
}
break;
case DOES_NOT_MATCH: {
FilterTypeUtil.checkValues(values, 0, 1);
Disjunction or = ReportsUtil.idIsNullOr(aliasedProperty);
for (ReportFilterValue value : values) {
or.add(Restrictions.not(Restrictions.like(aliasedProperty,
value.getValue())));
break;
}
criteria.add(or);
}
break;
case DOES_NOT_MATCH_ANY: {
Disjunction or = ReportsUtil.idIsNullOr(aliasedProperty);
Conjunction and = Restrictions.conjunction();
for (ReportFilterValue value : values) {
and.add(Restrictions.not(Restrictions.like(aliasedProperty,
value.getValue())));
}
or.add(and);
criteria.add(or);
}
break;
}
}
@Override
public Collection<FilterOperator> getOperators() {
return Arrays.asList(FilterOperator.MATCHES,
FilterOperator.MATCHES_ANY, FilterOperator.MATCHES_ALL,
FilterOperator.IS_SET, FilterOperator.IS_NOT_SET,
FilterOperator.DOES_NOT_MATCH, FilterOperator.DOES_NOT_MATCH_ANY);
}
}