package com.webobjects.eoaccess; import com.webobjects.eocontrol.EOAndQualifier; import com.webobjects.eocontrol.EOEditingContext; import com.webobjects.eocontrol.EOFetchSpecification; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSArray; /** * Helper class to allow us to access protected stuff in EOAccess. * @author ak */ public class ERXEOAccessHelper { /* public static EOGlobalID _globalIDForRowIsFinal(EOEntity entity, NSDictionary dict, boolean flag) { return entity._globalIDForRowIsFinal(dict, flag); } public static boolean isMultiHop(EORelationship rel) { return rel.isMultiHop(); } public static boolean foreignKeyInDestination(EORelationship rel) { return rel.foreignKeyInDestination(); } public static EOQualifier auxiliaryQualifier(EORelationship rel) { return rel.auxiliaryQualifier(); } public static boolean isToMany(EORelationship relationship) { return relationship.isToMany(); } public static boolean isToManyToOne(EORelationship relationship) { return relationship.isToManyToOne(); } public static EORelationship firstRelationship(EORelationship relationship) { return relationship.firstRelationship(); } public static EORelationship lastRelationship(EORelationship relationship) { return relationship.lastRelationship(); } public static NSDictionary primaryKeyForTargetRowFromSourceDBSnapshot(EORelationship lastrel, NSDictionary currentRow) { return lastrel.primaryKeyForTargetRowFromSourceDBSnapshot(currentRow); } public static EOQualifier _singleTableRestrictingQualifier(EOEntity entity) { return entity._singleTableRestrictingQualifier(); } */ /** * Helper to fix prefetching fetch spec to abstract entities. when batch * fetching across flattened relationships and targeting abstract entities, * we end up with GIDs that contain the abstract, not the concrete. So the * objects can't be instantiated. If we add the schema based qualifier to * the relationship beforehand, everything works as expected. * @author ak * @param dbc database context * @param fetchSpec original fetch specification * @param relationshipName relationship name to abstract entity * @param sourceObjects unused * @param context unused * @return adjusted fetch specification */ public static EOFetchSpecification adjustPrefetching(EODatabaseContext dbc, EOFetchSpecification fetchSpec, String relationshipName, NSArray sourceObjects, EOEditingContext context) { if (fetchSpec.prefetchingRelationshipKeyPaths().count() > 0) { EOEntity rootEntity = dbc.database().entityNamed(fetchSpec.entityName()); EORelationship relationship = rootEntity.relationshipNamed(relationshipName); EOEntity destinationEntity = relationship.destinationEntity(); if (relationship.isToManyToOne() && destinationEntity.isAbstractEntity() && fetchSpec.prefetchingRelationshipKeyPaths().containsObject(relationship.name())) { EOFetchSpecification newFetchSpec = (EOFetchSpecification) fetchSpec.clone(); String inverseName = relationship.anyInverseRelationship().definition(); // from destination to intermediate EOQualifier singleTableRestrict = destinationEntity._singleTableRestrictingQualifier(); EOQualifier migratedRestrict = EOQualifierSQLGeneration.Support._qualifierMigratedFromEntityRelationshipPath(singleTableRestrict, destinationEntity, inverseName); newFetchSpec.setQualifier(new EOAndQualifier(new NSArray(new Object[]{newFetchSpec.qualifier(),migratedRestrict}))); fetchSpec = newFetchSpec; } } return fetchSpec; } }