Return-Path: Delivered-To: apmail-openjpa-commits-archive@www.apache.org Received: (qmail 14763 invoked from network); 18 Feb 2009 23:27:47 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 18 Feb 2009 23:27:47 -0000 Received: (qmail 76462 invoked by uid 500); 18 Feb 2009 23:27:47 -0000 Delivered-To: apmail-openjpa-commits-archive@openjpa.apache.org Received: (qmail 76445 invoked by uid 500); 18 Feb 2009 23:27:47 -0000 Mailing-List: contact commits-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list commits@openjpa.apache.org Received: (qmail 76434 invoked by uid 99); 18 Feb 2009 23:27:47 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Feb 2009 15:27:47 -0800 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 18 Feb 2009 23:27:46 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 8FF57238889F; Wed, 18 Feb 2009 23:27:26 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r745691 - in /openjpa/branches/1.2.x: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/c... Date: Wed, 18 Feb 2009 23:27:26 -0000 To: commits@openjpa.apache.org From: mikedd@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090218232726.8FF57238889F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: mikedd Date: Wed Feb 18 23:27:25 2009 New Revision: 745691 URL: http://svn.apache.org/viewvc?rev=745691&view=rev Log: Reverting OPENJPA-838 and OPENJPA-917 for additional testing. Removed: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/Invoice.java openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/InvoiceKey.java openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/LineItem.java Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java?rev=745691&r1=745690&r2=745691&view=diff ============================================================================== --- openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java (original) +++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/meta/strats/StoreCollectionFieldStrategy.java Wed Feb 18 23:27:25 2009 @@ -26,8 +26,11 @@ import java.util.Map; import org.apache.openjpa.enhance.PersistenceCapable; +import org.apache.openjpa.jdbc.conf.JDBCConfiguration; import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration; +import org.apache.openjpa.jdbc.kernel.JDBCFetchConfigurationImpl; import org.apache.openjpa.jdbc.kernel.JDBCStore; +import org.apache.openjpa.jdbc.kernel.JDBCStoreManager; import org.apache.openjpa.jdbc.meta.ClassMapping; import org.apache.openjpa.jdbc.meta.FieldMapping; import org.apache.openjpa.jdbc.meta.FieldStrategy; @@ -35,11 +38,14 @@ import org.apache.openjpa.jdbc.schema.Column; import org.apache.openjpa.jdbc.schema.ForeignKey; import org.apache.openjpa.jdbc.sql.Joins; +import org.apache.openjpa.jdbc.sql.LogicalUnion; import org.apache.openjpa.jdbc.sql.Result; import org.apache.openjpa.jdbc.sql.Select; import org.apache.openjpa.jdbc.sql.SelectExecutor; +import org.apache.openjpa.jdbc.sql.SelectImpl; import org.apache.openjpa.jdbc.sql.Union; import org.apache.openjpa.kernel.OpenJPAStateManager; +import org.apache.openjpa.lib.log.Log; import org.apache.openjpa.lib.util.Localizer; import org.apache.openjpa.meta.ClassMetaData; import org.apache.openjpa.meta.JavaTypes; @@ -520,19 +526,86 @@ return; } + //cache union for field here // select data for this sm + boolean found = true; final ClassMapping[] elems = getIndependentElementMappings(true); final Joins[] resJoins = new Joins[Math.max(1, elems.length)]; - Union union = store.getSQLFactory().newUnion - (Math.max(1, elems.length)); - union.select(new Union.Selector() { - public void select(Select sel, int idx) { - ClassMapping elem = (elems.length == 0) ? null : elems[idx]; - resJoins[idx] = selectAll(sel, elem, sm, store, fetch, - JDBCFetchConfiguration.EAGER_PARALLEL); + List parmList = null; + Union union = null; + SelectImpl sel = null; + Map storeCollectionUnionCache = null; + JDBCStoreManager.SelectKey selKey = null; + if (!((JDBCStoreManager)store).isQuerySQLCacheOn() || elems.length > 1) + union = newUnion(sm, store, fetch, elems, resJoins); + else { + parmList = new ArrayList(); + JDBCFetchConfiguration fetchClone = new JDBCFetchConfigurationImpl(); + fetchClone.copy(fetch); + + // to specify the type so that no cast is needed + storeCollectionUnionCache = ((JDBCStoreManager)store). + getCacheMapFromQuerySQLCache(StoreCollectionFieldStrategy.class); + selKey = + new JDBCStoreManager.SelectKey(null, field, fetchClone); + Object[] objs = storeCollectionUnionCache.get(selKey); + if (objs != null) { + union = (Union) objs[0]; + resJoins[0] = (Joins) objs[1]; } - }); - + else { + synchronized(storeCollectionUnionCache) { + objs = storeCollectionUnionCache.get(selKey); + if (objs == null) { + // select data for this sm + union = newUnion(sm, store, fetch, elems, resJoins); + found = false; + } else { + union = (Union) objs[0]; + resJoins[0] = (Joins) objs[1]; + } + + sel = ((LogicalUnion.UnionSelect)union.getSelects()[0]). + getDelegate(); + if (sel.getSQL() == null) { + ((SelectImpl)sel).setSQL(store, fetch); + found = false; + } + + // only cache the union when elems length is 1 for now + if (!found) { + Object[] objs1 = new Object[2]; + objs1[0] = union; + objs1[1] = resJoins[0]; + ((JDBCStoreManager)store).addToSqlCache( + storeCollectionUnionCache, selKey, objs1); + } + } + } + + Log log = store.getConfiguration(). + getLog(JDBCConfiguration.LOG_JDBC); + if (log.isTraceEnabled()) { + if (found) + log.trace(_loc.get("cache-hit", field, this.getClass())); + else + log.trace(_loc.get("cache-missed", field, this.getClass())); + } + + ClassMapping mapping = field.getDefiningMapping(); + Object oid = sm.getObjectId(); + Column[] cols = mapping.getPrimaryKeyColumns(); + if (sel == null) + sel = ((LogicalUnion.UnionSelect)union.getSelects()[0]). + getDelegate(); + + sel.wherePrimaryKey(mapping, cols, cols, oid, store, + null, null, parmList); + List nonFKParams = sel.getSQL().getNonFKParameters(); + if (nonFKParams != null && nonFKParams.size() > 0) + parmList.addAll(nonFKParams); + } + // create proxy Object coll; ChangeTracker ct = null; @@ -545,7 +618,7 @@ } // load values - Result res = union.execute(store, fetch); + Result res = union.execute(store, fetch, parmList); try { int seq = -1; while (res.next()) { @@ -569,6 +642,21 @@ sm.storeObject(field.getIndex(), coll); } + protected Union newUnion(final OpenJPAStateManager sm, final JDBCStore store, + final JDBCFetchConfiguration fetch, final ClassMapping[] elems, + final Joins[] resJoins) { + Union union = store.getSQLFactory().newUnion + (Math.max(1, elems.length)); + union.select(new Union.Selector() { + public void select(Select sel, int idx) { + ClassMapping elem = (elems.length == 0) ? null : elems[idx]; + resJoins[idx] = selectAll(sel, elem, sm, store, fetch, + JDBCFetchConfiguration.EAGER_PARALLEL); + } + }); + return union; + } + /** * Select data for loading, starting in field table. */ Modified: openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java?rev=745691&r1=745690&r2=745691&view=diff ============================================================================== --- openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java (original) +++ openjpa/branches/1.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/SQLBuffer.java Wed Feb 18 23:27:25 2009 @@ -56,6 +56,7 @@ private List _subsels = null; private List _params = null; private List _cols = null; + private List _nonFKParams = null; /** * Default constructor. @@ -146,6 +147,11 @@ _cols.add(paramIndex, null); } } + if (buf._nonFKParams != null) { + if (_nonFKParams == null) + _nonFKParams = new ArrayList(); + _nonFKParams.addAll(buf._nonFKParams); + } } public SQLBuffer append(Table table) { @@ -265,6 +271,11 @@ if (isFK) break; } + if (!isFK) { + if (_nonFKParams == null) + _nonFKParams = new ArrayList(); + _nonFKParams.add(o); + } } return this; } @@ -388,6 +399,9 @@ return (_params == null) ? Collections.EMPTY_LIST : _params; } + public List getNonFKParameters() { + return (_nonFKParams == null) ? Collections.EMPTY_LIST : _nonFKParams; + } /** * Return the SQL for this buffer. */ Modified: openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java?rev=745691&r1=745690&r2=745691&view=diff ============================================================================== --- openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java (original) +++ openjpa/branches/1.2.x/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/query/cache/TestNonPrimaryKeyQueryParameters.java Wed Feb 18 23:27:25 2009 @@ -18,10 +18,10 @@ */ package org.apache.openjpa.persistence.jdbc.query.cache; -import java.util.List; +import java.util.ArrayList; +import java.util.Collection; import javax.persistence.EntityManager; -import javax.persistence.EntityTransaction; import javax.persistence.Query; import org.apache.openjpa.persistence.test.SQLListenerTestCase; @@ -45,21 +45,18 @@ * * @author Pinaki Poddar * @author Vikram Bhatia - * @author David Blevins + * */ public class TestNonPrimaryKeyQueryParameters extends SQLListenerTestCase { private static final int FULLTIME_EMPLOYEE_COUNT = 3; private static final int PARTTIME_EMPLOYEE_COUNT = 2; - private static final int LINEITEM_PER_INVOICE = 1; private static final String DEPT_NAME = "ENGINEERING"; public void setUp() { super.setUp(CLEAR_TABLES, Department.class, Employee.class, FullTimeEmployee.class, PartTimeEmployee.class, - Invoice.class, LineItem.class, "openjpa.jdbc.QuerySQLCache", "true"); createDepartment(DEPT_NAME); - createInvoice(); sql.clear(); } @@ -106,10 +103,6 @@ .size()); assertSQL(".* AND t0.TYPE = .*"); - - Invoice invoice = em.find(Invoice.class, new InvoiceKey(1, "Red")); - List list = invoice.getLineItems(); - assertEquals(LINEITEM_PER_INVOICE, list.size()); em.close(); } @@ -161,20 +154,4 @@ em.close(); } - - private void createInvoice() { - EntityManager em = emf.createEntityManager(); - EntityTransaction tran = em.getTransaction(); - tran.begin(); - Invoice invoice = new Invoice(1, "Red", 1.30); - for (int i = 1; i <= LINEITEM_PER_INVOICE; i++) { - LineItem item = new LineItem(String.valueOf(i), 10); - item.setInvoice(invoice); - invoice.getLineItems().add(item); - em.persist(invoice); - } - em.flush(); - tran.commit(); - em.close(); - } }