Mercurial > hg > LGDataverses
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 } |
