* @param filters
*/
private void internalCreateWhereFragment(InternalStringBuilder sql, List/*<Filter>*/ filters) {
for(int i = 0; i < filters.size(); i++) {
Filter filter = (Filter)filters.get(i);
if(filter == null)
continue;
FilterOperation fOp = filter.getOperation();
FilterOperationHint fOpHint = null;
String fExpr = filter.getFilterExpression();
if(fOp == null && filter.getOperationHint() != null) {
fOpHint = filter.getOperationHint();
fOp = mapFilterHintToOperation(fOpHint);
}
else {
fOpHint = filter.getOperation().getOperationHint();
}
if(fOp == null) {
String message = Bundle.getErrorString("DataGridFilter_NoFilterOperation", new Object[]{filter.getFilterExpression()});
LOGGER.error(message);
throw new IllegalFilterException(message);
}
/* todo: feature. pluggable conjunctions AND and OR here */
if(i > 0)
sql.append(" AND ");
if(filter.getValue() == null) {
if(fOpHint == FilterOperationHint.EQUAL) {
sql.append("(");
sql.append(fExpr);
sql.append(" IS NULL)");
}
else if(fOpHint == FilterOperationHint.NOT_EQUAL) {
sql.append("(");
sql.append(fExpr);
sql.append(" IS NOT NULL)");
}
}
switch(fOpHint.getValue()) {
case FilterOperationHint.INT_STARTS_WITH:
case FilterOperationHint.INT_CONTAINS:
{
boolean bEscape = _config.getSupportsLikeEscapeClause();
String strValue = bEscape ? convertSQLPattern(filter.getValue()) : filter.getValue().toString();
strValue = convertSQLString(strValue);
sql.append("(").append(fExpr).append(" LIKE '");
if(fOpHint == FilterOperationHint.CONTAINS)
sql.append("%");
sql.append(strValue).append("%'");
if(bEscape)
sql.append(" ESCAPE '\\'");
sql.append(')');
break;
}
case FilterOperationHint.INT_IS_NOT_EMPTY:
{
sql.append("(").append(fExpr).append(" IS NOT NULL)");
break;
}
case FilterOperationHint.INT_IS_EMPTY:
{
sql.append("(").append(fExpr).append(" IS NULL)");
break;
}
case FilterOperationHint.INT_EQUAL:
case FilterOperationHint.INT_LESS_THAN:
case FilterOperationHint.INT_LESS_THAN_OR_EQUAL:
case FilterOperationHint.INT_GREATER_THAN:
case FilterOperationHint.INT_GREATER_THAN_OR_EQUAL:
case FilterOperationHint.INT_NOT_EQUAL:
{
/* todo: conider using SQLFragment from the DatabaseControl here. */
sql.append("(");
sql.append(fExpr);
sql.append(lookupOperator(fOpHint));
addParameter(sql, filter.getValue(), filter.getTypeHint());
if(fOpHint == FilterOperationHint.NOT_EQUAL) {
sql.append(" OR ");
sql.append(fExpr);
sql.append(" IS NULL");
}
sql.append(")");
break;
}
case FilterOperationHint.INT_IS_ONE_OF:
{
Object[] arr;
if(filter.getValue().getClass().isArray())
arr = (Object[])filter.getValue();
else
arr = new Object[]{filter.getValue()};
if(arr.length == 0)
break;
sql.append("(");
sql.append(fExpr);
sql.append(" IN (");
String comma = "";
for(int j = 0; j < arr.length; j++) {
sql.append(comma);
/* todo: date handling. probably some type normalization required here */
addParameter(sql, arr[i], filter.getTypeHint());
comma = ",";
}
sql.append("))");
break;
}