Repository: olingo-odata2 Updated Branches: refs/heads/master 04a45ec92 -> 1f9dbe462
[OLINGO-1297] JPA NE Handling with special character Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/1f9dbe46 Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/1f9dbe46 Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/1f9dbe46 Branch: refs/heads/master Commit: 1f9dbe4623cdb9e7a6a6b98bf79ac8f3f5da7b30 Parents: 04a45ec Author: Archana Rai <archana....@sap.com> Authored: Wed Sep 26 15:38:14 2018 +0530 Committer: Archana Rai <archana....@sap.com> Committed: Wed Sep 26 15:38:14 2018 +0530 ---------------------------------------------------------------------- .../jpa/processor/core/ODataExpressionParser.java | 11 ++++++++++- .../core/ODataFilterExpressionParserTest.java | 18 +++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1f9dbe46/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 b417627..182a2da 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 @@ -171,11 +171,20 @@ public class ODataExpressionParser { + (!"null".equals(right) ? JPQLStatement.Operator.EQ : "IS") + JPQLStatement.DELIMITER.SPACE + right + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; case NE: + EdmSimpleType edmType = (EdmSimpleType)((BinaryExpression)whereExpression).getLeftOperand().getEdmType(); + if(EdmSimpleTypeKind.String.getEdmSimpleTypeInstance().isCompatible(edmType)){ + return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + + (!"null".equals(right) ? + JPQLStatement.Operator.NOT +JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.LIKE : + "IS" + JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.NOT) + + JPQLStatement.DELIMITER.SPACE + right + ("null".equals(right) ? "" :" ESCAPE '\\'") + + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; + } return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE + (!"null".equals(right) ? JPQLStatement.Operator.NE : "IS" + JPQLStatement.DELIMITER.SPACE + JPQLStatement.Operator.NOT) - + JPQLStatement.DELIMITER.SPACE + right + + JPQLStatement.DELIMITER.SPACE + right + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT; case LT: return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/1f9dbe46/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java ---------------------------------------------------------------------- diff --git a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java index 87bda2f..a268778 100644 --- a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java +++ b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java @@ -49,9 +49,10 @@ public class ODataFilterExpressionParserTest { private static final String ENTITY_NOTE = "Note"; // Index 0 - Is test input and Index 1 - Is expected output private static final String[] EXPRESSION_EQ = { "id eq '123'", "(E1.id LIKE '123' ESCAPE '\\')" }; - private static final String[] EXPRESSION_NE = { "id ne '123'", "(E1.id <> '123')" }; - private static final String[] EXPRESSION_ESCAPE = { "id ne '123''22'", "(E1.id <> '123''22')" }; - private static final String[] EXPRESSION_BINARY_AND = + private static final String[] EXPRESSION_NE = { "id ne '123'", "(E1.id NOT LIKE '123' ESCAPE '\\')" }; + private static final String[] EXPRESSION_NE_SPECIAL = { "id ne '1_3'", "(E1.id NOT LIKE '1_3' ESCAPE '\\')" }; + private static final String[] EXPRESSION_ESCAPE = { "id ne '123''22'", "(E1.id NOT LIKE '123''22' ESCAPE '\\')" }; + private static final String[] EXPRESSION_BINARY_AND = { "id le '123' and soId eq 123L and not (substringof(id,'123') eq false) eq true", "(((E1.id <= '123') AND (E1.soId = 123)) AND (NOT(((CASE WHEN ('123' LIKE CONCAT('%',CONCAT(E1.id,'%')" @@ -97,8 +98,8 @@ public class ODataFilterExpressionParserTest { "(E1.id LIKE CONCAT('%','Str''eet') ESCAPE '\\' )" }; private static final String[] EXPRESSION_PRECEDENCE = { "id eq '123' and id ne '123' or (id eq '123' and id ne '123')", - "(((E1.id LIKE '123' ESCAPE '\\') AND (E1.id <> '123')) OR ((E1.id LIKE '123' ESCAPE '\\') " - + "AND (E1.id <> '123')))" }; + "(((E1.id LIKE '123' ESCAPE '\\') AND (E1.id NOT LIKE '123' ESCAPE '\\')) OR ((E1.id LIKE '123' ESCAPE '\\') " + + "AND (E1.id NOT LIKE '123' ESCAPE '\\')))" }; private static final String[] EXPRESSION_DATETIME = { "date eq datetime'2000-01-01T00:00:00'", "(E1.date = 2000-01-01 00:00:00.000)" }; @@ -276,6 +277,13 @@ public class ODataFilterExpressionParserTest { whereExpression = replacePositionalParameters(whereExpression); assertEquals(EXPRESSION_NE[OUTPUT], whereExpression); } + + @Test + public void testNeSpecialRelation() { + String whereExpression = parseWhereExpression(EXPRESSION_NE_SPECIAL[INPUT], false); + whereExpression = replacePositionalParameters(whereExpression); + assertEquals(EXPRESSION_NE_SPECIAL[OUTPUT], whereExpression); + } @Test public void testBinaryAnd() {