[DSCR-19] Case sensitive sidebar facets

git-svn-id: http://scm.dspace.org/svn/repo/dspace/branches/dspace-1_7_x@6139 9c30dcfa-912a-0410-8fc2-9e0234be79fd
This commit is contained in:
Mark Diggory
2011-03-15 05:52:34 +00:00
parent 27741e59a9
commit 1a9a7dfcba
6 changed files with 35 additions and 11 deletions

View File

@@ -44,6 +44,8 @@ public class SearchUtils {
private static List<String> dateIndexableFields = new ArrayList<String>();
public static final String FILTER_SEPARATOR = "|||";
static {
log.debug("loading configuration");
@@ -190,6 +192,20 @@ public class SearchUtils {
return dateIndexableFields;
}
public static String getFilterQueryDisplay(String filterQuery){
String separator = SearchUtils.getConfig().getString("solr.facets.split.char", SearchUtils.FILTER_SEPARATOR);
//Escape any regex chars
separator = java.util.regex.Pattern.quote(separator);
String[] fqParts = filterQuery.split(separator);
String result = "";
int start = fqParts.length / 2;
for(int i = start; i < fqParts.length; i++){
result += fqParts[i];
}
return result;
}
public static class SolrFacetConfig {
private String facetField;

View File

@@ -700,7 +700,10 @@ public class SolrServiceImpl implements SearchService, IndexingService {
if(SearchUtils.getAllFacets().contains(field) || SearchUtils.getAllFacets().contains(unqualifiedField + "." + Item.ANY)){
//Add a special filter
doc.addField(field + "_filter", value);
//We use a separator to split up the lowercase and regular case, this is needed to get our filters in regular case
//Solr has issues with facet prefix and cases
String separator = SearchUtils.getConfig().getString("solr.facets.split.char", SearchUtils.FILTER_SEPARATOR);
doc.addField(field + "_filter", value.toLowerCase() + separator + value);
}
if(SearchUtils.getSortFields().contains(field) && !sortFieldsAdded.contains(field)){

View File

@@ -37,7 +37,6 @@ import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import java.sql.SQLException;
import java.util.*;
import java.util.regex.Matcher;
@@ -386,7 +385,7 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform
continue;
}
for (FacetField.Count count : facetVals) {
values.add(new FilterDisplayValue(count.getName(), count.getCount(), count.getAsFilterQuery()));
values.add(new FilterDisplayValue(SearchUtils.getFilterQueryDisplay(count.getName()), count.getCount(), count.getAsFilterQuery()));
}
}
if(field.isDate()){
@@ -463,12 +462,15 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform
if(keys != null){
while (keys.hasMoreElements()){
String key = (String) keys.nextElement();
if(key != null){
paramsQuery += key + "=" + URLEncoder.encode(request.getParameter(key), "UTF-8");
if(key != null && !"page".equals(key)){
String[] vals = request.getParameterValues(key);
for(String paramValue : vals){
paramsQuery += key + "=" + paramValue;
paramsQuery += "&";
}
}
}
}
filterValsList.addItem().addXref(
contextPath +
@@ -476,7 +478,7 @@ public abstract class AbstractFiltersTransformer extends AbstractDSpaceTransform
"/discover?" +
paramsQuery +
"fq=" +
URLEncoder.encode(filterQuery, "UTF-8"),
filterQuery,
displayedValue + " (" + value.getCount() + ")"
);
}

View File

@@ -558,7 +558,7 @@ public class SearchFacetFilter extends AbstractDSpaceTransformer implements Cach
//No use in selecting the same filter twice
if(filterQueries.contains(filterQuery)){
cell.addContent(displayedValue + " (" + value.getCount() + ")");
cell.addContent(SearchUtils.getFilterQueryDisplay(displayedValue) + " (" + value.getCount() + ")");
} else {
//Add the basics
Map<String, String> urlParams = new HashMap<String, String>();
@@ -567,8 +567,8 @@ public class SearchFacetFilter extends AbstractDSpaceTransformer implements Cach
//Add already existing filter queries
url = addFilterQueriesToUrl(url);
//Last add the current filter query
url += "&fq=" + URLEncoder.encode(filterQuery, "UTF-8");
cell.addXref(url, displayedValue + " (" + value.getCount() + ")"
url += "&fq=" + filterQuery;
cell.addXref(url, SearchUtils.getFilterQueryDisplay(displayedValue) + " (" + value.getCount() + ")"
);
}
}

View File

@@ -166,6 +166,9 @@ public class SimpleSearch extends AbstractSearch implements CacheableProcessingC
if(field.equals("location.comm") || field.equals("location.coll")){
//We have a community/collection, resolve it to a dspaceObject
value = SolrServiceImpl.locationToName(context, field, value);
} else
if(field.endsWith("_filter")){
value = SearchUtils.getFilterQueryDisplay(value);
}
//Check for a range query
Pattern pattern = Pattern.compile("\\[(.*? TO .*?)\\]");

View File

@@ -480,7 +480,7 @@
<!--Treats the entire field as a single token, regardless of its content-->
<tokenizer class="solr.KeywordTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory" />
<!--<filter class="solr.LowerCaseFilterFactory" />-->
</analyzer>
</fieldType>
</types>