e36b239c728162585cb085070cb47a81e3c8f7c5
[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 java.util.Arrays;\r
4 import java.util.List;\r
5 \r
6 import javax.enterprise.context.SessionScoped;\r
7 import javax.inject.Named;\r
8 \r
9 import org.apache.log4j.Logger;\r
10 \r
11 import com.indexdata.mkjsf.pazpar2.Pz2Service;\r
12 import com.indexdata.mkjsf.pazpar2.commands.sp.ServiceProxyCommand;\r
13 import com.indexdata.mkjsf.pazpar2.data.ResponseDataObject;\r
14 \r
15 @SessionScoped @Named\r
16 public class SearchCommand extends Pazpar2Command implements ServiceProxyCommand {\r
17   \r
18   private static final long serialVersionUID = -1888520867838597236L;\r
19   private static Logger logger = Logger.getLogger(SearchCommand.class);  \r
20     \r
21   public SearchCommand() {\r
22     super("search");\r
23   }\r
24   \r
25   public ResponseDataObject run() {\r
26     logger.info("Running " + getCommandName());\r
27     Pz2Service.get().getStateMgr().hasPendingStateChange("search",false);\r
28     Pz2Service.get().getPzresp().resetSearchAndBeyond();\r
29     Pz2Service.get().getPzreq().getRecord().removeParametersInState();        \r
30     Pz2Service.get().getPzreq().getShow().setParameterInState(new CommandParameter("start","=",0));    \r
31     Pz2Service.get().getSearchClient().setSearchCommand(this);\r
32     return super.run();\r
33   }\r
34     \r
35   public void setQuery(String query) {    \r
36     setParameter(new QueryParameter("query","=",query));\r
37   }\r
38   \r
39   public void setBooleanOperatorForQuery(String operator) {\r
40     Pazpar2Command copy = this.copy();\r
41     ((QueryParameter) getParameter("query")).setBooleanOperator(operator);\r
42     checkInState(copy);\r
43   }\r
44   \r
45   public String getQuery () {    \r
46     return getParameter("query") == null ? null  : getParameter("query").getSimpleValue();\r
47   }\r
48   \r
49   public String getExtendedQuery () {    \r
50     return getParameter("query") == null ? null  : getParameter("query").getValueWithExpressions();\r
51   }\r
52   \r
53   public void setFilter(String filterExpression) {\r
54     if (filterExpression != null && filterExpression.length()>0) {\r
55       if (filterExpression.split("[=~]").length==1) {\r
56         removeFilters(filterExpression.split("[=~]")[0]);\r
57       } else if (filterExpression.split("[=~]").length==2) {\r
58         setParameter(new FilterParameter(new Expression(filterExpression)));\r
59       } else {\r
60         logger.error("Could not parse filter expression [" + filterExpression + "]");\r
61       }\r
62     }\r
63   }\r
64   \r
65   public void setFilter(String field, String operator, String value, String label) {\r
66     setParameter(new FilterParameter(new Expression(field,operator,value,label)));\r
67   }\r
68   \r
69   public boolean hasFilterExpression(String... expressionFields) {\r
70     logger.trace("Checking for filter expression for " + Arrays.deepToString(expressionFields));\r
71     for (String field : expressionFields) {\r
72       if (getFilterExpressions(field) != null && getFilterExpressions(field).size()>0) {\r
73         logger.trace("Filter expression found (" + field + ")");\r
74         return true;\r
75       }  \r
76     }\r
77     logger.trace("No filter expressions found");\r
78     return false;\r
79   }\r
80 \r
81   \r
82   public String getFilter() {\r
83     return getParameter("filter") == null ? null : ((FilterParameter)getParameter("filter")).getValueWithExpressions();\r
84   }\r
85   \r
86   public Expression getOneFilterExpression(String expressionField) {\r
87     List<Expression> exprs = getFilterExpressions(expressionField);\r
88     if (exprs != null && exprs.size()>0) {\r
89       if (exprs.size()>1) {\r
90         logger.warn("More that one filter expression found for [" + expressionField + "] but only asked to return the first one");\r
91       }\r
92       return exprs.get(0);\r
93     } else {\r
94       return null;\r
95     }    \r
96   }\r
97 \r
98   \r
99   public List<Expression> getFilterExpressions() {\r
100     return getParameter("filter").getExpressions();\r
101   }\r
102     \r
103   public List<Expression> getFilterExpressions(String... expressionFields) {\r
104     logger.trace("Checking for filter parameter");\r
105     if (parameters.get("filter")!=null) {\r
106       logger.trace("Found");\r
107       return getParameter("filter").getExpressions(expressionFields);\r
108     } else {\r
109       logger.trace("Not found");\r
110       return null;\r
111     }\r
112   }\r
113   \r
114   public boolean hasFilter () {\r
115     return getFilter().length()>0;\r
116   }\r
117   \r
118   public void addFilter(String field, String operator, String value, String label) {\r
119     if (getParameter("filter") == null) {\r
120       setFilter(field + operator + value);\r
121     } else {\r
122       addExpression("filter",new Expression(field,operator,value,(label != null ? label : value)));\r
123     }\r
124   }\r
125   \r
126   public void removeFilters () {\r
127     removeParameter("filter");\r
128   }\r
129   \r
130   public void removeFilter(String field, String operator, String value) {\r
131     removeExpression("filter",new Expression(field, operator, value, null));\r
132   }\r
133   \r
134   public void removeFilters(String... fieldsToRemove) {    \r
135     removeExpressions("filter",fieldsToRemove);    \r
136   }  \r
137     \r
138   public void removeFiltersAfter(String field, String operator, String value, String... fieldsToRemove) {     \r
139     removeExpressionsAfter("filter",new Expression(field,operator,value,null),fieldsToRemove);    \r
140   }\r
141 \r
142   public void setLimit (String limitExpression) {   \r
143     if (limitExpression != null && limitExpression.length()>0) {\r
144       setParameter(new LimitParameter(new Expression(limitExpression)));\r
145     }\r
146   }\r
147   \r
148   public void setLimit(String field, String operator, String value, String label) {\r
149     setParameter(new LimitParameter(new Expression(field,operator,value,label)));\r
150   }\r
151       \r
152   public String getLimit () {\r
153     return getParameter("limit") == null ? null : ((FilterParameter)getParameter("limit")).getValueWithExpressions();    \r
154   }\r
155     \r
156   public boolean hasLimitExpression(String... expressionFields) {\r
157     logger.trace("Checking for limit expression for " + Arrays.deepToString(expressionFields));\r
158     for (String field : expressionFields) {\r
159       if (getLimitExpressions(field) != null && getLimitExpressions(field).size()>0) {\r
160         logger.trace("Limit expression found (" + field + ")");\r
161         return true;\r
162       }  \r
163     }\r
164     logger.trace("No limit expressions found");\r
165     return false;\r
166   }\r
167   \r
168   public Expression getOneLimitExpression(String expressionField) {\r
169     List<Expression> exprs = getLimitExpressions(expressionField);\r
170     if (exprs != null && exprs.size()>0) {\r
171       if (exprs.size()>1) {\r
172         logger.warn("More that one limit expression found for [" + expressionField + "] but only asked to return the first one");\r
173       }\r
174       return exprs.get(0);\r
175     } else {\r
176       return null;\r
177     }    \r
178   }\r
179   \r
180   public List<Expression> getLimitExpressions() {\r
181     return getParameter("limit").getExpressions();\r
182   }\r
183   \r
184   public List<Expression> getLimitExpressions(String... expressionFields) {\r
185     logger.trace("Checking for limit parameter");\r
186     if (parameters.get("limit")!=null) {\r
187       logger.trace("Found");\r
188       return getParameter("limit").getExpressions(expressionFields);\r
189     } else {\r
190       logger.trace("Not found");\r
191       return null;\r
192     }\r
193   }\r
194   \r
195   public void addLimit(String field, String operator, String value, String label) {\r
196     if (getParameter("limit") == null) {\r
197       setLimit(field, operator, value, label);\r
198     } else {\r
199       addExpression("limit",new Expression(field,operator,value,label));      \r
200     }\r
201   }\r
202   \r
203   public void removeLimits() {\r
204     removeParameter("limit");\r
205   }\r
206   \r
207   public void removeLimits(String... fieldsToRemove) {    \r
208     removeExpressions("limit",fieldsToRemove);    \r
209   }\r
210   \r
211   public void removeLimit(String field, String operator, String value) {\r
212     removeExpression("limit",new Expression(field, operator, value, null));    \r
213   }\r
214   \r
215   public void removeLimitsAfter(String field, String operator, String value, String... fieldsToRemove) {     \r
216     removeExpressionsAfter("limit",new Expression(field,operator,value,null),fieldsToRemove);    \r
217   }\r
218 \r
219         \r
220   public void setStartrecs (String startrecs) {\r
221     setParameter(new CommandParameter("startrecs","=",startrecs));\r
222   }\r
223   \r
224   public String getStartrecs () {\r
225     return getParameterValue("startrecs");\r
226   }\r
227   \r
228   public void setMaxrecs (String maxrecs) {\r
229     setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
230   }\r
231   \r
232   public String getMaxrecs () {\r
233     return getParameterValue("maxrecs");\r
234   }\r
235   \r
236   public void setSort (String sort) {\r
237     setParameter(new CommandParameter("sort","=",sort));\r
238   }\r
239   \r
240   public String getSort () {\r
241     return getParameterValue("sort");\r
242   }\r
243   \r
244   public void setRank (String rank) {\r
245     setParameter(new CommandParameter("rank","=",rank));\r
246   }\r
247   \r
248   public String getRank () {\r
249     return getParameterValue("rank");\r
250   }\r
251   \r
252   public void setMergekey (String mergekey) {\r
253     setParameter(new CommandParameter("mergekey","=",mergekey));\r
254   }\r
255   \r
256   public String getMergekey () {\r
257     return getParameterValue("mergekey");\r
258   }\r
259   \r
260   \r
261   /**\r
262    * Sets a facet, in CQL, to restrict the current results\r
263    * \r
264    * @param facetKey  i.e.  'au' for author\r
265    * @param term  i.e. 'Dickens, Charles'\r
266    */\r
267   public void setFacet(String facetKey, String term) {\r
268     if (term != null && term.length()>0) { \r
269       addExpression("query", new Expression(facetKey,"=",term,null));                  \r
270     }            \r
271   }\r
272   \r
273   /**\r
274    * Sets a facet to limit the current query by. The \r
275    * facet is appended to the query string itself (rather\r
276    * as a separately managed entity. It will thus appear\r
277    * in a query field as retrieved by getQuery(). It will\r
278    * not be removed by removeFacet(...)\r
279    * \r
280    * @param facetKey  i.e. 'au' for author\r
281    * @param term i.e. 'Dickens, Charles'\r
282    */\r
283   public void setFacetOnQuery (String facetKey, String term) {\r
284     String facetExpression = facetKey + "=" + term;    \r
285     if (term != null && term.length()>0) {\r
286       String currentQuery= getParameterValue("query");\r
287       setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));      \r
288     }            \r
289   }\r
290       \r
291   /**\r
292    * Removes a facet set by setFacet(...)\r
293    * \r
294    * Will not remove facets set by setFacetOnQuery(...)\r
295    *  \r
296    * @param facetKey i.e. 'au' for author\r
297    * @param term i.e. 'Dickens, Charles'\r
298    */\r
299   public void removeFacet(String facetKey, String term) {\r
300     if (getParameter("query") != null) {\r
301       removeExpression("query",new Expression(facetKey,"=",term,null));\r
302     }\r
303   }\r
304       \r
305   public SearchCommand copy () {\r
306     SearchCommand newCommand = new SearchCommand();\r
307     for (String parameterName : parameters.keySet()) {\r
308       newCommand.setParameterInState(parameters.get(parameterName).copy());      \r
309     }\r
310     return newCommand;\r
311   }\r
312 \r
313   @Override\r
314   public ServiceProxyCommand getSp() {\r
315     return this;\r
316   }\r
317 \r
318   @Override\r
319   public boolean spOnly() {\r
320     return false;\r
321   }\r
322 \r
323 }\r