Author: ssmiweve
Date: 2009-01-27 22:42:50 +0100 (Tue, 27 Jan 2009)
New Revision: 7173
Modified:
branches/2.18/generic.sesam/search-command-control/fast/src/main/java/no/sesat/search/mode/command/AbstractFast4SearchCommand.java
Log:
> don't ask for modifiers that are children to a parent that hasn't been
> selected.
> upto 500K saving in the xml result from the result per request
there was a lot more work to this as hierarchical Navigators and Modifiers were
not at all handled.
Modified:
branches/2.18/generic.sesam/search-command-control/fast/src/main/java/no/sesat/search/mode/command/AbstractFast4SearchCommand.java
===================================================================
---
branches/2.18/generic.sesam/search-command-control/fast/src/main/java/no/sesat/search/mode/command/AbstractFast4SearchCommand.java
2009-01-27 21:41:23 UTC (rev 7172)
+++
branches/2.18/generic.sesam/search-command-control/fast/src/main/java/no/sesat/search/mode/command/AbstractFast4SearchCommand.java
2009-01-27 21:42:50 UTC (rev 7173)
@@ -66,6 +66,7 @@
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -74,8 +75,12 @@
import no.sesat.search.result.WeightedSuggestion;
/**
- * Handles the basic implementation of the Simple FAST search.
+ * Handles the basic implementation of the FAST 4 search.
*
+ * Includes support for
+ * - faceted search (modifiers or navigators),
+ * - relevant queries, proper name and spelling suggestions.
+ *
* @version $Id$
*/
public abstract class AbstractFast4SearchCommand extends
AbstractSearchCommand {
@@ -92,14 +97,16 @@
private static final String COLLAPSE_PARAMETER = "collapse";
// Attributes ----------------------------------------------------
- private final Map<String, Navigator> navigatedTo = new HashMap<String,
Navigator>();
+ private final Map<String, Navigator> navigators;
// Deprecated code. I cannot see how anybody is using it. Much related
below is also commented out.
// private final Map<String, String[]> navigatedValues = new
HashMap<String, String[]>();
private final String queryServerUrl;
// Static --------------------------------------------------------
- private static final Map<String, IFastSearchEngine> SEARCH_ENGINES = new
ConcurrentHashMap<String, IFastSearchEngine>();
+ private static final Map<String, IFastSearchEngine> SEARCH_ENGINES
+ = new ConcurrentHashMap<String, IFastSearchEngine>();
+
private static transient IFastSearchEngineFactory engineFactory;
static {
@@ -126,6 +133,7 @@
final FastCommandConfig conf = (FastCommandConfig)
cxt.getSearchConfiguration();
final SiteConfiguration siteConf =
cxt.getDataModel().getSite().getSiteConfiguration();
queryServerUrl = siteConf.getProperty(conf.getQueryServerUrl());
+ navigators = conf.getNavigators();
}
// Public --------------------------------------------------------
@@ -139,7 +147,7 @@
*/
public Collection<String> createNavigationFilterStrings() {
- final Collection<String> filterStrings = new ArrayList<String>();
+ Collection<String> filterStrings = new ArrayList<String>();
// for (final Iterator iterator = navigatedValues.keySet().iterator();
iterator.hasNext();) {
// final String field = (String) iterator.next();
@@ -156,28 +164,9 @@
// }
// }
- for (final Navigator navigator :
getSearchConfiguration().getNavigators().values()) {
+ for (final Navigator navigator : getNavigators().values()) {
- final StringDataObject navigatedValue =
datamodel.getParameters().getValue(navigator.getId());
-
- if (navigatedValue != null) {
-
- // TODO this test should be encapsulated with the delegated
filterBuilder
- final StringBuilder filter
- = new
StringBuilder("adv".equals(getSearchConfiguration().getFiltertype()) ? " AND ("
: " +(");
-
- // splitting here allows for multiple navigation selections
within the one navigation level.
- for(String navSingleValue :
navigatedValue.getString().split(",")){
-
- final String value = navigator.isBoundaryMatch()
- ? "^\"" + navSingleValue + "\"$"
- : "\"" + navSingleValue + "\"";
-
- filter.append(' ' + navigator.getField() + ':' + value);
- }
-
- filterStrings.add(filter.append(" )").toString());
- }
+ filterStrings = createNavigationFilterStrings(filterStrings,
navigator);
}
return filterStrings;
@@ -191,14 +180,6 @@
engineFactory = factory;
}
- /**
- * Add to the navigatedTo map the navigator (from SearchConfiguration) by
the name "navigatorKey".
- * @param navigatorKey name of Navigator to add
- */
- public void addNavigatedTo(final String navigatorKey) {
- navigatedTo.put(navigatorKey, getNavigators().get(navigatorKey));
- }
-
// Z implementation ----------------------------------------------
// SearchCommand overrides ----------------------------------------------
@@ -214,13 +195,6 @@
public ResultList<ResultItem> execute() {
try {
- if (getNavigators() != null) {
- for (String navigatorKey : getNavigators().keySet()) {
-
- addNavigatedTo(navigatorKey);
- }
- }
-
final IFastSearchEngine engine = getSearchEngine();
final IQuery fastQuery = createQuery();
@@ -306,7 +280,7 @@
*/
protected Map<String, Navigator> getNavigators() {
- return getSearchConfiguration().getNavigators();
+ return navigators;
}
@@ -508,7 +482,7 @@
if (!getSearchConfiguration().isIgnoreNavigation() && getNavigators()
!= null) {
- Collection navStrings = createNavigationFilterStrings();
+ final Collection<String> navStrings =
createNavigationFilterStrings();
filter.append(' ');
filter.append(' ').append(StringUtils.join(navStrings.iterator(),
" "));
}
@@ -646,21 +620,14 @@
private String getNavigatorsString() {
- if (getNavigators() != null) {
+ final Collection<Navigator> allFlattened = new ArrayList<Navigator>();
+ for (Navigator navigator : getNavigators().values()) {
- Collection<Navigator> allFlattened = new ArrayList<Navigator>();
+ allFlattened.addAll(flattenNavigators(new ArrayList<Navigator>(),
navigator));
+ }
-
- for (Navigator navigator : getNavigators().values()) {
-
- allFlattened.addAll(flattenNavigators(new
ArrayList<Navigator>(), navigator));
- }
-
- return StringUtils.join(allFlattened.iterator(), ',');
- } else {
- return "";
- }
+ return StringUtils.join(allFlattened.iterator(), ',');
}
private Collection<Navigator> flattenNavigators(Collection<Navigator>
soFar, Navigator nav) {
@@ -677,29 +644,28 @@
private void collectModifiers(IQueryResult result,
FastSearchResult<ResultItem> searchResult) {
- for (String navigatorKey : navigatedTo.keySet()) {
+ for (Navigator nav : getNavigators().values()) {
- collectModifier(navigatorKey, result, searchResult);
+ collectModifier(nav, result, searchResult);
}
-
}
- protected void collectModifier(
- final String navigatorKey,
+ private void collectModifier(
+ final Navigator nav,
final IQueryResult result,
final FastSearchResult<ResultItem> searchResult) {
- final Navigator nav = navigatedTo.get(navigatorKey);
+ final String navigatorKey = nav.getId();
final INavigator navigator = result.getNavigator(nav.getName());
if (null != navigator) {
- final Iterator modifers = navigator.modifiers();
+ final Iterator iterator = navigator.modifiers();
- while (modifers.hasNext()) {
+ while (iterator.hasNext()) {
- final IModifier modifier = (IModifier) modifers.next();
+ final IModifier modifier = (IModifier) iterator.next();
if (!"unknown".equals(modifier.getName())) {
@@ -709,25 +675,28 @@
}
}
- if (searchResult.getModifiers(navigatorKey) != null) {
+ // live copy of list!
+ final List<Modifier> modifiers =
searchResult.getModifiers(navigatorKey);
+
+ if (null != modifiers) {
switch (nav.getSort()) {
case DAY_MONTH_YEAR:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
ModifierDateComparator.DAY_MONTH_YEAR);
+ Collections.sort(modifiers,
ModifierDateComparator.DAY_MONTH_YEAR);
break;
case DAY_MONTH_YEAR_DESCENDING:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
ModifierDateComparator.DAY_MONTH_YEAR_DESCENDING);
+ Collections.sort(modifiers,
ModifierDateComparator.DAY_MONTH_YEAR_DESCENDING);
break;
case YEAR_MONTH_DAY_DESCENDING:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
ModifierDateComparator.YEAR_MONTH_DAY_DESCENDING);
+ Collections.sort(modifiers,
ModifierDateComparator.YEAR_MONTH_DAY_DESCENDING);
break;
case YEAR:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
ModifierDateComparator.YEAR);
+ Collections.sort(modifiers,
ModifierDateComparator.YEAR);
break;
case MONTH_YEAR:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
ModifierDateComparator.MONTH_YEAR);
+ Collections.sort(modifiers,
ModifierDateComparator.MONTH_YEAR);
break;
case CUSTOM:
-
Collections.sort(searchResult.getModifiers(navigatorKey),
getModifierComparator(nav));
+ Collections.sort(modifiers,
getModifierComparator(nav));
break;
case NONE:
// Use the sorting the index returns
@@ -735,12 +704,15 @@
case COUNT:
/* Fall through */
default:
-
Collections.sort(searchResult.getModifiers(navigatorKey));
+ Collections.sort(modifiers);
break;
}
+ }
+ // include any child
+ if(null != nav.getChildNavigator()){
+ collectModifier(nav.getChildNavigator(), result, searchResult);
}
-
}
}
@@ -811,6 +783,39 @@
}
}
+
+ private Collection<String> createNavigationFilterStrings(
+ final Collection<String> filterStrings,
+ final Navigator navigator) {
+
+ final StringDataObject navigatedValue =
datamodel.getParameters().getValue(navigator.getId());
+
+ if(null != navigatedValue){
+
+ // TODO this test should be encapsulated with the delegated
filterBuilder
+ final StringBuilder filter = new
StringBuilder("adv".equals(getSearchConfiguration().getFiltertype())
+ ? " AND ("
+ : " +(");
+
+ // splitting here allows for multiple navigation selections
within the one navigation level.
+ for (String navSingleValue :
navigatedValue.getString().split(",")) {
+
+ final String value = navigator.isBoundaryMatch()
+ ? "^\"" + navSingleValue + "\"$"
+ : "\"" + navSingleValue + "\"";
+
+ filter.append(' ' + navigator.getField() + ':' + value);
+ }
+
+ filterStrings.add(filter.append(" )").toString());
+ }
+
+ // include any children (if parent is selected)
+ return null != navigatedValue && null != navigator.getChildNavigator()
+ ? createNavigationFilterStrings(filterStrings,
navigator.getChildNavigator())
+ : filterStrings;
+ }
+
// Inner classes -------------------------------------------------
}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits