From: Anjo K. <an...@us...> - 2006-10-30 10:47:51
|
Update of /cvsroot/wonder/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv23979/Sources/er/extensions Modified Files: ERXEOAccessUtilities.java ERXDisplayGroup.java Log Message: fixed fetches when sorting with localized key paths Index: ERXEOAccessUtilities.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXEOAccessUtilities.java,v retrieving revision 1.67 retrieving revision 1.68 diff -C2 -d -r1.67 -r1.68 *** ERXEOAccessUtilities.java 23 Oct 2006 14:45:40 -0000 1.67 --- ERXEOAccessUtilities.java 30 Oct 2006 10:34:31 -0000 1.68 *************** *** 295,311 **** spec.setPromptsAfterFetchLimit(false); } ! if(spec.sortOrderings() != null ) { ! NSMutableArray ommitedOrderings = new NSMutableArray(); ! for(Enumeration e = spec.sortOrderings().objectEnumerator(); e.hasMoreElements();) { ! EOSortOrdering ordering = (EOSortOrdering) e.nextElement(); ! if(ordering.key().indexOf(".") > 0) { ! ommitedOrderings.addObject(ordering); ! } ! } ! if(ommitedOrderings.count() > 0) { ! log.warn("Dropped some sort key as key paths are not supported here: " + ommitedOrderings); ! spec.setSortOrderings(ERXArrayUtilities.arrayMinusArray(spec.sortOrderings(), ommitedOrderings)); ! } ! } String url = (String) model.connectionDictionary().objectForKey("URL"); String lowerCaseURL = (url != null ? url.toLowerCase() : ""); --- 295,299 ---- spec.setPromptsAfterFetchLimit(false); } ! spec = localizeFetchSpecification(ec, spec); String url = (String) model.connectionDictionary().objectForKey("URL"); String lowerCaseURL = (url != null ? url.toLowerCase() : ""); *************** *** 355,359 **** + ")) where eo_rownum between " + (start + 1) + " and " + (end + 1); } else { ! // this might work, too, but only if we have an oder_by sql = "select * from (" + "select " + (spec.usesDistinct() ? " distinct " : "") --- 343,347 ---- + ")) where eo_rownum between " + (start + 1) + " and " + (end + 1); } else { ! // this might work, too, but only if we have an ORDER BY sql = "select * from (" + "select " + (spec.usesDistinct() ? " distinct " : "") *************** *** 1557,1559 **** --- 1545,1587 ---- return pluginName; } + + /** + * Returns a new fetch spec by morphing sort oderings containing the keys <code>foo.name</code> + * returning <code>foo.name_de</code> where appropriate. + * @param ec + * @param fetchSpecification + * @return + */ + public static EOFetchSpecification localizeFetchSpecification(EOEditingContext ec, EOFetchSpecification fetchSpecification) { + if(fetchSpecification != null && fetchSpecification.sortOrderings().count() > 0) { + fetchSpecification = (EOFetchSpecification) fetchSpecification.clone(); + NSMutableArray sortOrderings = new NSMutableArray(fetchSpecification.sortOrderings().count()); + for (Enumeration enumerator = fetchSpecification.sortOrderings().objectEnumerator(); enumerator.hasMoreElements();) { + EOSortOrdering item = (EOSortOrdering) enumerator.nextElement(); + String key = item.key(); + NSArray path = NSArray.componentsSeparatedByString(key, "."); + if(path.count() > 1) { + String prefix = ""; + String attributeName = (String) path.lastObject(); + EOEntity entity = ERXEOAccessUtilities.entityNamed(ec, fetchSpecification.entityName()); + for (int i = 0; i < path.count() - 1; i++) { + String part = (String) path.objectAtIndex(i); + EORelationship rel = entity.anyRelationshipNamed(part); + entity = rel.destinationEntity(); + prefix += part + "."; + } + + if(entity.attributeNamed(attributeName) == null) { + String localizedKey = attributeName + "_" + ERXLocalizer.currentLocalizer().languageCode(); + if(entity.attributeNamed(localizedKey) != null) { + item = new EOSortOrdering(prefix + localizedKey, item.selector()); + } + } + } + sortOrderings.addObject(item); + } + fetchSpecification.setSortOrderings(sortOrderings); + } + return fetchSpecification; + } } Index: ERXDisplayGroup.java =================================================================== RCS file: /cvsroot/wonder/Wonder/Common/Frameworks/ERExtensions/Sources/er/extensions/ERXDisplayGroup.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ERXDisplayGroup.java 10 Oct 2006 18:57:59 -0000 1.2 --- ERXDisplayGroup.java 30 Oct 2006 10:34:31 -0000 1.3 *************** *** 4,7 **** --- 4,9 ---- import com.webobjects.appserver.WODisplayGroup; + import com.webobjects.eoaccess.EODatabaseDataSource; + import com.webobjects.eocontrol.EOFetchSpecification; import com.webobjects.eocontrol.EOQualifier; import com.webobjects.foundation.NSArray; *************** *** 20,23 **** --- 22,51 ---- private static final Logger log = Logger.getLogger(ERXDisplayGroup.class); + public Object fetch() { + if(log.isDebugEnabled()) { + log.debug("Fetching: " + toString(), new RuntimeException("Dummy for Stacktrace")); + } + Object result; + // ak: we need to transform localized keys (foo.name->foo.name_de) + // when we do a real fetch. This actually + // belongs into ERXEC, but I'm reluctant to have this morphing done + // every time a fetch occurs as it affects mainly sort ordering + // from the display group + if (dataSource() instanceof EODatabaseDataSource) { + EODatabaseDataSource ds = (EODatabaseDataSource) dataSource(); + EOFetchSpecification old = ds.fetchSpecification(); + EOFetchSpecification fs = ERXEOAccessUtilities.localizeFetchSpecification(ds.editingContext(), old); + ds.setFetchSpecification(fs); + try { + result = super.fetch(); + } finally { + ds.setFetchSpecification(old); + } + } else { + result = super.fetch(); + } + return result; + } + public NSArray filteredObjects() { // FIXME AK: need to cache here |