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/14 15:53:42 UTC

svn commit: r764779 - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/p...

Author: faywang
Date: Tue Apr 14 13:53:41 2009
New Revision: 764779

URL: http://svn.apache.org/viewvc?rev=764779&view=rev
Log:
OPENJPA-1024: support case expression in subquery

Modified:
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GeneralCaseExpression.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SimpleCaseExpression.java
    openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GeneralCaseExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GeneralCaseExpression.java?rev=764779&r1=764778&r2=764779&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GeneralCaseExpression.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GeneralCaseExpression.java Tue Apr 14 13:53:41 2009
@@ -28,6 +28,7 @@
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.Filters;
 import org.apache.openjpa.kernel.exps.ExpressionVisitor;
+import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.meta.ClassMetaData;
 
 /**
@@ -42,6 +43,8 @@
     private final Val _val;
     private ClassMetaData _meta = null;
     private Class _cast = null;
+    private Value other = null;
+    private ExpState otherState = null;
 
     /**
      * Constructor.
@@ -158,7 +161,7 @@
     }
 
     private SQLBuffer newSQLBuffer(Select sel, ExpContext ctx, ExpState state) {
-        calculateValue(sel, ctx, state, null, null);
+        calculateValue(sel, ctx, state, (Val)other, otherState);
         SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
         appendTo(sel, ctx, state, buf, 0);
         return buf;
@@ -190,5 +193,20 @@
     public void setMetaData(ClassMetaData meta) {
         _meta = meta;
     }
+    public void setOtherPath(Value other) {
+        this.other = other;
+    }
+    
+    public Value getOtherPath() {
+        return other;
+    }
+    
+    public void setOtherState(ExpState otherState) {
+        this.otherState = otherState;
+    }
+    
+    public ExpState getOtherState() {
+        return otherState;
+    }
 }
 

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SimpleCaseExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SimpleCaseExpression.java?rev=764779&r1=764778&r2=764779&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SimpleCaseExpression.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SimpleCaseExpression.java Tue Apr 14 13:53:41 2009
@@ -29,6 +29,7 @@
 import org.apache.openjpa.jdbc.sql.Select;
 import org.apache.openjpa.kernel.Filters;
 import org.apache.openjpa.kernel.exps.ExpressionVisitor;
+import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.meta.ClassMetaData;
 
 /**
@@ -44,6 +45,8 @@
     private final Val _val;
     private ClassMetaData _meta = null;
     private Class _cast = null;
+    private Value other = null;
+    private ExpState otherState = null;
 
     /**
      * Constructor.
@@ -192,7 +195,7 @@
     }
 
     private SQLBuffer newSQLBuffer(Select sel, ExpContext ctx, ExpState state) {
-        calculateValue(sel, ctx, state, null, null);
+        calculateValue(sel, ctx, state, (Val)other, otherState);
         SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
         appendTo(sel, ctx, state, buf, 0);
         return buf;
@@ -224,5 +227,20 @@
     public void setMetaData(ClassMetaData meta) {
         _meta = meta;
     }
+    public void setOtherPath(Value other) {
+        this.other = other;
+    }
+    
+    public Value getOtherPath() {
+        return other;
+    }
+    
+    public void setOtherState(ExpState otherState) {
+        this.otherState = otherState;
+    }
+    
+    public ExpState getOtherState() {
+        return otherState;
+    }
 }
 

Modified: openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java?rev=764779&r1=764778&r2=764779&view=diff
==============================================================================
--- openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java (original)
+++ openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/SubQ.java Tue Apr 14 13:53:41 2009
@@ -30,6 +30,7 @@
 import org.apache.openjpa.kernel.exps.ExpressionVisitor;
 import org.apache.openjpa.kernel.exps.QueryExpressions;
 import org.apache.openjpa.kernel.exps.Subquery;
+import org.apache.openjpa.kernel.exps.Value;
 import org.apache.openjpa.meta.ClassMetaData;
 
 /**
@@ -149,6 +150,16 @@
 
     public void calculateValue(Select sel, ExpContext ctx, ExpState state, 
         Val other, ExpState otherState) {
+        Value[] projs = _exps.projections;
+        for (int i = 0; i < projs.length; i++) {
+            if (projs[i] instanceof GeneralCaseExpression) {
+                ((GeneralCaseExpression)projs[i]).setOtherPath(other);
+                ((GeneralCaseExpression)projs[i]).setOtherState(otherState);
+            } else if (projs[i] instanceof SimpleCaseExpression) {
+                ((SimpleCaseExpression)projs[i]).setOtherPath(other);
+                ((SimpleCaseExpression)projs[i]).setOtherState(otherState);
+            }
+        }
     }
 
     public int length(Select sel, ExpContext ctx, ExpState state) {

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=764779&r1=764778&r2=764779&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 Tue Apr 14 13:53:41 2009
@@ -157,6 +157,35 @@
         result = (Object[]) rs.get(rs.size()-1);
         assertEquals(result[1], 1);
 
+        startTx(em);
+        String update = "update CompUser c set c.creditRating = " +
+            " CASE c.age WHEN 35 THEN " +
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
+            " WHEN 11 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.GOOD" +
+            " ELSE " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.EXCELLENT" +
+            " END ";
+        int updateCount = em.createQuery(update).executeUpdate();
+        assertEquals("the result is not 6", 6, updateCount);
+
+        /*
+        //Derby fails but DB2 worksh 
+        String update2 = "update CompUser c set c.creditRating = " +
+            " (select " +
+            " CASE c1.age WHEN 10 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
+            " WHEN 19 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.GOOD " +
+            " ELSE " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.EXCELLENT " +
+            " END " +
+            " from CompUser c1" +
+            " where c.userid = c1.userid)";
+        updateCount = em.createQuery(update2).executeUpdate();
+        assertEquals("the result is not 6", 6, updateCount);
+        */
+        endTx(em);
         endEm(em);
     }
 
@@ -231,9 +260,28 @@
             " ELSE " + 
             "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.EXCELLENT " +
             " END "; 
-        result = em.createQuery(update2).executeUpdate();
-        assertEquals("the result is not 6", 6, result);
-
+        int updateCount = em.createQuery(update2).executeUpdate();
+        assertEquals("the result is not 6", 6, updateCount);
+        
+        String query4 = "select e.name, e.creditRating from CompUser e " + 
+            "where e.creditRating = " +
+            "(select " +
+            "CASE WHEN e1.age = 11 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
+            " WHEN e1.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 e1" +
+            " where e.userid = e1.userid) ORDER BY e.age";
+        List rs4 = em.createQuery(query4).getResultList();
+        Object[] result4 = (Object[]) rs4.get(0);
+        assertEquals("the name is not Ugo", "Ugo", result4[0]);
+        assertEquals("the credit rating is not 'EXCELLENT'", "EXCELLENT",
+            ((org.apache.openjpa.persistence.common.apps.CompUser.CreditRating)
+            result4[1]).name());
+        
         String update3 = "update CompUser c set c.creditRating = " +
             " CASE c.age WHEN 35 THEN " +
             "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
@@ -245,7 +293,23 @@
         result = em.createQuery(update3).executeUpdate();
         assertEquals("the result is not 6", 6, result);
 
-    endTx(em);
+        // Derby fails but DB2 works 
+        /*
+        String update4 = "update CompUser c set c.creditRating = " +
+            " (select " +
+            " CASE c1.age WHEN 10 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.POOR" + 
+            " WHEN 19 THEN " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.GOOD" +
+            " ELSE " + 
+            "org.apache.openjpa.persistence.common.apps.CompUser$CreditRating.EXCELLENT" +
+            " END " +
+            " from CompUser c1" +
+            " where c.userid = c1.userid)";
+        updateCount = em.createQuery(update4).executeUpdate();
+        assertEquals("the result is not 6", 6, updateCount);
+        */
+        endTx(em);
         endEm(em);
     }
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java?rev=764779&r1=764778&r2=764779&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/query/TestSubquery.java Tue Apr 14 13:53:41 2009
@@ -115,6 +115,17 @@
         "select o.oid from Order o where o.customer.name in" +
             " (select CONCAT(o.customer.name, 'XX') from Order o" +
             " where o.amount > 10)",            
+        "select c from Customer c where c.creditRating =" +
+            " (select " +
+            "   CASE WHEN o2.amount > 10 THEN " + 
+            "org.apache.openjpa.persistence.query.Customer$CreditRating.POOR" + 
+            "     WHEN o2.amount = 10 THEN " + 
+            "org.apache.openjpa.persistence.query.Customer$CreditRating.GOOD " +
+            "     ELSE " + 
+            "org.apache.openjpa.persistence.query.Customer$CreditRating.EXCELLENT " +
+            "     END " +
+            " from Order o2" +
+            " where c.cid.id = o2.customer.cid.id)",
     };
 
     static String[] updates = new String[] {