User: dsundstrom Date: 02/01/15 13:55:34 Modified: src/main/org/jboss/ejb/plugins/cmp/jdbc JDBCAbstractQueryCommand.java Log: Added support for read ahead on find. Revision Changes Path 1.6 +47 -23 jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java Index: JDBCAbstractQueryCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCAbstractQueryCommand.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- JDBCAbstractQueryCommand.java 2002/01/05 12:08:50 1.5 +++ JDBCAbstractQueryCommand.java 2002/01/15 21:55:33 1.6 @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; @@ -29,6 +30,7 @@ import org.jboss.ejb.EntityEnterpriseContext; import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCCMPFieldBridge; import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCEntityBridge; +import org.jboss.ejb.plugins.cmp.jdbc.bridge.JDBCFieldBridge; import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCQueryMetaData; import org.jboss.logging.Logger; import org.jboss.util.FinderResults; @@ -42,7 +44,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ */ public abstract class JDBCAbstractQueryCommand implements JDBCQueryCommand { private JDBCStoreManager manager; @@ -51,8 +53,9 @@ private JDBCEntityBridge selectEntity; private JDBCCMPFieldBridge selectField; + private List preloadFields = new ArrayList(0); private String sql; - private List parameters = new ArrayList(); + private List parameters = new ArrayList(0); public JDBCAbstractQueryCommand( JDBCStoreManager manager, JDBCQueryMetaData q) { @@ -74,7 +77,12 @@ Object[] args, EntityEnterpriseContext ctx) throws FinderException { - boolean debug = log.isDebugEnabled(); + JDBCStoreManager selectManager = null; + ReadAheadCache selectReadAheadCache = null; + if(selectEntity != null) { + selectManager = selectEntity.getManager(); + selectReadAheadCache = selectManager.getReadAheadCache(); + } Collection results = new ArrayList(); @@ -100,12 +108,26 @@ // load the results if(selectEntity != null) { - // load the pks - Object[] pkRef = new Object[1]; + Object[] ref = new Object[1]; + while(rs.next()) { - pkRef[0] = null; - selectEntity.loadPrimaryKeyResults(rs, 1, pkRef); - results.add(pkRef[0]); + int index = 1; + ref[0] = null; + + // get the pk + index = selectEntity.loadPrimaryKeyResults(rs, index, ref); + Object pk = ref[0]; + results.add(ref[0]); + + // read the preload fields + for(Iterator iter=preloadFields.iterator(); iter.hasNext();) { + JDBCFieldBridge field = (JDBCFieldBridge)iter.next(); + ref[0] = null; + + // read the value and store it in the readahead cache + index = field.loadArgumentResults(rs, index, ref); + selectReadAheadCache.addPreloadData(pk, field, ref[0]); + } } } else { // load the field @@ -117,8 +139,7 @@ } } } catch(Exception e) { - if (debug) - log.debug(e); + log.debug("Find failed", e); throw new FinderException("Find failed: " + e); } finally { JDBCUtil.safeClose(ps); @@ -131,15 +152,12 @@ } // Convert the pk collection into finder results - boolean readAheadOnLoad = queryMetaData.getReadAhead().isOnLoadUsed(); FinderResults finderResults = new FinderResults( - results, null, null, null, readAheadOnLoad); + results, queryMetaData.getReadAhead(), null, null); - // If read ahead is on, store the finder results for optimized loading. - if(readAheadOnLoad) { - // add to the cache - manager.getReadAheadCache().insert( - new Long(finderResults.getListId()), finderResults); + // add to the cache + if(!queryMetaData.getReadAhead().isNone()) { + selectReadAheadCache.addFinderResult(finderResults); } // If this is a finder, we're done. @@ -148,18 +166,16 @@ } // This is an ejbSelect, so we need to convert the pks to real ejbs. - EntityContainer container = manager.getContainer(); + EntityContainer selectContainer = selectManager.getContainer(); if(queryMetaData.isResultTypeMappingLocal()) { - JDBCStoreManager selectManager = selectEntity.getManager(); - LocalContainerInvoker localInvoker; - localInvoker = selectManager.getContainer().getLocalContainerInvoker(); + localInvoker = selectContainer.getLocalContainerInvoker(); return localInvoker.getEntityLocalCollection(finderResults); } else { ContainerInvoker invoker; - invoker = container.getContainerInvoker(); - return invoker.getEntityCollection(finderResults); + invoker = selectContainer.getContainerInvoker(); + return invoker.getEntityCollection(finderResults); } } @@ -200,6 +216,14 @@ protected void setSelectField(JDBCCMPFieldBridge selectField) { this.selectEntity = null; this.selectField = selectField; + } + + protected List getPreloadFields() { + return preloadFields; + } + + protected void setPreloadFields(List preloadFields) { + this.preloadFields = preloadFields; } /**
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development