package gov.nysenate.openleg.service.base.search;
import com.google.common.base.Splitter;
import gov.nysenate.openleg.model.search.SearchException;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public abstract class ElasticSearchServiceUtils {
/**
* Generates a list of elastic search sort parameters from a CSV string. If no parameters are specified,
* a single score sort parameter is used.
*
* @param sort String
* @return List<SortBuilder>
*/
public static List<SortBuilder> extractSortBuilders(String sort) throws SearchException {
List<SortBuilder> sortBuilders = new ArrayList<>();
if (sort == null || sort.trim().isEmpty()) {
sortBuilders.add(SortBuilders.scoreSort());
}
else {
try {
Map<String, String> sortMap =
Splitter.on(",").omitEmptyStrings().trimResults().withKeyValueSeparator(":").split(sort);
sortMap.forEach((k, v) -> sortBuilders.add(
SortBuilders.fieldSort(k).order(org.elasticsearch.search.sort.SortOrder.valueOf(v.toUpperCase()))));
} catch (IllegalArgumentException ex) {
throw new SearchException("Invalid sort string: '" + sort + "'\n" +
"Must be comma separated list of searchField:(ASC|DESC) e.g. 'status.statusType:ASC,status.actionDate:DESC'");
}
}
return sortBuilders;
}
}