\r
import org.apache.log4j.Logger;\r
\r
+import com.indexdata.pz2utils4jsf.pazpar2.Expression;\r
import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;\r
\r
@SessionScoped\r
\r
private static final long serialVersionUID = -1888520867838597236L;\r
private static Logger logger = Logger.getLogger(SearchCommand.class);\r
+ private SingleTargetFilter singleTargetFilter = null;\r
\r
public SearchCommand(StateManager stateMgr) {\r
super("search",stateMgr);\r
return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions();\r
}\r
\r
+ /**\r
+ * Sets a facet, in CQL, to restrict the current results,\r
+ * then executes the search \r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void setFacet(String facetKey, String term) {\r
+ if (term != null && term.length()>0) { \r
+ getParameter("query").addExpression(new Expression(facetKey,"=",term)); \r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Sets a facet to limit the current query by. The \r
+ * facet is appended to the query string itself (rather\r
+ * as a separately managed entity. It will thus appear\r
+ * in a query field as retrieved by getQuery(). It will\r
+ * not be removed by removeFacet(...)\r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void setFacetOnQuery (String facetKey, String term) {\r
+ String facetExpression = facetKey + "=" + term; \r
+ if (term != null && term.length()>0) {\r
+ String currentQuery= getParameterValue("query");\r
+ setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression)); \r
+ } \r
+ }\r
+ \r
+ /**\r
+ * Removes a facet set by setFacet(...), then executes\r
+ * the search.\r
+ * \r
+ * Will not remove facets set by setFacetOnQuery(...)\r
+ * \r
+ * @param facetKey i.e. 'au' for author\r
+ * @param term i.e. 'Dickens, Charles'\r
+ */\r
+ public void removeFacet(String facetKey, String term) {\r
+ if (getParameter("query") != null) {\r
+ getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
+ }\r
+ }\r
+ \r
public void setFilter(String filterExpression) {\r
setParameter(new CommandParameter("filter","=",filterExpression));\r
}\r
public String getFilter() {\r
return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
}\r
+ \r
+ public boolean hasFilter () {\r
+ return getFilter().length()>0;\r
+ }\r
+ \r
+ /**\r
+ * Adds a single target filter to restrict the current query by, \r
+ * then executes the current search.\r
+ * \r
+ * This is a special case of the general setFilter function, \r
+ * allowing to associate a descriptive target name with the \r
+ * filter expression for display in UI. \r
+ * \r
+ * @param targetId pazpar2's ID for the target to limit by\r
+ * @param targetName a descriptive name for the target\r
+ */\r
+ public void setSingleTargetFilter (String targetId, String targetName) { \r
+ if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
+ logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
+ } else { \r
+ this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
+ setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression())); \r
+ } \r
+ }\r
+\r
+ public SingleTargetFilter getSingleTargetFilter () {\r
+ logger.debug("request to get the current single target filter");\r
+ return singleTargetFilter;\r
+ }\r
+ \r
+ /**\r
+ * Removes the current target filter from the search\r
+ * \r
+ */\r
+ public void removeSingleTargetFilter () {\r
+ logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
+ this.singleTargetFilter = null;\r
+ removeParameter("filter"); \r
+ }\r
+ \r
+ /**\r
+ * \r
+ * @return The target filter set on the current search command\r
+ */\r
+ public boolean hasSingleTargetFilter() {\r
+ logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
+ return singleTargetFilter != null; \r
+ }\r
+\r
+ /**\r
+ * Resolves if the current search command has a target filter - to\r
+ * be used by the UI for conditional rendering of target filter info.\r
+ * \r
+ * @return true if the current search command is limited by a target \r
+ * filter\r
+ */\r
+ protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
+ return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
+ }\r
\r
\r
public void setLimit (String limit) {\r
- \r
+ // TODO\r
}\r
\r
public void addFilter(String filterExpression) {\r
public void removeFilter(String filterExpression) {\r
\r
}\r
- \r
+ \r
public SearchCommand copy () {\r
SearchCommand newCommand = new SearchCommand(stateMgr);\r
for (String parameterName : parameters.keySet()) {\r
newCommand.setParameterSilently(parameters.get(parameterName).copy()); \r
- } \r
+ }\r
+ newCommand.singleTargetFilter = this.singleTargetFilter;\r
return newCommand;\r
}\r
\r