package ru.hflabs.rcd.model;
import com.google.common.base.Function;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import ru.hflabs.rcd.model.criteria.FilterCriteria;
import ru.hflabs.rcd.model.criteria.FilterCriteriaValue;
import ru.hflabs.util.spring.Assert;
import java.util.Collection;
import static ru.hflabs.rcd.model.ModelUtils.ID_FUNCTION;
/**
* Класс <class>CriteriaUtils</class> реализует всмомогательные методы для построения критерий
*
* @see FilterCriteria
*/
public abstract class CriteriaUtils {
protected CriteriaUtils() {
// embedded constructor
}
/**
* @param fieldName название поля с идентификатором
* @param ids коллекция идентификаторов
* @return Возвращает критерий поиска сущностей по идентификаторам
*/
public static FilterCriteria createCriteriaByIDs(String fieldName, String... ids) {
return createCriteriaByIDs(fieldName, Sets.newHashSet(ids));
}
/**
* @param fieldName название поля с идентификатором
* @param ids коллекция идентификаторов
* @return Возвращает критерий поиска сущностей по идентификаторам
*/
public static FilterCriteria createCriteriaByIDs(String fieldName, Collection<String> ids) {
return new FilterCriteria().injectFilters(ImmutableMap.<String, FilterCriteriaValue<?>>of(fieldName, new FilterCriteriaValue.StringsValue(ids)));
}
/**
* @param fieldName название поля с идентификатором
* @param documents коллекция значений для получения идентификаторов
* @return Возвращает критерий поиска сущностей по идентификаторам
*/
public static <T extends Identifying> FilterCriteria createCriteriaByDocumentIDs(String fieldName, Collection<T> documents) {
return createCriteriaByDocuments(fieldName, documents, ID_FUNCTION);
}
/**
* @param fieldName название поля с идентификатором
* @param documents коллекция значений для получения идентификаторов
* @param function функция извлечения значения поля
* @return Возвращает критерий поиска сущностей по идентификаторам
*/
public static <T> FilterCriteria createCriteriaByDocuments(String fieldName, Collection<T> documents, Function<? super T, String> function) {
return createCriteriaByIDs(fieldName, Collections2.transform(documents, function));
}
/**
* @param relativeFieldName название поля связанного идентификатора
* @param relativeId значение связанного идентификатора
* @param searchField поисковое поле
* @param searchValues коллекция значений поиска
* @return Возвращает критерий поиска сущностей по связанным идентификаторам
*/
public static FilterCriteria createCriteriaByRelative(String relativeFieldName, String relativeId, String searchField, String... searchValues) {
return createCriteriaByRelative(relativeFieldName, relativeId, searchField, Lists.newArrayList(searchValues));
}
/**
* @param relativeFieldName название поля связанного идентификатора
* @param relativeId значение связанного идентификатора
* @param searchField поисковое поле
* @param searchValues коллекция значений поиска
* @return Возвращает критерий поиска сущностей по связанным идентификаторам
*/
public static FilterCriteria createCriteriaByRelative(String relativeFieldName, String relativeId, String searchField, Collection<String> searchValues) {
Assert.isTrue(StringUtils.hasText(relativeId), String.format("Relative '%s' must not be NULL or EMPTY", relativeFieldName));
ImmutableMap.Builder<String, FilterCriteriaValue<?>> filters = ImmutableMap.<String, FilterCriteriaValue<?>>builder()
.put(relativeFieldName, new FilterCriteriaValue.StringValue(relativeId));
if (searchField != null && !CollectionUtils.isEmpty(searchValues)) {
filters.put(searchField, new FilterCriteriaValue.StringsValue(searchValues));
}
return new FilterCriteria().injectFilters(filters.build());
}
}