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 2009/04/10 04:51:32 UTC

svn commit: r763860 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/ openjpa-persistence-jdbc/...

Author: faywang
Date: Fri Apr 10 02:51:31 2009
New Revision: 763860

URL: http://svn.apache.org/viewvc?rev=763860&view=rev
Log:
OPENJPA-1024: add enum literal support for case expression

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Literal.java
    openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/jpql/JPQLExpressionBuilder.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?rev=763860&r1=763859&r2=763860&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Fri Apr 10 02:51:31 2009
@@ -446,8 +446,10 @@
                     value.append("1");
                 else
                     value.append("0");
-            }
-            else
+            } else if (lit.getParseType() == Literal.TYPE_ENUM) {
+                value.append("'").append(((Enum) lit.getValue()).name()).
+                    append("'");
+            } else
                 value.append(lit.getValue().toString());
             lit.setValue(new Raw(value.toString()));
             return lit;
@@ -470,6 +472,7 @@
         Exp[] exps = new Exp[exp.length];
         for (int i = 0; i < exp.length; i++)
             exps[i] = (Exp) exp[i];
+        val = getLiteralRawString(val);
         return new GeneralCaseExpression(exps, (Val) val);
     }
 

Modified: openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Literal.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Literal.java?rev=763860&r1=763859&r2=763860&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Literal.java (original)
+++ openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/Literal.java Fri Apr 10 02:51:31 2009
@@ -33,6 +33,7 @@
     public static final int TYPE_STRING = 3;
     public static final int TYPE_SQ_STRING = 4; // single-quoted string
     public static final int TYPE_CLASS = 5;
+    public static final int TYPE_ENUM = 6;
 
     /**
      * The value of this literal.

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=763860&r1=763859&r2=763860&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 Apr 10 02:51:31 2009
@@ -1560,11 +1560,11 @@
         Class c = resolver.classForName(className, null);
         if (c != null) {
             String fieldName = lastChild(node).text;
-
+            int type = (c.isEnum() ? Literal.TYPE_ENUM : Literal.TYPE_UNKNOWN);
             try {
                 Field field = c.getField(fieldName);
                 Object value = field.get(null);
-                return factory.newLiteral(value, Literal.TYPE_UNKNOWN);
+                return factory.newLiteral(value, type);
             } catch (NoSuchFieldException nsfe) {
                 if (node.inEnumPath)
                     throw parseException(EX_USER, "no-field",

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java?rev=763860&r1=763859&r2=763860&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/common/apps/CompUser.java Fri Apr 10 02:51:31 2009
@@ -48,7 +48,11 @@
 	@Id
 	@GeneratedValue(strategy=GenerationType.AUTO)
 	public int userid;
-
+	
+    @Enumerated
+    @Basic
+    private CreditRating creditRating;
+	
 	public CompUser(){}
 
 	public CompUser(String name, String cName, Address address, int age)
@@ -95,4 +99,13 @@
 		this.age = age;
 	}
 
+    public CreditRating getRating() {
+        return creditRating;
+    }
+    
+    public void setRating(CreditRating rating) {
+        this.creditRating = rating;
+    }
+	
+    public enum CreditRating { POOR, GOOD, EXCELLENT };
 }

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java?rev=763860&r1=763859&r2=763860&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java Fri Apr 10 02:51:31 2009
@@ -187,6 +187,33 @@
         int result = em.createQuery(update).executeUpdate();
 
         assertEquals("the result is not 6", 6, result);
+        
+        String query2 = "SELECT e.name, e.age+1 as cage, " +
+            "CASE WHEN e.address.country = 'USA' " +
+            " THEN 'United-States' " +
+            " ELSE 'Non United-States'  END as d2," +
+            " e.address.country " +
+            " FROM CompUser e ORDER BY cage, d2 DESC";
+        List rs2 = em.createQuery(query2).getResultList();
+        Object[] result2 = (Object[]) rs2.get(rs2.size()-1);
+        assertEquals("the name is not seetha", "Seetha", result2[0]);
+        assertEquals("the country is not 'Non United-States'", 
+            "Non United-States", result2[2]);
+        
+        String query3 = " select e.name, " +
+            "CASE WHEN e.age = 11 THEN " +
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
+            " WHEN e.age = 35 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.GOOD" +
+            " ELSE " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.EXCELLENT" +
+            " END FROM CompUser e ORDER BY e.age";
+
+        List rs3 = em.createQuery(query3).getResultList();
+        Object[] result3 = (Object[]) rs3.get(0);
+        assertEquals("the name is not Jacob", "Jacob", result3[0]);
+        assertEquals("the credit rating is not 'POOR'", "POOR", result3[1]);
+
         endTx(em);
         endEm(em);
     }