You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ar...@apache.org on 2018/12/04 07:52:57 UTC
olingo-odata2 git commit: [Olingo-1228]JPA Parameterization issue
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 <ar...@sap.com>
Authored: Tue Dec 4 13:22:45 2018 +0530
Committer: Archana Rai <ar...@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());