e2bd02f44589376068937dfd29da34907d3d3312
[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 CommandParameter("query","=",query));\r
37   }\r
38   \r
39   public String getQuery () {    \r
40     return getParameter("query") == null ? null  : getParameter("query").getValueWithExpressions();\r
41   }\r
42   \r
43   public void setFilter(String filterExpression) {\r
44     if (filterExpression != null && filterExpression.length()>0) {\r
45       setParameter(new FilterParameter(new Expression(filterExpression)));\r
46     }\r
47   }\r
48   \r
49   public void setFilter(String field, String operator, String value, String label) {\r
50     setParameter(new FilterParameter(new Expression(field,operator,value,label)));\r
51   }\r
52   \r
53   public boolean hasFilterExpression(String... expressionFields) {\r
54     logger.trace("Checking for filter expression for " + Arrays.deepToString(expressionFields));\r
55     for (String field : expressionFields) {\r
56       if (getFilterExpressions(field) != null && getFilterExpressions(field).size()>0) {\r
57         logger.trace("Filter expression found (" + field + ")");\r
58         return true;\r
59       }  \r
60     }\r
61     logger.trace("No filter expressions found");\r
62     return false;\r
63   }\r
64 \r
65   \r
66   public String getFilter() {\r
67     return getParameter("filter") == null ? null : ((FilterParameter)getParameter("filter")).getValueWithExpressions();\r
68   }\r
69   \r
70   public Expression getOneFilterExpression(String expressionField) {\r
71     List<Expression> exprs = getFilterExpressions(expressionField);\r
72     if (exprs != null && exprs.size()>0) {\r
73       if (exprs.size()>1) {\r
74         logger.warn("More that one filter expression found for [" + expressionField + "] but only asked to return the first one");\r
75       }\r
76       return exprs.get(0);\r
77     } else {\r
78       return null;\r
79     }    \r
80   }\r
81 \r
82   \r
83   public List<Expression> getFilterExpressions() {\r
84     return getParameter("filter").getExpressions();\r
85   }\r
86     \r
87   public List<Expression> getFilterExpressions(String... expressionFields) {\r
88     logger.trace("Checking for filter parameter");\r
89     if (parameters.get("filter")!=null) {\r
90       logger.trace("Found");\r
91       return getParameter("filter").getExpressions(expressionFields);\r
92     } else {\r
93       logger.trace("Not found");\r
94       return null;\r
95     }\r
96   }\r
97   \r
98   public boolean hasFilter () {\r
99     return getFilter().length()>0;\r
100   }\r
101   \r
102   public void addFilter(String field, String operator, String value, String label) {\r
103     if (getParameter("filter") == null) {\r
104       setFilter(field + operator + value);\r
105     } else {\r
106       getParameter("filter").addExpression(new Expression(field,operator,value,(label != null ? label : value)));\r
107     }\r
108   }\r
109   \r
110   public void removeFilters () {\r
111     removeParameter("filter");\r
112   }\r
113   \r
114   public void removeFilter(String field, String operator, String value) {\r
115     removeExpression("filter",new Expression(field, operator, value, null));\r
116   }\r
117   \r
118   public void removeFilters(String... fieldsToRemove) {    \r
119     removeExpressions("filter",fieldsToRemove);    \r
120   }  \r
121     \r
122   public void removeFiltersAfter(String field, String operator, String value, String... fieldsToRemove) {     \r
123     removeExpressionsAfter("filter",new Expression(field,operator,value,null),fieldsToRemove);    \r
124   }\r
125 \r
126   public void setLimit (String limitExpression) {   \r
127     if (limitExpression != null && limitExpression.length()>0) {\r
128       setParameter(new LimitParameter(new Expression(limitExpression)));\r
129     }\r
130   }\r
131   \r
132   public void setLimit(String field, String operator, String value, String label) {\r
133     setParameter(new LimitParameter(new Expression(field,operator,value,label)));\r
134   }\r
135       \r
136   public String getLimit () {\r
137     return getParameter("limit") == null ? null : ((FilterParameter)getParameter("limit")).getValueWithExpressions();    \r
138   }\r
139     \r
140   public boolean hasLimitExpression(String... expressionFields) {\r
141     logger.trace("Checking for limit expression for " + Arrays.deepToString(expressionFields));\r
142     for (String field : expressionFields) {\r
143       if (getLimitExpressions(field) != null && getLimitExpressions(field).size()>0) {\r
144         logger.trace("Limit expression found (" + field + ")");\r
145         return true;\r
146       }  \r
147     }\r
148     logger.trace("No limit expressions found");\r
149     return false;\r
150   }\r
151   \r
152   public Expression getOneLimitExpression(String expressionField) {\r
153     List<Expression> exprs = getLimitExpressions(expressionField);\r
154     if (exprs != null && exprs.size()>0) {\r
155       if (exprs.size()>1) {\r
156         logger.warn("More that one limit expression found for [" + expressionField + "] but only asked to return the first one");\r
157       }\r
158       return exprs.get(0);\r
159     } else {\r
160       return null;\r
161     }    \r
162   }\r
163   \r
164   public List<Expression> getLimitExpressions() {\r
165     return getParameter("limit").getExpressions();\r
166   }\r
167   \r
168   public List<Expression> getLimitExpressions(String... expressionFields) {\r
169     logger.trace("Checking for limit parameter");\r
170     if (parameters.get("limit")!=null) {\r
171       logger.trace("Found");\r
172       return getParameter("limit").getExpressions(expressionFields);\r
173     } else {\r
174       logger.trace("Not found");\r
175       return null;\r
176     }\r
177   }\r
178   \r
179   public void addLimit(String field, String operator, String value, String label) {\r
180     if (getParameter("limit") == null) {\r
181       setLimit(field, operator, value, label);\r
182     } else {\r
183       addExpression("limit",new Expression(field,operator,value,label));      \r
184     }\r
185   }\r
186   \r
187   public void removeLimits() {\r
188     removeParameter("limit");\r
189   }\r
190   \r
191   public void removeLimits(String... fieldsToRemove) {    \r
192     removeExpressions("limit",fieldsToRemove);    \r
193   }\r
194   \r
195   public void removeLimit(String field, String operator, String value) {\r
196     removeExpression("limit",new Expression(field, operator, value, null));    \r
197   }\r
198   \r
199   public void removeLimitsAfter(String field, String operator, String value, String... fieldsToRemove) {     \r
200     removeExpressionsAfter("limit",new Expression(field,operator,value,null),fieldsToRemove);    \r
201   }\r
202 \r
203         \r
204   public void setStartrecs (String startrecs) {\r
205     setParameter(new CommandParameter("startrecs","=",startrecs));\r
206   }\r
207   \r
208   public String getStartrecs () {\r
209     return getParameterValue("startrecs");\r
210   }\r
211   \r
212   public void setMaxrecs (String maxrecs) {\r
213     setParameter(new CommandParameter("maxrecs","=",maxrecs));\r
214   }\r
215   \r
216   public String getMaxrecs () {\r
217     return getParameterValue("maxrecs");\r
218   }\r
219   \r
220   public void setSort (String sort) {\r
221     setParameter(new CommandParameter("sort","=",sort));\r
222   }\r
223   \r
224   public String getSort () {\r
225     return getParameterValue("sort");\r
226   }\r
227   \r
228   public void setRank (String rank) {\r
229     setParameter(new CommandParameter("rank","=",rank));\r
230   }\r
231   \r
232   public String getRank () {\r
233     return getParameterValue("rank");\r
234   }\r
235   \r
236   public void setMergekey (String mergekey) {\r
237     setParameter(new CommandParameter("mergekey","=",mergekey));\r
238   }\r
239   \r
240   public String getMergekey () {\r
241     return getParameterValue("mergekey");\r
242   }\r
243   \r
244   \r
245   /**\r
246    * Sets a facet, in CQL, to restrict the current results\r
247    * \r
248    * @param facetKey  i.e.  'au' for author\r
249    * @param term  i.e. 'Dickens, Charles'\r
250    */\r
251   public void setFacet(String facetKey, String term) {\r
252     if (term != null && term.length()>0) {         \r
253       getParameter("query").addExpression(new Expression(facetKey,"=",term,null));            \r
254     }            \r
255   }\r
256   \r
257   /**\r
258    * Sets a facet to limit the current query by. The \r
259    * facet is appended to the query string itself (rather\r
260    * as a separately managed entity. It will thus appear\r
261    * in a query field as retrieved by getQuery(). It will\r
262    * not be removed by removeFacet(...)\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 setFacetOnQuery (String facetKey, String term) {\r
268     String facetExpression = facetKey + "=" + term;    \r
269     if (term != null && term.length()>0) {\r
270       String currentQuery= getParameterValue("query");\r
271       setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));      \r
272     }            \r
273   }\r
274       \r
275   /**\r
276    * Removes a facet set by setFacet(...)\r
277    * \r
278    * Will not remove facets set by setFacetOnQuery(...)\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 removeFacet(String facetKey, String term) {\r
284     if (getParameter("query") != null) {\r
285       getParameter("query").removeExpression(new Expression(facetKey,"=",term,null));\r
286     }\r
287   }\r
288       \r
289   public SearchCommand copy () {\r
290     SearchCommand newCommand = new SearchCommand();\r
291     for (String parameterName : parameters.keySet()) {\r
292       newCommand.setParameterInState(parameters.get(parameterName).copy());      \r
293     }\r
294     return newCommand;\r
295   }\r
296 \r
297   @Override\r
298   public ServiceProxyCommand getSp() {\r
299     return this;\r
300   }\r
301 \r
302   @Override\r
303   public boolean spOnly() {\r
304     return false;\r
305   }\r
306 \r
307 }\r