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