package ru.hflabs.rcd.model; import org.springframework.util.comparator.NullSafeComparator; import ru.hflabs.rcd.model.document.Field; import ru.hflabs.rcd.model.document.MetaField; import ru.hflabs.rcd.model.document.Record; import java.util.Comparator; /** * Класс <class>Comparators</class> реализует вспомогательные сервисы сравнения сущностей * * @see Comparator */ public abstract class Comparators { /** Сервис сравнения сущностей по их идентификаторам */ public static final Comparator<Identifying> IDENTIFYING_COMPARATOR = new Comparator<Identifying>() { @Override @SuppressWarnings("unchecked") public int compare(Identifying o1, Identifying o2) { return NullSafeComparator.NULLS_LOW.compare(o1.getId(), o2.getId()); } }; /** Сервис сравнения МЕТА полей по их позиции */ public static final Comparator<MetaField> META_FIELD_ORDINAL_COMPARATOR = new Comparator<MetaField>() { @Override @SuppressWarnings("unchecked") public int compare(MetaField o1, MetaField o2) { return NullSafeComparator.NULLS_LOW.compare(o1.getOrdinal(), o2.getOrdinal()); } }; /** Сервис сравнения значений полей */ public static final Comparator<Field> FIELD_VALUE_COMPARATOR = new Comparator<Field>() { @Override @SuppressWarnings("unchecked") public int compare(Field o1, Field o2) { return NullSafeComparator.NULLS_LOW.compare(o1.getValue(), o2.getValue()); } }; /** Сервис сравнения записей по предопределенному МЕТА-полю */ public static final class RecordComparator implements Comparator<Record> { /** Сервис сравнения значений полей */ private final Comparator<Field> fieldValueComparator = new NullSafeComparator<>(FIELD_VALUE_COMPARATOR, true); /** Название МЕТА-поля */ private final String metaFieldName; public RecordComparator(String metaFieldName) { this.metaFieldName = metaFieldName; } @Override public int compare(Record o1, Record o2) { Field o1field = o1.retrieveFieldByName(metaFieldName); Field o2field = o2.retrieveFieldByName(metaFieldName); return fieldValueComparator.compare(o1field, o2field); } } protected Comparators() { // embedded constructor } }