f2eb3bef2dd9480332ac625f646fbd29c10794cf
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / mkjsf / pazpar2 / commands / SearchCommand.java
1 package com.indexdata.mkjsf.pazpar2.commands;\r
2 \r
3 import javax.enterprise.context.SessionScoped;\r
4 import javax.inject.Named;\r
5 \r
6 import org.apache.log4j.Logger;\r
7 \r
8 import com.indexdata.mkjsf.pazpar2.Pz2Service;\r
9 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
10 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
11 \r
12 @SessionScoped @Named\r
13 public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand {\r
14   \r
15   private static final long serialVersionUID = -1888520867838597236L;\r
16   private static Logger logger = Logger.getLogger(SearchCommand.class);\r
17   private SingleTargetFilter singleTargetFilter = null;\r
18     \r
19   public SearchCommand() {\r
20     super("search");\r
21   }\r
22   \r
23   public ResponseDataObject run() {\r
24     logger.info("Running " + getCommandName());\r
25     Pz2Service.get().getStateMgr().hasPendingStateChange("search",false);\r
26     Pz2Service.get().getPzresp().resetSearchAndBeyond();\r
27     Pz2Service.get().getPzreq().getRecord().removeParametersInState();        \r
28     Pz2Service.get().getPzreq().getShow().setParameterInState(new CommandParameter("start","=",0));    \r
29     Pz2Service.get().getSearchClient().setSearchCommand(this);\r
30     return super.run();\r
31   }\r
32 \r
33     \r
34   public void setQuery(String query) {    \r
35     setParameter(new CommandParameter("query","=",query));\r
36   }\r
37   \r
38   public String getQuery () {    \r
39     return getParameter("query") == null ? null  : getParameter("query").getValueWithExpressions();\r
40   }\r
41   \r
42   public void setFilter(String filterExpression) {\r
43     setParameter(new CommandParameter("filter","=",filterExpression));\r
44   }\r
45   \r
46   public String getFilter() {\r
47     return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
48   }\r
49   \r
50   public void addFilter(String filterExpression) {\r
51     // TODO: implement\r
52     if (hasParameterValue("filter")) {\r
53       setFilter(filterExpression);\r
54     } else {\r
55       getParameter("filter");\r
56     }\r
57     throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
58   }\r
59   \r
60   public void removeFilters () {\r
61     removeParameter("filter");\r
62   }\r
63   \r
64   public void removeFilter(String filterExpression) {\r
65     // TODO: implement\r
66     throw new UnsupportedOperationException("removeFilter(filterExpression) yet to be implemented.");\r
67   }\r
68 \r
69   public boolean hasFilter () {\r
70     return getFilter().length()>0;\r
71   }\r
72   \r
73   public void setLimit (String limitExpression) {\r
74     setParameter(new CommandParameter("limit","=",limitExpression));\r
75   }\r
76   \r
77   public String getLimit () {\r
78     return getParameterValue("limit");\r
79   }\r
80       \r
81   public void setStartrecs (String startrecs) {\r
82     setParameter(new CommandParameter("startrecs","=",startrecs));\r
83   }\r
84   \r
85   public String getStartrecs () {\r
86     return getParameterValue("startrecs");\r
87   }\r
88   \r
89   public void setMaxrecs (String maxrecs) {\r
90     setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
91   }\r
92   \r
93   public String getMaxrecs () {\r
94     return getParameterValue("maxrecs");\r
95   }\r
96   \r
97   public void setSort (String sort) {\r
98     setParameter(new CommandParameter("sort","=",sort));\r
99   }\r
100   \r
101   public String getSort () {\r
102     return getParameterValue("sort");\r
103   }\r
104   \r
105   public void setRank (String rank) {\r
106     setParameter(new CommandParameter("rank","=",rank));\r
107   }\r
108   \r
109   public String getRank () {\r
110     return getParameterValue("rank");\r
111   }\r
112   \r
113   public void setMergekey (String mergekey) {\r
114     setParameter(new CommandParameter("mergekey","=",mergekey));\r
115   }\r
116   \r
117   public String getMergekey () {\r
118     return getParameterValue("mergekey");\r
119   }\r
120   \r
121   \r
122   /**\r
123    * Sets a facet, in CQL, to restrict the current results,\r
124    * then executes the search \r
125    * \r
126    * @param facetKey  i.e.  'au' for author\r
127    * @param term  i.e. 'Dickens, Charles'\r
128    */\r
129   public void setFacet(String facetKey, String term) {\r
130     if (term != null && term.length()>0) {         \r
131       getParameter("query").addExpression(new Expression(facetKey,"=",term));            \r
132     }            \r
133   }\r
134   \r
135   /**\r
136    * Sets a facet to limit the current query by. The \r
137    * facet is appended to the query string itself (rather\r
138    * as a separately managed entity. It will thus appear\r
139    * in a query field as retrieved by getQuery(). It will\r
140    * not be removed by removeFacet(...)\r
141    * \r
142    * @param facetKey  i.e. 'au' for author\r
143    * @param term i.e. 'Dickens, Charles'\r
144    */\r
145   public void setFacetOnQuery (String facetKey, String term) {\r
146     String facetExpression = facetKey + "=" + term;    \r
147     if (term != null && term.length()>0) {\r
148       String currentQuery= getParameterValue("query");\r
149       setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));      \r
150     }            \r
151   }\r
152       \r
153   /**\r
154    * Removes a facet set by setFacet(...), then executes\r
155    * the search.\r
156    * \r
157    * Will not remove facets set by setFacetOnQuery(...)\r
158    *  \r
159    * @param facetKey i.e. 'au' for author\r
160    * @param term i.e. 'Dickens, Charles'\r
161    */\r
162   public void removeFacet(String facetKey, String term) {\r
163     if (getParameter("query") != null) {\r
164       getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
165     }\r
166   }\r
167   \r
168   \r
169   /**\r
170    * Adds a single target filter to restrict the current query by, \r
171    * then executes the current search.\r
172    * \r
173    * This is a special case of the general setFilter function, \r
174    * allowing to associate a descriptive target name with the \r
175    * filter expression for display in UI. \r
176    * \r
177    * @param targetId pazpar2's ID for the target to limit by\r
178    * @param targetName a descriptive name for the target\r
179    */\r
180   public void setSingleTargetFilter (String targetId, String targetName) {    \r
181     if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
182       logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
183     } else {      \r
184       logger.debug("Setting new single target filter for [" + targetName + "]");\r
185       this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
186       setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression()));            \r
187     }    \r
188   }\r
189 \r
190   public SingleTargetFilter getSingleTargetFilter () {\r
191     logger.debug("request to get the current single target filter " + singleTargetFilter);\r
192     return singleTargetFilter;\r
193   }\r
194    \r
195   /**\r
196    * Removes the current target filter from the search\r
197    * \r
198    */\r
199   public String removeSingleTargetFilter () {\r
200     logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
201     this.singleTargetFilter = null;\r
202     removeParameter("filter");\r
203     return null;\r
204   }\r
205   \r
206   /**\r
207    * \r
208    * @return The target filter set on the current search command\r
209    */\r
210   public boolean hasSingleTargetFilter() {\r
211     logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
212     return singleTargetFilter != null;    \r
213   }\r
214   \r
215   /**\r
216    * Resolves if the current search command has a target filter - to\r
217    * be used by the UI for conditional rendering of target filter info.\r
218    * \r
219    * @return true if the current search command is limited by a target \r
220    * filter\r
221    */\r
222   protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
223     logger.debug("Checking if target filter for [" + targetFilter.getTargetName() + "] is set.");\r
224     return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
225   }\r
226     \r
227   public SearchCommand copy () {\r
228     SearchCommand newCommand = new SearchCommand();\r
229     for (String parameterName : parameters.keySet()) {\r
230       newCommand.setParameterInState(parameters.get(parameterName).copy());      \r
231     }\r
232     newCommand.singleTargetFilter = this.singleTargetFilter;\r
233     return newCommand;\r
234   }\r
235 \r
236   @Override\r
237   public ServiceProxyCommand getSp() {\r
238     return this;\r
239   }\r
240 \r
241   @Override\r
242   public boolean spOnly() {\r
243     return false;\r
244   }\r
245 \r
246 }\r