package ru.hflabs.rcd.lucene.criteria;
import org.apache.lucene.search.*;
import org.springframework.util.CollectionUtils;
import ru.hflabs.rcd.model.criteria.CriteriaHolder;
import ru.hflabs.rcd.term.Condition;
import ru.hflabs.util.core.collection.ArrayUtil;
import ru.hflabs.util.lucene.LuceneQueryUtil;
import java.util.LinkedHashSet;
import java.util.Set;
/**
* Класс <class>LuceneCriteriaHolder</class> содержит информацию о построенной критерии
*
* @author Nazin Alexander
*/
public class LuceneCriteriaHolder implements CriteriaHolder<Query> {
/** Предикаты запроса */
private final BooleanQuery predicates;
/** Сортировка запроса */
private final Set<SortField> orders;
/** Запрос фильтрации */
private Filter filter;
public LuceneCriteriaHolder() {
this.predicates = new BooleanQuery();
this.orders = new LinkedHashSet<>();
}
public LuceneCriteriaHolder appendPredicate(Query predicate, Condition condition) {
predicates.add(predicate, LuceneCriteriaBuilder.retrieveOccurByLogicalOperation(condition));
return this;
}
public LuceneCriteriaHolder appendOrder(SortField order) {
orders.add(order);
return this;
}
public LuceneCriteriaHolder injectFilter(Query query) {
filter = new QueryWrapperFilter(query);
return this;
}
@Override
public void appendQuery(Query query, Condition condition) {
appendPredicate(query, condition);
}
@Override
public Query buildQuery() {
Query resultQuery = LuceneQueryUtil.rewriteBooleanQuery(predicates);
if (resultQuery == null) {
return new MatchAllDocsQuery();
}
return resultQuery;
}
public Sort buildSort() {
if (!CollectionUtils.isEmpty(orders)) {
return new Sort(ArrayUtil.toArray(SortField.class, orders));
}
return null;
}
public Filter buildFilter() {
return filter;
}
}