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