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