openjpa-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mik...@apache.org
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 GMT
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();        
-    }	
 }



Mime
View raw message