package pl.edu.icm.saos.search.analysis.solr.request;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pl.edu.icm.saos.search.analysis.request.XField;
import pl.edu.icm.saos.search.analysis.request.XRange;
import pl.edu.icm.saos.search.analysis.request.XSettings;
import pl.edu.icm.saos.search.analysis.solr.XFieldNameMapper;
import pl.edu.icm.saos.search.search.service.FieldFacetToQueryApplier;
import pl.edu.icm.saos.search.search.service.RangeFacetToQueryApplier;
import com.google.common.base.Preconditions;
/**
* Applier of {@link XSettings} to {@link SolrQuery}
*
* @author madryk
*/
@Service
public class XSettingsToQueryApplier {
private XFieldNameMapper xFieldNameMapper;
private XRangeConverterManager xRangeConverterManager;
private RangeFacetToQueryApplier rangeFacetToQueryApplier;
private FieldFacetToQueryApplier fieldFacetToQueryApplier;
//------------------------ LOGIC --------------------------
/**
* Applies {@link XSettings} to {@link SolrQuery}
*/
public void applyXSettingsToQuery(SolrQuery query, XSettings xSettings) {
Preconditions.checkNotNull(query);
Preconditions.checkNotNull(xSettings);
XField xField = xSettings.getField();
String fieldName = xFieldNameMapper.mapXField(xField);
XRange xRange = xSettings.getRange();
if (xRange != null) {
applyRangeFacet(query, fieldName, xRange);
} else {
applyFieldFacet(query, fieldName, xSettings.getFieldValuePrefix());
}
}
//------------------------ PRIVATE --------------------------
private void applyRangeFacet(SolrQuery query, String fieldName, XRange xRange) {
XRangeConverter xRangeConverter = xRangeConverterManager.getXRangeConverter(xRange.getClass());
String startParam = xRangeConverter.convertStart(xRange);
String endParam = xRangeConverter.convertEnd(xRange);
String gapParam = xRangeConverter.convertGap(xRange);
rangeFacetToQueryApplier.applyRangeFacet(query, fieldName, startParam, endParam, gapParam);
}
private void applyFieldFacet(SolrQuery query, String fieldName, String fieldValuePrefix) {
fieldFacetToQueryApplier.applyFieldFacet(query, fieldName, fieldValuePrefix);
}
//------------------------ SETTERS --------------------------
@Autowired
public void setxFieldNameMapper(XFieldNameMapper xFieldNameMapper) {
this.xFieldNameMapper = xFieldNameMapper;
}
@Autowired
public void setxRangeConverterManager(XRangeConverterManager xRangeConverterManager) {
this.xRangeConverterManager = xRangeConverterManager;
}
@Autowired
public void setRangeFacetToQueryApplier(RangeFacetToQueryApplier rangeFacetToQueryApplier) {
this.rangeFacetToQueryApplier = rangeFacetToQueryApplier;
}
@Autowired
public void setFieldFacetToQueryApplier(FieldFacetToQueryApplier fieldFacetToQueryApplier) {
this.fieldFacetToQueryApplier = fieldFacetToQueryApplier;
}
}