PrefetchHelper bug

From: Twan Kogels (twa..wansoft.com)
Date: Tue Aug 31 2004 - 03:53:52 EDT

  • Next message: Arndt Brenschede: "Re: PrefetchHelper bug"

    Hello,

    I think i have found a bug in PrefetchHelper.java, i discovered it when
    testing my application which uses resolveToOneRelations() defined in
    PrefetchHelper.

    In "PrefetchHelper.java" there is a function called
    resolveToOneRelations(). Here's a the interesting code:
    ===============
    List oids = new ArrayList(nobjects);

             for (int i = 0; i < nobjects; i++) {
                 DataObject sourceObject = (DataObject) objects.get(i);
                 DataObject targetObject = (DataObject)
    sourceObject.readProperty(relName);

                 if (targetObject.getPersistenceState() ==
    PersistenceState.HOLLOW) {
                     ObjectId oid = targetObject.getObjectId();
                     oids.add(oid);
                 }
             }
             // this maybe suboptimal, cause it uses an OR .. OR .. OR ..
    expression
             // instead of IN (..) - to be compatble with compound keys -
             // however, it seems to be quite fast as well
             SelectQuery sel = QueryUtils.selectQueryForIds(oids);
             context.performQuery(sel);
    ===============

    It is possible that "List oids" will be a empty list when it reaches the line:
    ===============
    SelectQuery sel = QueryUtils.selectQueryForIds(oids);
    ===============
    because when a object has already been retrieved once the following line
    will return false and no object is added to oids list.
    ===============
    if (targetObject.getPersistenceState() == PersistenceState.HOLLOW) {
    ===============

    "QueryUtils.selectQueryForIds(oids);" will raise a IllegalArgumentException
    when the oids list is empty.
    ===============
    IllegalArgumentException("List must contain at least one ObjectId")
    ===============

    I now just catch this "IllegalArgumentException" in my code and ignore it.
    But a check in PrefetchHelper would be nice, something like:
    ===============
    if(oids.size()!=0){
      SelectQuery sel = QueryUtils.selectQueryForIds(oids);
             context.performQuery(sel);
    }
    ===============

    Cheers,
    Twan Kogels



    This archive was generated by hypermail 2.0.0 : Tue Aug 31 2004 - 03:51:25 EDT