/* * This is a common dao with basic CRUD operations and is not limited to any * persistent layer implementation * * Copyright (C) 2010 Imran M Yousuf (imyousuf@smartitengineering.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * This library 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 * Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package com.smartitengineering.common.dao.search.solr; import com.google.inject.Inject; import com.google.inject.name.Named; import com.smartitengineering.common.dao.search.CommonFreeTextSearchDao; import com.smartitengineering.common.dao.search.SearchResult; import com.smartitengineering.dao.common.queryparam.Order; import com.smartitengineering.dao.common.queryparam.QueryParameter; import com.smartitengineering.dao.common.queryparam.QueryParameterCastHelper; import com.smartitengineering.dao.common.queryparam.SimpleNameValueQueryParameter; import com.smartitengineering.dao.common.queryparam.StringLikeQueryParameter; import com.smartitengineering.dao.common.queryparam.ValueOnlyQueryParameter; import com.smartitengineering.dao.solr.MultivalueMap; import com.smartitengineering.dao.solr.SolrQueryDao; import com.smartitengineering.util.bean.adapter.GenericAdapter; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; /** * * @author imyousuf */ public class SolrFreeTextSearchDao<T> implements CommonFreeTextSearchDao<T> { @Inject private GenericAdapter<T, MultivalueMap<String, Object>> adapter; @Inject private SolrQueryDao queryDao; @Inject private ExecutorService executorService; @Inject @Named("waitTime") private long waitTime; @Inject @Named("waitTimeUnit") private TimeUnit waitTimeUnit; @Override public SearchResult<T> detailedSearch(List<QueryParameter> parameters) { SolrQuery query = new SolrQuery(); for (QueryParameter param : parameters) { switch (param.getParameterType()) { case PARAMETER_TYPE_PROPERTY: StringLikeQueryParameter queryParameter = QueryParameterCastHelper.STRING_PARAM_HELPER.cast(param); if (queryParameter.getPropertyName().equals("q")) { String queryString = queryParameter.getValue(); query.setQuery(queryString); } else { query.add(queryParameter.getPropertyName(), queryParameter.getValue()); } break; case PARAMETER_TYPE_ORDER_BY: SimpleNameValueQueryParameter<Order> parameter = QueryParameterCastHelper.SIMPLE_PARAM_HELPER.cast(param); ORDER order = parameter.getValue().equals(Order.ASC) ? ORDER.asc : ORDER.desc; query.setSortField(parameter.getPropertyName(), order); break; case PARAMETER_TYPE_MAX_RESULT: ValueOnlyQueryParameter<Integer> valParam = QueryParameterCastHelper.VALUE_PARAM_HELPER.cast(param); Integer maxRows = valParam.getValue(); query.setRows(maxRows); break; case PARAMETER_TYPE_FIRST_RESULT: ValueOnlyQueryParameter<Integer> firstParam = QueryParameterCastHelper.VALUE_PARAM_HELPER.cast(param); Integer firstResult = firstParam.getValue(); query.setStart(firstResult); break; default: throw new UnsupportedOperationException("Only property and order by query parameter is supported!"); } } query.setIncludeScore(true); final SearchResult<MultivalueMap<String, Object>> mainResult = queryDao.getResult(query); final Collection<MultivalueMap<String, Object>> result = mainResult.getResult(); final Collection<T> convertedResult = adapter.convertInversely(result.toArray(new MultivalueMap[result.size()])); Iterator<T> resultItr = convertedResult.iterator(); while (resultItr.hasNext()) { T next = resultItr.next(); if (next == null) { resultItr.remove(); } } final SearchResult<T> actualResult = new SearchResult<T>(convertedResult, mainResult); return actualResult; } @Override public SearchResult<T> detailedSearch(QueryParameter... parameters) { return detailedSearch(Arrays.asList(parameters)); } @Override public Collection<T> search(QueryParameter... parameters) { return detailedSearch(Arrays.asList(parameters)).getResult(); } @Override public Collection<T> search(List<QueryParameter> parameters) { return detailedSearch(parameters).getResult(); } public GenericAdapter<T, MultivalueMap<String, Object>> getAdapter() { return adapter; } public void setAdapter(GenericAdapter<T, MultivalueMap<String, Object>> adapter) { this.adapter = adapter; } public ExecutorService getExecutorService() { return executorService; } public void setExecutorService(ExecutorService executorService) { this.executorService = executorService; } public SolrQueryDao getQueryDao() { return queryDao; } public void setQueryDao(SolrQueryDao queryDao) { this.queryDao = queryDao; } public long getWaitTime() { return waitTime; } public void setWaitTime(long waitTime) { this.waitTime = waitTime; } public TimeUnit getWaitTimeUnit() { return waitTimeUnit; } public void setWaitTimeUnit(TimeUnit waitTimeUnit) { this.waitTimeUnit = waitTimeUnit; } }