Repository: olingo-odata2
Updated Branches:
  refs/heads/master 9435ccd4d -> 85c993f1c


[OLINGO-829] having multiple startswith method in JPA throws Exception


Project: http://git-wip-us.apache.org/repos/asf/olingo-odata2/repo
Commit: http://git-wip-us.apache.org/repos/asf/olingo-odata2/commit/85c993f1
Tree: http://git-wip-us.apache.org/repos/asf/olingo-odata2/tree/85c993f1
Diff: http://git-wip-us.apache.org/repos/asf/olingo-odata2/diff/85c993f1

Branch: refs/heads/master
Commit: 85c993f1ccb3cdbd7d90a26bb1eefee8430b3656
Parents: 9435ccd
Author: ramya vasanth <ramya.vasa...@sap.com>
Authored: Fri Sep 1 10:16:43 2017 +0530
Committer: ramya vasanth <ramya.vasa...@sap.com>
Committed: Fri Sep 1 10:16:43 2017 +0530

----------------------------------------------------------------------
 .../processor/core/ODataExpressionParser.java   | 68 ++++++++++++------
 .../core/ODataFilterExpressionParserTest.java   | 72 ++++++++++++++++++++
 .../core/access/data/JPAEntityTest.java         |  4 +-
 3 files changed, 122 insertions(+), 22 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/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 66190a4..9879e66 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
@@ -18,19 +18,41 @@
  
******************************************************************************/
 package org.apache.olingo.odata2.jpa.processor.core;
 
-import org.apache.olingo.odata2.api.edm.*;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.olingo.odata2.api.edm.EdmException;
+import org.apache.olingo.odata2.api.edm.EdmLiteral;
+import org.apache.olingo.odata2.api.edm.EdmLiteralKind;
+import org.apache.olingo.odata2.api.edm.EdmMapping;
+import org.apache.olingo.odata2.api.edm.EdmNavigationProperty;
+import org.apache.olingo.odata2.api.edm.EdmProperty;
+import org.apache.olingo.odata2.api.edm.EdmSimpleType;
+import org.apache.olingo.odata2.api.edm.EdmSimpleTypeException;
+import org.apache.olingo.odata2.api.edm.EdmSimpleTypeKind;
+import org.apache.olingo.odata2.api.edm.EdmTyped;
 import org.apache.olingo.odata2.api.exception.ODataException;
 import org.apache.olingo.odata2.api.exception.ODataNotImplementedException;
 import org.apache.olingo.odata2.api.uri.KeyPredicate;
-import org.apache.olingo.odata2.api.uri.expression.*;
+import org.apache.olingo.odata2.api.uri.expression.BinaryExpression;
+import org.apache.olingo.odata2.api.uri.expression.BinaryOperator;
+import org.apache.olingo.odata2.api.uri.expression.CommonExpression;
+import org.apache.olingo.odata2.api.uri.expression.ExpressionKind;
+import org.apache.olingo.odata2.api.uri.expression.FilterExpression;
+import org.apache.olingo.odata2.api.uri.expression.LiteralExpression;
+import org.apache.olingo.odata2.api.uri.expression.MemberExpression;
+import org.apache.olingo.odata2.api.uri.expression.MethodExpression;
+import org.apache.olingo.odata2.api.uri.expression.MethodOperator;
+import org.apache.olingo.odata2.api.uri.expression.OrderByExpression;
+import org.apache.olingo.odata2.api.uri.expression.OrderExpression;
+import org.apache.olingo.odata2.api.uri.expression.PropertyExpression;
+import org.apache.olingo.odata2.api.uri.expression.SortOrder;
+import org.apache.olingo.odata2.api.uri.expression.UnaryExpression;
 import 
org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException;
 import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLStatement;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Iterator;
-import java.util.List;
-
 /**
  * This class contains utility methods for parsing the filter expressions 
built by core library from user OData Query.
  *
@@ -91,18 +113,22 @@ public class ODataExpressionParser {
 
       // Special handling for STARTSWITH and ENDSWITH method expression
       if (operator != null && (operator == MethodOperator.STARTSWITH || 
operator == MethodOperator.ENDSWITH)) {
-        if (!binaryExpression.getOperator().equals(BinaryOperator.EQ)) {
+        if (!binaryExpression.getOperator().equals(BinaryOperator.EQ) && 
+            !(binaryExpression.getRightOperand() instanceof LiteralExpression) 
&& 
+            ("true".equals(right) || "false".equals(right))) {
           throw 
ODataJPARuntimeException.throwException(ODataJPARuntimeException.OPERATOR_EQ_NE_MISSING
               .addContent(binaryExpression.getOperator().toString()), null);
-        } else if (right.equals("false")) {
-          return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + 
left.replaceFirst("LIKE", "NOT LIKE")
-              + JPQLStatement.DELIMITER.SPACE
-              + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
-        } else {
-          return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left
-              + JPQLStatement.DELIMITER.SPACE
-              + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
-        }
+        } else if (binaryExpression.getOperator().equals(BinaryOperator.EQ)) {
+          if ("false".equals(right)) {
+            return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + 
left.replaceFirst("LIKE", "NOT LIKE")
+                + JPQLStatement.DELIMITER.SPACE
+                + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
+          } else if ("true".equals(right)){
+            return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left
+                + JPQLStatement.DELIMITER.SPACE
+                + JPQLStatement.DELIMITER.PARENTHESIS_RIGHT;
+          }
+        } 
       }
       switch (binaryExpression.getOperator()) {
       case AND:
@@ -227,9 +253,11 @@ public class ODataExpressionParser {
    * @param first
    */
   private static String updateValueIfWildcards(String value) {
-    value = value.replace("\\", "\\\\");
-    value = value.replace("%", "\\%");
-    value = value.replace("_", "\\_");
+    if (value != null) {
+      value = value.replace("\\", "\\\\");
+      value = value.replace("%", "\\%");
+      value = value.replace("_", "\\_");
+    }
     return value;
   }
   /**

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/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 af798fe..c65dced 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
@@ -99,7 +99,32 @@ public class ODataFilterExpressionParserTest {
   private static final String[] EXPRESSION_NULL = { "date eq null", "(E1.date 
IS null)" };
 
   private static final String[] EXPRESSION_NOT_NULL = { "date ne null", 
"(E1.date IS NOT null)" };
+  
+  private static final String[] EXPRESSION_STARTSWITH_EQBINARY = { 
"startswith(id,'123') and text eq 'abc'", 
+      "(E1.id LIKE CONCAT('123','%') ESCAPE '\\' AND (E1.text = 'abc'))" };
+  
+  private static final String[] EXPRESSION_STARTSWITHEQ_EQBINARY = { 
"startswith(id,'123') eq true and text eq 'abc'", 
+  "((E1.id LIKE CONCAT('123','%') ESCAPE '\\' ) AND (E1.text = 'abc'))" };
+  
+  private static final String[] EXPRESSION_EQBINARY_STARTSWITH = { "text eq 
'abc' and startswith(id,'123')", 
+      "((E1.text = 'abc') AND E1.id LIKE CONCAT('123','%') ESCAPE '\\')" };
+  
+  private static final String[] EXPRESSION_EQBINARY_STARTSWITHEQ = { "text eq 
'abc' and startswith(id,'123') eq true", 
+  "((E1.text = 'abc') AND (E1.id LIKE CONCAT('123','%') ESCAPE '\\' ))" };
 
+  private static final String[] EXPRESSION_STARTSWITH_STARTSWITH = { 
"startswith(text,'abc') and startswith(id,'123')", 
+  "(E1.text LIKE CONCAT('abc','%') ESCAPE '\\' AND E1.id LIKE 
CONCAT('123','%') ESCAPE '\\')" };
+  
+  private static final String[] EXPRESSION_STARTSWITHEQ_STARTSWITHEQ = { 
+      "startswith(text,'abc') eq true and startswith(id,'123') eq true", 
+  "((E1.text LIKE CONCAT('abc','%') ESCAPE '\\' ) AND (E1.id LIKE 
CONCAT('123','%') ESCAPE '\\' ))" };
+  
+  private static final String[] EXPRESSION_STARTSWITH_ANDTRUE = 
{"startswith(text,'abc') and true", 
+      "(E1.text LIKE CONCAT('abc','%') ESCAPE '\\' AND true)"};
+  
+  private static final String[] EXPRESSION_STARTSWITHEQTRUE_ANDTRUE = 
{"startswith(text,'abc') eq true and true", 
+      "((E1.text LIKE CONCAT('abc','%') ESCAPE '\\' ) AND true)"};
+  
   private static Edm edm = null;
 
   @BeforeClass
@@ -243,4 +268,51 @@ public class ODataFilterExpressionParserTest {
     }
     return "";
   }
+  
+  @Test
+  public void testStartsWith_BinaryEq() {
+    assertEquals(EXPRESSION_STARTSWITH_EQBINARY[OUTPUT], parseWhereExpression(
+        EXPRESSION_STARTSWITH_EQBINARY[INPUT], false));
+  }
+  
+  @Test
+  public void testBinaryEq_StartsWith() {
+    assertEquals(EXPRESSION_EQBINARY_STARTSWITH[OUTPUT], parseWhereExpression(
+        EXPRESSION_EQBINARY_STARTSWITH[INPUT], false));
+  }
+  
+  public void testStartsWithEq_BinaryEq() {
+    assertEquals(EXPRESSION_STARTSWITHEQ_EQBINARY[OUTPUT], 
parseWhereExpression(
+        EXPRESSION_STARTSWITHEQ_EQBINARY[INPUT], false));
+  }
+  
+  @Test
+  public void testBinaryEq_StartsWithEq() {
+    assertEquals(EXPRESSION_EQBINARY_STARTSWITHEQ[OUTPUT], 
parseWhereExpression(
+        EXPRESSION_EQBINARY_STARTSWITHEQ[INPUT], false));
+  }
+  
+  @Test
+  public void testStartsWith_StartsWith() {
+    assertEquals(EXPRESSION_STARTSWITH_STARTSWITH[OUTPUT], 
parseWhereExpression(
+        EXPRESSION_STARTSWITH_STARTSWITH[INPUT], false));
+  }
+  
+  @Test
+  public void testStartsWithEq_StartsWithEq() {
+    assertEquals(EXPRESSION_STARTSWITHEQ_STARTSWITHEQ[OUTPUT], 
parseWhereExpression(
+        EXPRESSION_STARTSWITHEQ_STARTSWITHEQ[INPUT], false));
+  }
+  
+  @Test
+  public void testStartsWithEq_AndTrue() {
+    assertEquals(EXPRESSION_STARTSWITHEQTRUE_ANDTRUE[OUTPUT], 
parseWhereExpression(
+        EXPRESSION_STARTSWITHEQTRUE_ANDTRUE[INPUT], false));
+  }
+  
+  @Test
+  public void testStarts_AndTrue() {
+    assertEquals(EXPRESSION_STARTSWITH_ANDTRUE[OUTPUT], parseWhereExpression(
+        EXPRESSION_STARTSWITH_ANDTRUE[INPUT], false));
+  }
 }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/85c993f1/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
----------------------------------------------------------------------
diff --git 
a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
 
b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
index befee61..331a3d2 100644
--- 
a/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
+++ 
b/odata2-jpa-processor/jpa-core/src/test/java/org/apache/olingo/odata2/jpa/processor/core/access/data/JPAEntityTest.java
@@ -352,8 +352,8 @@ public class JPAEntityTest {
 
     assertEquals(jpaEmbeddableMock.getMShort(), 
ODataEntryMockUtil.VALUE_SHORT);
     assertEquals(jpaEmbeddableMock.getMDate().getDate(), 
ODataEntryMockUtil.VALUE_DATE.getDate());
-    assertEquals(jpaEmbeddableMock.getMDate().getTime(), 
ODataEntryMockUtil.VALUE_DATE.getTime());
-    assertEquals(jpaEmbeddableMock.getMDate1(), 
ODataEntryMockUtil.VALUE_DATE1);
+    assertEquals(jpaEmbeddableMock.getMDate().getDay(), 
ODataEntryMockUtil.VALUE_DATE.getDay());
+    assertEquals(jpaEmbeddableMock.getMDate1().getDate(), 
ODataEntryMockUtil.VALUE_DATE1.getDate());
     assertEquals(jpaEmbeddableMock.getMTime(), ODataEntryMockUtil.VALUE_TIME);
     assertEquals(jpaEmbeddableMock.getMTimestamp(), 
ODataEntryMockUtil.VALUE_TIMESTAMP);
     JPATypeEmbeddableMock2 jpaEmbeddableMock2 = 
jpaEmbeddableMock.getMEmbeddable();

Reply via email to