Repository: olingo-odata2 Updated Branches: refs/heads/master d32a900a4 -> 962d787cc
[Olingo-1228]JPA Parameterization issue Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/962d787c Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/962d787c Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/962d787c Branch: refs/heads/master Commit: 962d787cc8f9a0642d90bf328d7988f498b00c3c Parents: d32a900 Author: Archana Rai <archana....@sap.com> Authored: Tue Dec 4 13:22:45 2018 +0530 Committer: Archana Rai <archana....@sap.com> Committed: Tue Dec 4 13:22:45 2018 +0530 ---------------------------------------------------------------------- .../processor/core/ODataExpressionParser.java | 38 ++++++++++++++------ .../processor/core/jpql/JPQLSelectContext.java | 2 +- 2 files changed, 28 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/962d787c/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java index 182a2da..78d04ee 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java @@ -31,6 +31,7 @@ import java.util.TreeMap; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import org.apache.olingo.odata2.api.edm.EdmElement; import org.apache.olingo.odata2.api.edm.EdmException; import org.apache.olingo.odata2.api.edm.EdmLiteral; import org.apache.olingo.odata2.api.edm.EdmLiteralKind; @@ -87,16 +88,18 @@ public class ODataExpressionParser { */ public static String parseToJPAWhereExpression(final CommonExpression whereExpression, final String tableAlias) throws ODataException { - return parseToJPAWhereExpression(whereExpression, tableAlias, 1, new ConcurrentHashMap<Integer,Object>()); + EdmMapping edmMapping = null; + return parseToJPAWhereExpression(whereExpression, tableAlias, 1, + new ConcurrentHashMap<Integer,Object>(), edmMapping); } public static String parseToJPAWhereExpression(final CommonExpression whereExpression, final String tableAlias, - int index, Map<Integer,Object> positionalParameters) throws ODataException { + int index, Map<Integer,Object> positionalParameters,EdmMapping edmMapping) throws ODataException { switch (whereExpression.getKind()) { case UNARY: final UnaryExpression unaryExpression = (UnaryExpression) whereExpression; final String operand = parseToJPAWhereExpression(unaryExpression.getOperand(), tableAlias, - index, positionalParameters); + index, positionalParameters, edmMapping); switch (unaryExpression.getOperator()) { case NOT: @@ -114,7 +117,7 @@ public class ODataExpressionParser { case FILTER: return parseToJPAWhereExpression(((FilterExpression) whereExpression).getExpression(), tableAlias, - index, positionalParameters); + index, positionalParameters, edmMapping); case BINARY: final BinaryExpression binaryExpression = (BinaryExpression) whereExpression; MethodOperator operator = null; @@ -128,9 +131,10 @@ public class ODataExpressionParser { } } final String left = parseToJPAWhereExpression(binaryExpression.getLeftOperand(), tableAlias, - getIndexValue(index, positionalParameters), positionalParameters); + getIndexValue(index, positionalParameters), positionalParameters, edmMapping); + edmMapping = getEdmMapping(binaryExpression); final String right = parseToJPAWhereExpression(binaryExpression.getRightOperand(), tableAlias, - getIndexValue(index, positionalParameters), positionalParameters); + getIndexValue(index, positionalParameters), positionalParameters, edmMapping); // Special handling for STARTSWITH and ENDSWITH method expression if (operator != null && (operator == MethodOperator.STARTSWITH || operator == MethodOperator.ENDSWITH)) { @@ -236,19 +240,20 @@ public class ODataExpressionParser { final LiteralExpression literal = (LiteralExpression) whereExpression; final EdmSimpleType literalType = (EdmSimpleType) literal.getEdmType(); EdmLiteral uriLiteral = EdmSimpleTypeKind.parseUriLiteral(literal.getUriLiteral()); - return evaluateComparingExpression(uriLiteral.getLiteral(), literalType, null, + Class<?> edmMap = edmMapping != null ?((JPAEdmMappingImpl)edmMapping).getJPAType(): null; + return evaluateComparingExpression(uriLiteral.getLiteral(), literalType, edmMap, positionalParameters, index); case METHOD: final MethodExpression methodExpression = (MethodExpression) whereExpression; String first = parseToJPAWhereExpression(methodExpression.getParameters().get(0), tableAlias, - getIndexValue(index, positionalParameters), positionalParameters); + getIndexValue(index, positionalParameters), positionalParameters, edmMapping); String second = methodExpression.getParameterCount() > 1 ? parseToJPAWhereExpression(methodExpression.getParameters().get(1), - tableAlias, getIndexValue(index, positionalParameters), positionalParameters) : null; + tableAlias, getIndexValue(index, positionalParameters), positionalParameters, edmMapping) : null; String third = methodExpression.getParameterCount() > 2 ? parseToJPAWhereExpression(methodExpression.getParameters().get(2), - tableAlias, getIndexValue(index, positionalParameters), positionalParameters) : null; + tableAlias, getIndexValue(index, positionalParameters), positionalParameters, edmMapping) : null; switch (methodExpression.getMethod()) { case SUBSTRING: @@ -280,6 +285,17 @@ public class ODataExpressionParser { } } + private static EdmMapping getEdmMapping(BinaryExpression binaryExpression) throws EdmException { + if(binaryExpression!=null && binaryExpression.getLeftOperand() instanceof PropertyExpression){ + PropertyExpression left = (PropertyExpression)binaryExpression.getLeftOperand(); + if(left != null && left.getEdmProperty() instanceof EdmElement){ + EdmElement property = (EdmElement)left.getEdmProperty(); + return property.getMapping(); + } + } + return null; + } + private static int getIndexValue(int index, Map<Integer, Object> map) { if (map != null && !map.isEmpty()) { for (Entry<Integer, Object> entry : map.entrySet()) { @@ -367,7 +383,7 @@ public class ODataExpressionParser { try { if (orderBy.getExpression().getKind() == ExpressionKind.MEMBER) { orderByField = parseToJPAWhereExpression(orderBy.getExpression(), tableAlias, 1, - new ConcurrentHashMap<Integer, Object>()); + new ConcurrentHashMap<Integer, Object>(), null); } else { orderByField = tableAlias + JPQLStatement.DELIMITER.PERIOD + getPropertyName(orderBy.getExpression()); } http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/962d787c/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java index 3b8176c..aa0d98d 100644 --- a/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java +++ b/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/jpql/JPQLSelectContext.java @@ -185,7 +185,7 @@ public class JPQLSelectContext extends JPQLContext implements JPQLSelectContextV } whereExpression = ODataExpressionParser.parseToJPAWhereExpression( entitySetView.getFilter(), getJPAEntityAlias(), - previousIndex, new ConcurrentHashMap<Integer, Object>()); + previousIndex, new ConcurrentHashMap<Integer, Object>(), null); } else { whereExpression = ODataExpressionParser.parseToJPAWhereExpression( entitySetView.getFilter(), getJPAEntityAlias());