/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.olingo.server.core.uri.queryoption.expression; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind; import org.apache.olingo.commons.api.edm.EdmType; import org.apache.olingo.server.api.ODataApplicationException; import org.apache.olingo.server.api.uri.queryoption.expression.Expression; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException; import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitor; import org.apache.olingo.server.api.uri.queryoption.expression.Method; import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind; import org.apache.olingo.server.api.uri.queryoption.expression.TypeLiteral; import org.apache.olingo.server.core.ODataImpl; public class MethodImpl implements Method { private final MethodKind method; private final List<Expression> parameters; public MethodImpl(final MethodKind method, final List<Expression> parameters) { this.method = method; this.parameters = parameters; } @Override public MethodKind getMethod() { return method; } public EdmType getType() { EdmPrimitiveTypeKind kind = null; switch (method) { case CONTAINS: case STARTSWITH: case ENDSWITH: case SUBSTRINGOF: kind = EdmPrimitiveTypeKind.Boolean; break; case LENGTH: case INDEXOF: kind = EdmPrimitiveTypeKind.Int32; break; case SUBSTRING: case TOLOWER: case TOUPPER: case TRIM: case CONCAT: kind = EdmPrimitiveTypeKind.String; break; case YEAR: case MONTH: case DAY: case HOUR: case MINUTE: case SECOND: kind = EdmPrimitiveTypeKind.Int32; break; case FRACTIONALSECONDS: case TOTALSECONDS: kind = EdmPrimitiveTypeKind.Decimal; break; case DATE: kind = EdmPrimitiveTypeKind.Date; break; case TIME: kind = EdmPrimitiveTypeKind.TimeOfDay; break; case TOTALOFFSETMINUTES: kind = EdmPrimitiveTypeKind.Int32; break; case MINDATETIME: case MAXDATETIME: case NOW: kind = EdmPrimitiveTypeKind.DateTimeOffset; break; case ROUND: case FLOOR: case CEILING: // Needs to be refined if Decimal must be distinguished from Double. kind = EdmPrimitiveTypeKind.Double; break; case GEODISTANCE: case GEOLENGTH: kind = EdmPrimitiveTypeKind.Double; break; case GEOINTERSECTS: kind = EdmPrimitiveTypeKind.Boolean; break; case CAST: return ((TypeLiteral) parameters.get(parameters.size() - 1)).getType(); case ISOF: kind = EdmPrimitiveTypeKind.Boolean; break; } return new ODataImpl().createPrimitiveTypeInstance(kind); } @Override public List<Expression> getParameters() { return parameters == null ? Collections.<Expression> emptyList() : Collections.unmodifiableList(parameters); } @Override public <T> T accept(final ExpressionVisitor<T> visitor) throws ExpressionVisitException, ODataApplicationException { List<T> userParameters = new ArrayList<>(); if (parameters != null) { for (final Expression parameter : parameters) { userParameters.add(parameter.accept(visitor)); } } return visitor.visitMethodCall(method, userParameters); } @Override public String toString() { return "{" + method + " " + parameters + "}"; } }