You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2016/01/12 14:08:12 UTC
[11/30] olingo-odata4 git commit: [OLINGO-834] clean-up Expression
implementations
[OLINGO-834] clean-up Expression implementations
Signed-off-by: Christian Amend <ch...@sap.com>
Project: http://git-wip-us.apache.org/repos/asf/olingo-odata4/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata4/commit/208f26c7
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata4/tree/208f26c7
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata4/diff/208f26c7
Branch: refs/heads/master
Commit: 208f26c746263c2d5b9a14e48bae9a7091e1f839
Parents: d7e23bf
Author: Klaus Straubinger <kl...@sap.com>
Authored: Fri Dec 11 10:10:03 2015 +0100
Committer: Christian Amend <ch...@sap.com>
Committed: Fri Dec 11 12:30:10 2015 +0100
----------------------------------------------------------------------
.../core/uri/UriResourceLambdaAllImpl.java | 11 +-
.../core/uri/UriResourceLambdaAnyImpl.java | 11 +-
.../core/uri/UriResourceLambdaVarImpl.java | 4 +-
.../core/uri/expression/FilterParser.java | 562 ------------------
.../core/uri/parser/ExpressionParser.java | 575 +++++++++++++++++++
.../core/uri/parser/UriParseTreeVisitor.java | 498 ++++++----------
.../core/uri/queryoption/OrderByItemImpl.java | 8 +-
.../uri/queryoption/expression/AliasImpl.java | 14 +-
.../uri/queryoption/expression/BinaryImpl.java | 34 +-
.../queryoption/expression/EnumerationImpl.java | 28 +-
.../queryoption/expression/ExpressionImpl.java | 25 -
.../queryoption/expression/LambdaRefImpl.java | 14 +-
.../uri/queryoption/expression/LiteralImpl.java | 25 +-
.../uri/queryoption/expression/MemberImpl.java | 28 +-
.../uri/queryoption/expression/MethodImpl.java | 52 +-
.../queryoption/expression/TypeLiteralImpl.java | 14 +-
.../uri/queryoption/expression/UnaryImpl.java | 23 +-
.../core/uri/expression/FilterParserTest.java | 210 -------
.../core/uri/parser/ExpressionParserTest.java | 210 +++++++
.../server/core/uri/UriResourceImplTest.java | 8 +-
.../core/uri/queryoption/QueryOptionTest.java | 6 +-
.../queryoption/expression/ExpressionTest.java | 103 ++--
22 files changed, 1095 insertions(+), 1368 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAllImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAllImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAllImpl.java
index b57d12c..d980777 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAllImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAllImpl.java
@@ -25,15 +25,12 @@ import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.server.api.uri.UriResourceKind;
import org.apache.olingo.server.api.uri.UriResourceLambdaAll;
import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
public class UriResourceLambdaAllImpl extends UriResourceTypedImpl implements UriResourceLambdaAll {
protected EdmProperty property;
-
private String lambdaVariable;
-
- private ExpressionImpl expression;
+ private Expression expression;
public UriResourceLambdaAllImpl() {
super(UriResourceKind.lambdaAll);
@@ -64,13 +61,13 @@ public class UriResourceLambdaAllImpl extends UriResourceTypedImpl implements Ur
return expression;
}
- public UriResourceLambdaAllImpl setExpression(final ExpressionImpl expression) {
+ public UriResourceLambdaAllImpl setExpression(final Expression expression) {
this.expression = expression;
return this;
}
-
+
@Override
- public String getSegmentValue(){
+ public String getSegmentValue() {
return "all";
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAnyImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAnyImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAnyImpl.java
index 49be2fe..fe5dfee 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAnyImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaAnyImpl.java
@@ -25,15 +25,12 @@ import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
import org.apache.olingo.server.api.uri.UriResourceKind;
import org.apache.olingo.server.api.uri.UriResourceLambdaAny;
import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
public class UriResourceLambdaAnyImpl extends UriResourceTypedImpl implements UriResourceLambdaAny {
protected EdmProperty property;
-
private String lambdaVariable;
-
- private ExpressionImpl expression;
+ private Expression expression;
public UriResourceLambdaAnyImpl() {
super(UriResourceKind.lambdaAny);
@@ -64,13 +61,13 @@ public class UriResourceLambdaAnyImpl extends UriResourceTypedImpl implements Ur
return expression;
}
- public UriResourceLambdaAnyImpl setExpression(final ExpressionImpl expression) {
+ public UriResourceLambdaAnyImpl setExpression(final Expression expression) {
this.expression = expression;
return this;
}
-
+
@Override
- public String getSegmentValue(){
+ public String getSegmentValue() {
return "any";
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaVarImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaVarImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaVarImpl.java
index f7fa6fc..2eb7607 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaVarImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/UriResourceLambdaVarImpl.java
@@ -64,10 +64,10 @@ public class UriResourceLambdaVarImpl extends UriResourceTypedImpl implements Ur
}
@Override
- public String getSegmentValue(){
+ public String getSegmentValue() {
return variableText;
}
-
+
@Override
public String toString() {
return getSegmentValue();
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/expression/FilterParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/expression/FilterParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/expression/FilterParser.java
deleted file mode 100644
index 32cbc1a..0000000
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/expression/FilterParser.java
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- * 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.expression;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
-import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
-import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
-import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
-import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
-import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
-import org.apache.olingo.server.api.uri.queryoption.expression.UnaryOperatorKind;
-import org.apache.olingo.server.core.uri.queryoption.expression.AliasImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.BinaryImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.LiteralImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.MethodImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.UnaryImpl;
-
-public class FilterParser {
- private Tokenizer tokenizer;
-
- private static final Map<TokenKind, BinaryOperatorKind> tokenToBinaryOperator;
- static {
- HashMap<TokenKind, BinaryOperatorKind> temp = new HashMap<FilterParser.TokenKind, BinaryOperatorKind>();
- temp.put(TokenKind.OR_OP, BinaryOperatorKind.OR);
- temp.put(TokenKind.AND_OP, BinaryOperatorKind.AND);
-
- temp.put(TokenKind.EQ_OP, BinaryOperatorKind.EQ);
- temp.put(TokenKind.NE_OP, BinaryOperatorKind.NE);
-
- temp.put(TokenKind.GT_OP, BinaryOperatorKind.GT);
- temp.put(TokenKind.GE_OP, BinaryOperatorKind.GE);
- temp.put(TokenKind.LT_OP, BinaryOperatorKind.LT);
- temp.put(TokenKind.LE_OP, BinaryOperatorKind.LE);
-
- temp.put(TokenKind.ADD_OP, BinaryOperatorKind.ADD);
- temp.put(TokenKind.SUB_OP, BinaryOperatorKind.SUB);
-
- temp.put(TokenKind.MUL_OP, BinaryOperatorKind.MUL);
- temp.put(TokenKind.DIV_OP, BinaryOperatorKind.DIV);
- temp.put(TokenKind.MOD_OP, BinaryOperatorKind.MOD);
-
- tokenToBinaryOperator = Collections.unmodifiableMap(temp);
- }
-
- private static final Map<TokenKind, UnaryOperatorKind> tokenToUnaryOperator;
- static {
- HashMap<TokenKind, UnaryOperatorKind> temp = new HashMap<FilterParser.TokenKind, UnaryOperatorKind>();
- temp.put(TokenKind.MINUS, UnaryOperatorKind.MINUS);
- temp.put(TokenKind.NOT, UnaryOperatorKind.NOT);
- tokenToUnaryOperator = Collections.unmodifiableMap(temp);
- }
-
- private static final Map<TokenKind, MethodKind> tokenToMethod;
- static {
- HashMap<TokenKind, MethodKind> temp = new HashMap<FilterParser.TokenKind, MethodKind>();
- temp.put(TokenKind.Cast, MethodKind.CAST);
- temp.put(TokenKind.Ceiling, MethodKind.CEILING);
- temp.put(TokenKind.Concat, MethodKind.CONCAT);
- temp.put(TokenKind.Contains, MethodKind.CONTAINS);
- temp.put(TokenKind.Date, MethodKind.DATE);
- temp.put(TokenKind.Day, MethodKind.DAY);
- temp.put(TokenKind.Endswith, MethodKind.ENDSWITH);
- temp.put(TokenKind.Floor, MethodKind.FLOOR);
- temp.put(TokenKind.Fractionalseconds, MethodKind.FRACTIONALSECONDS);
- temp.put(TokenKind.GeoDistance, MethodKind.GEODISTANCE);
- temp.put(TokenKind.GeoIntersects, MethodKind.GEOINTERSECTS);
- temp.put(TokenKind.GeoLength, MethodKind.GEOLENGTH);
- temp.put(TokenKind.Hour, MethodKind.HOUR);
- temp.put(TokenKind.Indexof, MethodKind.INDEXOF);
- temp.put(TokenKind.Isof, MethodKind.ISOF);
- temp.put(TokenKind.Length, MethodKind.LENGTH);
- temp.put(TokenKind.Maxdatetime, MethodKind.MAXDATETIME);
- temp.put(TokenKind.Mindatetime, MethodKind.MINDATETIME);
- temp.put(TokenKind.Minute, MethodKind.MINUTE);
- temp.put(TokenKind.Month, MethodKind.MONTH);
- temp.put(TokenKind.Now, MethodKind.NOW);
- temp.put(TokenKind.Round, MethodKind.ROUND);
- temp.put(TokenKind.Second, MethodKind.SECOND);
- temp.put(TokenKind.Startswith, MethodKind.STARTSWITH);
- temp.put(TokenKind.Substring, MethodKind.SUBSTRING);
- temp.put(TokenKind.Time, MethodKind.TIME);
- temp.put(TokenKind.Tolower, MethodKind.TOLOWER);
- temp.put(TokenKind.Totaloffsetminutes, MethodKind.TOTALOFFSETMINUTES);
- temp.put(TokenKind.Totalseconds, MethodKind.TOTALSECONDS);
- temp.put(TokenKind.Toupper, MethodKind.TOUPPER);
- temp.put(TokenKind.Trim, MethodKind.TRIM);
- temp.put(TokenKind.Year, MethodKind.YEAR);
-
- tokenToMethod = Collections.unmodifiableMap(temp);
- }
-
- private static final Map<TokenKind, EdmPrimitiveTypeKind> tokenToPrimitiveType;
- static {
- /* Enum and null are not present in the map. These have to be handled differently */
- HashMap<TokenKind, EdmPrimitiveTypeKind> temp = new HashMap<FilterParser.TokenKind, EdmPrimitiveTypeKind>();
- temp.put(TokenKind.PrimitiveBooleanValue, EdmPrimitiveTypeKind.Boolean);
- temp.put(TokenKind.PrimitiveStringValue, EdmPrimitiveTypeKind.String);
- // TODO:Check if int64 is correct here or if it has to be single instead
- temp.put(TokenKind.PrimitiveIntegerValue, EdmPrimitiveTypeKind.Int64);
- temp.put(TokenKind.PrimitiveGuidValue, EdmPrimitiveTypeKind.Guid);
- temp.put(TokenKind.PrimitiveDateValue, EdmPrimitiveTypeKind.Date);
- temp.put(TokenKind.PrimitiveDateTimeOffsetValue, EdmPrimitiveTypeKind.DateTimeOffset);
- temp.put(TokenKind.PrimitiveTimeOfDayValue, EdmPrimitiveTypeKind.TimeOfDay);
- temp.put(TokenKind.PrimitiveDecimalValue, EdmPrimitiveTypeKind.Decimal);
- temp.put(TokenKind.PrimitiveDoubleValue, EdmPrimitiveTypeKind.Double);
- temp.put(TokenKind.PrimitiveDurationValue, EdmPrimitiveTypeKind.Duration);
- temp.put(TokenKind.PrimitiveBinaryValue, EdmPrimitiveTypeKind.Binary);
-
- tokenToPrimitiveType = Collections.unmodifiableMap(temp);
- }
-
- public Expression parse(Tokenizer tokenizer) {
- // Initialize tokenizer
- this.tokenizer = tokenizer;
-
- Expression exp = parseExpression();
- return exp;
- }
-
- private Expression parseExpression() {
- Expression left = parseAnd();
-
- while (is(TokenKind.OR_OP) != null) {
- tokenizer.getText();
-
- Expression right = parseAnd();
- left = new BinaryImpl(left, BinaryOperatorKind.OR, right);
- }
-
- return left;
- }
-
- private Expression parseAnd() {
- Expression left = parseExprEquality();
- while (is(TokenKind.AND_OP) != null) {
- tokenizer.getText();
-
- Expression right = parseExprEquality();
- left = new BinaryImpl(left, BinaryOperatorKind.AND, right);
- }
- return left;
- }
-
- private Expression parseExprEquality() {
- Expression left = parseExprRel();
-
- TokenKind nextTokenKind = is(TokenKind.EQ_OP, TokenKind.NE_OP);
- // Null for everything other than EQ or NE
- while (nextTokenKind != null) {
- tokenizer.getText();
-
- Expression right = parseExprEquality();
- left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
- nextTokenKind = is(TokenKind.EQ_OP, TokenKind.NE_OP);
- }
-
- return left;
- }
-
- private Expression parseExprRel() {
- Expression left = parseExprAdd();
-
- TokenKind nextTokenKind = is(TokenKind.GT_OP, TokenKind.GE_OP, TokenKind.LT_OP, TokenKind.LE_OP);
- // Null for everything other than GT or GE or LT or LE
- while (nextTokenKind != null) {
- tokenizer.getText();
-
- Expression right = parseExprAdd();
- left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
- nextTokenKind = is(TokenKind.GT_OP, TokenKind.GE_OP, TokenKind.LT_OP, TokenKind.LE_OP);
- }
-
- return left;
- }
-
- private Expression parseExprAdd() {
- Expression left = parseExprMul();
-
- TokenKind nextTokenKind = is(TokenKind.ADD_OP, TokenKind.SUB_OP);
- // Null for everything other than ADD or SUB
- while (nextTokenKind != null) {
- tokenizer.getText();
-
- Expression right = parseExprMul();
- left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
- nextTokenKind = is(TokenKind.ADD_OP, TokenKind.SUB_OP);
- }
-
- return left;
- }
-
- private Expression parseExprMul() {
- Expression left = parseExprUnary();
-
- TokenKind nextTokenKind = is(TokenKind.MUL_OP, TokenKind.DIV_OP, TokenKind.MOD_OP);
- // Null for everything other than MUL or DIV or MOD
- while (nextTokenKind != null) {
- tokenizer.getText();
-
- Expression right = parseExprUnary();
- left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
- nextTokenKind = is(TokenKind.MUL_OP, TokenKind.DIV_OP, TokenKind.MOD_OP);
- }
-
- return left;
- }
-
- private Expression parseExprUnary() {
- Expression left = null;
- TokenKind nextTokenKind = is(TokenKind.MINUS, TokenKind.NOT);
- // Null for everything other than - or NOT
- while (nextTokenKind != null) {
- tokenizer.getText();
-
- Expression exp = parseExprValue();
- left = new UnaryImpl(tokenToUnaryOperator.get(nextTokenKind), exp);
- nextTokenKind = is(TokenKind.MINUS, TokenKind.NOT);
- }
-
- if (left == null) {
- left = parseExprValue();
- }
-
- return left;
- }
-
- private Expression parseExprValue() {
- if (is(TokenKind.OPEN) != null) {
- tokenizer.getText();
- Expression exp = parseExpression();
- require(TokenKind.CLOSE);
- return exp;
- }
-
- if (is(TokenKind.ParameterAlias) != null) {
- return new AliasImpl(tokenizer.getText());
- }
-
- if (is(TokenKind.RootExpr) != null) {
- tokenizer.getText();
- // TODO: ConsumeRootExpression
- }
-
- TokenKind nextPrimitive = isPrimitive();
- if (nextPrimitive != null) {
- EdmPrimitiveTypeKind primitiveTypeKind = tokenToPrimitiveType.get(nextPrimitive);
- EdmPrimitiveType type;
- if (primitiveTypeKind == null) {
- if (nextPrimitive == TokenKind.PrimitiveEnumValue) {
- // TODO: Get enum type
- type = null;
- } else {
- // Null handling
- type = null;
- }
- } else {
- type = EdmPrimitiveTypeFactory.getInstance(primitiveTypeKind);
- }
- return new LiteralImpl(tokenizer.getText(), type);
- }
-
- TokenKind nextMethod = isMethod();
- if (nextMethod != null) {
- MethodImpl methodImpl = new MethodImpl(tokenToMethod.get(nextMethod));
- // Consume Method
- tokenizer.getText();
- if (is(TokenKind.CLOSE) != null) {
- // Consume closing bracket
- tokenizer.getText();
- } else {
- // TODO: Remove Cast
- methodImpl.addParameter((ExpressionImpl) parseExpression());
- while (is(TokenKind.COMMA) != null) {
- tokenizer.getText();
- methodImpl.addParameter((ExpressionImpl) parseExpression());
- }
- require(TokenKind.CLOSE);
- }
-
- validateMethodParameters(methodImpl);
-
- return methodImpl;
- }
-
- throw new RuntimeException("Unexpected token");
- }
-
- private void validateMethodParameters(MethodImpl methodImpl) {
- // We might validate parameter types in the future
- int size = methodImpl.getParameters().size();
- switch (methodImpl.getMethod()) {
- // Must have two Parameters
- case CONTAINS:
- case ENDSWITH:
- case STARTSWITH:
- case INDEXOF:
- case CONCAT:
- case GEODISTANCE:
- case GEOINTERSECTS:
- if (size != 2) {
- throw new RuntimeException("The method " + methodImpl.getMethod() + " needs exactly two parameters.");
- }
- break;
- // Must have one parameter
- case LENGTH:
- case TOLOWER:
- case TOUPPER:
- case TRIM:
- case YEAR:
- case MONTH:
- case DAY:
- case HOUR:
- case MINUTE:
- case SECOND:
- case FRACTIONALSECONDS:
- case DATE:
- case TIME:
- case TOTALOFFSETMINUTES:
- case TOTALSECONDS:
- case ROUND:
- case FLOOR:
- case CEILING:
- case GEOLENGTH:
- if (size != 1) {
- throw new RuntimeException("The method: '" + methodImpl.getMethod() + "' needs exactly one parameter.");
- }
- break;
- // Must have no parameter
- case NOW:
- case MAXDATETIME:
- case MINDATETIME:
- if (size != 0) {
- throw new RuntimeException("The method: '" + methodImpl.getMethod() + "' must have no parameters.");
- }
- break;
- // Variable parameter number
- case CAST:
- case ISOF:
- if (size == 1 || size == 2) {
- throw new RuntimeException("The method: '" + methodImpl.getMethod() + "' must have one or two parameters.");
- }
- break;
- case SUBSTRING:
- if (size == 2 || size == 3) {
- throw new RuntimeException("The method: '" + methodImpl.getMethod() + "' must have two or three parameters.");
- }
- break;
- default:
- throw new RuntimeException("Unkown method: '" + methodImpl.getMethod() + "'");
- }
- }
-
- private String require(TokenKind required) {
- if (is(required) == null) {
- throw new RuntimeException("Requred token: " + required);
- }
- return tokenizer.getText();
- }
-
- private TokenKind is(TokenKind... kind) {
- for (int i = 0; i < kind.length; i++) {
- if (tokenizer.next(kind[i])) {
- return kind[i];
- }
- }
- return null;
- }
-
- private TokenKind isMethod() {
- return is(TokenKind.Cast,
- TokenKind.Ceiling,
- TokenKind.Concat,
- TokenKind.Contains,
- TokenKind.Date,
- TokenKind.Day,
- TokenKind.Endswith,
- TokenKind.Floor,
- TokenKind.Fractionalseconds,
- TokenKind.GeoDistance,
- TokenKind.GeoIntersects,
- TokenKind.GeoLength,
- TokenKind.Hour,
- TokenKind.Indexof,
- TokenKind.Isof,
- TokenKind.Length,
- TokenKind.Maxdatetime,
- TokenKind.Mindatetime,
- TokenKind.Minute,
- TokenKind.Month,
- TokenKind.Now,
- TokenKind.Round,
- TokenKind.Second,
- TokenKind.Startswith,
- TokenKind.Substring,
- TokenKind.Time,
- TokenKind.Tolower,
- TokenKind.Totaloffsetminutes,
- TokenKind.Totalseconds,
- TokenKind.Toupper,
- TokenKind.Trim,
- TokenKind.Year);
- }
-
- private TokenKind isPrimitive() {
- return is(TokenKind.PrimitiveNullValue,
- TokenKind.PrimitiveBooleanValue,
- TokenKind.PrimitiveStringValue,
-
- // The order of the next seven expressions is important in order to avoid
- // finding partly parsed tokens (counter-intuitive as it may be, even a GUID may start with digits ...).
- TokenKind.PrimitiveDoubleValue,
- TokenKind.PrimitiveDecimalValue,
- TokenKind.PrimitiveGuidValue,
- TokenKind.PrimitiveDateTimeOffsetValue,
- TokenKind.PrimitiveDateValue,
- TokenKind.PrimitiveTimeOfDayValue,
- TokenKind.PrimitiveIntegerValue,
- TokenKind.PrimitiveDurationValue,
- TokenKind.PrimitiveBinaryValue,
- TokenKind.PrimitiveEnumValue);
- }
-
- public enum TokenKind {
- // BINARY
- OR_OP,
- AND_OP,
-
- EQ_OP,
- NE_OP,
-
- GT_OP,
- GE_OP,
- LT_OP,
- LE_OP,
-
- ADD_OP,
- SUB_OP,
-
- MUL_OP,
- DIV_OP,
- MOD_OP,
-
- MINUS,
- NOT,
-
- // Grouping
- OPEN,
- CLOSE,
-
- // PrimitiveValues
- PrimitiveNullValue,
- PrimitiveBooleanValue,
-
- PrimitiveStringValue,
- PrimitiveIntegerValue,
- PrimitiveGuidValue,
- PrimitiveDateValue,
- PrimitiveDateTimeOffsetValue,
- PrimitiveTimeOfDayValue,
- PrimitiveDecimalValue,
- PrimitiveDoubleValue,
- PrimitiveDurationValue,
- PrimitiveBinaryValue,
- PrimitiveEnumValue,
-
- // ExpressionValues
- ParameterAlias,
- ArrayOrObject,
- RootExpr,
- IT,
-
- // BuiltInMethods
- Cast,
- Ceiling,
- Concat,
- Contains,
- Date,
- Day,
- Endswith,
- Floor,
- Fractionalseconds,
- GeoDistance,
- GeoIntersects,
- GeoLength,
- Hour,
- Indexof,
- Isof,
- Length,
- Maxdatetime,
- Mindatetime,
- Minute,
- Month,
- Now,
- Round,
- Second,
- Startswith,
- Substring,
- Time,
- Tolower,
- Totaloffsetminutes,
- Totalseconds,
- Toupper,
- Trim,
- Year,
- COMMA
- }
-
- public static class Token {
- TokenKind kind;
- String text;
-
- public Token(TokenKind kind, String text) {
- this.kind = kind;
- this.text = text;
- }
- }
-
- public static class Tokenizer {
- private List<Token> tokens;
- int counter = 0;
-
- public Tokenizer(List<Token> tokens) {
- this.tokens = tokens;
- }
-
- public boolean next(TokenKind expectedKind) {
- if (counter < tokens.size() && expectedKind == tokens.get(counter).kind) {
- return true;
- }
- return false;
- }
-
- public String getText() {
- String text = tokens.get(counter).text;
- counter++;
- return text;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
new file mode 100644
index 0000000..854536d
--- /dev/null
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/ExpressionParser.java
@@ -0,0 +1,575 @@
+/*
+ * 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.parser;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.olingo.commons.api.edm.EdmPrimitiveType;
+import org.apache.olingo.commons.api.edm.EdmPrimitiveTypeKind;
+import org.apache.olingo.commons.core.edm.primitivetype.EdmPrimitiveTypeFactory;
+import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
+import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
+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.UnaryOperatorKind;
+import org.apache.olingo.server.core.uri.queryoption.expression.AliasImpl;
+import org.apache.olingo.server.core.uri.queryoption.expression.BinaryImpl;
+import org.apache.olingo.server.core.uri.queryoption.expression.LiteralImpl;
+import org.apache.olingo.server.core.uri.queryoption.expression.MethodImpl;
+import org.apache.olingo.server.core.uri.queryoption.expression.UnaryImpl;
+
+public class ExpressionParser {
+ private Tokenizer tokenizer;
+
+ private static final Map<TokenKind, BinaryOperatorKind> tokenToBinaryOperator;
+ static {
+ Map<TokenKind, BinaryOperatorKind> temp = new HashMap<ExpressionParser.TokenKind, BinaryOperatorKind>();
+ temp.put(TokenKind.OR_OP, BinaryOperatorKind.OR);
+ temp.put(TokenKind.AND_OP, BinaryOperatorKind.AND);
+
+ temp.put(TokenKind.EQ_OP, BinaryOperatorKind.EQ);
+ temp.put(TokenKind.NE_OP, BinaryOperatorKind.NE);
+
+ temp.put(TokenKind.GT_OP, BinaryOperatorKind.GT);
+ temp.put(TokenKind.GE_OP, BinaryOperatorKind.GE);
+ temp.put(TokenKind.LT_OP, BinaryOperatorKind.LT);
+ temp.put(TokenKind.LE_OP, BinaryOperatorKind.LE);
+
+ temp.put(TokenKind.ADD_OP, BinaryOperatorKind.ADD);
+ temp.put(TokenKind.SUB_OP, BinaryOperatorKind.SUB);
+
+ temp.put(TokenKind.MUL_OP, BinaryOperatorKind.MUL);
+ temp.put(TokenKind.DIV_OP, BinaryOperatorKind.DIV);
+ temp.put(TokenKind.MOD_OP, BinaryOperatorKind.MOD);
+
+ tokenToBinaryOperator = Collections.unmodifiableMap(temp);
+ }
+
+ private static final Map<TokenKind, UnaryOperatorKind> tokenToUnaryOperator;
+ static {
+ Map<TokenKind, UnaryOperatorKind> temp = new HashMap<ExpressionParser.TokenKind, UnaryOperatorKind>();
+ temp.put(TokenKind.MINUS, UnaryOperatorKind.MINUS);
+ temp.put(TokenKind.NOT, UnaryOperatorKind.NOT);
+ tokenToUnaryOperator = Collections.unmodifiableMap(temp);
+ }
+
+ private static final Map<TokenKind, MethodKind> tokenToMethod;
+ static {
+ Map<TokenKind, MethodKind> temp = new HashMap<ExpressionParser.TokenKind, MethodKind>();
+ temp.put(TokenKind.Cast, MethodKind.CAST);
+ temp.put(TokenKind.Ceiling, MethodKind.CEILING);
+ temp.put(TokenKind.Concat, MethodKind.CONCAT);
+ temp.put(TokenKind.Contains, MethodKind.CONTAINS);
+ temp.put(TokenKind.Date, MethodKind.DATE);
+ temp.put(TokenKind.Day, MethodKind.DAY);
+ temp.put(TokenKind.Endswith, MethodKind.ENDSWITH);
+ temp.put(TokenKind.Floor, MethodKind.FLOOR);
+ temp.put(TokenKind.Fractionalseconds, MethodKind.FRACTIONALSECONDS);
+ temp.put(TokenKind.GeoDistance, MethodKind.GEODISTANCE);
+ temp.put(TokenKind.GeoIntersects, MethodKind.GEOINTERSECTS);
+ temp.put(TokenKind.GeoLength, MethodKind.GEOLENGTH);
+ temp.put(TokenKind.Hour, MethodKind.HOUR);
+ temp.put(TokenKind.Indexof, MethodKind.INDEXOF);
+ temp.put(TokenKind.Isof, MethodKind.ISOF);
+ temp.put(TokenKind.Length, MethodKind.LENGTH);
+ temp.put(TokenKind.Maxdatetime, MethodKind.MAXDATETIME);
+ temp.put(TokenKind.Mindatetime, MethodKind.MINDATETIME);
+ temp.put(TokenKind.Minute, MethodKind.MINUTE);
+ temp.put(TokenKind.Month, MethodKind.MONTH);
+ temp.put(TokenKind.Now, MethodKind.NOW);
+ temp.put(TokenKind.Round, MethodKind.ROUND);
+ temp.put(TokenKind.Second, MethodKind.SECOND);
+ temp.put(TokenKind.Startswith, MethodKind.STARTSWITH);
+ temp.put(TokenKind.Substring, MethodKind.SUBSTRING);
+ temp.put(TokenKind.Time, MethodKind.TIME);
+ temp.put(TokenKind.Tolower, MethodKind.TOLOWER);
+ temp.put(TokenKind.Totaloffsetminutes, MethodKind.TOTALOFFSETMINUTES);
+ temp.put(TokenKind.Totalseconds, MethodKind.TOTALSECONDS);
+ temp.put(TokenKind.Toupper, MethodKind.TOUPPER);
+ temp.put(TokenKind.Trim, MethodKind.TRIM);
+ temp.put(TokenKind.Year, MethodKind.YEAR);
+
+ tokenToMethod = Collections.unmodifiableMap(temp);
+ }
+
+ private static final Map<TokenKind, EdmPrimitiveTypeKind> tokenToPrimitiveType;
+ static {
+ /* Enum and null are not present in the map. These have to be handled differently */
+ Map<TokenKind, EdmPrimitiveTypeKind> temp = new HashMap<ExpressionParser.TokenKind, EdmPrimitiveTypeKind>();
+ temp.put(TokenKind.PrimitiveBooleanValue, EdmPrimitiveTypeKind.Boolean);
+ temp.put(TokenKind.PrimitiveStringValue, EdmPrimitiveTypeKind.String);
+ // TODO:Check if int64 is correct here or if it has to be single instead
+ temp.put(TokenKind.PrimitiveIntegerValue, EdmPrimitiveTypeKind.Int64);
+ temp.put(TokenKind.PrimitiveGuidValue, EdmPrimitiveTypeKind.Guid);
+ temp.put(TokenKind.PrimitiveDateValue, EdmPrimitiveTypeKind.Date);
+ temp.put(TokenKind.PrimitiveDateTimeOffsetValue, EdmPrimitiveTypeKind.DateTimeOffset);
+ temp.put(TokenKind.PrimitiveTimeOfDayValue, EdmPrimitiveTypeKind.TimeOfDay);
+ temp.put(TokenKind.PrimitiveDecimalValue, EdmPrimitiveTypeKind.Decimal);
+ temp.put(TokenKind.PrimitiveDoubleValue, EdmPrimitiveTypeKind.Double);
+ temp.put(TokenKind.PrimitiveDurationValue, EdmPrimitiveTypeKind.Duration);
+ temp.put(TokenKind.PrimitiveBinaryValue, EdmPrimitiveTypeKind.Binary);
+
+ tokenToPrimitiveType = Collections.unmodifiableMap(temp);
+ }
+
+ public Expression parse(Tokenizer tokenizer) throws UriParserException {
+ // Initialize tokenizer.
+ this.tokenizer = tokenizer;
+
+ return parseExpression();
+ }
+
+ private Expression parseExpression() throws UriParserException {
+ Expression left = parseAnd();
+
+ while (is(TokenKind.OR_OP) != null) {
+ tokenizer.getText();
+
+ Expression right = parseAnd();
+ left = new BinaryImpl(left, BinaryOperatorKind.OR, right);
+ }
+
+ return left;
+ }
+
+ private Expression parseAnd() throws UriParserException {
+ Expression left = parseExprEquality();
+ while (is(TokenKind.AND_OP) != null) {
+ tokenizer.getText();
+
+ Expression right = parseExprEquality();
+ left = new BinaryImpl(left, BinaryOperatorKind.AND, right);
+ }
+ return left;
+ }
+
+ private Expression parseExprEquality() throws UriParserException {
+ Expression left = parseExprRel();
+
+ TokenKind nextTokenKind = is(TokenKind.EQ_OP, TokenKind.NE_OP);
+ // Null for everything other than EQ or NE
+ while (nextTokenKind != null) {
+ tokenizer.getText();
+
+ Expression right = parseExprEquality();
+ left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
+ nextTokenKind = is(TokenKind.EQ_OP, TokenKind.NE_OP);
+ }
+
+ return left;
+ }
+
+ private Expression parseExprRel() throws UriParserException {
+ Expression left = parseExprAdd();
+
+ TokenKind nextTokenKind = is(TokenKind.GT_OP, TokenKind.GE_OP, TokenKind.LT_OP, TokenKind.LE_OP);
+ // Null for everything other than GT or GE or LT or LE
+ while (nextTokenKind != null) {
+ tokenizer.getText();
+
+ Expression right = parseExprAdd();
+ left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
+ nextTokenKind = is(TokenKind.GT_OP, TokenKind.GE_OP, TokenKind.LT_OP, TokenKind.LE_OP);
+ }
+
+ return left;
+ }
+
+ private Expression parseExprAdd() throws UriParserException {
+ Expression left = parseExprMul();
+
+ TokenKind nextTokenKind = is(TokenKind.ADD_OP, TokenKind.SUB_OP);
+ // Null for everything other than ADD or SUB
+ while (nextTokenKind != null) {
+ tokenizer.getText();
+
+ Expression right = parseExprMul();
+ left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
+ nextTokenKind = is(TokenKind.ADD_OP, TokenKind.SUB_OP);
+ }
+
+ return left;
+ }
+
+ private Expression parseExprMul() throws UriParserException {
+ Expression left = parseExprUnary();
+
+ TokenKind nextTokenKind = is(TokenKind.MUL_OP, TokenKind.DIV_OP, TokenKind.MOD_OP);
+ // Null for everything other than MUL or DIV or MOD
+ while (nextTokenKind != null) {
+ tokenizer.getText();
+
+ Expression right = parseExprUnary();
+ left = new BinaryImpl(left, tokenToBinaryOperator.get(nextTokenKind), right);
+ nextTokenKind = is(TokenKind.MUL_OP, TokenKind.DIV_OP, TokenKind.MOD_OP);
+ }
+
+ return left;
+ }
+
+ private Expression parseExprUnary() throws UriParserException {
+ Expression left = null;
+ TokenKind nextTokenKind = is(TokenKind.MINUS, TokenKind.NOT);
+ // Null for everything other than - or NOT
+ while (nextTokenKind != null) {
+ tokenizer.getText();
+
+ Expression exp = parseExprValue();
+ left = new UnaryImpl(tokenToUnaryOperator.get(nextTokenKind), exp);
+ nextTokenKind = is(TokenKind.MINUS, TokenKind.NOT);
+ }
+
+ if (left == null) {
+ left = parseExprValue();
+ }
+
+ return left;
+ }
+
+ private Expression parseExprValue() throws UriParserException {
+ if (is(TokenKind.OPEN) != null) {
+ tokenizer.getText();
+ Expression exp = parseExpression();
+ require(TokenKind.CLOSE);
+ return exp;
+ }
+
+ if (is(TokenKind.ParameterAlias) != null) {
+ return new AliasImpl(tokenizer.getText());
+ }
+
+ if (is(TokenKind.RootExpr) != null) {
+ tokenizer.getText();
+ // TODO: Consume $root Expression.
+ }
+
+ TokenKind nextPrimitive = isPrimitive();
+ if (nextPrimitive != null) {
+ EdmPrimitiveTypeKind primitiveTypeKind = tokenToPrimitiveType.get(nextPrimitive);
+ EdmPrimitiveType type;
+ if (primitiveTypeKind == null) {
+ if (nextPrimitive == TokenKind.PrimitiveEnumValue) {
+ // TODO: Get enum type.
+ type = null;
+ } else {
+ // Null handling
+ type = null;
+ }
+ } else {
+ type = EdmPrimitiveTypeFactory.getInstance(primitiveTypeKind);
+ }
+ return new LiteralImpl(tokenizer.getText(), type);
+ }
+
+ TokenKind nextMethod = isMethod();
+ if (nextMethod != null) {
+ MethodKind methodKind = tokenToMethod.get(nextMethod);
+ List<Expression> parameters = new ArrayList<Expression>();
+ // Consume Method name.
+ tokenizer.getText();
+ if (is(TokenKind.CLOSE) != null) {
+ // Consume closing parenthesis.
+ tokenizer.getText();
+ } else {
+ parameters.add(parseExpression());
+ while (is(TokenKind.COMMA) != null) {
+ tokenizer.getText();
+ parameters.add(parseExpression());
+ }
+ require(TokenKind.CLOSE);
+ }
+
+ MethodImpl methodImpl = new MethodImpl(methodKind, parameters);
+ validateMethodParameters(methodImpl);
+
+ return methodImpl;
+ }
+
+ throw new UriParserSyntaxException("Unexpected token", UriParserSyntaxException.MessageKeys.SYNTAX);
+ }
+
+ private void validateMethodParameters(final Method method) throws UriParserException {
+ // We might validate parameter types in the future.
+ int size = method.getParameters().size();
+ switch (method.getMethod()) {
+ // Must have two Parameters.
+ case CONTAINS:
+ case ENDSWITH:
+ case STARTSWITH:
+ case INDEXOF:
+ case CONCAT:
+ case GEODISTANCE:
+ case GEOINTERSECTS:
+ if (size != 2) {
+ throw new UriParserSemanticException(
+ "The method " + method.getMethod() + " needs exactly two parameters.",
+ null); // TODO: message key
+ }
+ break;
+ // Must have one parameter.
+ case LENGTH:
+ case TOLOWER:
+ case TOUPPER:
+ case TRIM:
+ case YEAR:
+ case MONTH:
+ case DAY:
+ case HOUR:
+ case MINUTE:
+ case SECOND:
+ case FRACTIONALSECONDS:
+ case DATE:
+ case TIME:
+ case TOTALOFFSETMINUTES:
+ case TOTALSECONDS:
+ case ROUND:
+ case FLOOR:
+ case CEILING:
+ case GEOLENGTH:
+ if (size != 1) {
+ throw new UriParserSemanticException(
+ "The method '" + method.getMethod() + "' needs exactly one parameter.",
+ null); // TODO: message key
+ }
+ break;
+ // Must have no parameter.
+ case NOW:
+ case MAXDATETIME:
+ case MINDATETIME:
+ if (size != 0) {
+ throw new UriParserSemanticException("The method '" + method.getMethod() + "' must have no parameters.",
+ null); // TODO: message key
+ }
+ break;
+ // Variable parameter number
+ case CAST:
+ case ISOF:
+ if (size < 1 || size > 2) {
+ throw new UriParserSemanticException(
+ "The method '" + method.getMethod() + "' must have one or two parameters.",
+ null); // TODO: message key
+ }
+ break;
+ case SUBSTRING:
+ if (size < 2 || size > 3) {
+ throw new UriParserSemanticException(
+ "The method '" + method.getMethod() + "' must have two or three parameters.",
+ null); // TODO: message key
+ }
+ break;
+ default:
+ throw new UriParserSemanticException(
+ "Unkown method '" + method.getMethod() + "'",
+ null); // TODO: message key
+ }
+ }
+
+ private String require(TokenKind required) throws UriParserException {
+ if (is(required) == null) {
+ throw new UriParserSyntaxException("Required token: " + required,
+ UriParserSyntaxException.MessageKeys.SYNTAX);
+ }
+ return tokenizer.getText();
+ }
+
+ private TokenKind is(TokenKind... kind) {
+ for (int i = 0; i < kind.length; i++) {
+ if (tokenizer.next(kind[i])) {
+ return kind[i];
+ }
+ }
+ return null;
+ }
+
+ private TokenKind isMethod() {
+ return is(TokenKind.Cast,
+ TokenKind.Ceiling,
+ TokenKind.Concat,
+ TokenKind.Contains,
+ TokenKind.Date,
+ TokenKind.Day,
+ TokenKind.Endswith,
+ TokenKind.Floor,
+ TokenKind.Fractionalseconds,
+ TokenKind.GeoDistance,
+ TokenKind.GeoIntersects,
+ TokenKind.GeoLength,
+ TokenKind.Hour,
+ TokenKind.Indexof,
+ TokenKind.Isof,
+ TokenKind.Length,
+ TokenKind.Maxdatetime,
+ TokenKind.Mindatetime,
+ TokenKind.Minute,
+ TokenKind.Month,
+ TokenKind.Now,
+ TokenKind.Round,
+ TokenKind.Second,
+ TokenKind.Startswith,
+ TokenKind.Substring,
+ TokenKind.Time,
+ TokenKind.Tolower,
+ TokenKind.Totaloffsetminutes,
+ TokenKind.Totalseconds,
+ TokenKind.Toupper,
+ TokenKind.Trim,
+ TokenKind.Year);
+ }
+
+ private TokenKind isPrimitive() {
+ return is(TokenKind.PrimitiveNullValue,
+ TokenKind.PrimitiveBooleanValue,
+ TokenKind.PrimitiveStringValue,
+
+ // The order of the next seven expressions is important in order to avoid
+ // finding partly parsed tokens (counter-intuitive as it may be, even a GUID may start with digits ...).
+ TokenKind.PrimitiveDoubleValue,
+ TokenKind.PrimitiveDecimalValue,
+ TokenKind.PrimitiveGuidValue,
+ TokenKind.PrimitiveDateTimeOffsetValue,
+ TokenKind.PrimitiveDateValue,
+ TokenKind.PrimitiveTimeOfDayValue,
+ TokenKind.PrimitiveIntegerValue,
+ TokenKind.PrimitiveDurationValue,
+ TokenKind.PrimitiveBinaryValue,
+ TokenKind.PrimitiveEnumValue);
+ }
+
+ public enum TokenKind {
+ // BINARY
+ OR_OP,
+ AND_OP,
+
+ EQ_OP,
+ NE_OP,
+
+ GT_OP,
+ GE_OP,
+ LT_OP,
+ LE_OP,
+
+ ADD_OP,
+ SUB_OP,
+
+ MUL_OP,
+ DIV_OP,
+ MOD_OP,
+
+ MINUS,
+ NOT,
+
+ // Grouping
+ OPEN,
+ CLOSE,
+
+ // PrimitiveValues
+ PrimitiveNullValue,
+ PrimitiveBooleanValue,
+
+ PrimitiveStringValue,
+ PrimitiveIntegerValue,
+ PrimitiveGuidValue,
+ PrimitiveDateValue,
+ PrimitiveDateTimeOffsetValue,
+ PrimitiveTimeOfDayValue,
+ PrimitiveDecimalValue,
+ PrimitiveDoubleValue,
+ PrimitiveDurationValue,
+ PrimitiveBinaryValue,
+ PrimitiveEnumValue,
+
+ // ExpressionValues
+ ParameterAlias,
+ ArrayOrObject,
+ RootExpr,
+ IT,
+
+ // BuiltInMethods
+ Cast,
+ Ceiling,
+ Concat,
+ Contains,
+ Date,
+ Day,
+ Endswith,
+ Floor,
+ Fractionalseconds,
+ GeoDistance,
+ GeoIntersects,
+ GeoLength,
+ Hour,
+ Indexof,
+ Isof,
+ Length,
+ Maxdatetime,
+ Mindatetime,
+ Minute,
+ Month,
+ Now,
+ Round,
+ Second,
+ Startswith,
+ Substring,
+ Time,
+ Tolower,
+ Totaloffsetminutes,
+ Totalseconds,
+ Toupper,
+ Trim,
+ Year,
+ COMMA
+ }
+
+ public static class Token {
+ TokenKind kind;
+ String text;
+
+ public Token(TokenKind kind, String text) {
+ this.kind = kind;
+ this.text = text;
+ }
+ }
+
+ public static class Tokenizer {
+ private List<Token> tokens;
+ int counter = 0;
+
+ public Tokenizer(List<Token> tokens) {
+ this.tokens = tokens;
+ }
+
+ public boolean next(TokenKind expectedKind) {
+ if (counter < tokens.size() && expectedKind == tokens.get(counter).kind) {
+ return true;
+ }
+ return false;
+ }
+
+ public String getText() {
+ String text = tokens.get(counter).text;
+ counter++;
+ return text;
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
index c58327b..3f7f70c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/parser/UriParseTreeVisitor.java
@@ -19,6 +19,7 @@
package org.apache.olingo.server.core.uri.parser;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -59,6 +60,7 @@ import org.apache.olingo.server.api.uri.UriResourcePartTyped;
import org.apache.olingo.server.api.uri.UriResourceRoot;
import org.apache.olingo.server.api.uri.queryoption.SelectItem;
import org.apache.olingo.server.api.uri.queryoption.expression.BinaryOperatorKind;
+import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
import org.apache.olingo.server.api.uri.queryoption.expression.MethodKind;
import org.apache.olingo.server.api.uri.queryoption.expression.UnaryOperatorKind;
import org.apache.olingo.server.core.uri.UriInfoImpl;
@@ -82,7 +84,9 @@ import org.apache.olingo.server.core.uri.UriResourceStartingTypeFilterImpl;
import org.apache.olingo.server.core.uri.UriResourceTypedImpl;
import org.apache.olingo.server.core.uri.UriResourceValueImpl;
import org.apache.olingo.server.core.uri.UriResourceWithKeysImpl;
-import org.apache.olingo.server.core.uri.antlr.*;
+import org.apache.olingo.server.core.uri.antlr.UriLexer;
+import org.apache.olingo.server.core.uri.antlr.UriParserBaseVisitor;
+import org.apache.olingo.server.core.uri.antlr.UriParserParser;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllEOFContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.AllExprContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltAddContext;
@@ -96,7 +100,6 @@ import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltMultContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.AltOrContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.AnyExprContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.ArrayOrObjectContext;
-import org.apache.olingo.server.core.uri.antlr.UriParserParser.BatchEOFContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.BinaryLiteralContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.BooleanNonCaseLiteralContext;
import org.apache.olingo.server.core.uri.antlr.UriParserParser.CastExprContext;
@@ -197,7 +200,6 @@ import org.apache.olingo.server.core.uri.queryoption.TopOptionImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.AliasImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.BinaryImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.EnumerationImpl;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.LiteralImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.MemberImpl;
import org.apache.olingo.server.core.uri.queryoption.expression.MethodImpl;
@@ -725,26 +727,18 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
all.setLamdaVariable(ctx.vLV.getText());
context.allowedLambdaVariables.push(var);
- all.setExpression((ExpressionImpl) ctx.vLE.accept(this));
+ all.setExpression((Expression) ctx.vLE.accept(this));
context.allowedLambdaVariables.pop();
return all;
}
@Override
- public ExpressionImpl visitAltAdd(final AltAddContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
+ public Expression visitAltAdd(final AltAddContext ctx) {
int tokenIndex = ctx.vO.getType();
-
- if (tokenIndex == UriLexer.ADD) {
- binary.setOperator(BinaryOperatorKind.ADD);
- } else if (tokenIndex == UriLexer.SUB) {
- binary.setOperator(BinaryOperatorKind.SUB);
- }
-
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
- return binary;
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ tokenIndex == UriLexer.ADD ? BinaryOperatorKind.ADD : BinaryOperatorKind.SUB,
+ (Expression) ctx.vE2.accept(this));
}
@Override
@@ -756,14 +750,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath);
- MemberImpl ret = new MemberImpl();
-
- ret.setResourcePath(uriInfoImplpath);
- if (startType != null) {
- ret.setTypeFilter(startType);
- }
-
- return ret;
+ return new MemberImpl(uriInfoImplpath, startType);
}
private EdmType removeUriResourceStartingTypeFilterImpl(final UriInfoImpl uriInfoImplpath) {
@@ -794,14 +781,11 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitAltAnd(final AltAndContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
- binary.setOperator(BinaryOperatorKind.AND);
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
-
- return binary;
+ public Expression visitAltAnd(final AltAndContext ctx) {
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ BinaryOperatorKind.AND,
+ (Expression) ctx.vE2.accept(this));
}
@Override
@@ -812,39 +796,26 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath);
- MemberImpl ret = new MemberImpl();
- ret.setResourcePath(uriInfoImplpath);
- if (startType != null) {
- ret.setTypeFilter(startType);
- }
- return ret;
- }
-
- @Override
- public Object visitBatchEOF(final BatchEOFContext ctx) {
- context.contextUriInfo = new UriInfoImpl().setKind(UriInfoKind.batch);
- return null;
+ return new MemberImpl(uriInfoImplpath, startType);
}
@Override
- public ExpressionImpl visitAltComparism(final AltComparismContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
+ public Expression visitAltComparism(final AltComparismContext ctx) {
int tokenIndex = ctx.vO.getType();
-
+ BinaryOperatorKind kind = null;
if (tokenIndex == UriLexer.GT) {
- binary.setOperator(BinaryOperatorKind.GT);
+ kind = BinaryOperatorKind.GT;
} else if (tokenIndex == UriLexer.GE) {
- binary.setOperator(BinaryOperatorKind.GE);
+ kind = BinaryOperatorKind.GE;
} else if (tokenIndex == UriLexer.LT) {
- binary.setOperator(BinaryOperatorKind.LT);
+ kind = BinaryOperatorKind.LT;
} else if (tokenIndex == UriLexer.LE) {
- binary.setOperator(BinaryOperatorKind.LE);
+ kind = BinaryOperatorKind.LE;
}
-
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
- return binary;
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ kind,
+ (Expression) ctx.vE2.accept(this));
}
@Override
@@ -867,31 +838,20 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitAltEquality(final AltEqualityContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
+ public Expression visitAltEquality(final AltEqualityContext ctx) {
int tokenIndex = ctx.vO.getType();
-
- if (tokenIndex == UriLexer.EQ_ALPHA) {
- binary.setOperator(BinaryOperatorKind.EQ);
- } else {
- binary.setOperator(BinaryOperatorKind.NE);
- }
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
-
- return binary;
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ tokenIndex == UriLexer.EQ_ALPHA ? BinaryOperatorKind.EQ : BinaryOperatorKind.NE,
+ (Expression) ctx.vE2.accept(this));
}
@Override
public Object visitAltHas(final AltHasContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
- binary.setOperator(BinaryOperatorKind.HAS);
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
-
- return binary;
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ BinaryOperatorKind.HAS,
+ (Expression) ctx.vE2.accept(this));
}
@Override
@@ -902,33 +862,28 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitAltMult(final AltMultContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
+ public Expression visitAltMult(final AltMultContext ctx) {
int tokenIndex = ctx.vO.getType();
-
+ BinaryOperatorKind kind;
if (tokenIndex == UriLexer.MUL) {
- binary.setOperator(BinaryOperatorKind.MUL);
+ kind = BinaryOperatorKind.MUL;
} else if (tokenIndex == UriLexer.DIV) {
- binary.setOperator(BinaryOperatorKind.DIV);
+ kind = BinaryOperatorKind.DIV;
} else {
- binary.setOperator(BinaryOperatorKind.MOD);
+ kind = BinaryOperatorKind.MOD;
}
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
-
- return binary;
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ kind,
+ (Expression) ctx.vE2.accept(this));
}
@Override
- public ExpressionImpl visitAltOr(final AltOrContext ctx) {
- BinaryImpl binary = new BinaryImpl();
-
- binary.setOperator(BinaryOperatorKind.OR);
- binary.setLeftOperand((ExpressionImpl) ctx.vE1.accept(this));
- binary.setRightOperand((ExpressionImpl) ctx.vE2.accept(this));
-
- return binary;
+ public Expression visitAltOr(final AltOrContext ctx) {
+ return new BinaryImpl(
+ (Expression) ctx.vE1.accept(this),
+ BinaryOperatorKind.OR,
+ (Expression) ctx.vE2.accept(this));
}
@Override
@@ -954,7 +909,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
any.setLamdaVariable(ctx.vLV.getText());
context.allowedLambdaVariables.push(var);
- any.setExpression((ExpressionImpl) ctx.vLE.accept(this));
+ any.setExpression((Expression) ctx.vLE.accept(this));
context.allowedLambdaVariables.pop();
}
return any;
@@ -963,17 +918,16 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override
public Object visitBooleanNonCaseLiteral(final BooleanNonCaseLiteralContext ctx) {
final String text = ctx.getText().toLowerCase();
- return new LiteralImpl().setText(text.equals("false") ? "false" : "true")
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean));
+ return new LiteralImpl(text.equals("false") ? "false" : "true",
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Boolean));
}
@Override
- public ExpressionImpl visitCastExpr(final CastExprContext ctx) {
- MethodImpl method = new MethodImpl();
+ public Expression visitCastExpr(final CastExprContext ctx) {
+ List<Expression> parameters = new ArrayList<Expression>();
if (ctx.vE1 != null) {
// is optional parameter
- ExpressionImpl onExpression = (ExpressionImpl) ctx.vE1.accept(this);
- method.addParameter(onExpression);
+ parameters.add((Expression) ctx.vE1.accept(this));
}
String namespace = ctx.vNS.getText();
@@ -981,9 +935,8 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
FullQualifiedName fullName = new FullQualifiedName(namespace, ctx.vODI.getText());
EdmType type = getType(fullName);
- method.setMethod(MethodKind.CAST);
- method.addParameter(new TypeLiteralImpl().setType(type));
- return method;
+ parameters.add(new TypeLiteralImpl(type));
+ return new MethodImpl(MethodKind.CAST, parameters);
}
private EdmType getType(final FullQualifiedName fullName) {
@@ -1022,18 +975,15 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitCeilingMethodCallExpr(final CeilingMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.CEILING)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitCeilingMethodCallExpr(final CeilingMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.CEILING, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitConcatMethodCallExpr(final ConcatMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.CONCAT)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitConcatMethodCallExpr(final ConcatMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.CONCAT, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
@@ -1090,47 +1040,38 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitContainsMethodCallExpr(final ContainsMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.CONTAINS)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitContainsMethodCallExpr(final ContainsMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.CONTAINS, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
public Object visitDateMethodCallExpr(final DateMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.DATE)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ return new MethodImpl(MethodKind.DATE, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitDayMethodCallExpr(final DayMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.DAY)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitDayMethodCallExpr(final DayMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.DAY, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitGeoDistanceMethodCallExpr(final GeoDistanceMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.GEODISTANCE)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitGeoDistanceMethodCallExpr(final GeoDistanceMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.GEODISTANCE, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
public Object visitEndsWithMethodCallExpr(final EndsWithMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.ENDSWITH)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ return new MethodImpl(MethodKind.ENDSWITH, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
public Object visitEnumLiteral(final EnumLiteralContext ctx) {
- EnumerationImpl enum1 = new EnumerationImpl();
-
// get type
final String odi = ctx.vODI.getText();
@@ -1141,17 +1082,11 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
"Enum type '" + fullName.getFullQualifiedNameAsString() + "' not found!",
UriParserSemanticException.MessageKeys.UNKNOWN_TYPE, fullName.getFullQualifiedNameAsString()));
}
- enum1.setType(edmEnumType);
String valueString = ctx.vValues.getText();
valueString = valueString.substring(1, valueString.length() - 1);
-
String[] values = valueString.split(",");
- for (String item : values) {
- enum1.addValue(item);
- }
-
- return enum1;
+ return new EnumerationImpl(edmEnumType, Arrays.asList(values));
}
@Override
@@ -1343,7 +1278,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override
public Object visitFilter(final FilterContext ctx) {
context.contextReadingQueryPart = true;
- final FilterOptionImpl result = new FilterOptionImpl().setExpression((ExpressionImpl) ctx.children.get(2)
+ final FilterOptionImpl result = new FilterOptionImpl().setExpression((Expression) ctx.children.get(2)
.accept(this));
context.contextReadingQueryPart = false;
@@ -1353,7 +1288,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override
public Object visitFilterExpressionEOF(final FilterExpressionEOFContext ctx) {
context.contextReadingQueryPart = true;
- final FilterOptionImpl result = new FilterOptionImpl().setExpression((ExpressionImpl) ctx.children.get(0)
+ final FilterOptionImpl result = new FilterOptionImpl().setExpression((Expression) ctx.children.get(0)
.accept(this));
context.contextReadingQueryPart = false;
@@ -1361,39 +1296,30 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitFloorMethodCallExpr(final FloorMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.FLOOR)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitFloorMethodCallExpr(final FloorMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.FLOOR, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitFractionalsecondsMethodCallExpr(final FractionalsecondsMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.FRACTIONALSECONDS)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitFractionalsecondsMethodCallExpr(final FractionalsecondsMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.FRACTIONALSECONDS, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitGeoLengthMethodCallExpr(final GeoLengthMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.GEOLENGTH)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitGeoLengthMethodCallExpr(final GeoLengthMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.GEOLENGTH, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitHourMethodCallExpr(final HourMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.HOUR)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitHourMethodCallExpr(final HourMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.HOUR, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitIndexOfMethodCallExpr(final IndexOfMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.INDEXOF)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitIndexOfMethodCallExpr(final IndexOfMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.INDEXOF, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
@@ -1405,19 +1331,17 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitGeoIntersectsMethodCallExpr(final GeoIntersectsMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.GEOINTERSECTS)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitGeoIntersectsMethodCallExpr(final GeoIntersectsMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.GEOINTERSECTS, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
- public ExpressionImpl visitIsofExpr(final IsofExprContext ctx) {
- MethodImpl method = new MethodImpl();
+ public Expression visitIsofExpr(final IsofExprContext ctx) {
+ List<Expression> parameters = new ArrayList<Expression>();
if (ctx.vE1 != null) {
- ExpressionImpl onExpression = (ExpressionImpl) ctx.vE1.accept(this);
- method.addParameter(onExpression);
+ parameters.add((Expression) ctx.vE1.accept(this));
}
String namespace = ctx.vNS.getText();
@@ -1425,17 +1349,14 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
FullQualifiedName fullName = new FullQualifiedName(namespace, ctx.vODI.getText());
EdmType type = getType(fullName);
- method.setMethod(MethodKind.ISOF);
- method.addParameter(new TypeLiteralImpl().setType(type));
+ parameters.add(new TypeLiteralImpl(type));
- return method;
+ return new MethodImpl(MethodKind.ISOF, parameters);
}
@Override
- public ExpressionImpl visitLengthMethodCallExpr(final LengthMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.LENGTH)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitLengthMethodCallExpr(final LengthMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.LENGTH, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
@@ -1457,9 +1378,8 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitMaxDateTimeMethodCallExpr(final MaxDateTimeMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.MAXDATETIME);
+ public Expression visitMaxDateTimeMethodCallExpr(final MaxDateTimeMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.MAXDATETIME, null);
}
@Override
@@ -1501,33 +1421,22 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmType startType = removeUriResourceStartingTypeFilterImpl(uriInfoImplpath);
- MemberImpl ret = new MemberImpl();
- ret.setResourcePath(uriInfoImplpath);
- if (startType != null) {
- ret.setTypeFilter(startType);
- }
-
- return ret;
+ return new MemberImpl(uriInfoImplpath, startType);
}
@Override
- public ExpressionImpl visitMinDateTimeMethodCallExpr(final MinDateTimeMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.MINDATETIME);
+ public Expression visitMinDateTimeMethodCallExpr(final MinDateTimeMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.MINDATETIME, null);
}
@Override
- public ExpressionImpl visitMinuteMethodCallExpr(final MinuteMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.MINUTE)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitMinuteMethodCallExpr(final MinuteMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.MINUTE, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitMonthMethodCallExpr(final MonthMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.MONTH)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitMonthMethodCallExpr(final MonthMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.MONTH, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
@@ -1537,9 +1446,9 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
// is single key predicate without a name
String valueText = ctx.vVO.getText();
- ExpressionImpl expression = null;
+ Expression expression = null;
try {
- expression = (ExpressionImpl) ctx.vVO.accept(this);
+ expression = (Expression) ctx.vVO.accept(this);
} catch (final RuntimeException e) {
throw wrap(new UriParserSemanticException("Invalid key value: " + valueText, e,
UriParserSemanticException.MessageKeys.INVALID_KEY_VALUE, valueText));
@@ -1763,7 +1672,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
if (ctx.vCOM != null) {
final String text = ctx.vCOM.getText();
uriParameter.setText("null".equals(text) ? null : text);
- uriParameter.setExpression((ExpressionImpl) ctx.vCOM.accept(this));
+ uriParameter.setExpression((Expression) ctx.vCOM.accept(this));
} else {
uriParameter.setAlias("@" + ctx.vALI.getText());
}
@@ -1773,29 +1682,20 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
@Override
public Object visitNaninfinityLiteral(final NaninfinityLiteralContext ctx) {
- return new LiteralImpl().setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal)).setText(ctx
- .getText());
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal));
}
@Override
- public ExpressionImpl visitNowMethodCallExpr(final NowMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.NOW);
+ public Expression visitNowMethodCallExpr(final NowMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.NOW, null);
}
@Override
public Object visitNullruleLiteral(final NullruleLiteralContext ctx) {
- return new LiteralImpl().setText("null");
+ return new LiteralImpl("null", null);
}
- /*
- * @Override
- * public Object visitOdataRelativeUriEOF(final OdataRelativeUriEOFContext ctx) {
- * contextUriInfo = null;
- * super.visitOdataRelativeUriEOF(ctx);
- * return contextUriInfo;
- * }
- */
@Override
public Object visitOrderBy(final OrderByContext ctx) {
@@ -1831,7 +1731,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
oItem.setDescending(true);
}
- oItem.setExpression((ExpressionImpl) ctx.vC.accept(this));
+ oItem.setExpression((Expression) ctx.vC.accept(this));
return oItem;
}
@@ -1906,19 +1806,19 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
// TODO Implement geography types and set a proper type
- return new LiteralImpl().setText(ctx.getText());
+ return new LiteralImpl(ctx.getText(), null);
}
@Override
public Object visitBinaryLiteral(BinaryLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Binary));
}
@Override
public Object visitStringLiteral(final StringLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.String));
}
@Override
@@ -1928,7 +1828,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
EdmPrimitiveTypeKind.Double :
EdmPrimitiveTypeKind.Decimal);
- return new LiteralImpl().setText(ctx.getText()).setType(type);
+ return new LiteralImpl(ctx.getText(), type);
}
@Override
@@ -1948,41 +1848,41 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
typeKind = EdmPrimitiveTypeKind.Int64;
}
} catch (NumberFormatException e) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Decimal));
}
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(typeKind));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(typeKind));
}
@Override
public Object visitDateLiteral(final DateLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Date));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Date));
}
@Override
public Object visitDatetimeoffsetLiteral(final DatetimeoffsetLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.DateTimeOffset));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.DateTimeOffset));
}
@Override
public Object visitDurationLiteral(final DurationLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Duration));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Duration));
}
@Override
public Object visitGuidLiteral(final GuidLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Guid));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.Guid));
}
@Override
public Object visitTimeofdayLiteral(final TimeofdayLiteralContext ctx) {
- return new LiteralImpl().setText(ctx.getText())
- .setType(EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.TimeOfDay));
+ return new LiteralImpl(ctx.getText(),
+ EdmPrimitiveTypeFactory.getInstance(EdmPrimitiveTypeKind.TimeOfDay));
}
@Override
@@ -1996,21 +1896,6 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
return qpList;
}
- /*
- * @Override
- * public Object visitResourcePath(final ResourcePathContext ctx) {
- * if (ctx.vAll != null) {
- * contextUriInfo = new UriInfoImpl().setKind(UriInfoKind.all);
- * } else if (ctx.vCJ != null) {
- * ctx.vCJ.accept(this);
- * } else if (ctx.vlPS != null) {
- * UriInfoImpl uriInfoPath = new UriInfoImpl().setKind(UriInfoKind.resource);
- * contextUriInfo = uriInfoPath;
- * super.visitResourcePath(ctx); // visit all children of ctx
- * }
- * return contextUriInfo;
- * }
- */
@Override
public Object visitRootExpr(final RootExprContext ctx) {
@@ -2042,23 +1927,18 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
context.contextUriInfo = backupUriInfoPath;
}
- return new MemberImpl()
- .setResourcePath(uriInfoImplpath);
+ return new MemberImpl(uriInfoImplpath, null);
}
@Override
- public ExpressionImpl visitRoundMethodCallExpr(final RoundMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.ROUND)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitRoundMethodCallExpr(final RoundMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.ROUND, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitSecondMethodCallExpr(final SecondMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.SECOND)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitSecondMethodCallExpr(final SecondMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.SECOND, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
@@ -2344,33 +2224,28 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitStartsWithMethodCallExpr(final StartsWithMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.STARTSWITH)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this))
- .addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitStartsWithMethodCallExpr(final StartsWithMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.STARTSWITH, Arrays.asList(
+ (Expression) ctx.vE1.accept(this),
+ (Expression) ctx.vE2.accept(this)));
}
@Override
- public ExpressionImpl visitSubstringMethodCallExpr(final SubstringMethodCallExprContext ctx) {
- MethodImpl ret = new MethodImpl();
- ret.setMethod(MethodKind.SUBSTRING);
- ret.addParameter((ExpressionImpl) ctx.vE1.accept(this));
- ret.addParameter((ExpressionImpl) ctx.vE2.accept(this));
+ public Expression visitSubstringMethodCallExpr(final SubstringMethodCallExprContext ctx) {
+ List<Expression> parameters = new ArrayList<Expression>();
+ parameters.add((Expression) ctx.vE1.accept(this));
+ parameters.add((Expression) ctx.vE2.accept(this));
if (ctx.vE3 != null) {
- ret.addParameter((ExpressionImpl) ctx.vE3.accept(this));
+ parameters.add((Expression) ctx.vE3.accept(this));
}
- return ret;
-
+ return new MethodImpl(MethodKind.SUBSTRING, parameters);
}
@Override
- public ExpressionImpl visitTimeMethodCallExpr(final TimeMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TIME)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitTimeMethodCallExpr(final TimeMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TIME, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
@@ -2382,45 +2257,33 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitToLowerMethodCallExpr(final ToLowerMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TOLOWER)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitToLowerMethodCallExpr(final ToLowerMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TOLOWER, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitTotalOffsetMinutesMethodCallExpr(final TotalOffsetMinutesMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TOTALOFFSETMINUTES)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitTotalOffsetMinutesMethodCallExpr(final TotalOffsetMinutesMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TOTALOFFSETMINUTES, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitTotalsecondsMethodCallExpr(final TotalsecondsMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TOTALSECONDS)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitTotalsecondsMethodCallExpr(final TotalsecondsMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TOTALSECONDS, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitToUpperMethodCallExpr(final ToUpperMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TOUPPER)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitToUpperMethodCallExpr(final ToUpperMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TOUPPER, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitTrimMethodCallExpr(final TrimMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.TRIM)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitTrimMethodCallExpr(final TrimMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.TRIM, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
@Override
- public ExpressionImpl visitYearMethodCallExpr(final YearMethodCallExprContext ctx) {
- return new MethodImpl()
- .setMethod(MethodKind.YEAR)
- .addParameter((ExpressionImpl) ctx.vE1.accept(this));
+ public Expression visitYearMethodCallExpr(final YearMethodCallExprContext ctx) {
+ return new MethodImpl(MethodKind.YEAR, Collections.singletonList((Expression) ctx.vE1.accept(this)));
}
private ParseCancellationException wrap(final UriParserException uriParserException) {
@@ -2428,18 +2291,15 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
}
@Override
- public ExpressionImpl visitAltUnary(@NotNull final UriParserParser.AltUnaryContext ctx) {
- UnaryImpl unary = new UnaryImpl();
- unary.setOperator(ctx.unary().NOT() == null ? UnaryOperatorKind.MINUS : UnaryOperatorKind.NOT);
- unary.setOperand((ExpressionImpl) ctx.commonExpr().accept(this));
- return unary;
+ public Expression visitAltUnary(@NotNull final UriParserParser.AltUnaryContext ctx) {
+ return new UnaryImpl(
+ ctx.unary().NOT() == null ? UnaryOperatorKind.MINUS : UnaryOperatorKind.NOT,
+ (Expression) ctx.commonExpr().accept(this));
}
@Override
- public ExpressionImpl visitAltAlias(@NotNull final UriParserParser.AltAliasContext ctx) {
- AliasImpl alias = new AliasImpl();
- alias.setParameter("@" + ctx.odataIdentifier().getChild(0).getText());
- return alias;
+ public Expression visitAltAlias(@NotNull final UriParserParser.AltAliasContext ctx) {
+ return new AliasImpl("@" + ctx.odataIdentifier().getChild(0).getText());
}
@Override
@@ -2455,7 +2315,7 @@ public class UriParseTreeVisitor extends UriParserBaseVisitor<Object> {
MessageKeys.COMPLEX_PARAMETER_IN_RESOURCE_PATH, ctx.getText()));
}
- return new LiteralImpl().setText(ctx.getText()).setType(null);
+ return new LiteralImpl(ctx.getText(), null);
}
@Override
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByItemImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByItemImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByItemImpl.java
index aac33f0..71c728c 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByItemImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/OrderByItemImpl.java
@@ -19,11 +19,11 @@
package org.apache.olingo.server.core.uri.queryoption;
import org.apache.olingo.server.api.uri.queryoption.OrderByItem;
-import org.apache.olingo.server.core.uri.queryoption.expression.ExpressionImpl;
+import org.apache.olingo.server.api.uri.queryoption.expression.Expression;
public class OrderByItemImpl implements OrderByItem {
- private ExpressionImpl expression;
+ private Expression expression;
private boolean descending = false; // default sort order is ascending
@Override
@@ -37,11 +37,11 @@ public class OrderByItemImpl implements OrderByItem {
}
@Override
- public ExpressionImpl getExpression() {
+ public Expression getExpression() {
return expression;
}
- public OrderByItem setExpression(final ExpressionImpl expression) {
+ public OrderByItem setExpression(final Expression expression) {
this.expression = expression;
return this;
}
http://git-wip-us.apache.org/repos/asf/olingo-odata4/blob/208f26c7/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/AliasImpl.java
----------------------------------------------------------------------
diff --git a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/AliasImpl.java b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/AliasImpl.java
index 5309d73..c7d7c20 100644
--- a/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/AliasImpl.java
+++ b/lib/server-core/src/main/java/org/apache/olingo/server/core/uri/queryoption/expression/AliasImpl.java
@@ -23,15 +23,11 @@ import org.apache.olingo.server.api.uri.queryoption.expression.Alias;
import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitException;
import org.apache.olingo.server.api.uri.queryoption.expression.ExpressionVisitor;
-public class AliasImpl extends ExpressionImpl implements Alias {
+public class AliasImpl implements Alias {
- private String parameterName;
+ private final String parameterName;
- public AliasImpl() {
- //TODO: Delete Constructor
- }
-
- public AliasImpl(String parameterName) {
+ public AliasImpl(final String parameterName) {
this.parameterName = parameterName;
}
@@ -40,10 +36,6 @@ public class AliasImpl extends ExpressionImpl implements Alias {
return parameterName;
}
- public void setParameter(final String ParameterName) {
- parameterName = ParameterName;
- }
-
@Override
public <T> T accept(final ExpressionVisitor<T> visitor) throws ExpressionVisitException, ODataApplicationException {
return visitor.visitAlias(parameterName);