From 5f6712c3c26b4aaf878a26f319c2953fc75aaa06 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 15 Jan 2014 09:51:46 +0000 Subject: [PATCH] =?UTF-8?q?CategoryFilter:=20-=20Mehere=20ausgew=C3=A4hlte?= =?UTF-8?q?=20Kategorien=20werden=20jetzt=20per=20"und"=20verbunden,=20nic?= =?UTF-8?q?ht=20mehr=20per=20"oder"=20-=20Vereinfachung:=20Keine=20Umsetzu?= =?UTF-8?q?ng=20zwischen=20Name=20und=20ID=20der=20Kategorie=20mehr=20notw?= =?UTF-8?q?endig,=20=C3=BCbertragen=20wird=20nur=20noch=20die=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/trunk@2490 8810af33-2d31-482b-a856-94f89814c4df --- .../navigation/ui/object/CategoryFilter.java | 97 +++++++++++++------ 1 file changed, 65 insertions(+), 32 deletions(-) diff --git a/ccm-navigation/src/com/arsdigita/navigation/ui/object/CategoryFilter.java b/ccm-navigation/src/com/arsdigita/navigation/ui/object/CategoryFilter.java index 8e8fb866d..760c594b2 100644 --- a/ccm-navigation/src/com/arsdigita/navigation/ui/object/CategoryFilter.java +++ b/ccm-navigation/src/com/arsdigita/navigation/ui/object/CategoryFilter.java @@ -4,8 +4,10 @@ import com.arsdigita.categorization.Category; import com.arsdigita.categorization.CategoryCollection; import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataQuery; import com.arsdigita.persistence.SessionManager; import com.arsdigita.xml.Element; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -57,32 +59,61 @@ public class CategoryFilter { public void applyFilter(final DataCollection objects) { if (!values.isEmpty()) { - //final FilterFactory filterFactory = objects.getFilterFactory(); - //final CompoundFilter compoundFilter = filterFactory.and(); final List categoryIds = new ArrayList(); for (String value : values) { - if (multiple) { + //if (multiple) { //When using multiple search we assume text input for now - if (catNameToCatId.containsKey(value)) { -// final com.arsdigita.persistence.Filter filter = filterFactory.in( -// "parent.id", "com.arsdigita.categorization.objectIDsInSubtree"); -// filter.set("categoryID", catNameToCatId.get(value)); -// compoundFilter.addFilter(filter); - categoryIds.add(catNameToCatId.get(value)); - } - } else { + // if (catNameToCatId.containsKey(value)) { + // categoryIds.add(catNameToCatId.get(value)); + // } + //} else { //Otherwise, we assume that we get the ID of a single category -// final com.arsdigita.persistence.Filter filter = filterFactory.in( -// "parent.id", "com.arsdigita.categorization.objectIDsInSubtree"); -// filter.set("categoryID", value); -// compoundFilter.addFilter(filter); - categoryIds.add(value); - } + // categoryIds.add(value); + //} + categoryIds.add(value); } - final com.arsdigita.persistence.Filter filter = objects.addInSubqueryFilter("parent.id", "com.arsdigita.categorization.objectIDsInMultipleSubtrees"); - filter.set("categoryIDs", categoryIds); - //objects.addFilter(compoundFilter); + final List> results = new ArrayList>(); + + for (String categoryId : categoryIds) { + final DataQuery query = SessionManager.getSession().retrieveQuery( + "com.arsdigita.categorization.objectIDsInSubtree"); + query.setParameter("categoryID", categoryId); + + final List result = new ArrayList(); + while (query.next()) { + result.add((BigDecimal) query.get("id")); + } + + if (result.isEmpty()) { + result.add(BigDecimal.ZERO); + } + + results.add(result); + } + + final StringBuilder filterBuilder = new StringBuilder(); + for (List result : results) { + if (filterBuilder.length() > 0) { + filterBuilder.append(" AND "); + } + + final StringBuilder conditionBuilder = new StringBuilder(); + for (BigDecimal id : result) { + if (conditionBuilder.length() > 0) { + conditionBuilder.append(','); + } + conditionBuilder.append(id.toString()); + } + filterBuilder.append("(parent.id IN ("); + filterBuilder.append(conditionBuilder); + filterBuilder.append("))"); + } + + objects.addFilter(filterBuilder.toString()); + //final com.arsdigita.persistence.Filter filter = objects.addNotInSubqueryFilter( + // "parent.id", "com.arsdigita.categorization.objectIDsInMultipleSubtrees"); + //filter.set("categoryIDs", categoryIds); } } @@ -105,7 +136,7 @@ public class CategoryFilter { category = categories.getCategory(); addCategoryToFilter(categoriesElem, category, searchString); if (categoriesStr.length() > 0) { - categoriesStr.append(", "); + categoriesStr.append("; "); } categoriesStr.append('"').append(category.getName()).append('"'); } @@ -142,21 +173,23 @@ public class CategoryFilter { final StringBuffer searchString) { final Element elem = new Element("category"); elem.addAttribute("id", category.getID().toString()); - if (multiple) { - if ((values != null) && !values.isEmpty() && values.contains(category.getName())) { - elem.addAttribute("selected", "selected"); -// if (searchString.length() > 0) { -// searchString.append(separator); -// } - searchString.append(category.getName()); - searchString.append(separator); - } - } else { +// if (multiple) { +// if ((values != null) && !values.isEmpty() && values.contains(category.getName())) { +// elem.addAttribute("selected", "selected"); +//// if (searchString.length() > 0) { +//// searchString.append(separator); +//// } +// searchString.append(category.getName()); +// searchString.append(separator); +// } +// } else { if ((values != null) && !values.isEmpty() && values. contains(category.getID().toString())) { elem.addAttribute("selected", "selected"); + searchString.append(category.getID().toString()); + searchString.append(separator); } - } + //} elem.setText(category.getName()); parent.addContent(elem); }