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