* @param queryFilter The query filter.
*
* @return The sql query WHERE clause as a StrBuilder.
*/
private static StrBuilder buildWhereClauseRecursively(QueryFilter queryFilter) {
StrBuilder whereClause = new StrBuilder();
// Base case of the recursion: the filter is not a compound filter.
if (queryFilter instanceof ColumnIsNullFilter) {
buildWhereClauseForIsNullFilter(whereClause, queryFilter);
} else if (queryFilter instanceof ComparisonFilter) {
buildWhereCluaseForComparisonFilter(whereClause, queryFilter);
} else if (queryFilter instanceof NegationFilter) {
whereClause.append("(NOT ");
whereClause.append(buildWhereClauseRecursively(
((NegationFilter) queryFilter).getSubFilter()));
whereClause.append(")");
} else {
// queryFilter is a CompoundFilter.
CompoundFilter compoundFilter = (CompoundFilter) queryFilter;
int numberOfSubFilters = compoundFilter.getSubFilters().size();
// If the compound filter is empty, build a where clause according to the
// logical operator: nothing AND nothing -> WHERE "true", nothing OR
// nothing -> WHERE "false" (match the query language rules).
if (numberOfSubFilters == 0) {
if (compoundFilter.getOperator() == CompoundFilter.LogicalOperator.AND) {
whereClause.append("true");
} else {// OR
whereClause.append("false");
}
} else {
List<String> filterComponents = Lists.newArrayList();
for (QueryFilter filter : compoundFilter.getSubFilters()) {
filterComponents.add(buildWhereClauseRecursively(filter).toString());
}
String logicalOperator = getSqlLogicalOperator(compoundFilter.getOperator());
whereClause.append("(").appendWithSeparators(filterComponents, " " + logicalOperator + " ")
.append(")");
}
}
return whereClause;
}