Выражения в движке DMN

Этот раздел перенесён из документации Camunda 7 и в дальнейшем будет доработан с учётом особенностей OpenBPM Engine

Таблицы решений и литеральные выражения решений позволяют задавать различные типы выражений. Этот раздел описывает существующие типы выражений. Он также перечисляет поддерживаемые языки выражений и демонстрирует, как поменять используемый язык выражений для конкретного выражения.

Выражения в DMN

Как было рассказано в разделах о таблицах решений и в справочнике по литеральным выражениям в решениях, поддерживаются четыре типа выражений:

  • Input Expression (входное выражение): устанавливает входное значение для колонки с входными данными в таблице решений

  • Input Entry (входная ячейка): используется для того, чтобы определить, применимо ли правило в таблице решений

  • Output Entry (выходная ячейка): возвращает значение, которое добавляется к выходным данным для соответствующего правила

  • Literal Expression (литеральное выражение): используется для определения значения литерального выражения решения

Вы можете прочитать об этом более подробно в справочнике по DMN 1.3. В DMN 1.3 XML выражения можно найти в следующих элементах XML: inputExpression, inputEntry, outputEntry и literalExpression:

<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn">

  <decision id="decision" name="Decision">
    <decisionTable>
      <input id="input">
        <!-- the input expression determines the input value of a column -->
        <inputExpression>
          <text>age</text>
        </inputExpression>
      </input>
      <output id="output"/>
      <rule id="rule1">
      <!-- the input entry determines if the rule is applicable -->
        <inputEntry>
          <text>[18..30]</text>
        </inputEntry>
        <!-- the output entry determines the rule if it is applicable -->
        <outputEntry>
          <text>"okay"</text>
        </outputEntry>
      </rule>
    </decisionTable>
  </decision>

   <decision id="decision2 name="Decision 2">
    <!-- the literal expression determines the value of this decision -->
    <literalExpression>
      <text>a + b</text>
    </literalExpression>
  </decision>

</definitions>

Поддерживаемые языки выражений

Движок DMN от Camunda поддерживает два языка выражений из коробки:

В зависимости от того, какую JDK вы используете, может присутствовать также и реализация на Javascript, доступная как Rhino или Nashhorn.

Вы также можете использовать любой другой язык скриптов, который предоставляет реализацию JSR-223. Сюда входят groovy, python и ruby. Чтобы использовать эти языки, вам необходимо добавить соответствующую зависимость к вашему проекту.

Например, чтобы использовать groovy как язык для выражений, добавьте вот эти зависимости к файлу pom.xml в вашем проекте:

    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-jsr223</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-json</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-xml</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-templates</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-dateutil</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.groovy</groupId>
      <artifactId>groovy-datetime</artifactId>
      <version>${GROOVY_VERSION}</version>
    </dependency>

Язык выражений по умолчанию

По умолчанию, языки для различных типов выражений в движке DMN распределяются вот так:

  • Input Expression: FEEL

  • Input Entry: FEEL

  • Output Entry: FEEL

  • Literal Expression: FEEL

ЛЕГАСИ ПОВЕДЕНИЕ: Вы можете узнать, как вернуться к легаси поведению, при котором JUEL использовался для входных выражений, выходных ячеек и литеральных выражений, здесь.

Язык по умолчанию можно поменять, установив его напрямую в DMN 1.3 XML как глобальный язык выражений при помощи атрибута expressionLanguage элемента definitions:

<!-- this sets the default expression language for all expressions -->
<!-- in this file to javascript -->
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn" expressionLanguage="javascript">
  <decision  id="decision" name="Decision">
    <decisionTable>
      <!-- ... -->
    </decisionTable>
  </decision>
</definitions>

Дополнительно можео изменить язык выражений по умолчанию в конфигурации движка DMN, как описано в руководстве пользователя.

Конфигурирование языка выражений

Также есть возможность установить язык индивидуально для каждого выражения, используя атрибут expressionLanguage:

<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" id="definitions" name="definitions" namespace="http://camunda.org/schema/1.0/dmn">

  <decision id="decision" name="Decision">
    <decisionTable>
      <input id="input">
        <!-- use javascript for this input expression -->
        <inputExpression expressionLanguage="javascript">
          <text>age</text>
        </inputExpression>
      </input>
      <output id="output"/>
      <rule id="rule1">
        <!-- use juel for this input entry -->
        <inputEntry expressionLanguage="juel">
          <text><![CDATA[cellInput >= 18 && cellInput <= 30]]></text>
        </inputEntry>
        <!-- use javascript for this output entry -->
        <outputEntry expressionLanguage="javascript">
          <text>"okay"</text>
        </outputEntry>
      </rule>
    </decisionTable>
  </decision>

  <decision id="decision2" name="Decision 2">
    <!-- use groovy for this literal expression -->
    <literalExpression expressionLanguage="groovy">
      <text>a + b</text>
    </literalExpression>
  </decision>

</definitions>

Если вы хотите использовать другую реализацию Java Unified Expression Language (JEEL) или FEEL, вы можете заменить реализацию по умолчанию в конфигурации движка DMN. Таким образом вы также поменяете способ разрешения в движке скриптов JSR-223, например, если вы хотите сконфигурировать движок скриптов перед его использованием.

Лицензия и атрибуция

Эта документация была создана на базе материала "Camunda 7 Docs" от Camunda, находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License .

Оригинал документации: https://docs.camunda.org