public static boolean eval(CQLNode vn1, CQLTermNode tn, Comparator<CQLTermNode> cmp) {
if (vn1 instanceof CQLBooleanNode) {
CQLBooleanNode n1 = (CQLBooleanNode) vn1;
switch (n1.getOperator()) {
case AND:
case PROX:
return eval(n1.getLeftOperand(), tn, cmp) && eval(n1.getRightOperand(), tn, cmp);
case OR:
return eval(n1.getLeftOperand(), tn, cmp) || eval(n1.getRightOperand(), tn, cmp);
case NOT:
return eval(n1.getLeftOperand(), tn, cmp);
default:
throw new IllegalArgumentException("unknown operator for CQLBooleanNode: " + n1.getOperator());
}
} else if (vn1 instanceof CQLTermNode) {
CQLTermNode n1 = (CQLTermNode) vn1;
return cmp.compare(n1, tn) == 0;
} else if (vn1 instanceof CQLSortNode) {
CQLSortNode n1 = (CQLSortNode) vn1;
return eval(n1.getSubtree(), tn, cmp);
} else if (vn1 instanceof CQLPrefixNode) {
CQLPrefixNode n1 = (CQLPrefixNode) vn1;
return eval(n1.getSubtree(), tn, cmp);
} else {
throw new IllegalArgumentException("unknown type for CQLNode: " + vn1.toString());
}
}