comparison src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
comparison
equal deleted inserted replaced
9:5926d6419569 10:a50cf11e5178
1 package edu.harvard.iq.dataverse;
2
3 import edu.harvard.iq.dataverse.search.SearchFields;
4 import java.io.IOException;
5 import java.io.UnsupportedEncodingException;
6 import java.net.URLEncoder;
7 import java.util.ArrayList;
8 import java.util.Collection;
9 import java.util.HashMap;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.StringTokenizer;
13 import java.util.logging.Logger;
14 import javax.ejb.EJB;
15 import javax.faces.view.ViewScoped;
16 import javax.inject.Named;
17 import org.apache.commons.lang.StringUtils;
18
19 @ViewScoped
20 @Named("AdvancedSearchPage")
21 public class AdvancedSearchPage implements java.io.Serializable {
22
23 private static final Logger logger = Logger.getLogger(AdvancedSearchPage.class.getCanonicalName());
24
25 @EJB
26 DataverseServiceBean dataverseServiceBean;
27
28 @EJB
29 DatasetFieldServiceBean datasetFieldService;
30
31 private Dataverse dataverse;
32 private String dataverseIdentifier;
33 private List<MetadataBlock> metadataBlocks;
34 private Map<Long, List<DatasetFieldType>> metadataFieldMap = new HashMap();
35 private List<DatasetFieldType> metadataFieldList;
36 private String dvFieldName;
37 private String dvFieldDescription;
38 private String dvFieldAffiliation;
39 private List<String> dvFieldSubject;
40 private String dsPublicationDate;
41 private String dsPersistentId;
42 private String fileFieldName;
43 private String fileFieldDescription;
44 private String fileFieldFiletype;
45 private String fileFieldVariableName;
46 private String fileFieldVariableLabel;
47
48 public void init() {
49
50 if (dataverseIdentifier != null) {
51 dataverse = dataverseServiceBean.findByAlias(dataverseIdentifier);
52 }
53 if (dataverse == null) {
54 dataverse = dataverseServiceBean.findRootDataverse();
55 }
56 metadataBlocks = dataverse.getMetadataBlocks();
57 this.metadataFieldList = datasetFieldService.findAllAdvancedSearchFieldTypes();
58
59 for (MetadataBlock mdb : metadataBlocks) {
60
61 List dsfTypes = new ArrayList();
62 for (DatasetFieldType dsfType : metadataFieldList) {
63 if (dsfType.getMetadataBlock().getId().equals(mdb.getId())) {
64 dsfTypes.add(dsfType);
65 }
66 }
67 metadataFieldMap.put(mdb.getId(), dsfTypes);
68 }
69
70 }
71
72 public String find() throws IOException, UnsupportedEncodingException {
73 List<String> queryStrings = new ArrayList();
74 queryStrings.add(constructDataverseQuery());
75 queryStrings.add(constructDatasetQuery());
76 queryStrings.add(constructFileQuery());
77
78 String returnString = "/dataverse.xhtml?q=";
79 returnString += URLEncoder.encode(constructQuery(queryStrings, false, false), "UTF-8");
80 returnString += "&alias=" + dataverse.getAlias() + "&faces-redirect=true";
81
82
83 logger.fine(returnString);
84 return returnString;
85 }
86
87 private String constructDatasetQuery() {
88 List<String> queryStrings = new ArrayList();
89 for (DatasetFieldType dsfType : metadataFieldList) {
90 if (dsfType.getSearchValue() != null && !dsfType.getSearchValue().equals("")) {
91 queryStrings.add(constructQuery(dsfType.getSolrField().getNameSearchable(), dsfType.getSearchValue()));
92 } else if (dsfType.getListValues() != null && !dsfType.getListValues().isEmpty()) {
93 List<String> listQueryStrings = new ArrayList();
94 for (String value : dsfType.getListValues()) {
95 listQueryStrings.add(dsfType.getSolrField().getNameSearchable() + ":" + "\"" + value + "\"");
96 }
97 queryStrings.add(constructQuery(listQueryStrings, false));
98 }
99 }
100 if (StringUtils.isNotBlank(dsPublicationDate)) {
101 queryStrings.add(constructQuery(SearchFields.DATASET_PUBLICATION_DATE, dsPublicationDate));
102 }
103 if (StringUtils.isNotBlank(dsPersistentId)) {
104 queryStrings.add(constructQuery(SearchFields.DATASET_PERSISTENT_ID, dsPersistentId));
105 }
106 return constructQuery(queryStrings, true);
107
108 }
109
110 private String constructDataverseQuery() {
111 List queryStrings = new ArrayList();
112 if (StringUtils.isNotBlank(dvFieldName)) {
113 queryStrings.add(constructQuery(SearchFields.DATAVERSE_NAME, dvFieldName));
114 }
115
116 if (StringUtils.isNotBlank(dvFieldAffiliation)) {
117 queryStrings.add(constructQuery(SearchFields.DATAVERSE_AFFILIATION, dvFieldAffiliation));
118 }
119
120 if (StringUtils.isNotBlank(dvFieldDescription)) {
121 queryStrings.add(constructQuery(SearchFields.DATAVERSE_DESCRIPTION, dvFieldDescription));
122 }
123
124 if (dvFieldSubject != null && !dvFieldSubject.isEmpty()) {
125 List<String> listQueryStrings = new ArrayList();
126 for (String value : dvFieldSubject) {
127 listQueryStrings.add(SearchFields.DATAVERSE_SUBJECT + ":" + "\"" + value + "\"");
128 }
129 queryStrings.add(constructQuery(listQueryStrings, false));
130 }
131
132 return constructQuery(queryStrings, true);
133 }
134
135 private String constructFileQuery() {
136 List queryStrings = new ArrayList();
137 if (StringUtils.isNotBlank(fileFieldName)) {
138 queryStrings.add(constructQuery(SearchFields.FILE_NAME, fileFieldName));
139 }
140
141 if (StringUtils.isNotBlank(fileFieldDescription)) {
142 queryStrings.add(constructQuery(SearchFields.FILE_DESCRIPTION, fileFieldDescription));
143 }
144
145 if (StringUtils.isNotBlank(fileFieldFiletype)) {
146 queryStrings.add(constructQuery(SearchFields.FILE_TYPE_SEARCHABLE, fileFieldFiletype));
147 }
148
149 if (StringUtils.isNotBlank(fileFieldVariableName)) {
150 queryStrings.add(constructQuery(SearchFields.VARIABLE_NAME, fileFieldVariableName));
151 }
152
153 if (StringUtils.isNotBlank(fileFieldVariableLabel)) {
154 queryStrings.add(constructQuery(SearchFields.VARIABLE_LABEL, fileFieldVariableLabel));
155 }
156
157 return constructQuery(queryStrings, true);
158 }
159
160 private String constructQuery(List<String> queryStrings, boolean isAnd) {
161 return constructQuery(queryStrings, isAnd, true);
162 }
163
164 private String constructQuery(List<String> queryStrings, boolean isAnd, boolean surroundWithParens) {
165 StringBuilder queryBuilder = new StringBuilder();
166
167 int count = 0;
168 for (String string : queryStrings) {
169 if (!StringUtils.isBlank(string)) {
170 if (++count > 1) {
171 queryBuilder.append(isAnd ? " AND " : " OR ");
172 }
173 queryBuilder.append(string);
174 }
175 }
176
177 if (surroundWithParens && count > 1) {
178 queryBuilder.insert(0, "(");
179 queryBuilder.append(")");
180 }
181
182 return queryBuilder.toString().trim();
183 }
184
185 private String constructQuery(String solrField, String userSuppliedQuery) {
186
187 StringBuilder queryBuilder = new StringBuilder();
188 String delimiter = "[\"]+";
189
190 List<String> queryStrings = new ArrayList();
191
192 if (userSuppliedQuery != null && !userSuppliedQuery.equals("")) {
193 if (userSuppliedQuery.contains("\"")) {
194 String[] tempString = userSuppliedQuery.split(delimiter);
195 for (int i = 1; i < tempString.length; i++) {
196 if (!tempString[i].equals(" ") && !tempString[i].isEmpty()) {
197 queryStrings.add(solrField + ":" + "\"" + tempString[i].trim() + "\"");
198 }
199 }
200 } else {
201 StringTokenizer st = new StringTokenizer(userSuppliedQuery);
202 while (st.hasMoreElements()) {
203 queryStrings.add(solrField + ":" + st.nextElement());
204 }
205 }
206 }
207
208 if (queryStrings.size() > 1) {
209 queryBuilder.append("(");
210 }
211
212 for (int i = 0; i < queryStrings.size(); i++) {
213 if (i > 0) {
214 queryBuilder.append(" ");
215 }
216 queryBuilder.append(queryStrings.get(i));
217 }
218
219 if (queryStrings.size() > 1) {
220 queryBuilder.append(")");
221 }
222
223 return queryBuilder.toString().trim();
224 }
225
226 public Dataverse getDataverse() {
227 return dataverse;
228 }
229
230 public void setDataverse(Dataverse dataverse) {
231 this.dataverse = dataverse;
232 }
233
234 public String getDataverseIdentifier() {
235 return dataverseIdentifier;
236 }
237
238 public void setDataverseIdentifier(String dataverseIdentifier) {
239 this.dataverseIdentifier = dataverseIdentifier;
240 }
241
242 public List<MetadataBlock> getMetadataBlocks() {
243 return metadataBlocks;
244 }
245
246 public void setMetadataBlocks(List<MetadataBlock> metadataBlocks) {
247 this.metadataBlocks = metadataBlocks;
248 }
249
250 public Map<Long, List<DatasetFieldType>> getMetadataFieldMap() {
251 return metadataFieldMap;
252 }
253
254 public void setMetadataFieldMap(Map<Long, List<DatasetFieldType>> metadataFieldMap) {
255 this.metadataFieldMap = metadataFieldMap;
256 }
257
258 public String getDvFieldName() {
259 return dvFieldName;
260 }
261
262 public void setDvFieldName(String dvFieldName) {
263 this.dvFieldName = dvFieldName;
264 }
265
266 public String getDvFieldDescription() {
267 return dvFieldDescription;
268 }
269
270 public void setDvFieldDescription(String dvFieldDescription) {
271 this.dvFieldDescription = dvFieldDescription;
272 }
273
274 public String getDvFieldAffiliation() {
275 return dvFieldAffiliation;
276 }
277
278 public void setDvFieldAffiliation(String dvFieldAffiliation) {
279 this.dvFieldAffiliation = dvFieldAffiliation;
280 }
281
282 public List<String> getDvFieldSubject() {
283 return dvFieldSubject;
284 }
285
286 public void setDvFieldSubject(List<String> dvFieldSubject) {
287 this.dvFieldSubject = dvFieldSubject;
288 }
289
290 public Collection<ControlledVocabularyValue> getDvFieldSubjectValues() {
291 DatasetFieldType subjectType = datasetFieldService.findByName(DatasetFieldConstant.subject);
292 return subjectType.getControlledVocabularyValues();
293 }
294
295 public String getDsPublicationDate() {
296 return dsPublicationDate;
297 }
298
299 public void setDsPublicationDate(String dsPublicationDate) {
300 this.dsPublicationDate = dsPublicationDate;
301 }
302
303 public String getDsPersistentId() {
304 return dsPersistentId;
305 }
306
307 public void setDsPersistentId(String dsPersistentId) {
308 this.dsPersistentId = dsPersistentId;
309 }
310
311 public String getFileFieldName() {
312 return fileFieldName;
313 }
314
315 public void setFileFieldName(String fileFieldName) {
316 this.fileFieldName = fileFieldName;
317 }
318
319 public String getFileFieldDescription() {
320 return fileFieldDescription;
321 }
322
323 public void setFileFieldDescription(String fileFieldDescription) {
324 this.fileFieldDescription = fileFieldDescription;
325 }
326
327 public String getFileFieldFiletype() {
328 return fileFieldFiletype;
329 }
330
331 public void setFileFieldFiletype(String fileFieldFiletype) {
332 this.fileFieldFiletype = fileFieldFiletype;
333 }
334
335 public String getFileFieldVariableName() {
336 return fileFieldVariableName;
337 }
338
339 public void setFileFieldVariableName(String fileFieldVariableName) {
340 this.fileFieldVariableName = fileFieldVariableName;
341 }
342
343 public String getFileFieldVariableLabel() {
344 return fileFieldVariableLabel;
345 }
346
347 public void setFileFieldVariableLabel(String fileFieldVariableLabel) {
348 this.fileFieldVariableLabel = fileFieldVariableLabel;
349 }
350
351 }