Return-Path: Delivered-To: apmail-db-ojb-dev-archive@www.apache.org Received: (qmail 31729 invoked from network); 5 Jan 2007 03:13:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 5 Jan 2007 03:13:14 -0000 Received: (qmail 67884 invoked by uid 500); 5 Jan 2007 03:13:20 -0000 Delivered-To: apmail-db-ojb-dev-archive@db.apache.org Received: (qmail 67854 invoked by uid 500); 5 Jan 2007 03:13:20 -0000 Mailing-List: contact ojb-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "OJB Developers List" Reply-To: "OJB Developers List" Delivered-To: mailing list ojb-dev@db.apache.org Received: (qmail 67843 invoked by uid 500); 5 Jan 2007 03:13:20 -0000 Received: (qmail 67840 invoked by uid 99); 5 Jan 2007 03:13:20 -0000 Received: from herse.apache.org (HELO herse.apache.org) (140.211.11.133) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jan 2007 19:13:20 -0800 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 04 Jan 2007 19:13:12 -0800 Received: by eris.apache.org (Postfix, from userid 65534) id 639CB1A981A; Thu, 4 Jan 2007 19:12:15 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r492885 - /db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java Date: Fri, 05 Jan 2007 03:12:15 -0000 To: ojb-commits@db.apache.org From: arminw@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20070105031215.639CB1A981A@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: arminw Date: Thu Jan 4 19:12:14 2007 New Revision: 492885 URL: http://svn.apache.org/viewvc?view=rev&rev=492885 Log: improvement to allow enable/disable of proxy prefetching (with boolean setter method) Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java URL: http://svn.apache.org/viewvc/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java?view=diff&rev=492885&r1=492884&r2=492885 ============================================================================== --- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java (original) +++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/core/QueryReferenceBroker.java Thu Jan 4 19:12:14 2007 @@ -68,8 +68,7 @@ private PersistenceBrokerImpl pb; private HashMap m_retrievalTasks; private ArrayList prefetchingListeners; - private final boolean batchRetrieval = true; - private final boolean prefetchProxies = true; + private boolean prefetchProxies = true; private Class classToPrefetch; private PBLifeCycleEvent afterLookupEvent; @@ -80,6 +79,24 @@ } /** + * Return true if proxy object reference pre-fetching is enabled, + * false if disabled. + */ + public boolean isPrefetchProxies() + { + return prefetchProxies; + } + + /** + * Enable or disable proxy object reference pre-fetching. By default it's enabled. + * @param prefetchProxies If set true, reference pre-fetching will be enabled. + */ + public void setPrefetchProxies(boolean prefetchProxies) + { + this.prefetchProxies = prefetchProxies; + } + + /** * retrieve a collection of itemClass Objects matching the Query query * @param collectionClass type the collection to be returned * @param itemClass Class of item in collection @@ -96,7 +113,7 @@ int fullSize = -1; int size = 0; - final boolean isRetrievalTasksCreated = batchRetrieval && m_retrievalTasks == null; + final boolean isRetrievalTasksCreated = m_retrievalTasks == null; if (isRetrievalTasksCreated) { // Maps ReferenceDescriptors to HashSets of owners @@ -157,8 +174,8 @@ && (cld.getProxyPrefetchingLimit() > 0) && addRetrievalTask(candidate, this)) { - new PBMaterializationListener(candidate, m_retrievalTasks, - this, cld.getProxyPrefetchingLimit()); + if(log.isDebugEnabled()) log.debug("Add proxy prefetch listener for result candidate of query " + query); + new PBMaterializationListener(candidate, m_retrievalTasks, this, cld.getProxyPrefetchingLimit()); } } } @@ -316,24 +333,18 @@ Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); - if (!(key instanceof ObjectReferenceDescriptor)) + if (key instanceof ObjectReferenceDescriptor) { - continue; - } + ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) key; + ArrayList owners = (ArrayList) entry.getValue(); - ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) key; - RelationshipPrefetcher prefetcher; - ArrayList owners = (ArrayList) entry.getValue(); - -// if (ord instanceof SuperReferenceDescriptor || ord.isLazy() || (ord.getItemProxyClass() != null)) - if (ord.isLazy() || (ord.getItemProxyClass() != null)) - { - continue; + if(!ord.isLazy() && (ord.getItemProxyClass() == null)) + { + RelationshipPrefetcher prefetcher = pb.getRelationshipPrefetcherFactory().createRelationshipPrefetcher(ord); + prefetcher.prefetchRelationship(owners); + it.remove(); + } } - - prefetcher = pb.getRelationshipPrefetcherFactory().createRelationshipPrefetcher(ord); - prefetcher.prefetchRelationship(owners); - it.remove(); } } } @@ -341,26 +352,26 @@ /** * Retrieve a single Reference. * This implementation retrieves a referenced object from the data backend - * if cascade-retrieve is true or if forced is true. + * if cascade-retrieve is true or if forceReference is true. * * @param obj - object that will have it's field set with a referenced object. * @param cld - the ClassDescriptor describring obj * @param rds - the ObjectReferenceDescriptor of the reference attribute to be loaded - * @param forced - if set to true, the reference is loaded even if the rds differs. + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs */ - public void retrieveReference(Object obj, ClassDescriptor cld, ObjectReferenceDescriptor rds, boolean forced) + public void retrieveReference(Object obj, ClassDescriptor cld, ObjectReferenceDescriptor rds, boolean forceReference) { PersistentField refField; Object refObj = null; - if (forced || rds.getCascadeRetrieve()) + if (forceReference || rds.getCascadeRetrieve()) { pb.getInternalCache().enableMaterializationCache(); try { Identity id = getReferencedObjectIdentity(obj, rds, cld); boolean isRefObjDefined = true; - if (id == null) { refObj = null; @@ -371,14 +382,12 @@ if (rds.isSuperReferenceDescriptor()) { // walk the super-references - ClassDescriptor superCld = cld.getRepository().getDescriptorFor(rds.getItemClass()); + ClassDescriptor superCld = cld.getSuperClassDescriptor(); retrieveReferences(refObj, superCld, false); retrieveCollections(refObj, superCld, false); } } - else if ((m_retrievalTasks != null) - && !rds.isLazy() - && (rds.getItemProxyClass() == null)) + else if ((m_retrievalTasks != null) && !rds.isLazy() && (rds.getItemProxyClass() == null)) { addRetrievalTask(obj, rds); isRefObjDefined = false; @@ -386,6 +395,7 @@ else { refObj = getReferencedObject(id, rds); + if(refObj == null) isRefObjDefined = false; } if (isRefObjDefined) @@ -393,17 +403,14 @@ refField = rds.getPersistentField(); refField.set(obj, refObj); - if ((refObj != null) && prefetchProxies - && (m_retrievalTasks != null) + if ((refObj != null) && prefetchProxies && (m_retrievalTasks != null) && (rds.getProxyPrefetchingLimit() > 0)) { IndirectionHandler handler = pb.getProxyFactory().getIndirectionHandler(refObj); - - if ((handler != null) - && addRetrievalTask(obj, rds)) + if ((handler != null) && addRetrievalTask(obj, rds)) { - new PBMaterializationListener(obj, m_retrievalTasks, - rds, rds.getProxyPrefetchingLimit()); + if(log.isDebugEnabled()) log.debug("Add proxy prefetch listener for reference " + rds); + new PBMaterializationListener(obj, m_retrievalTasks, rds, rds.getProxyPrefetchingLimit()); } } } @@ -421,43 +428,39 @@ /** * Retrieve a single Reference. * This implementation retrieves a referenced object from the data backend - * if cascade-retrieve is true or if forced is true. + * if cascade-retrieve is true or if forceReference is true. * * @param obj - object that will have it's field set with a referenced object. * @param cld - the ClassDescriptor describring obj * @param rds - the ObjectReferenceDescriptor of the reference attribute to be loaded - * @param forced - if set to true, the reference is loaded even if the rds differs. + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs */ - public void retrieveProxyReference(Object obj, ClassDescriptor cld, ObjectReferenceDescriptor rds, boolean forced) + public void retrieveProxyReference(Object obj, ClassDescriptor cld, ObjectReferenceDescriptor rds, boolean forceReference) { PersistentField refField; Object refObj = null; - pb.getInternalCache().enableMaterializationCache(); try { Identity id = getReferencedObjectIdentity(obj, rds, cld); - if (id != null){ + if (id != null) + { refObj = pb.createProxy(rds.getItemClass(), id); } refField = rds.getPersistentField(); refField.set(obj, refObj); - if ((refObj != null) && prefetchProxies - && (m_retrievalTasks != null) + if ((refObj != null) && prefetchProxies && (m_retrievalTasks != null) && (rds.getProxyPrefetchingLimit() > 0)) { IndirectionHandler handler = pb.getProxyFactory().getIndirectionHandler(refObj); - - if ((handler != null) - && addRetrievalTask(obj, rds)) + if ((handler != null) && addRetrievalTask(obj, rds)) { - new PBMaterializationListener(obj, m_retrievalTasks, - rds, rds.getProxyPrefetchingLimit()); + if(log.isDebugEnabled()) log.debug("Add proxy prefetch listener for reference " + rds); + new PBMaterializationListener(obj, m_retrievalTasks, rds, rds.getProxyPrefetchingLimit()); } } - - pb.getInternalCache().disableMaterializationCache(); } catch(RuntimeException e) @@ -473,12 +476,12 @@ * * @param newObj the instance to be loaded or refreshed * @param cld the ClassDescriptor of the instance - * @param forced if set to true loading is forced even if cld differs. + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs */ - public void retrieveReferences(Object newObj, ClassDescriptor cld, boolean forced) throws PersistenceBrokerException + public void retrieveReferences(Object newObj, ClassDescriptor cld, boolean forceReference) throws PersistenceBrokerException { Iterator i = cld.getObjectReferenceDescriptors().iterator(); - // turn off auto prefetching for related proxies final Class saveClassToPrefetch = classToPrefetch; classToPrefetch = null; @@ -489,9 +492,8 @@ while (i.hasNext()) { ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) i.next(); - retrieveReference(newObj, cld, rds, forced); + retrieveReference(newObj, cld, rds, forceReference); } - pb.getInternalCache().disableMaterializationCache(); } catch(RuntimeException e) @@ -510,12 +512,12 @@ * * @param newObj the instance to be loaded or refreshed * @param cld the ClassDescriptor of the instance - * @param forced if set to true loading is forced even if cld differs. + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs */ - public void retrieveProxyReferences(Object newObj, ClassDescriptor cld, boolean forced) throws PersistenceBrokerException + public void retrieveProxyReferences(Object newObj, ClassDescriptor cld, boolean forceReference) throws PersistenceBrokerException { Iterator i = cld.getObjectReferenceDescriptors().iterator(); - // turn off auto prefetching for related proxies final Class saveClassToPrefetch = classToPrefetch; classToPrefetch = null; @@ -526,9 +528,8 @@ while (i.hasNext()) { ObjectReferenceDescriptor rds = (ObjectReferenceDescriptor) i.next(); - retrieveProxyReference(newObj, cld, rds, forced); + retrieveProxyReference(newObj, cld, rds, forceReference); } - pb.getInternalCache().disableMaterializationCache(); } catch(RuntimeException e) @@ -574,7 +575,8 @@ else { // ensure that top-level extents are used for Identities - return pb.serviceIdentity().buildIdentity(rds.getItemClass(), pb.getTopLevelClass(rds.getItemClass()), fkValues); + return pb.serviceIdentity().buildIdentity(rds.getItemClass(), + rds.getItemClassDescriptor().getTopLevelClass(), fkValues); } return null; } @@ -663,33 +665,34 @@ /** * Retrieve a single Collection on behalf of obj. * The Collection is retrieved only if cascade.retrieve is true - * or if forced is set to true. * + * or if forceReference is set to true. * * * @param obj - the object to be updated * @param cld - the ClassDescriptor describing obj * @param cds - the CollectionDescriptor describing the collection attribute to be loaded - * @param forced - if set to true loading is forced, even if cds differs. + * @param forceReference - if set to true loading is forced, even if cds differs. * */ - public void retrieveCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forced) + public void retrieveCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forceReference) { - doRetrieveCollection(obj, cds, forced, cds.isLazy()); + doRetrieveCollection(obj, cds, forceReference, cds.isLazy()); } /** * Retrieve a single Proxied Collection on behalf of obj. * The Collection is retrieved only if cascade.retrieve is true - * or if forced is set to true. * + * or if forceReference is set to true. * * * @param obj - the object to be updated * @param cld - the ClassDescriptor describing obj * @param cds - the CollectionDescriptor describing the collection attribute to be loaded - * @param forced - if set to true a proxy will be placed, even if cds differs. + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs * */ - public void retrieveProxyCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forced) + public void retrieveProxyCollection(Object obj, ClassDescriptor cld, CollectionDescriptor cds, boolean forceReference) { - doRetrieveCollection(obj, cds, forced, true); + doRetrieveCollection(obj, cds, forceReference, true); } private void doRetrieveCollection(Object obj, CollectionDescriptor cds, boolean forced, boolean lazyLoad) @@ -697,8 +700,7 @@ if (forced || cds.getCascadeRetrieve()) { if ((m_retrievalTasks != null) && !cds.isLazy() - && !cds.hasProxyItems() - && (cds.getQueryCustomizer() == null)) + && !cds.hasProxyItems() && (cds.getQueryCustomizer() == null)) { addRetrievalTask(obj, cds); } @@ -745,8 +747,8 @@ { if (addRetrievalTask(obj, cds)) { - new PBCollectionProxyListener(obj, - m_retrievalTasks, cds, cds.getProxyPrefetchingLimit()); + if(log.isDebugEnabled()) log.debug("Add proxy prefetch listener for collection reference " + cds); + new PBCollectionProxyListener(obj, m_retrievalTasks, cds, cds.getProxyPrefetchingLimit()); } } @@ -803,18 +805,19 @@ } /** - * Get Foreign key query for m:n
- * supports UNIDIRECTIONAL m:n using QueryByMtoNCriteria - * @return org.apache.ojb.broker.query.QueryByCriteria + * Get Foreign key query for m:n relationship + * supports UNIDIRECTIONAL m:n using QueryByMtoNCriteria. + * * @param obj the owner of the relationship * @param cod the CollectionDescriptor + * @return A Query object */ private QueryByCriteria getFKQueryMtoN(Object obj, CollectionDescriptor cod) { ValueContainer[] values = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false); Object[] thisClassFks = cod.getFksToThisClass(); Object[] itemClassFks = cod.getFksToItemClass(); - ClassDescriptor refCld = pb.getClassDescriptor(cod.getItemClass()); + ClassDescriptor refCld = cod.getItemClassDescriptor(); Criteria criteria = new Criteria(); for (int i = 0; i < thisClassFks.length; i++) @@ -831,24 +834,22 @@ } /** - * Get Foreign key query for 1:n + * Get Foreign key query for 1:n relationship. + * + * @param obj the owner of the relationship + * @param cod the CollectionDescriptor * @return org.apache.ojb.broker.query.QueryByCriteria - * @param obj - * @param cod */ private QueryByCriteria getFKQuery1toN(Object obj, CollectionDescriptor cod) { ValueContainer[] container = pb.serviceBrokerHelper().getFkTargetValuesForObject(cod, obj ,false); - ClassDescriptor refCld = pb.getClassDescriptor(cod.getItemClass()); + ClassDescriptor refCld = cod.getItemClassDescriptor(); FieldDescriptor[] fields = cod.getForeignKeyFieldDescriptors(refCld); Criteria criteria = new Criteria(); - for (int i = 0; i < fields.length; i++) { - FieldDescriptor fld = fields[i]; - criteria.addEqualTo(fld.getAttributeName(), container[i].getValue()); + criteria.addEqualTo(fields[i].getAttributeName(), container[i].getValue()); } - return QueryFactory.newQuery(refCld.getClassOfObject(), criteria); } @@ -885,12 +886,13 @@ * * @param newObj the instance to be loaded or refreshed * @param cld the ClassDescriptor of the instance - * @param forced if set to true, loading is forced even if cld differs + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs * */ - public void retrieveCollections(Object newObj, ClassDescriptor cld, boolean forced) throws PersistenceBrokerException + public void retrieveCollections(Object newObj, ClassDescriptor cld, boolean forceReference) throws PersistenceBrokerException { - doRetrieveCollections(newObj, cld, forced, false); + doRetrieveCollections(newObj, cld, forceReference, false); } /** @@ -898,15 +900,16 @@ * * @param newObj the instance to be loaded or refreshed * @param cld the ClassDescriptor of the instance - * @param forced if set to true, loading is forced even if cld differs + * @param forceReference if set to true, loading of reference is forced even if cld + * auto/cascade retrieve setting differs * */ - public void retrieveProxyCollections(Object newObj, ClassDescriptor cld, boolean forced) throws PersistenceBrokerException + public void retrieveProxyCollections(Object newObj, ClassDescriptor cld, boolean forceReference) throws PersistenceBrokerException { - doRetrieveCollections(newObj, cld, forced, true); + doRetrieveCollections(newObj, cld, forceReference, true); } - private void doRetrieveCollections(Object newObj, ClassDescriptor cld, boolean forced, boolean forceProxyCollection) throws PersistenceBrokerException + private void doRetrieveCollections(Object newObj, ClassDescriptor cld, boolean forceReference, boolean forceProxyCollection) throws PersistenceBrokerException { Iterator i = cld.getCollectionDescriptors().iterator(); @@ -920,10 +923,13 @@ while (i.hasNext()) { CollectionDescriptor cds = (CollectionDescriptor) i.next(); - if (forceProxyCollection){ - retrieveProxyCollection(newObj, cld, cds, forced); - } else { - retrieveCollection(newObj, cld, cds, forced); + if (forceProxyCollection) + { + retrieveProxyCollection(newObj, cld, cds, forceReference); + } + else + { + retrieveCollection(newObj, cld, cds, forceReference); } } pb.getInternalCache().disableMaterializationCache(); @@ -956,6 +962,11 @@ } } + /** + * Return the Class to be prefetched. + * + * @return Class or null. + */ public Class getClassToPrefetch() { return classToPrefetch; @@ -969,8 +980,7 @@ { private IndirectionHandler _listenedHandler; - PBMaterializationListener(Object owner, - HashMap retrievalTasks, Object key, int limit) + PBMaterializationListener(Object owner, HashMap retrievalTasks, Object key, int limit) { super(owner, retrievalTasks, key, limit); } @@ -1026,8 +1036,7 @@ private int _limit; protected Object _key; - PBPrefetchingListener(Object owner, HashMap retrievalTasks, - Object key, int limit) + PBPrefetchingListener(Object owner, HashMap retrievalTasks, Object key, int limit) { _retrievalTasks = retrievalTasks; _key = key; @@ -1069,6 +1078,7 @@ } else { + if(log.isDebugEnabled()) log.debug("Prefetch limit of " + _limit + " entries rearched"); toPrefetch = owners.subList(0, _limit); prefetchingAll = false; } @@ -1077,6 +1087,7 @@ classToPrefetch = prefetcher.getItemClassDescriptor().getClassOfObject(); try { + if(log.isDebugEnabled()) log.debug("Start prefetching of objects for " + prefetcher); prefetcher.prefetchRelationship(toPrefetch); } finally @@ -1086,10 +1097,12 @@ if (prefetchingAll) { + if(log.isDebugEnabled()) log.debug("All objects for key " + _key + " prefetched"); _retrievalTasks.remove(_key); } else { + if(log.isDebugEnabled()) log.debug("Only objects till limit prefetched for key " + _key); // ArrayList documented trick: // "the following idiom removes a range of elements from a list: // list.subList(from, to).clear(); @@ -1099,21 +1112,18 @@ } } - class PBCollectionProxyListener extends PBPrefetchingListener - implements CollectionProxyListener + class PBCollectionProxyListener extends PBPrefetchingListener implements CollectionProxyListener { CollectionProxyDefaultImpl _listenedCollection; - PBCollectionProxyListener(Object owner, - HashMap retrievalTasks, CollectionDescriptor key, int limit) + PBCollectionProxyListener(Object owner, HashMap retrievalTasks, CollectionDescriptor key, int limit) { super(owner, retrievalTasks, key, limit); } protected void addThisListenerTo(Object owner) { - PersistentField collectionField = - ((CollectionDescriptor) _key).getPersistentField(); + PersistentField collectionField = ((CollectionDescriptor) _key).getPersistentField(); _listenedCollection = (CollectionProxyDefaultImpl) collectionField.get(owner); _listenedCollection.addListener(this); } --------------------------------------------------------------------- To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org For additional commands, e-mail: ojb-dev-help@db.apache.org