You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2010/07/17 00:39:06 UTC

svn commit: r964967 - /openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java

Author: faywang
Date: Fri Jul 16 22:39:06 2010
New Revision: 964967

URL: http://svn.apache.org/viewvc?rev=964967&view=rev
Log:
OPENJPA-1726: fix the locate and substring for Postgres as it only accepts integer as the start index.

Modified:
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java?rev=964967&r1=964966&r2=964967&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java Fri Jul 16 22:39:06 2010
@@ -1287,7 +1287,12 @@ public class JPQLExpressionBuilder
                 if (node.children.length == 3) {
                     val1 = getValue(child(node, 0, 3));
                     val2 = getValue(child(node, 1, 3));
-                    val3 = getValue(child(node, 2, 3));
+                    JPQLNode child3 = child(node, 2, 3);
+                    if (child3.id == JJTINTEGERLITERAL)
+                        val3 = getIntegerValue(child3);
+                    else
+                        val3 = getValue(child3);
+                    
                 } else if (node.children.length == 2) {
                     val1 = getValue(child(node, 0, 2));
                     val2 = getValue(child(node, 1, 2));
@@ -1306,9 +1311,13 @@ public class JPQLExpressionBuilder
                 Value locatePath = getValue(firstChild(node));
                 Value locateSearch = getValue(secondChild(node));
                 Value locateFromIndex = null;
-                if (node.getChildCount() > 2) // optional start index arg
-                    locateFromIndex = getValue(thirdChild(node));
-
+                if (node.getChildCount() > 2) { // optional start index arg
+                    JPQLNode child3 = thirdChild(node);
+                    if (child3.id == JJTINTEGERLITERAL) {
+                        locateFromIndex = getIntegerValue(child3);
+                    } else
+                        locateFromIndex = getValue(child3);
+                }
                 setImplicitType(locatePath, TYPE_STRING);
                 setImplicitType(locateSearch, TYPE_STRING);
 
@@ -1405,6 +1414,16 @@ public class JPQLExpressionBuilder
         }
     }
     
+    private Value getIntegerValue(JPQLNode node) {
+        BigDecimal bigdec = new BigDecimal
+        (node.text.endsWith("l") || node.text.endsWith("L")
+            ? node.text.substring(0, node.text.length() - 1)
+            : node.text).
+        multiply(new BigDecimal(negative(node)));
+        return factory.newLiteral(Integer.valueOf(bigdec.intValue()),
+                Literal.TYPE_NUMBER);        
+    }
+    
     /**
      * Converts JPQL substring() function to OpenJPA ExpressionFactory 
      * substring() arguments.