You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@olingo.apache.org by ch...@apache.org on 2014/11/26 10:14:51 UTC

[1/2] olingo-odata2 git commit: [OLINGO-451] Support for StartsWith and EndsWith OData Methods in JPA processor

Repository: olingo-odata2
Updated Branches:
  refs/heads/master 1d150017e -> 8cbf30638


[OLINGO-451] Support for StartsWith and EndsWith OData Methods in JPA
processor


Signed-off-by: Chandan V A <ch...@sap.com>

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

Branch: refs/heads/master
Commit: edd8c0646d0552dd0ef46d076edfb3f87475fb66
Parents: 413bde2
Author: Chandan V A <ch...@sap.com>
Authored: Wed Nov 26 14:43:13 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Wed Nov 26 14:43:13 2014 +0530

----------------------------------------------------------------------
 .../api/exception/ODataJPARuntimeException.java |  2 +
 .../processor/core/ODataExpressionParser.java   | 44 ++++++++++++++++----
 .../main/resources/jpaprocessor_msg.properties  |  1 +
 3 files changed, 38 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/edd8c064/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
index 9863544..0b9c3b2 100644
--- a/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
+++ b/odata2-jpa-processor/jpa-api/src/main/java/org/apache/olingo/odata2/jpa/processor/api/exception/ODataJPARuntimeException.java
@@ -70,6 +70,8 @@ public class ODataJPARuntimeException extends ODataJPAException {
       "ERROR_JPA_BLOB_NULL");
   public static final MessageReference ERROR_JPA_CLOB_NULL = createMessageReference(ODataJPARuntimeException.class,
       "ERROR_JPA_CLOB_NULL");
+  public static final MessageReference OPERATOR_EQ_NE_MISSING = createMessageReference(ODataJPARuntimeException.class,
+      "OPERATOR_EQ_NE_MISSING");
 
   private ODataJPARuntimeException(final String localizedMessage, final Throwable e, final MessageReference msgRef) {
     super(localizedMessage, e, msgRef);

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/edd8c064/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 5510fde..8188a72 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
@@ -61,7 +61,7 @@ import org.apache.olingo.odata2.jpa.processor.api.jpql.JPQLStatement;
 public class ODataExpressionParser {
 
   public static final String EMPTY = ""; //$NON-NLS-1$
-  public static Integer methodFlag = 0;
+  public static final ThreadLocal<Integer> methodFlag = new ThreadLocal<Integer>();
 
   /**
    * This method returns the parsed where condition corresponding to the filter input in the user query.
@@ -97,15 +97,34 @@ public class ODataExpressionParser {
       return parseToJPAWhereExpression(((FilterExpression) whereExpression).getExpression(), tableAlias);
     case BINARY:
       final BinaryExpression binaryExpression = (BinaryExpression) whereExpression;
-      if ((binaryExpression.getLeftOperand().getKind() == ExpressionKind.METHOD)
-          && ((binaryExpression.getOperator() == BinaryOperator.EQ) ||
-          (binaryExpression.getOperator() == BinaryOperator.NE))
-          && (((MethodExpression) binaryExpression.getLeftOperand()).getMethod() == MethodOperator.SUBSTRINGOF)) {
-        methodFlag = 1;
+      MethodOperator operator = null;
+      if (binaryExpression.getLeftOperand().getKind() == ExpressionKind.METHOD) {
+        operator = ((MethodExpression) binaryExpression.getLeftOperand()).getMethod();
+      }
+      if (operator != null && ((binaryExpression.getOperator() == BinaryOperator.EQ) ||
+          (binaryExpression.getOperator() == BinaryOperator.NE))) {
+        if (operator == MethodOperator.SUBSTRINGOF) {
+          methodFlag.set(1);
+        }
       }
       final String left = parseToJPAWhereExpression(binaryExpression.getLeftOperand(), tableAlias);
       final String right = parseToJPAWhereExpression(binaryExpression.getRightOperand(), tableAlias);
 
+      // Special handling for STARTSWITH and ENDSWITH method expression
+      if (operator != null && (operator == MethodOperator.STARTSWITH || operator == MethodOperator.ENDSWITH)) {
+        if (!binaryExpression.getOperator().equals(BinaryOperator.EQ)) {
+          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;
+        }
+      }
       switch (binaryExpression.getOperator()) {
       case AND:
         return JPQLStatement.DELIMITER.PARENTHESIS_LEFT + left + JPQLStatement.DELIMITER.SPACE
@@ -143,6 +162,7 @@ public class ODataExpressionParser {
         throw new ODataNotImplementedException();
       default:
         throw new ODataNotImplementedException();
+
       }
 
     case PROPERTY:
@@ -183,7 +203,7 @@ public class ODataExpressionParser {
     case METHOD:
       final MethodExpression methodExpression = (MethodExpression) whereExpression;
       String first = parseToJPAWhereExpression(methodExpression.getParameters().get(0), tableAlias);
-      final String second =
+      String second =
           methodExpression.getParameterCount() > 1 ? parseToJPAWhereExpression(methodExpression.getParameters().get(1),
               tableAlias) : null;
       String third =
@@ -196,14 +216,20 @@ public class ODataExpressionParser {
         return String.format("SUBSTRING(%s, %s + 1 %s)", first, second, third);
       case SUBSTRINGOF:
         first = first.substring(1, first.length() - 1);
-        if (methodFlag == 1) {
-          methodFlag = 0;
+        if (methodFlag.get() == 1) {
+          methodFlag.set(0);
           return String.format("(CASE WHEN (%s LIKE '%%%s%%') THEN TRUE ELSE FALSE END)", second, first);
         } else {
           return String.format("(CASE WHEN (%s LIKE '%%%s%%') THEN TRUE ELSE FALSE END) = true", second, first);
         }
       case TOLOWER:
         return String.format("LOWER(%s)", first);
+      case STARTSWITH:
+        second = second.substring(1, second.length() - 1);
+        return String.format("%s LIKE '%s%%'", first, second);
+      case ENDSWITH:
+        second = second.substring(1, second.length() - 1);
+        return String.format("%s LIKE '%%%s'", first, second);
       default:
         throw new ODataNotImplementedException();
       }

http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/edd8c064/odata2-jpa-processor/jpa-core/src/main/resources/jpaprocessor_msg.properties
----------------------------------------------------------------------
diff --git a/odata2-jpa-processor/jpa-core/src/main/resources/jpaprocessor_msg.properties b/odata2-jpa-processor/jpa-core/src/main/resources/jpaprocessor_msg.properties
index 7788d49..29c1006 100644
--- a/odata2-jpa-processor/jpa-core/src/main/resources/jpaprocessor_msg.properties
+++ b/odata2-jpa-processor/jpa-core/src/main/resources/jpaprocessor_msg.properties
@@ -57,6 +57,7 @@ org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException.RE
 org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException.RESOURCE_X_NOT_FOUND="OData - JPA Runtime: Resource [%1$s] not found"
 org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException.ERROR_JPA_BLOB_NULL="OData - JPA Runtime: Blob data type is null. Initialize Blob type by implementing callback interface org.apache.olingo.odata2.jpa.processor.api.OnJPAWriteContent.
 org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException.ERROR_JPA_CLOB_NULL="OData - JPA Runtime: Clob data type is null. Initialize Clob type by implementing callback interface org.apache.olingo.odata2.jpa.processor.api.OnJPAWriteContent.
+org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPARuntimeException.OPERATOR_EQ_NE_MISSING="OData - JPA Runtime: OData Expression parser - Operator EQ or NE missing"
 
 #JPA Common Errors
 org.apache.olingo.odata2.jpa.processor.api.exception.ODataJPAException.ODATA_JPACTX_NULL="OData JPA: OData JPA Context cannot be null"


[2/2] olingo-odata2 git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/olingo-odata2

Posted by ch...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/olingo-odata2


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

Branch: refs/heads/master
Commit: 8cbf30638ce2e0467cb32dc27d38c0e4c3ae4371
Parents: edd8c06 1d15001
Author: Chandan V A <ch...@sap.com>
Authored: Wed Nov 26 14:43:31 2014 +0530
Committer: Chandan V A <ch...@sap.com>
Committed: Wed Nov 26 14:43:31 2014 +0530

----------------------------------------------------------------------
 .../jpa/processor/api/jpql/JPQLSelectContextView.java     | 10 ++++++----
 .../odata2/jpa/processor/core/ODataExpressionParser.java  |  3 ++-
 2 files changed, 8 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/olingo-odata2/blob/8cbf3063/odata2-jpa-processor/jpa-core/src/main/java/org/apache/olingo/odata2/jpa/processor/core/ODataExpressionParser.java
----------------------------------------------------------------------