CategoryFilter:

- Mehere ausgewählte Kategorien werden jetzt per "und" verbunden, nicht mehr per "oder"
- Vereinfachung: Keine Umsetzung zwischen Name und ID der Kategorie mehr notwendig, übertragen wird nur noch die ID


git-svn-id: https://svn.libreccm.org/ccm/trunk@2490 8810af33-2d31-482b-a856-94f89814c4df
master
jensp 2014-01-15 09:51:46 +00:00
parent 683640dd0e
commit 5f6712c3c2
1 changed files with 65 additions and 32 deletions

View File

@ -4,8 +4,10 @@ import com.arsdigita.categorization.Category;
import com.arsdigita.categorization.CategoryCollection; import com.arsdigita.categorization.CategoryCollection;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.DataCollection; import com.arsdigita.persistence.DataCollection;
import com.arsdigita.persistence.DataQuery;
import com.arsdigita.persistence.SessionManager; import com.arsdigita.persistence.SessionManager;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -57,32 +59,61 @@ public class CategoryFilter {
public void applyFilter(final DataCollection objects) { public void applyFilter(final DataCollection objects) {
if (!values.isEmpty()) { if (!values.isEmpty()) {
//final FilterFactory filterFactory = objects.getFilterFactory();
//final CompoundFilter compoundFilter = filterFactory.and();
final List<String> categoryIds = new ArrayList<String>(); final List<String> categoryIds = new ArrayList<String>();
for (String value : values) { for (String value : values) {
if (multiple) { //if (multiple) {
//When using multiple search we assume text input for now //When using multiple search we assume text input for now
if (catNameToCatId.containsKey(value)) { // if (catNameToCatId.containsKey(value)) {
// final com.arsdigita.persistence.Filter filter = filterFactory.in( // categoryIds.add(catNameToCatId.get(value));
// "parent.id", "com.arsdigita.categorization.objectIDsInSubtree"); // }
// filter.set("categoryID", catNameToCatId.get(value)); //} else {
// compoundFilter.addFilter(filter);
categoryIds.add(catNameToCatId.get(value));
}
} else {
//Otherwise, we assume that we get the ID of a single category //Otherwise, we assume that we get the ID of a single category
// final com.arsdigita.persistence.Filter filter = filterFactory.in( // categoryIds.add(value);
// "parent.id", "com.arsdigita.categorization.objectIDsInSubtree"); //}
// filter.set("categoryID", value); categoryIds.add(value);
// compoundFilter.addFilter(filter);
categoryIds.add(value);
}
} }
final com.arsdigita.persistence.Filter filter = objects.addInSubqueryFilter("parent.id", "com.arsdigita.categorization.objectIDsInMultipleSubtrees"); final List<List<BigDecimal>> results = new ArrayList<List<BigDecimal>>();
filter.set("categoryIDs", categoryIds);
//objects.addFilter(compoundFilter); for (String categoryId : categoryIds) {
final DataQuery query = SessionManager.getSession().retrieveQuery(
"com.arsdigita.categorization.objectIDsInSubtree");
query.setParameter("categoryID", categoryId);
final List<BigDecimal> result = new ArrayList<BigDecimal>();
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<BigDecimal> 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(); category = categories.getCategory();
addCategoryToFilter(categoriesElem, category, searchString); addCategoryToFilter(categoriesElem, category, searchString);
if (categoriesStr.length() > 0) { if (categoriesStr.length() > 0) {
categoriesStr.append(", "); categoriesStr.append("; ");
} }
categoriesStr.append('"').append(category.getName()).append('"'); categoriesStr.append('"').append(category.getName()).append('"');
} }
@ -142,21 +173,23 @@ public class CategoryFilter {
final StringBuffer searchString) { final StringBuffer searchString) {
final Element elem = new Element("category"); final Element elem = new Element("category");
elem.addAttribute("id", category.getID().toString()); elem.addAttribute("id", category.getID().toString());
if (multiple) { // if (multiple) {
if ((values != null) && !values.isEmpty() && values.contains(category.getName())) { // if ((values != null) && !values.isEmpty() && values.contains(category.getName())) {
elem.addAttribute("selected", "selected"); // elem.addAttribute("selected", "selected");
// if (searchString.length() > 0) { //// if (searchString.length() > 0) {
// searchString.append(separator); //// searchString.append(separator);
// } //// }
searchString.append(category.getName()); // searchString.append(category.getName());
searchString.append(separator); // searchString.append(separator);
} // }
} else { // } else {
if ((values != null) && !values.isEmpty() && values. if ((values != null) && !values.isEmpty() && values.
contains(category.getID().toString())) { contains(category.getID().toString())) {
elem.addAttribute("selected", "selected"); elem.addAttribute("selected", "selected");
searchString.append(category.getID().toString());
searchString.append(separator);
} }
} //}
elem.setText(category.getName()); elem.setText(category.getName());
parent.addContent(elem); parent.addContent(elem);
} }