package ru.hflabs.rcd.lucene.criteria; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import ru.hflabs.rcd.model.Historical; import ru.hflabs.rcd.model.Identifying; import ru.hflabs.rcd.model.change.ChangeType; import ru.hflabs.rcd.model.criteria.FilterActivity; import ru.hflabs.rcd.service.IActivityBuilder; import ru.hflabs.util.lucene.LuceneQueryUtil; import ru.hflabs.util.spring.Assert; /** * Класс <class>LuceneHistoricalActivityBuilder</class> реализует методы построения критерии историцируемых документов * * @see Historical */ public class LuceneHistoricalActivityBuilder<E extends Identifying> implements IActivityBuilder<E, LuceneCriteriaHolder, Query> { @Override public boolean isSupport(Class<?> targetClass) { return Historical.class.isAssignableFrom(targetClass); } @Override public LuceneCriteriaHolder createActivity(LuceneCriteriaHolder current, Class<E> criteriaClass, FilterActivity activity) { Assert.isTrue(isSupport(criteriaClass), String.format("Class '%s' not supported by '%s'", criteriaClass.getName(), getClass().getName())); if (activity != null && !FilterActivity.ALL.equals(activity)) { BooleanQuery query = new BooleanQuery(); BooleanClause.Occur condition = LuceneCriteriaBuilder.retrieveOccurByLogicalOperation(activity.getClauseCondition()); if (BooleanClause.Occur.MUST_NOT.equals(condition)) { query.add(new MatchAllDocsQuery(), BooleanClause.Occur.MUST); } for (ChangeType changeType : activity.getValue()) { query.add(LuceneQueryUtil.createTermQuery(Historical.CHANGE_TYPE, changeType), condition); } current.injectFilter(query); } return current; } }