Author: struberg
Date: Sun May 20 20:41:56 2012
New Revision: 1340835
URL: http://svn.apache.org/viewvc?rev=1340835&view=rev
Log:
OPENJPA-2179 provide unit test (disabled)
please remove the 'disabled' from the disabledtestJoinOnly
test method to verify the bug.
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/distinctjoin/TestDistinctJoin.java
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/distinctjoin/TestDistinctJoin.java
URL:
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/distinctjoin/TestDistinctJoin.java?rev=1340835&r1=1340834&r2=1340835&view=diff
==============================================================================
---
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/distinctjoin/TestDistinctJoin.java
(original)
+++
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/distinctjoin/TestDistinctJoin.java
Sun May 20 20:41:56 2012
@@ -22,38 +22,31 @@ import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import java.sql.SQLException;
+import java.util.ArrayList;
import java.util.List;
+import org.apache.openjpa.lib.jdbc.JDBCListener;
import org.apache.openjpa.lib.log.Log;
import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
import org.apache.openjpa.persistence.test.AbstractPersistenceTestCase;
+import org.apache.openjpa.persistence.test.FilteringJDBCListener;
/**
* This test case demonstrates that we currently do way too much sub selects
- * on Oracle if @Embedded fields with a @Lob are involved.
+ * if @Embedded fields with a @Lob are involved.
*
* For running the test you can use the following commandline in
* openjpa-persistence-jdbc:
*
- *
- * <pre>
- * mvn clean test -Dtest=TestOracleDistinctJoin -Doracle.artifactid=ojdbc14
-Doracle.version=10.2.0.4.0
- * -Dopenjpa.oracle.url="jdbc:oracle:thin:@192.168.1.6/XE"
- * -Dopenjpa.oracle.username=username
-Dopenjpa.oracle.password=yourpwd
- * -Dopenjpa.Log=DefaultLevel=TRACE -Dtest-oracle
- * </pre>
- *
- * Of course you need to set the correct IP address, username and password of
your Oracle server.
- * This also assumes that you have downloaded the oracle JDBC driver and
locally installed it to maven.
*/
public class TestDistinctJoin extends AbstractPersistenceTestCase {
- private static String projectStr = "project";
+ protected List<String> sql = new ArrayList<String>();
private Log log;
-
+ @Override
public void setUp() throws SQLException {
OpenJPAEntityManagerFactorySPI emf = createEMF();
@@ -62,13 +55,32 @@ public class TestDistinctJoin extends Ab
emf.close();
}
- public void testJoinOnly() throws SQLException {
+ /**
+ * Gets the number of SQL issued since last reset.
+ */
+ public int getSQLCount() {
+ return sql.size();
+ }
+
+ /**
+ * Resets SQL count.
+ * @return number of SQL counted since last reset.
+ */
+ public int resetSQL() {
+ int tmp = sql.size();
+ sql.clear();
+ return tmp;
+ }
+
+ public void disabledtestJoinOnly() throws SQLException {
OpenJPAEntityManagerFactorySPI emf =
createEMF(Course.class, Lecturer.class, LocalizedText.class,
"openjpa.jdbc.SchemaFactory", "native",
"openjpa.jdbc.SynchronizeMappings",
"buildSchema(ForeignKeys=true)",
"openjpa.jdbc.QuerySQLCache", "false",
- "openjpa.DataCache", "false" );
+ "openjpa.DataCache", "false",
+ "openjpa.jdbc.JDBCListeners", new JDBCListener[] { new
FilteringJDBCListener(sql) }
+ );
Long id;
@@ -121,65 +133,78 @@ public class TestDistinctJoin extends Ab
em.close();
}
+ String msg;
+
{
- log.info("\n\nDistinct and Join"); // this one does sub-selects
for LocalizedString and changeLog
+ msg = "Distinct and Join";
+ log.info("\n\n" + msg); // this one does sub-selects for
LocalizedString and changeLog
EntityManager em = emf.createEntityManager();
EntityTransaction tran = em.getTransaction();
tran.begin();
+ resetSQL();
Query q = em.createQuery("select distinct c from Course c join
c.lecturers l ");
List<Course> courses = q.getResultList();
assertFalse(courses.isEmpty());
assertNotNull(courses.get(0));
+ assertMaxQueries(msg, 2);
tran.commit();
em.close();
}
{
- log.info("\n\nDistinct"); // creates NO sub-query!
+ msg = "Distinct"; // creates NO sub-query!
+ log.info("\n\n" + msg);
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select distinct c from Course c");
List<Course> courses = q.getResultList();
assertFalse(courses.isEmpty());
assertNotNull(courses.get(0));
+ assertMaxQueries(msg, 2);
em.close();
}
{
- log.info("\n\nJoin"); // creates NO sub-query!
+ msg = "Join"; // creates NO sub-query!
+ log.info("\n\n" + msg);
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select c from Course c join c.lecturers
l ");
List<Course> courses = q.getResultList();
assertFalse(courses.isEmpty());
assertNotNull(courses.get(0));
+ assertMaxQueries(msg, 2);
em.close();
}
{
- log.info("\n\nDistinct inverse join"); // this one does
sub-selects for LocalizedString and changeLog
+ msg = "Distinct inverse join"; // this one does sub-selects for
LocalizedString and changeLog
+ log.info("\n\n" + msg);
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select distinct c from Lecturer l join
l.course c");
List<Course> courses = q.getResultList();
assertFalse(courses.isEmpty());
assertNotNull(courses.get(0));
+ assertMaxQueries(msg, 2);
em.close();
}
{
- log.info("\n\nInverse join"); // this one does sub-selects for
LocalizedString and changeLog
+ msg = "Inverse join"; // this one does sub-selects for
LocalizedString and changeLog
+ log.info("\n\n" + msg);
EntityManager em = emf.createEntityManager();
Query q = em.createQuery("select c from Lecturer l join l.course
c");
List<Course> courses = q.getResultList();
assertFalse(courses.isEmpty());
assertNotNull(courses.get(0));
+ assertMaxQueries(msg, 2);
em.close();
}
@@ -187,4 +212,18 @@ public class TestDistinctJoin extends Ab
emf.close();
}
+
+ private void assertMaxQueries(String msg, int queriesAllowed) {
+ int queryCount = getSQLCount();
+ if (queryCount > queriesAllowed) {
+ StringBuilder sb = new StringBuilder("The following queries got
executed\n");
+ for (String query : sql) {
+ sb.append(query).append('\n');
+ }
+ log.error(sb.toString());
+
+ fail("got too many queries executed(" + queryCount + ") but only "
+ queriesAllowed+ " expected in " + msg);
+ }
+ resetSQL();
+ }
}