in oak-core/src/main/java/org/apache/jackrabbit/oak/query/xpath/XPathToSQL2Converter.java [734:843]
private Expression parseFunction(String functionName) throws ParseException {
if ("jcr:like".equals(functionName)) {
Expression.Condition c = new Expression.Condition(parseExpression(),
"like", null, Expression.PRECEDENCE_CONDITION);
read(",");
c.right = parseExpression();
read(")");
return c;
} else if ("jcr:contains".equals(functionName)) {
Expression left = parseExpression();
read(",");
Expression right = parseExpression();
read(")");
Expression.Contains f = new Expression.Contains(left, right);
return f;
} else if ("jcr:score".equals(functionName)) {
Expression.Function f = new Expression.Function("score");
f.params.add(new Expression.SelectorExpr(currentSelector));
read(")");
return f;
} else if ("xs:dateTime".equals(functionName)) {
Expression expr = parseExpression();
Expression.Cast c = new Expression.Cast(expr, "date");
read(")");
return c;
} else if ("fn:coalesce".equals(functionName)) {
Expression.Function f = new Expression.Function("coalesce");
f.params.add(parseExpression());
read(",");
f.params.add(parseExpression());
read(")");
return f;
} else if ("jcr:first".equals(functionName)) {
Expression.Function f = new Expression.Function("first");
f.params.add(parseExpression());
read(")");
return f;
} else if ("fn:lower-case".equals(functionName)) {
Expression.Function f = new Expression.Function("lower");
f.params.add(parseExpression());
read(")");
return f;
} else if ("fn:upper-case".equals(functionName)) {
Expression.Function f = new Expression.Function("upper");
f.params.add(parseExpression());
read(")");
return f;
} else if ("fn:string-length".equals(functionName)) {
Expression.Function f = new Expression.Function("length");
f.params.add(parseExpression());
read(")");
return f;
} else if ("fn:name".equals(functionName)) {
Expression.Function f = new Expression.Function("name");
if (!readIf(")")) {
// only name(.) and name() are currently supported
read(".");
read(")");
}
f.params.add(new Expression.SelectorExpr(currentSelector));
return f;
} else if ("fn:path".equals(functionName)) {
Expression.Function f = new Expression.Function("path");
if (!readIf(")")) {
// only path(.) and path() are currently supported
read(".");
read(")");
}
f.params.add(new Expression.SelectorExpr(currentSelector));
return f;
} else if ("fn:local-name".equals(functionName)) {
Expression.Function f = new Expression.Function("localname");
if (!readIf(")")) {
// only localname(.) and localname() are currently supported
read(".");
read(")");
}
f.params.add(new Expression.SelectorExpr(currentSelector));
return f;
} else if ("jcr:deref".equals(functionName)) {
// TODO maybe support jcr:deref
throw getSyntaxError("jcr:deref is not supported");
} else if ("rep:native".equals(functionName)) {
String selectorName = currentSelector.name;
Expression language = parseExpression();
read(",");
Expression expr = parseExpression();
read(")");
Expression.NativeFunction f = new Expression.NativeFunction(selectorName, language, expr);
return f;
} else if ("rep:similar".equals(functionName)) {
Expression property = parseExpression();
read(",");
Expression path = parseExpression();
read(")");
Expression.Similar f = new Expression.Similar(property, path);
return f;
} else if ("rep:spellcheck".equals(functionName)) {
Expression term = parseExpression();
read(")");
return new Expression.Spellcheck(term);
} else if ("rep:suggest".equals(functionName)) {
Expression term = parseExpression();
read(")");
return new Expression.Suggest(term);
} else {
throw getSyntaxError("jcr:like | jcr:contains | jcr:score | xs:dateTime | " +
"fn:lower-case | fn:upper-case | jcr:first | fn:name | fn:local-name | fn:path | rep:similar | rep:spellcheck | rep:suggest");
}
}