} else if (!(crit instanceof IsNullCriteria)) {
return FALSE_CRITERIA;
}
}
} else if (converted instanceof SetCriteria) {
SetCriteria sc = (SetCriteria)converted;
Criteria crit = exprMap.get(sc.getExpression());
if (crit instanceof IsNullCriteria) {
return FALSE_CRITERIA;
}
if (!sc.isNegated() && sc.isAllConstants()) {
if (crit == null) {
exprMap.put(sc.getExpression(), converted);
} else if (crit instanceof SetCriteria) {
SetCriteria sc1 = (SetCriteria)crit;
newCrits.remove(sc1);
sc1.getValues().retainAll(sc.getValues());
if (sc1.getValues().isEmpty()) {
return FALSE_CRITERIA;
}
//TODO: single value as compare criteria
newCrits.add(sc1);
exprMap.put(sc1.getExpression(), sc1);
return null;
} else {
CompareCriteria cc = (CompareCriteria)crit;
for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
exprIter.remove();
}
}
if (sc.getValues().isEmpty()) {
return FALSE_CRITERIA;
}
if (cc.getOperator() != CompareCriteria.EQ) {
newCrits.remove(cc);
//TODO: single value as compare criteria
exprMap.put(sc.getExpression(), sc);
} else {
return null;
}
}
}
} else if (converted instanceof CompareCriteria) {
CompareCriteria cc = (CompareCriteria)converted;
Criteria crit = exprMap.get(cc.getLeftExpression());
if (crit instanceof IsNullCriteria) {
return FALSE_CRITERIA;
}
if (cc.getRightExpression() instanceof Constant) {
if (crit == null) {
exprMap.put(cc.getLeftExpression(), cc);
} else if (crit instanceof SetCriteria) {
SetCriteria sc = (SetCriteria)crit;
boolean modified = false;
for (Iterator<Constant> exprIter = sc.getValues().iterator(); exprIter.hasNext();) {
if (!Evaluator.compare(cc, exprIter.next().getValue(), ((Constant)cc.getRightExpression()).getValue())) {
if (!modified) {
modified = true;
newCrits.remove(sc);
}
exprIter.remove();
}
}
//TODO: single value as compare criteria
if (sc.getValues().isEmpty()) {
return FALSE_CRITERIA;
}
if (cc.getOperator() == CompareCriteria.EQ) {
exprMap.put(cc.getLeftExpression(), cc);
} else if (modified) {
newCrits.add(sc);
exprMap.put(sc.getExpression(), sc);
return null;
}
} else {
CompareCriteria cc1 = (CompareCriteria)crit;
if (cc1.getOperator() == CompareCriteria.NE) {