ym88659208ym87991671
Строковые выражения | Документация для разработчиков
Skip to main content

Строковые выражения

Обновлено 20 апреля 2022

В Platform V DataSpace можно использовать строковые выражения, которые позволяют моделировать выражения различных уровней сложности.

Поддерживаются следующие типы строковых выражений:

  • примитивное выражение;
  • коллекция примитивных выражений;
  • сущность;
  • коллекция сущностей;
  • условие.

Базовые объекты строковых выражений

В грамматике строковых выражений предусмотрены следующие базовые объекты:

Корневая сущность

Корневая сущность имеет тип сущность, обозначается с помощью ключевого слова root и имеет настройку спецификации type (тип сущности) − позволяет уточнить тип сущности для обращения к свойствам типа-наследника.

Корневую сущность можно, например, использовать для обращения к искомой сущности при поиске.

Пример 1

Условие: код продукта соответствует шаблону product% (при поиске продуктов).

root.code $like 'product%'

Пример 2

Примитивное значение: ставка депозита больше 10 (при поиске продуктов).

root{type = Deposit}.rate > 10
note

Рекомендуется для обращения к корневой сущности использовать текущий элемент в ситуациях, когда в контексте они обозначают один и тот же объект.

Элемент коллекции

Элемент коллекции имеет тип сущность или примитивное выражение в зависимости от контекста. Обозначается с помощью ключевого слова elem. В случае, если имеет тип сущность, то имеет настройку спецификации type (тип сущности) − позволяет уточнить тип сущности-элемента для обращения к свойствам типа-наследника.

Элемент коллекции можно использовать в поисках для обращения к элементу коллекции при фильтрации коллекции.

Пример 1

Условие: код сервиса начинается с кода продукта (при запросе сервисов при поиске продуктов).

elem.code $like root.code + '%'

Пример 2

Условие: состояние начинается с символа 'a' (при запросе состояний при поиске продуктов).

elem $like 'a%'
note

Рекомендуется для обращения к элементу коллекции использовать текущий элемент.

Текущий элемент

Текущий элемент имеет тип сущность или примитивное значение в зависимости от контекста. Обозначается с помощью ключевого слова it. В случае, если имеет тип сущность, то имеет настройку спецификации type (тип сущности) − позволяет уточнить тип сущности-элемента для обращения к свойствам типа-наследника.

Текущий элемент используется для обращения к текущему рассматриваемому элементу выражения. Например, в случае условия поиска текущий элемент является эквивалентом корневой сущности, а в случае фильтрации коллекции − элемента коллекции.

Пример 1

Условие: код продукта соответствует шаблону 'product%' (при поиске продуктов).

it.code $like 'product%'

Пример 2

Условие: код сервиса начинается с кода продукта (при запросе сервисов при поиске продуктов).

it.code $like root.code + '%'

Сущность под псевдонимом

Если в контексте присутствуют сущности под псевдонимом, то к ним можно обратиться через ключевое слово @ с последующим указанием псевдонима.

При обращении к сущности под псевдонимом можно использовать настройку спецификации type − тип сущности. Параметр позволяет уточнить тип сущности для обращения к свойствам типа-наследника.

Пример

Условие: код продукта под псевдонимом 'product' равен 'product1' (при запросе сервисов у запрошенных продуктов при поиске документов).

@product.code == 'product1'

Сущности

Сущности имеют тип коллекция сущностей, обозначаются с помощью ключевого слова entities и имеют следующие настройки спецификации:

  • type − тип сущностей (обязательная настройка);
  • elemAlias − псевдоним элемента;
  • cond − условие фильтрации сущностей.

Пример

Условие: существуют контракты, код которых равен коду продукта (при поиске продуктов).

entities{type = Contract, cond = it.code == root.code}.$exists

Примитивное значение

Имеется возможность задать базовые примитивные выражения:

ТипФорматПример значения
СтрокаСтрока, обрамленная одинарными кавычками ('). Для обозначения одинарной кавычки необходимо написать одинарную кавычку два раза подряд ('')'I''m a string'
Целое число123
Вещественное числоЦелая и вещественная часть отделены точкой. Использование экспоненциальной записи не допускается123.456
ДатаISO 8601 с префиксом DD2021-04-12
Дата и времяISO 8601 с префиксом DD2021-04-12T13:18:10.123
Дата и время со смещениемISO 8601 с префиксом DD2021-04-12T13:18:10.123+03:00
Логическое значениеtrue или false

Спецификация

Некоторые объекты могут иметь дополнительные настройки (например, type для корневой сущности). Для задания данных настроек вводится понятие спецификации.

Спецификацию для объекта можно указать в фигурных скобках ({ и }), а настройки указываются следующим образом и перечисляются через запятую:

${наименование настройки} = ${значение настройки}`

Пример

Коллекция сущностей: продукты, код которых соответствует шаблону 'product%'.

entities{type = Product, cond = it.code $like 'product%'}

Методы выражений

Каждый тип выражения предоставляет набор методов, которые можно использовать при описании выражения.

Методы примитивных выражений

Для примитивных выражений доступны следующие методы:

  • отрицание: -${примитивное выражение} (например, -it.number);
  • приведение в верхний регистр: ${примитивное выражение}.$upper (например, it.string.$upper);
  • приведение в нижний регистр: ${примитивное выражение}.$lower (например, it.string.$lower);
  • длина: ${примитивное выражение}.$length (например, it.string.$length);
  • отсечение пробельных символов в начале и конце: ${примитивное выражение}.$trim (например, it.string.$trim);
  • отсечение пробельных символов в начале: ${примитивное выражение}.$ltrim (например, it.string.$ltrim);
  • отсечение пробельных символов в конце: ${примитивное выражение}.$rtrim (например, it.string.$rtrim);
  • округление: ${примитивное выражение}.$round (например, it.number.$round);
  • округление вверх: ${примитивное выражение}.$ceil (например, it.number.$ceil);
  • округление вниз: ${примитивное выражение}.$floor (например, it.number.$floor);
  • хеш: ${примитивное выражение}.$hash (например, it.string.$hash);
  • приведение к строке: ${примитивное выражение}.$asString (например, it.number.$asString);
  • приведение к большому десятичному числу: ${примитивное выражение}.$asBigDecimal (например, it.string.$asBigDecimal);
  • модуль числа: ${примитивное выражение}.$abs (например, it.string.$abs);
  • сложение: ${примитивное выражение} + ${примитивное выражение} (например, it.number + 4);
  • разность: ${примитивное выражение} − ${примитивное выражение} (например, it.number − 4);
  • произведение: ${примитивное выражение} * ${примитивное выражение} (например, it.number * 4);
  • деление: ${примитивное выражение} / ${примитивное выражение} (например, it.number / 4);
  • остаток от деления: ${примитивное выражение} $mod ${примитивное выражение} (например, it.number $mod 4);
  • подстрока: ${примитивное выражение}.$substr(${примитивное выражение (индекс начала)}) (например, it.string.$substr(4));
  • подстрока: ${примитивное выражение}.$substr(${примитивное выражение (индекс начала)}, ${примитивное выражение (длина)}) (например, it.string.$substr(4, it.number));
  • замена: ${примитивное выражение}.$replace(${примитивное выражение (заменяемая строка)}, ${примитивное выражение (новая строка)}) (например, it.string.$replace('code', it.name));
  • добавление миллисекунд: ${примитивное выражение}.$addMilliseconds(${примитивное выражение}) (например, it.date.$addMilliseconds(1));
  • добавление секунд: ${примитивное выражение}.$addSeconds(${примитивное выражение}) (например, it.date.$addSeconds(1));
  • добавление минут: ${примитивное выражение}.$addMinutes(${примитивное выражение}) (например, it.date.$addMinutes(1));
  • добавление часов: ${примитивное выражение}.$addHours(${примитивное выражение}) (например, it.date.$addHours(1));
  • добавление дней: ${примитивное выражение}.$addDays(${примитивное выражение}) (например, it.date.$addDays(1));
  • добавление месяцев: ${примитивное выражение}.$addMonths(${примитивное выражение}) (например, it.date.$addMonths(1));
  • добавление годов: ${примитивное выражение}.$addYears(${примитивное выражение}) (например, it.date.$addYears(1));
  • вычитание миллисекунд: ${примитивное выражение}.$subMilliseconds(${примитивное выражение}) (например, it.date.$subMilliseconds(1));
  • вычитание секунд: ${примитивное выражение}.$subSeconds(${примитивное выражение}) (например, it.date.$subSeconds(1));
  • вычитание минут: ${примитивное выражение}.$subMinutes(${примитивное выражение}) (например, it.date.$subMinutes(1));
  • вычитание часов: ${примитивное выражение}.$subHours(${примитивное выражение}) (например, it.date.$subHours(1));
  • вычитание дней: ${примитивное выражение}.$subDays(${примитивное выражение}) (например, it.date.$subDays(1));
  • вычитание месяцев: ${примитивное выражение}.$subMonths(${примитивное выражение}) (например, it.date.$subMonths(1));
  • вычитание годов: ${примитивное выражение}.$subYears(${примитивное выражение}) (например, it.date.$subYears(1));
  • условие "Равен null": ${примитивное выражение} == null (например, it.code == null);
  • условие "Не равен null": ${примитивное выражение} != null (например, it.code != null);
  • условие "Равен": ${примитивное выражение} == ${примитивное выражение} (например, it.code == 'service');
  • условие "Не равен": ${примитивное выражение} != ${примитивное выражение} (например, it.code != 'service');
  • условие "Больше": ${примитивное выражение} > ${примитивное выражение} (например, it.number > 4);
  • условие "Меньше или равно": ${примитивное выражение} <= ${примитивное выражение} (например, it.number <= 4);
  • условие "Меньше": ${примитивное выражение} < ${примитивное выражение} (например, it.number < 4);
  • условие "Подобен": ${примитивное выражение} $like ${примитивное выражение} (например, it.code $like 'service%');
  • условие "Между": ${примитивное выражение} $between (${примитивное выражение}, ${примитивное значение}) (например, it.number $between (4, it.number2));
  • условие "В": ${примитивное выражение} $in [${примитивное выражение}, ...] (например, it.number $in [4, it.number2, 6]);
  • условие "В": ${примитивное выражение} $in ${коллекция примитивных значений} (например, it.number $in it.numbers);
  • агрегация "минимум": ${примитивное выражение}.$min (например, it.number.$min);
  • агрегация "максимум": ${примитивное выражение}.$max (например, it.number.$max);
  • агрегация "сумма": ${примитивное выражение}.$sum (например, it.number.$sum);
  • агрегация "среднее": ${примитивное выражение}.$avg (например, it.number.$avg);
  • агрегация "количество": ${примитивное выражение}.$count (например, it.number.$count).

Методы коллекций примитивных выражений

Для коллекций примитивных выражений доступны следующие методы:

  • минимум: ${коллекция примитивных значений}.$min (например, it.numbers.$min);
  • максимум: ${коллекция примитивных значений}.$max (например, it.numbers.$max);
  • сумма: ${коллекция примитивных значений}.$sum (например, it.numbers.$sum);
  • среднее: ${коллекция примитивных значений}.$avg (например, it.numbers.$avg);
  • количество элементов: ${коллекция примитивных значений}.$count (например, it.numbers.$count);
  • условие "Существует": ${коллекция примитивных значений}.$exists (например, it.numbers.$exists).

Методы сущностей

Для сущностей доступны следующие методы:

  • тип: ${сущность}.$type (например, it.$type);
  • id: ${сущность}.$id (например, it.$id);
  • примитив: ${сущность}.${наименование свойства} (например, it.code);
  • коллекция примитивов: ${сущность}.${наименование свойства}${спецификация} (например, it.states, it.states{cond = it $like 'h%'}). Доступная настройка спецификации: cond (условие) − условие фильтрации;
  • ссылка: ${сущность}.${наименование свойства}${спецификация} (например, it.product, it.product{type = Deposit}). Доступные настройки спецификации:
    • type (тип сущности) позволяет уточнить тип сущности для обращения к свойствам типа-наследника;
    • alias (псевдоним) позволяет сохранить ссылку под псевдонимом в контекст;
  • коллекция ссылок: ${сущность}.${наименование свойства}${спецификация} (например, it.services, it.services{type = SuperService, cond = it.code like root.code + 'service%'}, it.services{elemAlias = service, cond = it.parameters{cond = it.code == @service.code}.$exists}.$exists). Доступные настройки спецификации:
    • type (тип сущности) позволяет ограничить коллекцию до коллекции, ссылки которой указывают на сущность указанного типа;
    • elemAlias (псевдоним элемента) позволяет сохранить ссылку из коллекции под псевдонимом в контекст;
    • cond (условие) условие фильтрации;
  • условие "Равен null": ${сущность} == null (например, it.product == null);
  • условие "Не равен null": ${сущность} != null (например, it.product != null);
  • условие "Существует": ${сущность}.$exists (например, it.product.$exists);
  • условие "Равно": ${сущность} == ${сущность} (например, it.product == it.document.product);
  • условие "Не равно": ${сущность} != ${сущность} (например, it.product != it.document.product);
  • условие "В": ${сущность} $in [${сущность}, ...] (например, it.product $in [it.document.product, it.document.relatedProduct]);
  • условие "В": ${сущность} $in ${коллекция сущностей} (например, it.product $in it.services.product).

Методы коллекций сущностей

Для коллекций сущностей доступны следующие методы:

  • коллекция примитивных выражений на основе типа сущности: ${коллекция сущностей}.$type (например, it.services.$type);
  • коллекция примитивных выражений на основе id сущности: ${коллекция сущностей}.$id (например, it.services.$id);
  • коллекция примитивных выражений на основе примитива: ${коллекция сущностей}.${наименование свойства} (например, it.services.code);
  • коллекция сущностей на основе ссылки: ${коллекция сущностей}.${наименование свойства}${спецификация} (например, it.services.product, it.services.product{type = Deposit}). Доступная настройка спецификации type (тип сущности) позволяет ограничить коллекцию до коллекции, ссылки которой указывают на сущность указанного типа;
  • количество элементов: ${коллекция сущностей}.$count (например, it.services.$count);
  • условие "Существует": ${коллекция сущностей}.$exists (например, it.services.$exists).

Методы условий

Для условий доступны следующие методы:

  • условие "Отрицание": !${условие} (например, !it.services.$exists);
  • условие "И": ${условие} && ${условие} (например, it.services.$exists && it.product != null);
  • условие "Или": ${условие} || ${условие} (например, it.services.$exists || it.product != null).

Общие методы

Доступен общий метод − первый ненулевой элемент: coalesce(${примитивное выражение}, ...) (например, coalesce(it.string, it.string2)).

Примеры

Пример 1

Условие: код продукта равен 'product1' независимо от регистра (при поиске продуктов).

it.code.$lower == 'product1'

Пример 2

Условие: суммарное время выполнение всех сервисов продукта, код которых начинается с кода продукта, не превышает 10 (при поиске продуктов).

it.services{cond = it.code $like root.code + '%'}.executionTime.$sum <= 10

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней