Специализированный DSL MasterSCADA 4D

<< Click to Display Table of Contents >>

Navigation:  Проект в MasterSCADA 4D > Работа с сообщениями > Формирование JSON-строки для фильтрации сообщений >

Специализированный DSL MasterSCADA 4D

Специализированный DSL MasterSCADA 4D разработан для устранения ограничений упрощенного синтаксиса. Поддерживает строгую типизацию, UTF-8 и иерархические операции.

Поддерживаемые типы данных и литералы:

BOOL

Логическое значение

true | false

true

LINT

Целое число

[1-9][0-9]* | "0"+

1234567890 ; 0

LREAL

Дробное число

обычный | экспоненциальный

0.0 ; 0. ; 1.5

STRING

Строка

"str abc \" 1234"

"string literal"

DATE_TIME

Дата и время

#2012-01-06T01:23:45.678910

 

TIME_SPAN

Интервал времени

T#tsDay? tsHour? tsMin? tsSec? tsMs?

T#1d2h30m45s500ms ; T#1.5d2.5h

ITEM_ID

ID элемента, путь в проекте

${id:LINT (. simple_id )*}

${id:14.param}

ObjectID

ID объекта, путь в проекте

${oid:LINT (. utf8 path )*}

${oid:14.русскиебуквы}

Variable

Переменная

${u8:any utf8} | simple_id

variable_name

Легенда:

simple_id

[a-zA-Z_][a-zA-Z_0-9]*

Операторы:

умножение

"*"

деление

"/"

сложение

"+"

вычитание

"-"

деление по модулю

"%"

не

"!" или 'NOT'

побитовое или

"|"

побитовое и

"&"

XOR

"^"

приведение к ObjectId

"::ObjectId"

приведение к ItemId

"::ItemId"

И

"&&" или 'AND'

или

"||" или 'OR'

равно

"==" или "=" или 'Equal'

не равно

"!=" или "<>" или 'NotEqual'

больше либо равно

">=" или 'MoreEqual'

меньше либо равно

"<=" или 'LessEqual'

больше

">" или 'More'

меньше

"<" или 'Less'

входит ли

'IN' или ":>"

содержит ли

'CONTAINS'

•::ObjectId и ::ItemId - операторы явного приведения типа (строка -> ItemId, строка -> ObjectId, число -> ItemId, число -> ObjectId).

•Оператор IN (:>) - проверяет, находится ли левый операнд внутри правого. Если правый операнд имеет тип LINT, то сначала происходит приведение правого операнда к OBJECT_ID.

•IN для строк проверяет, является ли левая строка подстрокой правой.

•IN для OBJECT_ID и ITEM_ID проверяет, является ли левый элемент дерева дочерним для правого.

•Логическое НЕ: ! - правоассоциативный унарный оператор, преобразует значение операнда к типу BOOL, возвращает инвертированное значение

•Умножение: * - левоассоциативный бинарный оператор.

•Если левый операнд имеет арифметический тип (BOOL, LINT, LREAL) выполняет умножение по правилам языка Си на правый операнд, если правый операнд арифметический тип. Возвращает ошибку, если правый операнд не арифметический тип.

•Если левый операнд имеет тип DATE_TIME, приводит правый операнд к типу DATE_TIME, возвращает DATE_TIME со значением ticks, равным произведению значений ticks левого и правого операндов.

•Если левый операнд имеет тип TIME_SPAN, приводит правый операнд к типу TIME_SPAN, возвращает TIME_SPAN со значением ticks, равным произведению значений ticks левого и правого операндов.

•Деление / - левоассоциативный бинарный оператор.

•Если левый операнд имеет арифметический тип (BOOL, LINT, LREAL) выполняет деление по правилам языка Си на правый операнд, если правый операнд арифметический тип. Возвращает ошибку, если правый операнд не арифметический тип.

•Если левый операнд имеет тип DATE_TIME, приводит правый операнд к типу DATE_TIME, возвращает DATE_TIME со значением ticks, равным частному значений ticks левого и правого операндов.

•Если левый операнд имеет тип TIME_SPAN, приводит правый операнд к типу TIME_SPAN, возвращает TIME_SPAN со значением ticks, равным частному значений ticks левого и правого операндов.

•Если в результате приведения типа правого операнда к типу левого операнда получено нулевое значение возвращает ошибку "division by zero".

•Деление по модулю % - левоассоциативный бинарный оператор.

•Если левый операнд имеет тип BOOL или LINT выполняет деление по модулю правилам языка Си на правый операнд, если правый операнд арифметический тип. Возвращает ошибку, если правый операнд не арифметический тип.

•Если левый операнд имеет тип DATE_TIME, приводит правый операнд к типу DATE_TIME, возвращает DATE_TIME со значением ticks, равным остатку от деления по модулю значений ticks левого и правого операндов.

•Если левый операнд имеет тип TIME_SPAN, приводит правый операнд к типу TIME_SPAN, возвращает TIME_SPAN со значением ticks, равным остатку от деления по модулю значений ticks левого и правого операндов.

•Если в результате приведения типа правого операнда к типу левого операнда получено нулевое значение возвращает ошибку "division by zero"

•Вычитание - левоассоциативный бинарный оператор.

•Если левый операнд имеет арифметический тип (BOOL, LINT, LREAL) выполняет вычитание по правилам языка Си на правый операнд, если правый операнд арифметический тип. Возвращает ошибку, если правый операнд не арифметический тип.

•Если левый операнд имеет тип DATE_TIME, приводит правый операнд к типу DATE_TIME, возвращает DATE_TIME со значением ticks, равным разности значений ticks левого и правого операндов.

•Если левый операнд имеет тип TIME_SPAN, приводит правый операнд к типу TIME_SPAN, возвращает TIME_SPAN со значением ticks, равным разности значений ticks левого и правого операндов.

•Сложение +, сравнение >, <, >=, <=, ==, != - левоассоциативные бинарные операторы.

•Если левый операнд имеет арифметический тип (BOOL, LINT, LREAL), выполняет соответствующую операцию по правилам языка Си на правый операнд, если правый операнд арифметический тип. Возвращает ошибку, если правый операнд не арифметический тип.

•Если левый операнд имеет тип DATE_TIME, то правый операнд приводится к типу DATE_TIME , над ticks выполняется соответствующая операция.

•Если левый операнд имеет тип TIME_SPAN, то правый операнд приводится к типу TIME_SPAN , над ticks выполняется соответствующая операция.

•Если левый операнд имеет тип STRING, то правый операнд приводится к типу STRING, выполняется соответствующая операция над строками.

•Побитовые операторы: побитовое И &, побитовое ИЛИ |, исключающее ИЛИ, он же XOR'^' - бинарные левоассоциативные операторы.

•приводит правый операнд к типу левого операнда и выполняет соответствующую побитовую операцию.

•Логические операторы: И &&, ИЛИ || - левоассоциативные бинарные операторы, приводят оба операнда к типу BOOL, выполняют логическую операцию.

•Унарный плюс + - правоассоциативный унарный оператор, никак не изменяет переданное значение.

•+ парсится как унарный, если перед + нет круглых скобок, переменной или константы, иначе + парсится как бинарный.

•Унарный минус - - правоассоциативный унарный оператор, возвращает отрицательное значение числа (LINT, LREAL).

•- парсится как унарный, если перед - нет круглых скобок, переменной или константы, иначе - парсится как бинарный.

Приоритет операторов и типы операндов

Оператор

Приоритет

BOOL

LINT

LREAL

STRING

DATE_TIME

TIME_SPAN

ITEM_ID

ObjectID

унарный +

0

+

+

+

+

+

+

+

+

унарный -

0

 

+

+

 

 

+

 

 

::ObjectId

1

 

+

 

+

 

 

+

+

::ItemId

1

 

+

 

+

 

 

+

 

!

2

+

+

+

+

+

+

+

+

*

3

+

+

+

 

+

+

 

 

/

3

+

+

+

 

+

+

 

 

%

3

+

+

 

 

+

+

 

 

+

4

+

+

+

+

+

+

 

 

-

4

+

+

+

 

+

+

 

 

>

5

+

+

+

+

+

+

 

 

>=

5

+

+

+

+

+

+

 

 

<

5

+

+

+

+

+

+

 

 

<=

5

+

+

+

+

+

+

 

 

==

6

+

+

+

+

+

+

+

+

!=

6

+

+

+

+

+

+

+

+

IN

6

 

 

 

+

 

 

+

+

CONTAINS

6

 

 

 

+

 

 

 

+

&

7

+

+

 

 

 

 

 

 

\

 

7

+

+

 

 

 

 

 

^

7

+

+

 

 

 

 

 

 

&&

8

+

+

+

+

+

+

+

+

| |

8

+

+

+

+

+

+

+

+

Чем меньше значение приоритета, тем выше приоритет оператора. Операторы с приоритетом 0 имеют наивысший приоритет, операторы с приоритетом 8 - наименьший.

Также могут использоваться круглые скобки () для явного задания порядка вычисления выражения и имеют приоритет над операторами, указанными в таблице. Если выражение заключено в скобки, сначала вычисляется выражение в скобках.

Допустимые конвертации

Base Type

BOOL

LINT

LREAL

STRING

DATE_TIME

TIME_SPAN

ITEM_ID

ObjectID

BOOL

+

+

+

+

 

 

 

 

LINT

+

+

+

+

+

+

+

+

LREAL

+

+

+

+

+

+

 

 

STRING

+

+

+

+

+

+

+

+

DATE_TIME

+

+

+

+

+

 

 

 

TIME_SPAN

+

+

+

+

 

+

 

 

ITEM_ID

+

+-

 

+

 

 

+

+

ObjectID

+

+-

 

+

 

 

 

+

Перевод выражения в SQL

При переводе в SQL сохраняется приоритет операторов, описанный выше.

В SQL не переводится оператор CONTAINS.

Особенность перевода литералов типа BOOL: true переводится в 1, false переводится в 0.

Особенность перевода литералов типа TIME_SPAN: переводится в строковое представление количества ticks (число).

Остальные операторы транслируются стандартным образом.

Правила операций в Си

Все, что помещается в int преобразуется в int (документация). На практике это значит, что BOOL значение при выполнении операций приводится к INT значению, например true +  true == 2 // истина.

Если в выражении используются значения типа LREAL и LINT, то LINT приводится к LREAL (документация).

Экспериментальная операция

Чтение значения из ITEM_ID:

*${id:1234.path.elem}

Обратная совместимость с упрощенным синтаксисом

В дополнение к полному DSL поддерживается упрощенная форма записи, совместимая с ранее использовавшимися выражениями:

•Допускаются логические операторы and / or.

•Поддерживается условие вложения через оператор :>.

Примеры упрощённой записи:

EventFullObjectName :> '${full_name_in_instance}'

ItemId :> ${id}

Интерпретация для ItemId

Для ItemId синтаксис интерпретируется следующим образом:

1.Получено выражение ItemId :> 39151.

2.Справа от :> целое число. Работает приведение к ObjectId, получаем ItemId :> ${oid:39151}.

3.Имя (variable) ItemId разрешается на основе данных mplc, получаем ${id: 39151} :> ${oid:39151}.

4.Вычисляется выражение.

Здесь 39151 имеет тип LINT и при обработке преобразуется в ObjectId. Такое выражение проверяет принадлежность сообщения узлу с идентификатором 39151 или его потомкам.

Интерпретация для EventFullObjectName

Для EventFullObjectName синтаксис интерпретируется следующим образом:

1.Получено выражение EventFullObjectName :> 'Объекты.Объект 1'.

2.Слева от :> имя, получаем значение из mplc, 'Объекты.Объект 1'.

3.Вычисляем значение :> для двух строк.

Примеры

•4 способа проверки принадлежности тревоги объекту (ObjectID):

["'Объекты.Объект 1.Ресурсы.Сообщения.Тревога 1'::ObjectId in 'Объекты.Объект 1'::ObjectId"]

["${oid:39151.Ресурсы.Сообщения.Тревога 1} in 'Объекты.Объект 1'::ObjectId"]

["'Объекты.Объект 1.Ресурсы.Сообщения.Тревога 1'::ObjectId in ${oid:39151}"]

["${oid:39151.Ресурсы.Сообщения.Тревога 1} in ${oid:39151}"]

•4 способа проверки принадлежности тревоги объекту ItemID:

["'Объекты.Объект 1.Ресурсы.Сообщения.Тревога 1'::ItemId in 'Объекты.Объект 1'::ItemId"]

["${id:39210} in 'Объекты.Объект 1'::ItemId"]

["'Объекты.Объект 1.Ресурсы.Сообщения.Тревога 1'::ItemId in ${oid:39151}"]

["${id:39210} in ${id:39151}"]

•Фильтрация по объекту "Экз_Библ_объекта" (не содержит квадратных скобок):

"ItemID in 'Объекты.Экз_Библ_объекта'::ObjectId"

•Фильтрация по приоритету и активности:

["Severity More 450 && Active NotEqual True"]

["Severity <= 414 OR Severity > 510"] -

["Severity = 200 || Severity = 201 || Severity = 202"]

•Фильтрация с поиском подстроки в полном имени объекта:

["Message CONTAINS \"Тревога\" AND EventFullObjectName CONTAINS 'фон 2'"]

•Фильтрация по типу события, названия источника и приоритету:

["UpdateType == 1 AND EventSourceName Equal \"Тревога 1\" && Severity > 300"]

 

Смотрите также: