You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by th...@apache.org on 2003/02/20 22:37:12 UTC
cvs commit: db-ojb/src/java/org/apache/ojb/broker/accesslayer CollectionPrefetcher.java
thma 2003/02/20 13:37:12
Modified: src/java/org/apache/ojb/broker/accesslayer
CollectionPrefetcher.java
Log:
CollectionPrefetcher behaved differently than RsIterator wrt. extents (fix by Mark Rowell)
Revision Changes Path
1.8 +155 -148 db-ojb/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java
Index: CollectionPrefetcher.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/CollectionPrefetcher.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- CollectionPrefetcher.java 29 Dec 2002 08:51:49 -0000 1.7
+++ CollectionPrefetcher.java 20 Feb 2003 21:37:12 -0000 1.8
@@ -80,166 +80,173 @@
public class CollectionPrefetcher extends RelationshipPrefetcherImpl
{
- /**
- * Constructor for CollectionPrefetcher.
- * @param aBroker
- * @param anOrd
- */
- public CollectionPrefetcher(PersistenceBroker aBroker, ObjectReferenceDescriptor anOrd)
- {
- super(aBroker, anOrd);
- }
-
- /**
- * Build the query to perform a batched read get orderBy settings from
- * CollectionDescriptor
- * @param owners Collection containing all objects of the ONE side
- */
- protected Query buildPrefetchQuery(Collection owners)
- {
- CollectionDescriptor cds = (CollectionDescriptor) getObjectReferenceDescriptor();
- FieldDescriptor fkFields[] = cds.getForeignKeyFieldDescriptors(getItemClassDescriptor());
- Criteria crit;
-
- if (fkFields.length == 1)
- {
- crit = buildPrefetchCriteriaSingleKey(owners, fkFields[0]);
- }
- else
- {
- crit = buildPrefetchCriteriaMultipleKeys(owners, fkFields);
- }
-
- // check if collection must be ordered
- if (!cds.getOrderBy().isEmpty())
- {
- Iterator iter = cds.getOrderBy().iterator();
- while (iter.hasNext())
- {
- crit.addOrderBy((FieldHelper) iter.next());
- }
- }
-
- return QueryFactory.newQuery(cds.getItemClass(), crit);
- }
-
- /**
- * Build the Criteria using IN(...) for single keys
- * @param owners
- * @param fkField
- * @return Criteria
- */
- private Criteria buildPrefetchCriteriaSingleKey(Collection owners, FieldDescriptor fkField)
- {
- Criteria crit = new Criteria();
- Collection pkValues = new ArrayList();
- Iterator iter = owners.iterator();
- Object pkVal;
- Object owner;
-
- while (iter.hasNext())
- {
- owner = iter.next();
- pkVal = getBroker().serviceBrokerHelper().getKeyValues(getOwnerClassDescriptor(), owner)[0];
- pkValues.add(pkVal);
- }
-
- // create IN (...) for the single key field
- if (!pkValues.isEmpty())
- {
- crit.addIn(fkField.getAttributeName(), pkValues);
- }
-
- return crit;
- }
-
- /**
- * Build the Criteria using multiple ORs
- * @param owners
- * @param fkFields
- * @return Criteria
- */
- private Criteria buildPrefetchCriteriaMultipleKeys(Collection owners, FieldDescriptor fkFields[])
- {
+ /**
+ * Constructor for CollectionPrefetcher.
+ * @param aBroker
+ * @param anOrd
+ */
+ public CollectionPrefetcher(PersistenceBroker aBroker, ObjectReferenceDescriptor anOrd)
+ {
+ super(aBroker, anOrd);
+ }
+
+ /**
+ * Build the query to perform a batched read get orderBy settings from
+ * CollectionDescriptor
+ * @param owners Collection containing all objects of the ONE side
+ */
+ protected Query buildPrefetchQuery(Collection owners)
+ {
+ CollectionDescriptor cds = (CollectionDescriptor) getObjectReferenceDescriptor();
+ FieldDescriptor fkFields[] = cds.getForeignKeyFieldDescriptors(getItemClassDescriptor());
+ Criteria crit;
+
+ if (fkFields.length == 1)
+ {
+ crit = buildPrefetchCriteriaSingleKey(owners, fkFields[0]);
+ }
+ else
+ {
+ crit = buildPrefetchCriteriaMultipleKeys(owners, fkFields);
+ }
+
+ // check if collection must be ordered
+ if (!cds.getOrderBy().isEmpty())
+ {
+ Iterator iter = cds.getOrderBy().iterator();
+ while (iter.hasNext())
+ {
+ crit.addOrderBy((FieldHelper) iter.next());
+ }
+ }
+
+ return QueryFactory.newQuery(cds.getItemClass(), crit);
+ }
+
+ /**
+ * Build the Criteria using IN(...) for single keys
+ * @param owners
+ * @param fkField
+ * @return Criteria
+ */
+ private Criteria buildPrefetchCriteriaSingleKey(Collection owners, FieldDescriptor fkField)
+ {
+ Criteria crit = new Criteria();
+ Collection pkValues = new ArrayList();
+ Iterator iter = owners.iterator();
+ Object pkVal;
+ Object owner;
+
+ while (iter.hasNext())
+ {
+ owner = iter.next();
+ pkVal =
+ getBroker().serviceBrokerHelper().getKeyValues(getOwnerClassDescriptor(), owner)[0];
+ pkValues.add(pkVal);
+ }
+
+ // create IN (...) for the single key field
+ if (!pkValues.isEmpty())
+ {
+ crit.addIn(fkField.getAttributeName(), pkValues);
+ }
+
+ return crit;
+ }
+
+ /**
+ * Build the Criteria using multiple ORs
+ * @param owners
+ * @param fkFields
+ * @return Criteria
+ */
+ private Criteria buildPrefetchCriteriaMultipleKeys(
+ Collection owners,
+ FieldDescriptor fkFields[])
+ {
Criteria crit = new Criteria();
Iterator iter = owners.iterator();
Object[] pkVal;
Object owner;
-
+
while (iter.hasNext())
{
Criteria c = new Criteria();
owner = iter.next();
- pkVal = getBroker().serviceBrokerHelper().getKeyValues(getOwnerClassDescriptor(), owner);
- for (int i=0;i < pkVal.length;i++)
+ pkVal =
+ getBroker().serviceBrokerHelper().getKeyValues(getOwnerClassDescriptor(), owner);
+ for (int i = 0; i < pkVal.length; i++)
{
- c.addEqualTo(fkFields[i].getAttributeName(),pkVal[i]);
+ c.addEqualTo(fkFields[i].getAttributeName(), pkVal[i]);
}
-
+
crit.addOrCriteria(c);
}
return crit;
- }
+ }
- /**
- * associate the batched Children with their owner object <br>
- * loop over children
- */
- protected void associateBatched(Collection owners, Collection children)
- {
- ClassDescriptor cld = getItemClassDescriptor();
- Iterator iter = children.iterator();
- Object owner, relatedObject;
- Object fkValues[];
- Identity id;
- PersistentField field = getObjectReferenceDescriptor().getPersistentField();
-
- while (iter.hasNext())
- {
- relatedObject = iter.next();
- fkValues = getObjectReferenceDescriptor().getForeignKeyValues(relatedObject, cld);
- id = new Identity(getOwnerClassDescriptor().getClassOfObject(), fkValues);
- owner = getBroker().getObjectByIdentity(id);
-
- if (Collection.class.isAssignableFrom(field.getType()))
- {
- Collection relatedData = (Collection) field.get(owner);
- if (relatedData == null)
- {
- try
- {
- // instantiate and set the owners collection
- relatedData = (Collection) children.getClass().newInstance();
- field.set(owner, relatedData);
- }
- catch (Exception e)
- {
- getLogger().error("Can't create new Collection for owner", e);
- }
- }
- relatedData.add(relatedObject);
- }
- else
- {
- getLogger().error("prefetch works with Collections only");
- }
-
- }
- }
-
- /**
- * @see org.apache.ojb.broker.accesslayer.RelationshipPrefetcher#prefetchRelationship(Collection)
- */
- public void prefetchRelationship(Collection owners)
- {
- if (getObjectReferenceDescriptor().getPersistentField().getType().isArray())
- {
- throw new PersistenceBrokerException("Prefetch does not yet work with Arrays");
- }
- else
- {
- super.prefetchRelationship(owners);
- }
- }
+ /**
+ * associate the batched Children with their owner object <br>
+ * loop over children
+ */
+ protected void associateBatched(Collection owners, Collection children)
+ {
+ ClassDescriptor cld = getItemClassDescriptor();
+ Iterator iter = children.iterator();
+ Object owner, relatedObject;
+ Object fkValues[];
+ Identity id;
+ PersistentField field = getObjectReferenceDescriptor().getPersistentField();
+
+ while (iter.hasNext())
+ {
+ relatedObject = iter.next();
+ fkValues = getObjectReferenceDescriptor().getForeignKeyValues(relatedObject, cld);
+ id =
+ new Identity(
+ getBroker().getTopLevelClass(getOwnerClassDescriptor().getClassOfObject()),
+ fkValues);
+ owner = getBroker().getObjectByIdentity(id);
+
+ if (Collection.class.isAssignableFrom(field.getType()))
+ {
+ Collection relatedData = (Collection) field.get(owner);
+ if (relatedData == null)
+ {
+ try
+ {
+ // instantiate and set the owners collection
+ relatedData = (Collection) children.getClass().newInstance();
+ field.set(owner, relatedData);
+ }
+ catch (Exception e)
+ {
+ getLogger().error("Can't create new Collection for owner", e);
+ }
+ }
+ relatedData.add(relatedObject);
+ }
+ else
+ {
+ getLogger().error("prefetch works with Collections only");
+ }
+
+ }
+ }
+
+ /**
+ * @see org.apache.ojb.broker.accesslayer.RelationshipPrefetcher#prefetchRelationship(Collection)
+ */
+ public void prefetchRelationship(Collection owners)
+ {
+ if (getObjectReferenceDescriptor().getPersistentField().getType().isArray())
+ {
+ throw new PersistenceBrokerException("Prefetch does not yet work with Arrays");
+ }
+ else
+ {
+ super.prefetchRelationship(owners);
+ }
+ }
}