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