1 package com.indexdata.pz2utils4jsf.pazpar2.commands;
\r
3 import javax.enterprise.context.SessionScoped;
\r
5 import org.apache.log4j.Logger;
\r
7 import com.indexdata.pz2utils4jsf.pazpar2.Expression;
\r
8 import com.indexdata.pz2utils4jsf.pazpar2.SingleTargetFilter;
\r
9 import com.indexdata.pz2utils4jsf.pazpar2.state.StateManager;
\r
12 public class SearchCommand extends Pazpar2Command {
\r
14 private static final long serialVersionUID = -1888520867838597236L;
\r
15 private static Logger logger = Logger.getLogger(SearchCommand.class);
\r
16 private SingleTargetFilter singleTargetFilter = null;
\r
18 public SearchCommand(StateManager stateMgr) {
\r
19 super("search",stateMgr);
\r
22 public void setSession (String sessionId) {
\r
23 setParameter(new CommandParameter("session","=",sessionId));
\r
26 public void setQuery(String query) {
\r
27 setParameter(new CommandParameter("query","=",query));
\r
30 public String getQuery () {
\r
31 return getParameter("query") == null ? null : getParameter("query").getValueWithExpressions();
\r
35 * Sets a facet, in CQL, to restrict the current results,
\r
36 * then executes the search
\r
38 * @param facetKey i.e. 'au' for author
\r
39 * @param term i.e. 'Dickens, Charles'
\r
41 public void setFacet(String facetKey, String term) {
\r
42 if (term != null && term.length()>0) {
\r
43 getParameter("query").addExpression(new Expression(facetKey,"=",term));
\r
48 * Sets a facet to limit the current query by. The
\r
49 * facet is appended to the query string itself (rather
\r
50 * as a separately managed entity. It will thus appear
\r
51 * in a query field as retrieved by getQuery(). It will
\r
52 * not be removed by removeFacet(...)
\r
54 * @param facetKey i.e. 'au' for author
\r
55 * @param term i.e. 'Dickens, Charles'
\r
57 public void setFacetOnQuery (String facetKey, String term) {
\r
58 String facetExpression = facetKey + "=" + term;
\r
59 if (term != null && term.length()>0) {
\r
60 String currentQuery= getParameterValue("query");
\r
61 setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));
\r
66 * Removes a facet set by setFacet(...), then executes
\r
69 * Will not remove facets set by setFacetOnQuery(...)
\r
71 * @param facetKey i.e. 'au' for author
\r
72 * @param term i.e. 'Dickens, Charles'
\r
74 public void removeFacet(String facetKey, String term) {
\r
75 if (getParameter("query") != null) {
\r
76 getParameter("query").removeExpression(new Expression(facetKey,"=",term));
\r
80 public void setFilter(String filterExpression) {
\r
81 setParameter(new CommandParameter("filter","=",filterExpression));
\r
84 public String getFilter() {
\r
85 return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();
\r
88 public boolean hasFilter () {
\r
89 return getFilter().length()>0;
\r
93 * Adds a single target filter to restrict the current query by,
\r
94 * then executes the current search.
\r
96 * This is a special case of the general setFilter function,
\r
97 * allowing to associate a descriptive target name with the
\r
98 * filter expression for display in UI.
\r
100 * @param targetId pazpar2's ID for the target to limit by
\r
101 * @param targetName a descriptive name for the target
\r
103 public void setSingleTargetFilter (String targetId, String targetName) {
\r
104 if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {
\r
105 logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());
\r
107 this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);
\r
108 setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression()));
\r
112 public SingleTargetFilter getSingleTargetFilter () {
\r
113 logger.debug("request to get the current single target filter");
\r
114 return singleTargetFilter;
\r
118 * Removes the current target filter from the search
\r
121 public void removeSingleTargetFilter () {
\r
122 logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());
\r
123 this.singleTargetFilter = null;
\r
124 removeParameter("filter");
\r
129 * @return The target filter set on the current search command
\r
131 public boolean hasSingleTargetFilter() {
\r
132 logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));
\r
133 return singleTargetFilter != null;
\r
137 * Resolves if the current search command has a target filter - to
\r
138 * be used by the UI for conditional rendering of target filter info.
\r
140 * @return true if the current search command is limited by a target
\r
143 protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {
\r
144 return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);
\r
148 public void setLimit (String limit) {
\r
152 public void addFilter(String filterExpression) {
\r
153 if (hasParameterSet("filter")) {
\r
154 setFilter(filterExpression);
\r
157 getParameter("filter");
\r
161 public void removeFilters () {
\r
165 public void removeFilter(String filterExpression) {
\r
169 public SearchCommand copy () {
\r
170 SearchCommand newCommand = new SearchCommand(stateMgr);
\r
171 for (String parameterName : parameters.keySet()) {
\r
172 newCommand.setParameterSilently(parameters.get(parameterName).copy());
\r
174 newCommand.singleTargetFilter = this.singleTargetFilter;
\r