package pl.edu.icm.saos.search.indexing;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.common.SolrInputDocument;
import org.joda.time.LocalDate;
import org.springframework.stereotype.Service;
import pl.edu.icm.saos.search.config.model.IndexField;
import pl.edu.icm.saos.search.config.model.IndexFieldsConstants;
import pl.edu.icm.saos.search.util.SearchDateTimeUtils;
/**
* Service for adding index fields into {@link SolrInputDocument}
*
* @author madryk
* @param <F> types of fields that can be added
*/
@Service
public class SolrFieldAdder<F extends IndexField> {
//------------------------ LOGIC --------------------------
/**
* Adds String value of field into {@link SolrInputDocument}.
* Blank value will be omitted.
* @param doc
* @param field
* @param value
*/
public void addField(SolrInputDocument doc, F field, String value) {
if (StringUtils.isNotBlank(value)) {
doc.addField(field.getFieldName(), value);
}
}
/**
* Adds field long value into {@link SolrInputDocument}
* @param doc
* @param field
* @param value
*/
public void addField(SolrInputDocument doc, F field, long value) {
doc.addField(field.getFieldName(), value);
}
/**
* Adds String value of postfixed field into {@link SolrInputDocument}
* @param doc
* @param field
* @param fieldPostfix
* @param value
*/
public void addField(SolrInputDocument doc, F field, String fieldPostfix, String value) {
if (StringUtils.isNotBlank(value)) {
doc.addField(field.getFieldName() + IndexFieldsConstants.FIELD_SEPARATOR + fieldPostfix, value);
}
}
/**
* Adds String value into {@link SolrInputDocument}.
* Value of field is composed of multiple values by inserting
* {@link IndexFieldsConstants#VALUE_ATTRIBUTE_SEPARATOR} between them.
* @param doc
* @param field
* @param values
*/
public void addCompositeField(SolrInputDocument doc, F field, List<String> values) {
if (values.size() > 0) {
String compositedValues = values.stream().collect(Collectors.joining(IndexFieldsConstants.VALUE_ATTRIBUTE_SEPARATOR));
if (StringUtils.isNotBlank(compositedValues)) {
doc.addField(field.getFieldName(), compositedValues);
}
}
}
/**
* Adds {@link LocalDate} value of field into {@link SolrInputDocument}
* @param doc
* @param field
* @param date
*/
public void addDateField(SolrInputDocument doc, F field, LocalDate date) {
if (date != null) {
String dateString = SearchDateTimeUtils.convertDateToISOString(date);
doc.addField(field.getFieldName(), dateString);
}
}
/**
* Adds {@link BigDecimal} value as PLN currency into {@link SolrInputDocument}
*
* @param doc
* @param field
* @param value
*/
public void addCurrencyField(SolrInputDocument doc, F field, BigDecimal value) {
if (value != null) {
doc.addField(field.getFieldName(), value);
}
}
}