/** | |
* | |
*/ | |
package org.eclipse.smila.solr.search; | |
import java.net.URLDecoder; | |
import org.apache.commons.lang.NullArgumentException; | |
import org.apache.commons.lang.StringUtils; | |
import org.apache.commons.logging.Log; | |
import org.apache.commons.logging.LogFactory; | |
import org.apache.solr.client.solrj.SolrClient; | |
import org.apache.solr.client.solrj.SolrQuery; | |
import org.apache.solr.client.solrj.SolrRequest.METHOD; | |
import org.apache.solr.client.solrj.response.QueryResponse; | |
import org.eclipse.smila.blackboard.Blackboard; | |
import org.eclipse.smila.datamodel.AnyMap; | |
import org.eclipse.smila.datamodel.Record; | |
import org.eclipse.smila.datamodel.xml.XmlSerializationUtils; | |
import org.eclipse.smila.processing.Pipelet; | |
import org.eclipse.smila.processing.ProcessingException; | |
import org.eclipse.smila.processing.util.ProcessingConstants; | |
import org.eclipse.smila.processing.util.ResultCollector; | |
import org.eclipse.smila.search.api.QueryConstants; | |
import org.eclipse.smila.solr.SolrClientService; | |
import org.eclipse.smila.solr.SolrConfiguration; | |
import org.eclipse.smila.solr.SolrConfigurationService; | |
import org.eclipse.smila.solr.SolrConstants.QueryLogging; | |
import org.eclipse.smila.solr.SolrServiceException; | |
import org.eclipse.smila.solr.params.QueryParams; | |
import org.eclipse.smila.solr.params.SearchParams; | |
import org.eclipse.smila.solr.query.QueryTransformer; | |
import org.eclipse.smila.solr.response.QueryResponseParser; | |
import org.eclipse.smila.utils.service.ServiceUtils; | |
/** | |
* @author pwissel | |
* | |
*/ | |
public class SolrSearchPipelet implements Pipelet { | |
private final Log _log = LogFactory.getLog(getClass()); | |
private SolrClientService _solr; | |
private SolrConfigurationService _solrConfiguration; | |
private AnyMap _configuration; | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.eclipse.smila.processing.Pipelet#configure(org.eclipse.smila. datamodel.AnyMap) | |
*/ | |
@Override | |
public void configure(AnyMap configuration) throws ProcessingException { | |
_configuration = configuration; | |
} | |
/* | |
* (non-Javadoc) | |
* | |
* @see org.eclipse.smila.processing.Pipelet#process(org.eclipse.smila.blackboard .Blackboard, java.lang.String[]) | |
*/ | |
@Override | |
public String[] process(Blackboard blackboard, String[] recordIds) throws ProcessingException { | |
final SearchParams params = new SearchParams(blackboard, _configuration); | |
final boolean dropOnError = | |
params.getBooleanParameter(ProcessingConstants.KEY_DROP_ON_ERROR, ProcessingConstants.DROP_ON_ERROR_DEFAULT); | |
final ResultCollector results = new ResultCollector(params, _log, dropOnError); | |
for (final String id : recordIds) { | |
try { | |
params.setCurrentRecord(id); | |
final QueryParams queryParams = new QueryParams(blackboard, _configuration, id); | |
final String index = queryParams.getIndexName(); | |
if (StringUtils.isBlank(index)) { | |
throw new NullArgumentException(QueryConstants.INDEXNAME); | |
} | |
final SolrQuery query = new QueryTransformer(queryParams).toSolrQuery(); | |
// query logging | |
final QueryLogging logging = params.getQueryLogging(); | |
Record record = blackboard.getRecord(id); | |
switch (logging) { | |
case SMILA: | |
_log.info("SmilaQueryRecord:" + XmlSerializationUtils.serialize2string(record)); | |
break; | |
case SOLR: | |
_log.info("SolrQueryString: " + query.toString()); | |
break; | |
case BOTH: | |
_log.info("SmilaQueryRecord:" + XmlSerializationUtils.serialize2string(record)); | |
_log.info("SolrQueryString: " + URLDecoder.decode(query.toString(), "UTF-8")); | |
default: | |
break; | |
} | |
final SolrClient client = getClient(); | |
final METHOD method = params.getMethod(); | |
final QueryResponse response = client.query(index, query, method); | |
final String uniqueKey = getSolrConfiguration().getUniqueKeyDefault(); | |
final boolean fetchFacetFieldType = getSolrConfiguration().isFetchFacetFieldTypeDefault(); | |
final boolean processGroupValueNull = getSolrConfiguration().isProcessGroupValueNullDefault(); | |
final String groupValueNull = getSolrConfiguration().getGroupValueNullDefault(); | |
record = | |
new QueryResponseParser(record, uniqueKey, fetchFacetFieldType, processGroupValueNull, groupValueNull) | |
.parse(response).returnAsRecord(); | |
blackboard.setRecord(record); | |
results.addResult(id); | |
} catch (Exception exception) { | |
results.addFailedResult(id, exception); | |
} | |
} | |
return results.getResultIds(); | |
} | |
private SolrClient getClient() throws InterruptedException, SolrServiceException { | |
if (_solr == null) { | |
_solr = ServiceUtils.getService(SolrClientService.class); | |
} | |
return _solr.getSolrClient(); | |
} | |
private SolrConfiguration getSolrConfiguration() throws InterruptedException { | |
if (_solrConfiguration == null) { | |
_solrConfiguration = ServiceUtils.getService(SolrConfigurationService.class); | |
} | |
return _solrConfiguration.getConfiguration(); | |
} | |
} |