From 56e39bef6b7c1a11429d930ed46f4ed4f8b2fdab Mon Sep 17 00:00:00 2001 From: ryounes Date: Wed, 4 May 2011 02:02:16 +0000 Subject: [PATCH] NIHVIVO-2573 Rewrite collate() method so it doesn't assume the statementData is ordered by subclass --- .../CollatedObjectPropertyTemplateModel.java | 47 ++++++++++++------- 1 file changed, 30 insertions(+), 17 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java index 1ea3756bb..8cc442849 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/web/templatemodels/individual/CollatedObjectPropertyTemplateModel.java @@ -7,7 +7,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -144,11 +143,6 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM filteredList.add(dataForThisObject.get(0)); } - // Use retainAll() rather than clear() plus addAll() in order to retain the subclass ordering - // of statementData. Otherwise the list is now ordered by author, whereas collate() assumes - // the list is ordered by subclass. - //statementData.clear(); - //statementData.addAll(filteredList); statementData.retainAll(filteredList); if (log.isDebugEnabled()) { @@ -201,31 +195,50 @@ public class CollatedObjectPropertyTemplateModel extends ObjectPropertyTemplateM } } - // Collate the statements by subclass. NB It is assumed that the statements in statementData - // are ordered by subclass. + // Collate the statements by subclass. private SortedMap> collate(String subjectUri, String propertyUri, List> statementData, VitroRequest vreq, EditingPolicyHelper policyHelper) { SortedMap> subclassMap = new TreeMap>(); - String currentSubclassUri = null; - List currentList = null; + String objectKey = getObjectKey(); + + Map subclassUrisToNames = new HashMap(); + for (Map map : statementData) { + String subclassUri = map.get(SUBCLASS_VARIABLE_NAME); + // Rows with no subclass are put into a subclass map with an empty name. if (subclassUri == null) { subclassUri = ""; } - if (!subclassUri.equals(currentSubclassUri)) { - currentSubclassUri = subclassUri; - currentList = new ArrayList(); - String subclassName = getSubclassName(subclassUri, vreq); - subclassMap.put(subclassName, currentList); + + // Keep a map of subclass uris to subclass names, so we don't have + // to keep recomputing from the dao each time we hit the same subclass. + String subclassName; + if (subclassUri.isEmpty()) { + subclassName = ""; + } else if ( subclassUrisToNames.containsKey(subclassUri) ) { + subclassName = subclassUrisToNames.get(subclassUri); + } else { + subclassName = getSubclassName(subclassUri, vreq); + subclassUrisToNames.put(subclassUri, subclassName); } - currentList.add(new ObjectPropertyStatementTemplateModel(subjectUri, + + List listForThisSubclass; + if ( subclassMap.containsKey(subclassName) ) { + listForThisSubclass = subclassMap.get(subclassName); + } else { + listForThisSubclass = new ArrayList(); + subclassMap.put(subclassName, listForThisSubclass); + } + + listForThisSubclass.add(new ObjectPropertyStatementTemplateModel(subjectUri, propertyUri, objectKey, map, policyHelper, getTemplateName())); - } + } + return subclassMap; }