/******************************************************************************* * Australian National University Data Commons * Copyright (C) 2013 The Australian National University * * This file is part of Australian National University Data Commons. * * Australian National University Data Commons is free software: you * can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation, * either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package au.edu.anu.datacommons.data.solr.dao; import java.util.List; import javax.annotation.Resource; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.response.QueryResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; import au.edu.anu.datacommons.data.solr.SolrManager; import au.edu.anu.datacommons.data.solr.SolrUtils; import au.edu.anu.datacommons.data.solr.dao.query.AbstractSolrQuery; import au.edu.anu.datacommons.data.solr.dao.query.AllSolrQuery; import au.edu.anu.datacommons.data.solr.dao.query.PublishedSolrQuery; import au.edu.anu.datacommons.data.solr.dao.query.TeamSolrQuery; import au.edu.anu.datacommons.data.solr.dao.query.TemplateSolrQuery; import au.edu.anu.datacommons.data.solr.model.SolrSearchResult; import au.edu.anu.datacommons.search.SearchTerm; import au.edu.anu.datacommons.security.service.GroupService; /** * SolrSearchImpl * * Australian National University Data Commons * * Implementation class for searches * * JUnit coverage: * SolrSearchDAOTest * * @author Genevieve Turner * */ @Repository("solrSearchDAOImpl") public class SolrSearchDAOImpl implements SolrSearchDAO { static final Logger LOGGER = LoggerFactory.getLogger(SolrSearchDAOImpl.class); @Resource(name="groupServiceImpl") GroupService groupService; @Override public SolrSearchResult executeSearch(String q, int offset, int limit, String filter) throws SolrServerException { LOGGER.info("Do basic search"); q = SolrUtils.escapeSpecialCharacters(q); Object[] list = {q, offset, limit}; LOGGER.debug("Values to use to generate query for Solr - Query Limiter: {} Query Term: {}, Offset: {}, Limit: {}", list); AbstractSolrQuery query = getQueryTerms(q, filter); query.setStart(offset); query.setRows(limit); return executeSearch(query.getSolrQuery()); } @Override public SolrSearchResult executeSearch(String q, int offset, int limit, String filter, String sortField, ORDER sortOrder) throws SolrServerException { q = SolrUtils.escapeSpecialCharacters(q); Object[] list = {filter, q, offset, limit, sortField, sortOrder}; LOGGER.debug("Values to use to generate query for Solr - Query Limiter: {} Query Term: {}, Offset: {}, Limit: {}, Sort Field: {}, Sort Order: {}", list); AbstractSolrQuery query = getQueryTerms(q, filter); query.setStart(offset); query.setRows(limit); query.setSortField(sortField, sortOrder); return executeSearch(query.getSolrQuery()); } @Override public SolrSearchResult executeSearch(String q, String facetField, String facetSelected, int offset, int limit, String filter) throws SolrServerException { if (q != null && !"".equals(q)) { q = SolrUtils.escapeSpecialCharacters(q); } else { q = "*"; } AbstractSolrQuery query = getQueryTerms(q, filter); query.setStart(offset); query.setRows(limit); query.addFacet(facetField, facetSelected); return executeSearch(query.getSolrQuery(), true); } @Override public SolrSearchResult executeSearch(List<SearchTerm> terms, int offset, int limit, String filter) throws SolrServerException { AbstractSolrQuery query = getQueryTerms(terms, filter); query.setStart(offset); query.setRows(limit); return executeSearch(query.getSolrQuery()); } @Override public SolrSearchResult executeSearch(SolrQuery solrQuery) throws SolrServerException { return executeSearch(solrQuery, false); } /** * Execute a search query * * @param solrQuery The solr query to perform * @param hasFacet Indicates whether the solr query has facets * @return The search result * @throws SolrServerException */ private SolrSearchResult executeSearch(SolrQuery solrQuery, boolean hasFacet) throws SolrServerException { LOGGER.debug("Query to send to Solr: {}", solrQuery.toString()); SolrServer solrServer = SolrManager.getInstance().getSolrServer(); QueryResponse queryResponse = solrServer.query(solrQuery); if (hasFacet) { return new SolrSearchResult(queryResponse.getResults(), queryResponse.getFacetFields()); } else { return new SolrSearchResult(queryResponse.getResults()); } } /** * Get the query terms * * @param q The query string * @param filter The filter that defines which records to retrieve * @return The class that generates the solr query */ private AbstractSolrQuery getQueryTerms(String q, String filter) { LOGGER.trace("Get the query terms with the search value '{}', and filter '{}'", q, filter); AbstractSolrQuery absSolrQuery = null; if ("team".equals(filter)) { absSolrQuery = new TeamSolrQuery(groupService, q); } else if ("published".equals(filter)) { absSolrQuery = new PublishedSolrQuery(groupService, q); } else if ("template".equals(filter)) { absSolrQuery = new TemplateSolrQuery(groupService, q); } else { absSolrQuery = new AllSolrQuery(groupService, q); } return absSolrQuery; } /** * Get the query terms * * @param searchTerms The search terms * @param filter The filter that defines which records to retrieve * @return THe class that generates the solr query */ private AbstractSolrQuery getQueryTerms(List<SearchTerm> searchTerms, String filter) { AbstractSolrQuery absSolrQuery = null; if ("team".equals(filter)) { absSolrQuery = new TeamSolrQuery(groupService, searchTerms); } else if ("published".equals(filter)) { absSolrQuery = new PublishedSolrQuery(groupService, searchTerms); } else if ("template".equals(filter)) { absSolrQuery = new TemplateSolrQuery(groupService, searchTerms); } else { absSolrQuery = new AllSolrQuery(groupService, searchTerms); } return absSolrQuery; } }