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<JDBCStoreManager.SelectKey, Object[]>
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<LineItem> 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(); - } }