diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/AdvancedSearchPage.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,351 @@
+package edu.harvard.iq.dataverse;
+
+import edu.harvard.iq.dataverse.search.SearchFields;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.logging.Logger;
+import javax.ejb.EJB;
+import javax.faces.view.ViewScoped;
+import javax.inject.Named;
+import org.apache.commons.lang.StringUtils;
+
+@ViewScoped
+@Named("AdvancedSearchPage")
+public class AdvancedSearchPage implements java.io.Serializable {
+
+    private static final Logger logger = Logger.getLogger(AdvancedSearchPage.class.getCanonicalName());
+
+    @EJB
+    DataverseServiceBean dataverseServiceBean;
+
+    @EJB
+    DatasetFieldServiceBean datasetFieldService;
+
+    private Dataverse dataverse;
+    private String dataverseIdentifier;
+    private List<MetadataBlock> metadataBlocks;
+    private Map<Long, List<DatasetFieldType>> metadataFieldMap = new HashMap();
+    private List<DatasetFieldType> metadataFieldList;
+    private String dvFieldName;
+    private String dvFieldDescription;
+    private String dvFieldAffiliation;
+    private List<String> dvFieldSubject;
+    private String dsPublicationDate;
+    private String dsPersistentId;
+    private String fileFieldName;
+    private String fileFieldDescription;
+    private String fileFieldFiletype;
+    private String fileFieldVariableName;
+    private String fileFieldVariableLabel;
+
+    public void init() {
+
+        if (dataverseIdentifier != null) {
+            dataverse = dataverseServiceBean.findByAlias(dataverseIdentifier);
+        }
+        if (dataverse == null) {
+            dataverse = dataverseServiceBean.findRootDataverse();
+        }
+        metadataBlocks = dataverse.getMetadataBlocks();
+        this.metadataFieldList = datasetFieldService.findAllAdvancedSearchFieldTypes();
+
+        for (MetadataBlock mdb : metadataBlocks) {
+
+            List dsfTypes = new ArrayList();
+            for (DatasetFieldType dsfType : metadataFieldList) {
+                if (dsfType.getMetadataBlock().getId().equals(mdb.getId())) {
+                    dsfTypes.add(dsfType);
+                }
+            }
+            metadataFieldMap.put(mdb.getId(), dsfTypes);
+        }
+
+    }
+
+    public String find() throws IOException, UnsupportedEncodingException {
+        List<String> queryStrings = new ArrayList();
+        queryStrings.add(constructDataverseQuery());
+        queryStrings.add(constructDatasetQuery());
+        queryStrings.add(constructFileQuery());
+
+        String returnString = "/dataverse.xhtml?q=";
+        returnString += URLEncoder.encode(constructQuery(queryStrings, false, false), "UTF-8");       
+        returnString += "&alias=" + dataverse.getAlias() + "&faces-redirect=true";
+
+        
+        logger.fine(returnString);        
+        return returnString;
+    }
+
+    private String constructDatasetQuery() {
+        List<String> queryStrings = new ArrayList();
+        for (DatasetFieldType dsfType : metadataFieldList) {
+            if (dsfType.getSearchValue() != null && !dsfType.getSearchValue().equals("")) {
+                queryStrings.add(constructQuery(dsfType.getSolrField().getNameSearchable(), dsfType.getSearchValue()));
+            } else if (dsfType.getListValues() != null && !dsfType.getListValues().isEmpty()) {
+                List<String> listQueryStrings = new ArrayList();
+                for (String value : dsfType.getListValues()) {
+                    listQueryStrings.add(dsfType.getSolrField().getNameSearchable() + ":" + "\"" + value + "\"");
+                }
+                queryStrings.add(constructQuery(listQueryStrings, false));
+            }
+        }
+        if (StringUtils.isNotBlank(dsPublicationDate)) {
+            queryStrings.add(constructQuery(SearchFields.DATASET_PUBLICATION_DATE, dsPublicationDate));
+        }
+        if (StringUtils.isNotBlank(dsPersistentId)) {
+            queryStrings.add(constructQuery(SearchFields.DATASET_PERSISTENT_ID, dsPersistentId));
+        }
+        return constructQuery(queryStrings, true);
+
+    }
+
+    private String constructDataverseQuery() {
+        List queryStrings = new ArrayList();
+        if (StringUtils.isNotBlank(dvFieldName)) {
+            queryStrings.add(constructQuery(SearchFields.DATAVERSE_NAME, dvFieldName));
+        }
+
+        if (StringUtils.isNotBlank(dvFieldAffiliation)) {
+            queryStrings.add(constructQuery(SearchFields.DATAVERSE_AFFILIATION, dvFieldAffiliation));
+        }
+
+        if (StringUtils.isNotBlank(dvFieldDescription)) {
+            queryStrings.add(constructQuery(SearchFields.DATAVERSE_DESCRIPTION, dvFieldDescription));
+        }
+
+        if (dvFieldSubject != null && !dvFieldSubject.isEmpty()) {
+            List<String> listQueryStrings = new ArrayList();
+            for (String value : dvFieldSubject) {
+                listQueryStrings.add(SearchFields.DATAVERSE_SUBJECT + ":" + "\"" + value + "\"");
+            }
+            queryStrings.add(constructQuery(listQueryStrings, false));
+        }
+
+            return constructQuery(queryStrings, true);
+        }
+
+    private String constructFileQuery() {
+        List queryStrings = new ArrayList();
+        if (StringUtils.isNotBlank(fileFieldName)) {
+            queryStrings.add(constructQuery(SearchFields.FILE_NAME, fileFieldName));
+        }
+
+        if (StringUtils.isNotBlank(fileFieldDescription)) {
+            queryStrings.add(constructQuery(SearchFields.FILE_DESCRIPTION, fileFieldDescription));
+        }
+
+        if (StringUtils.isNotBlank(fileFieldFiletype)) {
+            queryStrings.add(constructQuery(SearchFields.FILE_TYPE_SEARCHABLE, fileFieldFiletype));
+        }
+
+        if (StringUtils.isNotBlank(fileFieldVariableName)) {
+            queryStrings.add(constructQuery(SearchFields.VARIABLE_NAME, fileFieldVariableName));
+        }
+
+        if (StringUtils.isNotBlank(fileFieldVariableLabel)) {
+            queryStrings.add(constructQuery(SearchFields.VARIABLE_LABEL, fileFieldVariableLabel));
+        }
+
+        return constructQuery(queryStrings, true);
+    }
+
+    private String constructQuery(List<String> queryStrings, boolean isAnd) {
+        return constructQuery(queryStrings, isAnd, true);
+    }
+
+    private String constructQuery(List<String> queryStrings, boolean isAnd, boolean surroundWithParens) {
+        StringBuilder queryBuilder = new StringBuilder();
+
+        int count = 0;
+        for (String string : queryStrings) {
+            if (!StringUtils.isBlank(string)) {
+                if (++count > 1) {
+                    queryBuilder.append(isAnd ? " AND " : " OR ");
+                }
+                queryBuilder.append(string);
+            }
+        }
+
+        if (surroundWithParens && count > 1) {
+            queryBuilder.insert(0, "(");
+            queryBuilder.append(")");
+        }
+
+        return queryBuilder.toString().trim();
+    }
+
+    private String constructQuery(String solrField, String userSuppliedQuery) {
+
+        StringBuilder queryBuilder = new StringBuilder();
+        String delimiter = "[\"]+";
+
+        List<String> queryStrings = new ArrayList();
+
+        if (userSuppliedQuery != null && !userSuppliedQuery.equals("")) {
+            if (userSuppliedQuery.contains("\"")) {
+                String[] tempString = userSuppliedQuery.split(delimiter);
+                for (int i = 1; i < tempString.length; i++) {
+                    if (!tempString[i].equals(" ") && !tempString[i].isEmpty()) {
+                        queryStrings.add(solrField + ":" + "\"" + tempString[i].trim() + "\"");
+                    }
+                }
+            } else {
+                StringTokenizer st = new StringTokenizer(userSuppliedQuery);
+                while (st.hasMoreElements()) {
+                    queryStrings.add(solrField + ":" + st.nextElement());
+                }
+            }
+        }
+
+        if (queryStrings.size() > 1) {
+            queryBuilder.append("(");
+        }
+
+        for (int i = 0; i < queryStrings.size(); i++) {
+            if (i > 0) {
+                queryBuilder.append(" ");
+            }
+            queryBuilder.append(queryStrings.get(i));
+        }
+
+        if (queryStrings.size() > 1) {
+            queryBuilder.append(")");
+        }
+
+        return queryBuilder.toString().trim();
+    }
+
+    public Dataverse getDataverse() {
+        return dataverse;
+    }
+
+    public void setDataverse(Dataverse dataverse) {
+        this.dataverse = dataverse;
+    }
+
+    public String getDataverseIdentifier() {
+        return dataverseIdentifier;
+    }
+
+    public void setDataverseIdentifier(String dataverseIdentifier) {
+        this.dataverseIdentifier = dataverseIdentifier;
+    }
+
+    public List<MetadataBlock> getMetadataBlocks() {
+        return metadataBlocks;
+    }
+
+    public void setMetadataBlocks(List<MetadataBlock> metadataBlocks) {
+        this.metadataBlocks = metadataBlocks;
+    }
+
+    public Map<Long, List<DatasetFieldType>> getMetadataFieldMap() {
+        return metadataFieldMap;
+    }
+
+    public void setMetadataFieldMap(Map<Long, List<DatasetFieldType>> metadataFieldMap) {
+        this.metadataFieldMap = metadataFieldMap;
+    }
+
+    public String getDvFieldName() {
+        return dvFieldName;
+    }
+
+    public void setDvFieldName(String dvFieldName) {
+        this.dvFieldName = dvFieldName;
+    }
+
+    public String getDvFieldDescription() {
+        return dvFieldDescription;
+    }
+
+    public void setDvFieldDescription(String dvFieldDescription) {
+        this.dvFieldDescription = dvFieldDescription;
+    }
+
+    public String getDvFieldAffiliation() {
+        return dvFieldAffiliation;
+    }
+
+    public void setDvFieldAffiliation(String dvFieldAffiliation) {
+        this.dvFieldAffiliation = dvFieldAffiliation;
+    }
+
+    public List<String> getDvFieldSubject() {
+        return dvFieldSubject;
+    }
+
+    public void setDvFieldSubject(List<String> dvFieldSubject) {
+        this.dvFieldSubject = dvFieldSubject;
+    }
+
+    public Collection<ControlledVocabularyValue> getDvFieldSubjectValues() {
+        DatasetFieldType subjectType = datasetFieldService.findByName(DatasetFieldConstant.subject);
+        return subjectType.getControlledVocabularyValues();
+    }
+
+    public String getDsPublicationDate() {
+        return dsPublicationDate;
+    }
+
+    public void setDsPublicationDate(String dsPublicationDate) {
+        this.dsPublicationDate = dsPublicationDate;
+    }
+
+    public String getDsPersistentId() {
+        return dsPersistentId;
+    }
+
+    public void setDsPersistentId(String dsPersistentId) {
+        this.dsPersistentId = dsPersistentId;
+    }
+
+    public String getFileFieldName() {
+        return fileFieldName;
+    }
+
+    public void setFileFieldName(String fileFieldName) {
+        this.fileFieldName = fileFieldName;
+    }
+
+    public String getFileFieldDescription() {
+        return fileFieldDescription;
+    }
+
+    public void setFileFieldDescription(String fileFieldDescription) {
+        this.fileFieldDescription = fileFieldDescription;
+    }
+
+    public String getFileFieldFiletype() {
+        return fileFieldFiletype;
+    }
+
+    public void setFileFieldFiletype(String fileFieldFiletype) {
+        this.fileFieldFiletype = fileFieldFiletype;
+    }
+
+    public String getFileFieldVariableName() {
+        return fileFieldVariableName;
+    }
+
+    public void setFileFieldVariableName(String fileFieldVariableName) {
+        this.fileFieldVariableName = fileFieldVariableName;
+    }
+
+    public String getFileFieldVariableLabel() {
+        return fileFieldVariableLabel;
+    }
+
+    public void setFileFieldVariableLabel(String fileFieldVariableLabel) {
+        this.fileFieldVariableLabel = fileFieldVariableLabel;
+    }
+
+}