Язык предикатов
Предназначение: язык, с которым легко работать как на frontend так и на backend (модифицировать, анализировать и пр.).
Абстрактное определение предиката - это некоторая функция, которая на вход получает элемент множества и возвращает True/False
.
В библиотеке ecos-records добавлена реализация данной концепции.
Есть два агрегатных состояния предиката - JSON или JAVA классы. Для конвертации между этими двумя состояниями есть сервис PredicateService и методы writeJson/readJson
.
Java представление - это просто модель.
Обработка модели - отдельная задача, которая лежит на источниках данных или на преобразователях запросов (например: для запросов в alfresco предикаты трансформируются в fts-alfresco запрос в классе PredicateToFtsAlfrescoConverter).
JAVA представление
Predicate - базовый маркерный интерфейс без методов
AttributePredicate - предикат связанный с некоторым аттрибутом
EmptyPredicate - предикат «Значение аттрибута пустое»
ValuePredicate - предикат «Значение аттрибута равно/содержит/одно из/больше/меньше/похоже/больше или равно/меньше или равно. Тип сравнения определяется полем type. Значение для сравнения в поле value
NotPredicate - предикат «НЕ какой_то_другой_предикат»
ComposedPredicate - предикат, который объединяет другие предикаты
AndPredicate - предикат И
OrPredicate - предикат ИЛИ
VoidPredicate - пустой предикат, который получается если t (тип) не задан. Как правило означает, что при фильтрации/поиске никаких проверок не нужно (берем все записи).
JSON представление
Пример:
{
"t": "and",
"val": [
{
"t": "or",
"val": [
{
"att": "country",
"t": "contains",
"val": "milan"
},
{
"att": "state",
"t": "contains",
"val": "milan"
},
{
"att": "name",
"t": "contains",
"val": "milan"
}
]
}
]
}
В поле «t» записывается тип предиката, в «att» название аттрибута (если тип предиката его требует) и в «val» значение (опять же имеет смысл не для всех предикатов).
Для конвертации java предикатов в json и обратно:
String predicateStr = Json.getMapper().toString(predicate);
Predicate predicate = Json.getMapper().read(predicateStr, Predicate.class);
Для чтения предикатов из запроса RecordsQuery:
Predicate predicate = recordsQuery.getQuery(Predicate.class);
Типы предикатов
Предикат |
Описание |
FTS |
---|---|---|
starts |
Строка начинается с val.
Пример:
|
|
ends |
Строка заканчивается с val.
Пример:
|
|
or |
Объединение массива предикатов в val по ИЛИ.
Пример:
|
|
and |
Объединение массива предикатов в val по И.
Пример:
|
|
empty |
Поле в att пустое.
Пример:
|
|
not |
Отрицание предиката в val.
Пример:
Этот предикат можно автоматически добавлять к другим добавляя префикс «not-».
Пример:
|
|
eq |
Значение поля att точно равно val.
Пример:
|
|
gt |
Значение поля att больше val
|
|
ge |
Значение поля att больше или равно val
|
|
lt |
Значение поля att меньше val
|
|
le |
Значение поля att меньше или равно val
|
|
like |
Значение att подходит под паттерн val.
В паттерне используется % как заменитель любого кол-ва символов (как в SELECT запросе БД)
|
|
in |
Значение att подходит под паттерн val.
|
|
contains |
Значение att содержит подстроку val (работает и для ассоциаций)
|
Например:
Дополнительные возможности предикатов
Фича |
Описание |
---|---|
Промежутки и продолжительность |
Для атрибутов типа date и datetime добавлена возможность вычислять продолжительность и промежутки
При указании промежутка первой границей он вычисляется от текущей даты-времени
При указании промежутка второй границей он вычисляется от первой границы
Поиск идёт включительно границ т.е. [DurationOrDateTime1, DurationOrDateTime2]
Добавлены две константы $NOW - текущая дата время, $TODAY текущая дата
Примеры:
Найти документы которые были созданы в течении 10 суток:
Ищем документы у которых от $NOW - два года, до ($NOW - два года) - плюс год
Найти документы которые были созданы в течении 2-х лет, до текущей даты-времени
Найти документы которые были созданы в течении 2-х лет, до сегодняшнего дня
от 2020-01-01 до 2020-02-01
от 2020-01-01 до 2020-01-01 плюс 1 месяц
от минус 10 дней до 2020-01-01
от сегодня
|