WhereClauseExpression whereClausePart,
boolean ignoreCase,
Adapter adapter)
throws TorqueException
{
PreparedStatementPart result = new PreparedStatementPart();
// Handle SqlEnum.Custom
if (SqlEnum.CUSTOM == whereClausePart.getOperator())
{
result.getSql().append(whereClausePart.getRValue());
return result;
}
// Handle SqlEnum.CURRENT_DATE and SqlEnum.CURRENT_TIME
if (whereClausePart.getRValue() instanceof SqlEnum)
{
result.getSql().append(whereClausePart.getLValue())
.append(whereClausePart.getOperator())
.append(whereClausePart.getRValue());
return result;
}
// If rValue is an ObjectKey, take the value of that ObjectKey.
if (whereClausePart.getRValue() instanceof ObjectKey)
{
whereClausePart.setRValue(
((ObjectKey) whereClausePart.getRValue()).getValue());
}
/* If rValue is null, check to see if the operator
* is an =, <>, or !=. If so, replace the comparison
* with SqlEnum.ISNULL or SqlEnum.ISNOTNULL.
*/
if (whereClausePart.getRValue() == null)
{
if (whereClausePart.getOperator().equals(SqlEnum.EQUAL))
{
result.getSql().append(whereClausePart.getLValue())
.append(SqlEnum.ISNULL);
return result;
}
if (whereClausePart.getOperator().equals(SqlEnum.NOT_EQUAL)
|| whereClausePart.getOperator().equals(
SqlEnum.ALT_NOT_EQUAL))
{
result.getSql().append(whereClausePart.getLValue())
.append(SqlEnum.ISNOTNULL);
return result;
}
}
// Handle SqlEnum.ISNULL and SqlEnum.ISNOTNULL
if (whereClausePart.getOperator().equals(SqlEnum.ISNULL)
|| whereClausePart.getOperator().equals(SqlEnum.ISNOTNULL))
{
result.getSql().append(whereClausePart.getLValue())
.append(whereClausePart.getOperator());
return result;
}
// handle Subqueries
if (whereClausePart.getRValue() instanceof Criteria)
{
Query subquery = SqlBuilder.buildQuery(
(Criteria) whereClausePart.getRValue());
result.getPreparedStatementReplacements().addAll(
subquery.getPreparedStatementReplacements());
result.getSql().append(whereClausePart.getLValue())
.append(whereClausePart.getOperator())
.append("(").append(subquery.toString()).append(")");
return result;
}
if (whereClausePart.getRValue()
instanceof org.apache.torque.util.Criteria)
{
Query subquery = SqlBuilder.buildQuery(
(org.apache.torque.util.Criteria)
whereClausePart.getRValue());
result.getPreparedStatementReplacements().addAll(
subquery.getPreparedStatementReplacements());
result.getSql().append(whereClausePart.getLValue())
.append(whereClausePart.getOperator())
.append("(").append(subquery.toString()).append(")");
return result;
}
// handle LIKE and similar
if (whereClausePart.getOperator().equals(Criteria.LIKE)
|| whereClausePart.getOperator().equals(Criteria.NOT_LIKE)
|| whereClausePart.getOperator().equals(Criteria.ILIKE)
|| whereClausePart.getOperator().equals(Criteria.NOT_ILIKE))
{
return buildPsLike(whereClausePart, ignoreCase, adapter);
}
// handle IN and similar
if (whereClausePart.getOperator().equals(Criteria.IN)
|| whereClausePart.getOperator().equals(Criteria.NOT_IN))
{
return buildPsIn(whereClausePart, ignoreCase, adapter);
}
// Standard case
result.getPreparedStatementReplacements().add(
whereClausePart.getRValue());
if (ignoreCase
&& whereClausePart.getRValue() instanceof String)
{
result.getSql().append(
adapter.ignoreCase((String) whereClausePart.getLValue()))
.append(whereClausePart.getOperator())
.append(adapter.ignoreCase("?"));
}
else
{
result.getSql().append(whereClausePart.getLValue())
.append(whereClausePart.getOperator())
.append("?");
}
return result;
}