Moves parameter expression class to commands package
[mkjsf-moved-to-github.git] / src / main / java / com / indexdata / pz2utils4jsf / pazpar2 / commands / SearchCommand.java
1 package com.indexdata.pz2utils4jsf.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.pz2utils4jsf.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 setSession (String sessionId) {\r
21     setParameter(new CommandParameter("session","=",sessionId));\r
22   }\r
23   \r
24   public void setQuery(String query) {    \r
25     setParameter(new CommandParameter("query","=",query));\r
26   }\r
27   \r
28   public String getQuery () {    \r
29     return getParameter("query") == null ? null  : getParameter("query").getValueWithExpressions();\r
30   }\r
31   \r
32   /**\r
33    * Sets a facet, in CQL, to restrict the current results,\r
34    * then executes the search \r
35    * \r
36    * @param facetKey  i.e.  'au' for author\r
37    * @param term  i.e. 'Dickens, Charles'\r
38    */\r
39   public void setFacet(String facetKey, String term) {\r
40     if (term != null && term.length()>0) {         \r
41       getParameter("query").addExpression(new Expression(facetKey,"=",term));            \r
42     }            \r
43   }\r
44   \r
45   /**\r
46    * Sets a facet to limit the current query by. The \r
47    * facet is appended to the query string itself (rather\r
48    * as a separately managed entity. It will thus appear\r
49    * in a query field as retrieved by getQuery(). It will\r
50    * not be removed by removeFacet(...)\r
51    * \r
52    * @param facetKey  i.e. 'au' for author\r
53    * @param term i.e. 'Dickens, Charles'\r
54    */\r
55   public void setFacetOnQuery (String facetKey, String term) {\r
56     String facetExpression = facetKey + "=" + term;    \r
57     if (term != null && term.length()>0) {\r
58       String currentQuery= getParameterValue("query");\r
59       setParameter(new CommandParameter("query","=", currentQuery + " and " + facetExpression));      \r
60     }            \r
61   }\r
62       \r
63   /**\r
64    * Removes a facet set by setFacet(...), then executes\r
65    * the search.\r
66    * \r
67    * Will not remove facets set by setFacetOnQuery(...)\r
68    *  \r
69    * @param facetKey i.e. 'au' for author\r
70    * @param term i.e. 'Dickens, Charles'\r
71    */\r
72   public void removeFacet(String facetKey, String term) {\r
73     if (getParameter("query") != null) {\r
74       getParameter("query").removeExpression(new Expression(facetKey,"=",term));\r
75     }\r
76   }\r
77   \r
78   public void setFilter(String filterExpression) {\r
79     setParameter(new CommandParameter("filter","=",filterExpression));\r
80   }\r
81   \r
82   public String getFilter() {\r
83     return getParameter("filter") == null ? null : getParameter("filter").getValueWithExpressions();\r
84   }\r
85   \r
86   public boolean hasFilter () {\r
87     return getFilter().length()>0;\r
88   }\r
89   \r
90   /**\r
91    * Adds a single target filter to restrict the current query by, \r
92    * then executes the current search.\r
93    * \r
94    * This is a special case of the general setFilter function, \r
95    * allowing to associate a descriptive target name with the \r
96    * filter expression for display in UI. \r
97    * \r
98    * @param targetId pazpar2's ID for the target to limit by\r
99    * @param targetName a descriptive name for the target\r
100    */\r
101   public void setSingleTargetFilter (String targetId, String targetName) {    \r
102     if (hasSingleTargetFilter(new SingleTargetFilter(targetId,targetName))) {\r
103       logger.debug("Already using target filter " + this.singleTargetFilter.getFilterExpression());\r
104     } else {      \r
105       this.singleTargetFilter = new SingleTargetFilter(targetId,targetName);\r
106       setParameter(new CommandParameter("filter","=",this.singleTargetFilter.getFilterExpression()));            \r
107     }    \r
108   }\r
109 \r
110   public SingleTargetFilter getSingleTargetFilter () {\r
111     logger.debug("request to get the current single target filter");\r
112     return singleTargetFilter;\r
113   }\r
114    \r
115   /**\r
116    * Removes the current target filter from the search\r
117    * \r
118    */\r
119   public void removeSingleTargetFilter () {\r
120     logger.debug("Removing target filter " + singleTargetFilter.getFilterExpression());\r
121     this.singleTargetFilter = null;\r
122     removeParameter("filter");             \r
123   }\r
124   \r
125   /**\r
126    * \r
127    * @return The target filter set on the current search command\r
128    */\r
129   public boolean hasSingleTargetFilter() {\r
130     logger.debug("Checking if a single target filter is set: " + (singleTargetFilter != null));\r
131     return singleTargetFilter != null;    \r
132   }\r
133 \r
134   /**\r
135    * Resolves if the current search command has a target filter - to\r
136    * be used by the UI for conditional rendering of target filter info.\r
137    * \r
138    * @return true if the current search command is limited by a target \r
139    * filter\r
140    */\r
141   protected boolean hasSingleTargetFilter(SingleTargetFilter targetFilter) {\r
142     return hasSingleTargetFilter() && targetFilter.equals(this.singleTargetFilter);\r
143   }\r
144 \r
145   \r
146   public void setLimit (String limit) {\r
147     // TODO\r
148   }\r
149       \r
150   public void addFilter(String filterExpression) {\r
151     if (hasParameterSet("filter")) {\r
152       setFilter(filterExpression);\r
153     } else {\r
154       //TODO\r
155       getParameter("filter");\r
156     }\r
157   }\r
158   \r
159   public void removeFilters () {\r
160     \r
161   }\r
162   \r
163   public void removeFilter(String filterExpression) {\r
164     \r
165   }\r
166     \r
167   public SearchCommand copy () {\r
168     SearchCommand newCommand = new SearchCommand(stateMgr);\r
169     for (String parameterName : parameters.keySet()) {\r
170       newCommand.setParameterSilently(parameters.get(parameterName).copy());      \r
171     }\r
172     newCommand.singleTargetFilter = this.singleTargetFilter;\r
173     return newCommand;\r
174   }\r
175 \r
176 \r
177 }\r