/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.search.solr.util; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.springframework.beans.factory.annotation.Autowired; import edu.unc.lib.dl.search.solr.model.CaseInsensitiveFacet; import edu.unc.lib.dl.search.solr.model.CutoffFacet; import edu.unc.lib.dl.search.solr.model.CutoffFacetNode; import edu.unc.lib.dl.search.solr.model.FacetFieldFactory; import edu.unc.lib.dl.search.solr.model.GenericFacet; import edu.unc.lib.dl.search.solr.model.HierarchicalFacetNode; import edu.unc.lib.dl.search.solr.model.MultivaluedHierarchicalFacet; import edu.unc.lib.dl.search.solr.model.SearchState; public class FacetFieldUtil { private SearchSettings searchSettings; private SolrSettings solrSettings; @Autowired private FacetFieldFactory facetFieldFactory; /** * Apply facet restrictions to a solr query based on the type of facet provided * * @param facetObject * @param solrQuery */ public void addToSolrQuery(Object facetObject, SolrQuery solrQuery) { if (facetObject instanceof CutoffFacet) { this.addCutoffFacetValue((CutoffFacet) facetObject, solrQuery); } else if (facetObject instanceof MultivaluedHierarchicalFacet) { this.addMultivaluedFacetValue((MultivaluedHierarchicalFacet) facetObject, solrQuery); } else if (facetObject instanceof CaseInsensitiveFacet) { this.addCaseInsensitiveFacetValue((CaseInsensitiveFacet) facetObject, solrQuery); } else if (facetObject instanceof GenericFacet) { this.addGenericFacetValue((GenericFacet) facetObject, solrQuery); } } private void addCutoffFacetValue(CutoffFacet facet, SolrQuery solrQuery) { List<HierarchicalFacetNode> facetNodes = facet.getFacetNodes(); CutoffFacetNode endNode = (CutoffFacetNode) facetNodes.get(facetNodes.size() - 1); String solrFieldName = solrSettings.getFieldName(facet.getFieldName()); StringBuilder filterQuery = new StringBuilder(); filterQuery.append(solrFieldName).append(":").append(endNode.getTier()).append(","); if (!endNode.getSearchKey().equals("*")) { filterQuery.append(SolrSettings.sanitize(endNode.getSearchKey())); } else { filterQuery.append('*'); } solrQuery.addFilterQuery(filterQuery.toString()); if (facet.getCutoff() != null) { filterQuery = new StringBuilder(); filterQuery.append('!').append(solrFieldName).append(':').append(facet.getCutoff()).append(',').append('*'); solrQuery.addFilterQuery(filterQuery.toString()); } if (facet.getFacetCutoff() != null) { solrQuery.setFacetPrefix(solrFieldName, facet.getFacetCutoff() + ","); } } private void addMultivaluedFacetValue(MultivaluedHierarchicalFacet facet, SolrQuery solrQuery) { StringBuilder filterQuery = new StringBuilder(); String solrFieldName = solrSettings.getFieldName(facet.getFieldName()); filterQuery.append(solrFieldName).append(":").append(SolrSettings.sanitize(facet.getSearchValue())).append(",*"); solrQuery.addFilterQuery(filterQuery.toString()); solrQuery.add("f." + solrFieldName + ".facet.prefix", facet.getPivotValue()); } private void addGenericFacetValue(GenericFacet facet, SolrQuery solrQuery) { solrQuery.addFilterQuery(solrSettings.getFieldName(facet.getFieldName()) + ":\"" + SolrSettings.sanitize(facet.getSearchValue()) + "\""); } private void addCaseInsensitiveFacetValue(CaseInsensitiveFacet facet, SolrQuery solrQuery) { solrQuery.addFilterQuery(solrSettings.getFieldName(facet.getSearchName()) + ":\"" + SolrSettings.sanitize(facet.getSearchValue()) + "\""); } /** * Default pivoting values used for restricting facet list results. * * @param fieldKey * @param solrQuery */ public void addDefaultFacetPivot(String fieldKey, SolrQuery solrQuery) { Class<?> facetClass = searchSettings.getFacetClasses().get(fieldKey); this.addDefaultFacetPivot(fieldKey, facetClass, solrQuery); } public void addDefaultFacetPivot(GenericFacet facet, SolrQuery solrQuery) { this.addDefaultFacetPivot(facet.getFieldName(), facet.getClass(), solrQuery); } public void addDefaultFacetPivot(String fieldKey, Class<?> facetClass, SolrQuery solrQuery) { String solrFieldName = solrSettings.getFieldName(fieldKey); if (CutoffFacet.class.equals(facetClass)) { solrQuery.add("f." + solrFieldName + ".facet.prefix", "1,"); } else if (MultivaluedHierarchicalFacet.class.equals(facetClass)) { solrQuery.add("f." + solrFieldName + ".facet.prefix", "^"); } } public void setFacetLimit(String fieldKey, Integer facetLimit, SearchState searchState) { // Create a new facet object for the facet being limited GenericFacet facet = facetFieldFactory.createFacet(fieldKey, null); searchState.getFacetLimits().put(facet.getFieldName(), facetLimit); } public void setSearchSettings(SearchSettings searchSettings) { this.searchSettings = searchSettings; } public void setSolrSettings(SolrSettings solrSettings) { this.solrSettings = solrSettings; } }