You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by mi...@apache.org on 2010/09/30 21:21:25 UTC

svn commit: r1003209 - in /openjpa/branches/2.0.x: openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java

Author: mikedd
Date: Thu Sep 30 19:21:25 2010
New Revision: 1003209

URL: http://svn.apache.org/viewvc?rev=1003209&view=rev
Log:
OPENJPA-1814: JPQL fails with Group By and Having aggregate_expression IN (subquery)

Modified:
    openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
    openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java

Modified: openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java?rev=1003209&r1=1003208&r2=1003209&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java (original)
+++ openjpa/branches/2.0.x/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ExpressionStoreQuery.java Thu Sep 30 19:21:25 2010
@@ -19,6 +19,8 @@
 package org.apache.openjpa.kernel;
 
 import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -29,6 +31,7 @@ import java.util.Set;
 
 import org.apache.commons.collections.map.LinkedMap;
 import org.apache.openjpa.conf.OpenJPAConfiguration;
+import org.apache.openjpa.kernel.exps.Subquery;
 import org.apache.openjpa.kernel.exps.AbstractExpressionVisitor;
 import org.apache.openjpa.kernel.exps.AggregateListener;
 import org.apache.openjpa.kernel.exps.Constant;
@@ -508,8 +511,28 @@ public class ExpressionStoreQuery
                 for (int i = 0; i < exps.grouping.length; i++)
                     exps.grouping[i].acceptVisit(visitor);
                 visitor._grouping = false;
-                if (exps.having != null)
-                    exps.having.acceptVisit(visitor);
+                if (exps.having != null) {
+                    Class cls = exps.having.getClass();
+                    if (cls.getName().endsWith("Expression"))
+                        cls = cls.getSuperclass();
+                    Object value2 = null;
+                    Method getValue2 = null;
+                    try {
+                        getValue2 = cls.getMethod("getValue2");
+                        getValue2.setAccessible(true);
+                        value2 = getValue2.invoke(exps.having, (Object[]) null);
+                    } catch (NoSuchMethodException name) {
+                        // skip
+                    } catch (IllegalAccessException iae) {
+                        // skip
+                    } catch (InvocationTargetException ite) {
+                        // skip
+                    } 
+                    if (value2 != null && value2 instanceof Subquery)
+                        ;  // complex having with subquery, validation is performed by DBMS
+                    else
+                        exps.having.acceptVisit(visitor);
+                }
                 for (int i = 0; i < exps.projections.length; i++)
                     exps.projections[i].acceptVisit(visitor);
             }

Modified: openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java
URL: http://svn.apache.org/viewvc/openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java?rev=1003209&r1=1003208&r2=1003209&view=diff
==============================================================================
--- openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java (original)
+++ openjpa/branches/2.0.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java Thu Sep 30 19:21:25 2010
@@ -165,6 +165,26 @@ public class TestMultipleEntityProjectio
 		query = em.createQuery(jpql);
 		result = query.getResultList();
 		assertTrue(result.isEmpty());
+
+//      The following JPQL results in syntax error,
+//      see comments in OPENJPA-1814              
+//		jpql = "select m.publisher, max(m.datePublished) " + 
+//		    "from Magazine m group by m.publisher " + 
+//		    "having max(m.tsPublished) IN " + 
+//		    "(select max(m.tsPublished) from Magazine m " +
+//		    "where m.datePublished = CURRENT_TIMESTAMP)";
+//		query = em.createQuery(jpql);
+//		result = query.getResultList();
+//		assertTrue(result.isEmpty());
+
+		jpql = "select m.publisher, max(m.datePublished) " + 
+		    "from Magazine m group by m.publisher " + 
+		    "having max(m.tsPublished) = " + 
+		    "(select max(m.tsPublished) from Magazine m " + 
+		    "where m.datePublished = CURRENT_TIMESTAMP)";
+		query = em.createQuery(jpql);
+		result = query.getResultList();
+		assertTrue(result.isEmpty());
 	}
 	
 	/**