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 2008/09/06 05:47:41 UTC

svn commit: r692609 - in /openjpa/trunk: openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persiste...

Author: fancy
Date: Fri Sep  5 20:47:40 2008
New Revision: 692609

URL: http://svn.apache.org/viewvc?rev=692609&view=rev
Log:
OPENJPA-712 Not correctly parsing the "having" clause with aggregate functions (ie. max, min, etc)
Committing patch provided by Fay Wang

Modified:
    openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Magazine.java

Modified: openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt?rev=692609&r1=692608&r2=692609&view=diff
==============================================================================
--- openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt (original)
+++ openjpa/trunk/openjpa-kernel/src/main/jjtree/org/apache/openjpa/kernel/jpql/JPQL.jjt Fri Sep  5 20:47:40 2008
@@ -729,7 +729,7 @@
 
 void null_comparison_expression() #ISNULL : { }
 {
-	(input_parameter() | path())
+	(input_parameter() | path() | aggregate_select_expression())
 	<IS> [<NOT> { jjtThis.not = true; }] <NULL> 
 }
 
@@ -931,7 +931,7 @@
 
 void datetime_primary() : { }
 {
-	path() | functions_returning_datetime() | input_parameter()
+	path() | functions_returning_datetime() | input_parameter() | aggregate_select_expression()
 }
 
 

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java?rev=692609&r1=692608&r2=692609&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/TestMultipleEntityProjection.java Fri Sep  5 20:47:40 2008
@@ -18,6 +18,11 @@
  */
 package org.apache.openjpa.persistence.jdbc.query;
 
+import java.sql.Timestamp;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
 import javax.persistence.EntityManager;
@@ -72,6 +77,15 @@
 				Publisher pub = new Publisher();
 				pub.setName(pubName);
 				mag.setPublisher(pub);
+				try {
+					DateFormat df = new SimpleDateFormat ("yyyy-MM-dd");
+					Date date = df.parse("2001-01-01");
+					mag.setDatePublished(date);
+				} catch (ParseException e) {
+					mag.setDatePublished(null);
+				}
+				mag.setTsPublished(new Timestamp(System.currentTimeMillis()));
+				
 				em.persist(pub);
 			}
 			em.persist(mag);
@@ -134,6 +148,24 @@
 		}
 	}
 	
+	public void testAggregateExpressionInHavingExpression() {
+        String jpql = "select m.publisher, max(m.datePublished) " + 
+					  "from Magazine m group by m.publisher " + 
+					  "having max(m.datePublished) is null";
+		
+		EntityManager em = emf.createEntityManager();
+		Query query = em.createQuery(jpql);
+		List result = query.getResultList();
+		assertTrue(result.isEmpty());
+		
+        jpql = "select m.publisher, max(m.datePublished) " + 
+		       "from Magazine m group by m.publisher " + 
+		       "having max(m.tsPublished) = CURRENT_TIMESTAMP";
+		query = em.createQuery(jpql);
+		result = query.getResultList();
+		assertTrue(result.isEmpty());
+	}
+	
 	/**
 	 * Count number of expected result based on inner/outer join condition and
 	 * the name of the Magazine.

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Magazine.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Magazine.java?rev=692609&r1=692608&r2=692609&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Magazine.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/domain/Magazine.java Fri Sep  5 20:47:40 2008
@@ -18,6 +18,9 @@
  */
 package org.apache.openjpa.persistence.jdbc.query.domain;
 
+import java.sql.Timestamp;
+import java.util.Date;
+
 import javax.persistence.*;
 
 /**
@@ -38,6 +41,10 @@
 	@OneToOne
 	private Publisher publisher;
 
+	private Date datePublished;
+
+	private Timestamp tsPublished;
+	
 	public String getName() {
 		return name;
 	}
@@ -58,4 +65,20 @@
 		this.publisher = publisher;
 	}
 
+	public Date getDatePublished() {
+		return datePublished;
+	}
+
+	public void setDatePublished(Date datePublished) {
+		this.datePublished = datePublished;
+	}
+
+	public Date getTsPublished() {
+		return tsPublished;
+	}
+
+	public void setTsPublished(Timestamp tsPublished) {
+		this.tsPublished = tsPublished;
+	}
+	
 }