/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.frontend.web.controllers.helper; import org.apache.commons.lang.StringUtils; import org.orcid.core.utils.OrcidSolrQueryBuilder; import org.orcid.core.utils.SolrQueryBuilder; /** * Helper class to be used by {@link SearchOrcidBioForm} to build up an * OrcidSolr query object. The permutations designated as valid here determine * which fields will be added to the query. * * @See {@link OrcidSolrQueryBuilder} * @See {@link SolrQueryBuilder} * @See {@link OrcidSearchForm} * * * @author jamesb * */ public class SearchOrcidSolrCriteria { private OrcidSolrQueryBuilder orcidSolrQueryBuilder; private String orcid; private String familyName; private String givenName; private String institutionName; private Boolean includeOtherNames = false; private Boolean isPastInstitutionsSearchable = false; private String keyword; private String text; public SearchOrcidSolrCriteria() { orcidSolrQueryBuilder = new OrcidSolrQueryBuilder(); } public String getOrcid() { return orcid; } public void setOrcid(String orcid) { this.orcid = orcid; } public String getFamilyName() { return familyName; } public void setFamilyName(String familyName) { this.familyName = familyName; } public String getGivenName() { return givenName; } public void setGivenName(String givenName) { this.givenName = givenName; } public String getInstitutionName() { return institutionName; } public void setInstitutionName(String institutionName) { this.institutionName = institutionName; } public Boolean getIncludeOtherNames() { return includeOtherNames; } public void setIncludeOtherNames(Boolean includeOtherNames) { this.includeOtherNames = includeOtherNames; } public Boolean getIsPastInstitutionsSearchable() { return isPastInstitutionsSearchable; } public void setPastInstitutionsSearchable(Boolean isPastInstitutionsSearchable) { this.isPastInstitutionsSearchable = isPastInstitutionsSearchable; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public String getText() { return text; } public void setText(String text) { this.text = text; } public String deriveQueryString() { if (!StringUtils.isBlank(orcid)) { return "orcid:" + orcid; } deriveGivenNameFamilyNameClause(givenName, familyName); deriveOtherNamesCondition(includeOtherNames, givenName); derivePrimaryInstitutionName(institutionName); derivePastInstitutionsNamesCondition(isPastInstitutionsSearchable, institutionName); deriveKeywordSearchCondition(keyword); deriveTextSearchCondition(text); return orcidSolrQueryBuilder.retrieveQuery(); } private void deriveGivenNameFamilyNameClause(String givenName, String familyName) { boolean givenNameSupplied = !StringUtils.isBlank(givenName); boolean familyNameSupplied = !StringUtils.isBlank(familyName); // when both names are supplied we want to restrict the query to match // on both names if (givenNameSupplied && familyNameSupplied) { orcidSolrQueryBuilder.addGivenNameAsLowercaseWildcardToQuery(givenName); orcidSolrQueryBuilder.addFamilyNameToQueryAsLowerCaseWildcardANDOperation(familyName); return; } // otherwise we just want the query to match on the value provided // (wildcarded*) if (givenNameSupplied || familyNameSupplied) { if (givenNameSupplied) { orcidSolrQueryBuilder.addGivenNameAsLowercaseWildcardToQuery(givenName); } else { orcidSolrQueryBuilder.addFamilyNameAsLowercaseWildcardToQuery(familyName); } return; } } private void derivePrimaryInstitutionName(String institutionName) { if (!orcidSolrQueryBuilder.isEmpty()) { orcidSolrQueryBuilder.addPrimaryInstitutionAsLowercaseWildcardANDOperation(institutionName); } else { orcidSolrQueryBuilder.addPrimaryInstitutionAsLowercaseWildcard(institutionName); } } private void deriveOtherNamesCondition(Boolean otherNamesSearchable, String givenName) { // don't do anything if not searchable // don't do anything if the given name not populated if (otherNamesSearchable && !StringUtils.isBlank(givenName)) { orcidSolrQueryBuilder.addOtherNamesLowercaseWildcardOROperation(givenName); } } private void derivePastInstitutionsNamesCondition(boolean pastInstitutionsSearchable, String institutionName) { // don't do anything if not searchable // don't do anything if the given name not populated if (pastInstitutionsSearchable && !StringUtils.isBlank(institutionName)) { orcidSolrQueryBuilder.addPastInstitutionNamesAsLowercaseWildcardOROperation(institutionName); } } private void deriveKeywordSearchCondition(String keyword) { if (StringUtils.isBlank(keyword)) { return; } // don't make this an AND term if this is the only term if (!orcidSolrQueryBuilder.isEmpty()) { orcidSolrQueryBuilder.addSingleKeywordAsLowercaseWildcardANDCondition(keyword); } else { orcidSolrQueryBuilder.addSingleKeywordAsLowercaseWildcard(keyword); } } private void deriveTextSearchCondition(String text) { if (StringUtils.isBlank(text)) { return; } // don't make this an AND term if this is the only term if (!orcidSolrQueryBuilder.isEmpty()) { orcidSolrQueryBuilder.addTextAsLowercaseWildcardANDCondition(text); } else { orcidSolrQueryBuilder.addTextAsLowercaseWildcard(text); } } }