}
if (right instanceof Literal) {
String value = ((Literal)right).getValue();
where.propertyValue(tableName, propertyName).is(operator, value);
} else if (right instanceof FunctionCall) {
FunctionCall call = (FunctionCall)right;
NameTest functionName = call.getName();
List<Component> parameters = call.getParameters();
// Is this a cast ...
String castType = CAST_FUNCTION_NAME_TO_TYPE.get(functionName);
if (castType != null) {
if (parameters.size() == 1 && parameters.get(0).collapse() instanceof Literal) {
// The first parameter can be the type name (or table name) ...
Literal value = (Literal)parameters.get(0).collapse();
where.propertyValue(tableName, propertyName).is(operator).cast(value.getValue()).as(castType);
} else {
throw new InvalidQueryException(query, "A cast function requires one literal parameter; therefore '"
+ comparison + "' is not valid");
}
} else {
throw new InvalidQueryException(query,
"Only the 'jcr:score' function is allowed in a comparison predicate; therefore '"
+ comparison + "' is not valid");
}
}
} else if (left instanceof FunctionCall && right instanceof Literal) {
FunctionCall call = (FunctionCall)left;
NameTest functionName = call.getName();
List<Component> parameters = call.getParameters();
String value = ((Literal)right).getValue();
if (functionName.matches("jcr", "score")) {
String scoreTableName = tableName;
if (parameters.isEmpty()) {
scoreTableName = tableName;
} else if (parameters.size() == 1 && parameters.get(0) instanceof NameTest) {
// The first parameter can be the type name (or table name) ...
NameTest name = (NameTest)parameters.get(0);
if (!name.isWildcard()) scoreTableName = nameFrom(name);
} else {
throw new InvalidQueryException(query,
"The 'jcr:score' function may have no parameters or the type name as the only parameter.");
}
where.fullTextSearchScore(scoreTableName).is(operator, value);
} else if (functionName.matches("fn", "name")) {
where.nodeName(tableName);
} else {
throw new InvalidQueryException(query,
"Only the 'jcr:score' function is allowed in a comparison predicate; therefore '"
+ comparison + "' is not valid");
}
}
} else if (predicate instanceof FunctionCall) {
FunctionCall call = (FunctionCall)predicate;
NameTest functionName = call.getName();
List<Component> parameters = call.getParameters();
Component param1 = parameters.size() > 0 ? parameters.get(0) : null;
Component param2 = parameters.size() > 1 ? parameters.get(1) : null;
if (functionName.matches(null, "not")) {
if (parameters.size() != 1) {
throw new InvalidQueryException(query, "The 'not' function requires one parameter; therefore '" + predicate