Programming__WebObjects-EOF-Using EOF-Batch Fetching

Version 6.1 by smmccraw on 2007/07/08 09:44

Batch Fetching

Petite Abeille

Here is a little example about how to batch fetch a bunch of EOFaults:

  • First, given an array of faults, how to retrieve meta information
    without triggering the fault:

  EOEnterpriseObject  aReferenceObject = (EOEnterpriseObject)someFaults.lastObject();
  EOAccessFaultHandler aFaultHandler = (EOAccessFaultHandler) EOFaultHandler.handlerForFault(aReferenceObject);
  EOEditingContext  anEditingContext = aFaultHandler.editingContext();
  String    anEntityName = aFaultHandler.globalID().entityName();
  EOEntity    anEntity =
  EOModelGroup.defaultGroup().entityNamed( anEntityName );

  • Second, for each EOFault build a qualifier:

  EOEnterpriseObject aFault = (EOEnterpriseObject) someFaults.objectAtIndex(index);
  EOKeyGlobalID  aGlobalID = (EOKeyGlobalID) anEditingContext.globalIDForObject( aFault );
  NSDictionary  aPrimaryKey = anEntity.primaryKeyForGlobalID( aGlobalID );
  EOQualifier  aQualifier = anEntity.qualifierForPrimaryKey( aPrimaryKey );

  • Finally, resolve the qualifier:

  EOQualifier   aQualifier = new EOOrQualifier( someQualifiers );
  EOFetchSpecification aFetchSpecification = new EOFetchSpecification( anEntityName, aQualifier, null);
  anEditingContext.objectsWithFetchSpecification?(aFetchSpecification?);

  • Attached is the entire method.

   h4. h4. h4. h4. h4. h4. h4. h1. =
  
Batch fetching Class method(s)
  -
  public static void batchFetchObjects(NSArray someObjects)
  {
    if ( ( someObjects !=_null_)_&&_(_someObjects.count()_>_0_)_)
{
NSMutableArraysomeFaults_=_new_NSMutableArray();
intcount_=_someObjects.count();

for_(_int_index_=_0;_index_<_count;_index++_)
{
ObjectanObject_=_someObjects.objectAtIndex(index);

if_(_EOFaultHandler.isFault(_anObject_)_==_true_)
{
someFaults.addObject(_anObject_);
}
}

if_(_someFaults.count()_>_0_)
{
NSMutableArraysomeQualifiers_=_new_NSMutableArray();
EOEnterpriseObject
aReferenceObject_=_(EOEnterpriseObject)_someFaults.lastObject();
EOAccessFaultHandleraFaultHandler_=_(EOAccessFaultHandler)_EOFaultHandler.handlerForFault(aReferenceObject);
EOEditingContext
anEditingContext_=_aFaultHandler.editingContext();
StringanEntityName_=_aFaultHandler.globalID().entityName();
EOEntityanEntity_=_EOModelGroup.defaultGroup().entityNamed(_anEntityName_);

count_=_someFaults.count();

for_(_int_index_=_0;_index_<_count;_index++_)
{
EOEnterpriseObjectaFault_=_(EOEnterpriseObject)_someFaults.objectAtIndex(index);
EOKeyGlobalIDaGlobalID_=_(EOKeyGlobalID)_anEditingContext.globalIDForObject(_aFault_);
NSDictionaryaPrimaryKey_=_anEntity.primaryKeyForGlobalID(_aGlobalID_);
EOQualifieraQualifier_=_anEntity.qualifierForPrimaryKey(_aPrimaryKey_);

someQualifiers.addObject(_aQualifier_);
}

if_(_someQualifiers.count()_>_0_)
{
EOQualifieraQualifier_=_new_EOOrQualifier(_someQualifiers_);
EOFetchSpecificationaFetchSpecification_=_new_EOFetchSpecification(_anEntityName,_aQualifier,_null);
anEditingContext.objectsWithFetchSpecification(aFetchSpecification);
}
}
}
}

JonathanRochkind

CanyouexplaintheadvantagesoffetchingfaultsinsteadofjustlettingtheeditingContextreturnthem?-SamBarnum

A'fault'willnotactuallybefetcheduntilitisaskedfor.It'sjustanobjectinmemorythatsays'ifanyonetriestoaccessmydata,Iwillfetchitfromthedb.'
Youusuallydon'trunintoasituationwhereyouwanttocreatefaultsinsteadofjustfetchingobjectsfromtheEC---butwhenyou'redoingcomplicatedprogramming,itwillbeobviouswhenyoudo.IthinkjustoncehaveIactuallymanuallycreatedfaults.When_I_had_a_semantic_relationship,_but_couldn't_actually_model_the_relationship,_and_implemented_a_sort_of_half_baked_relationship_scheme_of_my_own_instead

However,I'mnotsurewhyyou'dwanttousetheabovecodewhentheEOEditingContextmethodfaultForRawRowisavailable.MakeanNSDictionarywhichhaspkattributenamesaskeysanddesiredvaluesastheirvalues,passittoyourEC.faultForRawRow?,you'vegotafault.Aheckofaloteasierthantheabove.

PreloadingRelationships

Thismethodcanbeusedtoprefetchrelationshipsinabatchinsteadofhavingthemfireonebyone.Thiscanbeusedtofinetunebatchfetchingincodeinsteadofdoingitinthemodel.Becarefulofhowyouusethismethod.Itwillforceafetchfromthedatabaseeveniftheobjectsarealreadycachedintheobjectstore.Usedincorrectlythiscanreduce,insteadofincrease,performance.

public_static_void_preloadRelationship(NSArray_sourceEOs,_String_relationshipName)_{
_if_(sourceEOs.count()_!= 0) {
         EOEnterpriseObject sampleEO = (EOEnterpriseObject) sourceEOs.objectAtIndex(0);
         EOEditingContext ec = sampleEO.editingContext();
            
         EOObjectStoreCoordinator osc = (EOObjectStoreCoordinator) ec.rootObjectStore();
         osc.lock();
         try {
             EOEntity entity = EOModelGroup.modelGroupForObjectStoreCoordinator(osc)
                 .entityNamed(sampleEO.entityName());
 
             EODatabaseContext databaseContext =  EODatabaseContext.
                 registeredDatabaseContextForModel(entity.model(), osc);
 
             EORelationship relationship = entity.relationshipNamed(relationshipName);
            
             databaseContext.batchFetchRelationship(relationship, sourceEOs, ec);
         }
         finally {
             osc.unlock();
         }
     }
  }

Category:WebObjects