in aws-datastore/src/main/java/com/amplifyframework/datastore/storage/sqlite/adapter/SQLPredicate.java [136:216]
private StringBuilder parsePredicateOperation(QueryPredicateOperation<?> operation) throws DataStoreException {
final StringBuilder builder = new StringBuilder();
final String model = Wrap.inBackticks(operation.modelName());
final String field = Wrap.inBackticks(operation.field());
final String column = model == null ? operation.field() : model + "." + field;
final QueryOperator<?> op = operation.operator();
switch (op.type()) {
case BETWEEN:
BetweenQueryOperator<?> betweenOp = (BetweenQueryOperator<?>) op;
addBinding(betweenOp.start());
addBinding(betweenOp.end());
return builder.append(column)
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.BETWEEN)
.append(SqlKeyword.DELIMITER)
.append("?")
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.AND)
.append(SqlKeyword.DELIMITER)
.append("?");
case CONTAINS:
ContainsQueryOperator containsOp = (ContainsQueryOperator) op;
addBinding(containsOp.value());
return builder.append("instr(")
.append(column)
.append(",")
.append("?")
.append(")")
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.fromQueryOperator(QueryOperator.Type.GREATER_THAN))
.append(SqlKeyword.DELIMITER)
.append("0");
case NOT_CONTAINS:
NotContainsQueryOperator notContainsOp = (NotContainsQueryOperator) op;
addBinding(notContainsOp.value());
return builder.append("instr(")
.append(column)
.append(",")
.append("?")
.append(")")
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.fromQueryOperator(QueryOperator.Type.EQUAL))
.append(SqlKeyword.DELIMITER)
.append("0");
case BEGINS_WITH:
BeginsWithQueryOperator beginsWithOp = (BeginsWithQueryOperator) op;
addBinding(beginsWithOp.value() + "%");
return builder.append(column)
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.LIKE)
.append(SqlKeyword.DELIMITER)
.append("?");
case EQUAL:
case NOT_EQUAL:
Object operatorValue = getOperatorValue(op);
if (operatorValue == null) {
SqlKeyword sqlNullCheck =
op.type() == QueryOperator.Type.EQUAL ? SqlKeyword.IS_NULL : SqlKeyword.IS_NOT_NULL;
return builder.append(column)
.append(SqlKeyword.DELIMITER)
.append(sqlNullCheck.toString());
}
case LESS_THAN:
case GREATER_THAN:
case LESS_OR_EQUAL:
case GREATER_OR_EQUAL:
addBinding(getOperatorValue(op));
return builder.append(column)
.append(SqlKeyword.DELIMITER)
.append(SqlKeyword.fromQueryOperator(op.type()))
.append(SqlKeyword.DELIMITER)
.append("?");
default:
throw new DataStoreException(
"Tried to parse an unsupported QueryPredicateOperation",
"Try changing to one of the supported values from " +
"QueryPredicateOperation.Type enum."
);
}
}