in lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java [500:676]
private List<Expression> parseMethodParameters(final MethodKind methodKind)
throws UriParserException, UriValidationException {
List<Expression> parameters = new ArrayList<>();
switch (methodKind) {
// Must have no parameter.
case NOW:
case MAXDATETIME:
case MINDATETIME:
ParserHelper.bws(tokenizer);
break;
// Must have one parameter.
case LENGTH:
case TOLOWER:
case TOUPPER:
case TRIM:
ParserHelper.bws(tokenizer);
final Expression stringParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(stringParameter, EdmPrimitiveTypeKind.String);
checkNoCollection(stringParameter);
parameters.add(stringParameter);
break;
case YEAR:
case MONTH:
case DAY:
ParserHelper.bws(tokenizer);
final Expression dateParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(dateParameter, EdmPrimitiveTypeKind.Date, EdmPrimitiveTypeKind.DateTimeOffset);
checkNoCollection(dateParameter);
parameters.add(dateParameter);
break;
case HOUR:
case MINUTE:
case SECOND:
case FRACTIONALSECONDS:
ParserHelper.bws(tokenizer);
final Expression timeParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(timeParameter, EdmPrimitiveTypeKind.TimeOfDay, EdmPrimitiveTypeKind.DateTimeOffset);
checkNoCollection(timeParameter);
parameters.add(timeParameter);
break;
case DATE:
case TIME:
case TOTALOFFSETMINUTES:
ParserHelper.bws(tokenizer);
final Expression dateTimeParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(dateTimeParameter, EdmPrimitiveTypeKind.DateTimeOffset);
checkNoCollection(dateTimeParameter);
parameters.add(dateTimeParameter);
break;
case TOTALSECONDS:
ParserHelper.bws(tokenizer);
final Expression durationParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(durationParameter, EdmPrimitiveTypeKind.Duration);
checkNoCollection(durationParameter);
parameters.add(durationParameter);
break;
case ROUND:
case FLOOR:
case CEILING:
ParserHelper.bws(tokenizer);
final Expression decimalParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(decimalParameter,
EdmPrimitiveTypeKind.Decimal, EdmPrimitiveTypeKind.Single, EdmPrimitiveTypeKind.Double);
checkNoCollection(decimalParameter);
parameters.add(decimalParameter);
break;
case GEOLENGTH:
ParserHelper.bws(tokenizer);
final Expression geoParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(geoParameter,
EdmPrimitiveTypeKind.GeographyLineString, EdmPrimitiveTypeKind.GeometryLineString);
checkNoCollection(geoParameter);
parameters.add(geoParameter);
break;
// Must have two parameters.
case CONTAINS:
case ENDSWITH:
case STARTSWITH:
case INDEXOF:
case CONCAT:
case SUBSTRINGOF:
ParserHelper.bws(tokenizer);
final Expression stringParameter1 = parseExpression();
checkType(stringParameter1, EdmPrimitiveTypeKind.String);
checkNoCollection(stringParameter1);
parameters.add(stringParameter1);
ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
ParserHelper.bws(tokenizer);
final Expression stringParameter2 = parseExpression();
ParserHelper.bws(tokenizer);
checkType(stringParameter2, EdmPrimitiveTypeKind.String);
checkNoCollection(stringParameter2);
parameters.add(stringParameter2);
break;
case GEODISTANCE:
ParserHelper.bws(tokenizer);
final Expression geoParameter1 = parseExpression();
checkType(geoParameter1, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
checkNoCollection(geoParameter1);
parameters.add(geoParameter1);
ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
ParserHelper.bws(tokenizer);
final Expression geoParameter2 = parseExpression();
ParserHelper.bws(tokenizer);
checkType(geoParameter2, EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
checkNoCollection(geoParameter2);
parameters.add(geoParameter2);
break;
case GEOINTERSECTS:
ParserHelper.bws(tokenizer);
final Expression geoPointParameter = parseExpression();
checkType(geoPointParameter,
EdmPrimitiveTypeKind.GeographyPoint, EdmPrimitiveTypeKind.GeometryPoint);
checkNoCollection(geoPointParameter);
parameters.add(geoPointParameter);
ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
ParserHelper.bws(tokenizer);
final Expression geoPolygonParameter = parseExpression();
ParserHelper.bws(tokenizer);
checkType(geoPolygonParameter,
EdmPrimitiveTypeKind.GeographyPolygon, EdmPrimitiveTypeKind.GeometryPolygon);
checkNoCollection(geoPolygonParameter);
parameters.add(geoPolygonParameter);
break;
// Can have two or three parameters.
case SUBSTRING:
ParserHelper.bws(tokenizer);
final Expression parameterFirst = parseExpression();
checkType(parameterFirst, EdmPrimitiveTypeKind.String);
checkNoCollection(parameterFirst);
parameters.add(parameterFirst);
ParserHelper.bws(tokenizer);
ParserHelper.requireNext(tokenizer, TokenKind.COMMA);
ParserHelper.bws(tokenizer);
final Expression parameterSecond = parseExpression();
ParserHelper.bws(tokenizer);
checkIntegerType(parameterSecond);
parameters.add(parameterSecond);
ParserHelper.bws(tokenizer);
if (tokenizer.next(TokenKind.COMMA)) {
ParserHelper.bws(tokenizer);
final Expression parameterThird = parseExpression();
ParserHelper.bws(tokenizer);
checkIntegerType(parameterThird);
parameters.add(parameterThird);
}
break;
// Can have one or two parameters. These methods are handled elsewhere.
case CAST:
case ISOF:
break;
case COMPUTE_AGGREGATE:
ApplyParser ap = new ApplyParser(edm, odata);
AggregateExpression aggrExpr = ap.parseAggregateMethodCallExpr(tokenizer,
(EdmStructuredType) referringType);
parameters.add(aggrExpr);
}
ParserHelper.requireNext(tokenizer, TokenKind.CLOSE);
return parameters;
}