[OLINGO-1297] JPA NE Handling with special character
authorArchana Rai <archana.rai@sap.com>
Wed, 26 Sep 2018 10:08:14 +0000 (15:38 +0530)
committerArchana Rai <archana.rai@sap.com>
Wed, 26 Sep 2018 10:08:14 +0000 (15:38 +0530)
odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java
odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/ODataFilterExpressionParserTest.java

index b417627..182a2da 100644 (file)
@@ -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
index 87bda2f..a268778 100644 (file)
@@ -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() {