Добавление функций управления в действия для оптимизации выполнения правил с помощью Microsoft Rules Composer

Область применения: Azure Logic Apps (стандартная версия)

В этом руководстве показано, как оптимизировать выполнение правил, добавив функции управления в действия в правилах с помощью Microsoft Rules Composer. Функции управления помогают приложению или набору правил контролировать факты в рабочей памяти обработчика правил. Эти функции включают Assert, Clear, Halt, Retract, RetractByType, Reassert и Update для объектов .NET и сущностей TypedXmlDocument, которые можно использовать в качестве фактов. Существование фактов в рабочей памяти определяет условия, которые движок оценивает, и действия, которые выполняет.

Предварительные требования

  • Скачайте и установите Microsoft Rules Composer.

  • XML-файл, содержащий набор правил, над которым вы хотите работать.

    Чтобы добавить факты, укажите их значения в XML-документах, на которые вы ссылаетесь в окне обозревателя RuleSet Explorer. Кроме того, вы можете использовать создателя фактов для предоставления обработчика правил массиву, который содержит объекты .NET в качестве фактов. Более подробную информацию см. в разделе Создание и использование механизмов создания и извлечения фактов.

Функция Assert

Чтобы добавить экземпляры объектов в рабочую память обработчика правил, используйте функцию Assert в Microsoft Rules Composer. Система обрабатывает каждый экземпляр объекта в соответствии с условиями и действиями, написанными в соответствие с типом экземпляра, с помощью этапов сопоставления, разрешения конфликтов и действий.

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

Объект Количество экземпляров, подтвержденных Тип экземпляра
Объект .NET 1 (сам объект) Полностью квалифицированный класс .NET
TypedXmlDocument 1-N TypedXmlDocument(s): на основе привязок селектора, созданных и содержимого документа DocumentType.Selector

Утверждение объекта .NET

Подсистема правил изначально поддерживает базовые скалярные типы и объекты .NET для ссылочных типов. Утверждается, что обработка объектов .NET является самой простой из типов обработки.

В Microsoft Rules Composer можно создать утверждение для объекта .NET в рамках правила.

  1. В редакторе правил Майкрософт загрузите XML-файл, содержащий хранилище правил, над которым вы хотите работать.

  2. В окне обозревателя правил найдите и выберите нужное правило.

  3. В области "Затем" в разделе "Действия" добавьте встроенную функцию Assert в качестве действия.

  4. В окне Facts Explorer выберите Классы .NET.

  5. На вкладке .NET Classes перетащите метод конструктора для объекта, который вы хотите, к аргументу в действии Assert.

    Microsoft Rules Composer преобразует метод конструктора в вызов CreateObject в определении правила.

    Примечание.

    Хотя подсистема правил имеет функцию CreateObject , функция не отображается как отдельная функция в Microsoft Rules Composer.

Каждый объект утверждается в рабочей памяти в качестве отдельного экземпляра объекта, что означает, что каждый предикат, ссылающийся на тип объекта, например IF Object.Property = 1, анализирует экземпляр. Экземпляр также может быть использован для действий, определяемых правилами, которые ссылаются на тип, основываясь на результатах условий правил.

Например, предположим, что у вас есть следующие правила:

Правило 1

IF A.Value = 1
THEN A.Status = "good"

Правило 2

IF B.Value = 1
THEN A.Status = "good"

В правиле 1 только экземпляры A со значением 1 обновляют свое свойство Status . Однако в правиле 2, если условие оценивается как true, все экземпляры A обновляют свое состояние. На самом деле, если существует несколько экземпляров B , экземпляры A обновляются каждый раз, когда условие оценивается как true для экземпляра B .

Утверждение сущности TypedXmlDocument

В Microsoft Rules Composer можно утверждать сущность TypedXmlDocument из правила.

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Assert в качестве действия.

  3. В окне обозревателя фактов выберите XML-схемы.

  4. На вкладке «Схемы XML» перетащите узел, который вы хотите использовать в качестве аргумента в действии Assert.

XML-документы в основном текстовые, но значения полей могут быть любым типом, который основан на указанном типе при создании правила. Поля — это выражения XPath, поэтому они могут возвращать набор узлов, что означает, что в качестве значения используется первый элемент из набора.

Если сущность TypedXmlDocument утверждается как факт, обработчик правил создает дочерние экземпляры TypedXmlDocument на основе селекторов, определенных в правиле. Вы можете рассматривать селекторы как способ изоляции узлов в XML-документе и поля как идентификация определенных элементов в селекторе. Подсистема правил группит все поля внутри одного селектора в виде объекта.

Селекторы также являются выражениями XPath. В обозревателе фактов при выборе узла на вкладке "Схемы XML" средство Microsoft Rules Composer автоматически заполняет свойство XPath Selector для всех узлов и свойства XPath Field для любого узла, не содержащего дочерних узлов. Кроме того, можно ввести собственные выражения XPath для XPath Selector и XPath Field при необходимости. Если селектор соответствует нескольким частям в XML-документе, то несколько объектов этого типа утверждаются или удаляются из рабочей памяти обработчика правил.

В одном документе можно использовать несколько селекторов. Таким образом, можно просмотреть различные части документа, например предположим, что один раздел — заказ, а другой — адрес доставки. Однако помните, что созданные объекты определяются строкой XPath, созданной ими. Если вы используете другое выражение XPath, результатом является уникальная сущность TypedXmlDocument, даже если это выражение относится к тому же узлу.

Например, предположим, что у вас есть следующий XML-код:

<root>
    <order customer="Joe">
        <item name="router" quantity="10" cost="550" />
        <item name="switch" quantity="3" cost="300" />
    </order>
    <order customer="Jane">
        <item name="switch" quantity="1" cost="300" />
        <item name="cable" quantity="23" cost="9.99" />
    </order>
</root>

Если вы используете селектор /root/order или order, в рабочую память обработчика добавляются следующие объекты:

Объект 1

<order customer="Joe">
    <item name="router" quantity="10" cost="550" />
    <item name="switch" quantity="3" cost="300" />
</order>

Объект 2

<order customer="Jane">
    <item name="switch" quantity="1" cost="300" />
    <item name="cable" quantity="23" cost="9.99" />
</order>

В каждом селекторе XPaths ссылается на отдельные поля. Таким образом, если вы используете селектор /root/order/item, //order/item или //item, в рабочую память движка добавляются следующие объекты с двумя элементами для Джо и двумя элементами для Джейн:

<root>
    <order customer="Joe">
    </order>
    <order customer="Jane">
    </order>
</root>

Каждый объект может получить доступ к трем полям: @name, @quantity и @cost. Вы можете ссылаться на родительские поля, так как объект является ссылкой на исходный документ, например .. /@customer.

За кулисами обработчик правил может преобразовать значение текстового поля в любой из поддерживаемых типов с помощью функции XmlConvert . Этот параметр можно указать, задав тип в Microsoft Rules Composer. Если преобразование невозможно, подсистема создает исключение. Логические и двойные типы можно получить только в качестве соответствующего типа, строк или объектов.

Очистить функцию

Чтобы сбросить рабочую память и повестку дня для экземпляра обработчика правил, используйте функцию Clear в Microsoft Rules Composer. Дополнительные сведения о рабочей памяти и повестке дня см. в статье "Оптимизация подсистемы правил".

Сброс рабочей памяти и повестки дня для обработчика правил

  1. В окне обозревателя правил найдите и выберите правило, в котором требуется очистить рабочую память и повестку дня для обработчика правил.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Clear в качестве действия.

    Функция Clear не принимает аргументы.

Остановка функции

Чтобы остановить текущее выполнение обработчиком правил, используйте функцию Stop в Microsoft Rules Composer.

Остановка выполнения набора правил

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

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию "Остановить" в качестве действия.

Функция Halt принимает один логический аргумент. Если указать значение true, обработчик правил очищает повестку дня, содержащую ожидающие правила кандидата.

Метод Ruleset.Execute представляет собой оболочку вокруг метода RuleEngine.Execute и использует код, аналогичный следующему коду:

RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);

Если для выполнения набора правил используется метод Ruleset.Execute , обработчик правил возвращает управление методу Ruleset.Execute при выполнении функции Остановки . Метод Ruleset.Execute убирает факты и возвращает контроль вызывающему. В этом случае приостановленное выполнение набора правил не может возобновиться.

Однако если вы напрямую используете метод RuleEngine.Execute для выполнения набора правил, можно возобновить выполнение остановленного набора правил с последующим запуском ожидающего правила , вызвав RuleEngine.Execute еще раз, если вы не вычитали какие-либо объекты, необходимые между двумя вызовами.

Примечание.

Метод Ruleset.Execute кэширует экземпляры обработчика правил для повышения производительности. Если вы используете непосредственно метод RuleEngine.Execute , экземпляры обработчика правил не кэшируются.

В следующем примере кода показано, как возобновить выполнение остановленного набора правил:

// Assert facts into working memory of the rules engine instance.
RuleEngine.Assert(facts);

// Execute the ruleset.
RuleEngine.Execute();

// The ruleset invokes the Halt method when executing actions.
// Control returns here when the Halt function is called. 
// When engine halts, do the following tasks.

// Add your code here.

// Resume the halted rules engine execution.
RuleEngine.Execute();

// Retract or remove facts from working memory in the rules engine.
RuleEngine.Retract(facts);

Функция отзыва

Чтобы удалить объекты из набора правил и из рабочей памяти обработчика правил, используйте функцию Retract в Microsoft Rules Composer.

Отзыв объекта .NET

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Retract в качестве действия.

  3. В окне Facts Explorer выберите Классы .NET.

  4. На вкладке классов .NET перетащите нужный класс, а не сборку или метод, в аргумент параметра Retract .

    При перетаскивании метода в функцию Retract движок пытается отозвать объект, возвращаемый методом.

Отзыв объекта .NET имеет следующий результат:

  • Действия по повестке дня, которые используют объекты, удаляются из повестки дня.

    Примечание.

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

  • Правила, использующие объект в предикате, удаляют свои действия из повестки дня, если какие-либо действия существуют в повестке дня.

  • Модуль больше не оценивает объект.

Отозвать сущность или сущности TypedXmlDocument

Вы можете отменить исходную сущность TypedXmlDocument, которая была создана в обработчике правил, или вы можете отозвать одну из дочерних сущностей TypedXmlDocument, созданных из родительской сущности XmlDocument.

Предположим, что у вас есть следующий пример XML:

<order>
    <orderline customer="Joe" linenumber="001">
        <product name="router" quantity="10" cost="550" />
    </orderline>
    <orderline customer="Jane" linenumber="002">
        <product name="switch" quantity="1" cost="300" />
    </orderline>
</order>

Можно либо отозвать сущность TypedXmlDocument, связанную с объектом заказа, либо отозвать одну или обе сущности TypedXmlDocument, связанные с объектом orderline. Все сущности TypedXmlDocument связаны с сущностью TypedXmlDocument верхнего уровня, которая была первоначально утверждена, а не с сущностью TypedXmlDocument, которая расположена над этим верхним узлом TypedXmlDocument в иерархии XML-дерева.

Например, product является сущностью TypedXmlDocument, находящейся под объектом orderline и связанной с сущностью TypedXmlDocument для order, а не с сущностью TypedXmlDocument для orderline. В большинстве случаев это различие не важно. Однако при удалении объекта заказа линия заказа и объекты продукта также удаляются. Если вы удалите объект строки заказа, то будет удалён только этот объект, а не объект продукта.

Движок работает только с экземплярами объектов и отслеживает их, которые являются экземплярами TypedXmlDocument, созданными движком при первоначальном утверждении сущности TypedXmlDocument. Если вы создаете дополнительные узлы, такие как одноуровневые узлы для узла, выбранного с помощью селектора в наборе правил, эти узлы не оцениваются в правилах, если для них не созданы и утверждены сущности TypedXmlDocument. Если вы утверждаете эти новые, относящиеся к нижнему уровню экземпляры TypedXmlDocument, система оценивает экземпляры в правилах, но сущность верхнего уровня TypedXmlDocument не имеет знаний о них. При удалении документа верхнего уровня TypedXmlDocument, новые, независимые сущности TypedXmlDocument не скрываются автоматически. В результате, если создаются новые узлы, выполните откат и переутверждение на полном XmlDocument, это типичный и самый простой шаг.

Класс TypedXmlDocument предоставляет полезные методы, которые можно вызывать в пользовательском элементе .NET в составе действия. Эти методы включают возможность получения XmlNode, связанного с TypedXmlDocument или родительским TypedXmlDocument.

Отменить сущность TypedXmlDocument верхнего уровня

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Retract в качестве действия.

  3. В окне обозревателя фактов Facts Explorer выберите XML-Схемы.

  4. На вкладке "Схемы XML" перетащите узел верхнего уровня для схемы в аргумент функции Retract .

    Этот верхний узел заканчивается расширением XSD и представляет корневой узел документа, а не узел элемента документа. Узел имеет селектор, который ссылается на исходный /TypedXmlDocument. При удалении родительского объекта TypedXmlDocument все дочерние сущности TypedXmlDocument, связанные с TypedXmlDocument, удаляются из рабочей памяти, включая все сущности TypedXmlDocument, созданные путем вызова функции Assert, на основе селекторов, используемых в наборе правил.

Отозвать дочернюю сущность TypedXmlDocument

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Retract в качестве действия.

  3. В окне Обозреватель фактов, выберите XML-схемы.

  4. На вкладке "Схемы XML" перетащите дочерний узел в аргумент функции Retract .

Функция RetractByType

Чтобы удалить все объекты с указанным типом из рабочей памяти обработчика правил, используйте функцию RetractByType в Microsoft Rules Composer. Эта функция отличается от функции Retract , которая удаляет только определенные элементы с определенным типом.

Повторное извлечение всех объектов .NET с определенным типом

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию RetractByType в качестве действия.

  3. В окне Facts Explorer выберите Классы .NET.

  4. На вкладке .NET классы перетащите этот класс в аргумент функции RetractByType.

Отозвать все сущности TypedXmlDocument с определенным типом

RetractByType удаляет все сущности TypedXmlDocument с тем же DocumentType.Selector.

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию RetractByType в качестве действия.

  3. В окне обозревателя фактов выберите XML-схемы.

  4. На вкладке "Схемы XML" перетащите соответствующий узел в функцию RetractByType .

В соответствии с функцией Retract, если вы используете функцию RetractByType на корневом узле документа, это действие не только удаляет все сущности TypedXmlDocument, прописанные с этим DocumentType, но и все дочерние сущности TypedXmlDocument или узлы XmlNode в иерархии дерева, связанные с этими родительскими сущностями TypedXmlDocument.

Функция повторного утверждения

Чтобы вызвать функцию Assert в объекте, который уже существует в рабочей памяти обработчика, используйте функцию Reassert в Microsoft Rules Composer. Поведение эквивалентно выполнению команды Retract для объекта, за которой следует команда Assert .

Например, если вы используете функцию Reassert в объекте .NET, обработчик правил выполняет следующие действия:

  1. Извлеките объект .NET из рабочей памяти.

  2. Удалите все действия в повестке дня для правил, использующих объект в предикате или действии.

  3. Утвердить объект .NET обратно в рабочую память и оценить как вновь ассоциированный объект.

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

  5. Считывал действия повестки дня для всех правил, которые ранее оценили значение true и использовали объект только в своих действиях.

Повторное добавление объекта .NET

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Reassert в качестве действия.

  3. В окне Facts Explorer выберите Классы .NET.

  4. На вкладке .NET классы перетащите класс в аргумент функции Reassert.

Повторное подтверждение сущности TypedXmlDocument

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Reassert в качестве действия.

  3. В окне обозревателя фактов выберите XML-схемы.

  4. На вкладке "Схемы XML" перетащите узел сущности, который вы хотите использовать в функции Reassert.

При повторном утверждении сущности TypedXmlDocument верхнего уровня дочерние сущности TypedXmlDocument, созданные при первом утверждении сущности TypedXmlDocument, могут вести себя по-разному в зависимости от состояния каждой дочерней сущности TypedXmlDocument.

Например, если новая или существующая дочерняя сущность "грязна", то есть хотя бы одно поле было изменено в наборе правил с помощью действия, то функция Assert или функция Reassert выполняется на этом дочернем объекте. Любой существующий ребенок, который не является грязным, остается в рабочей памяти.

Примечание.

Узел не помечен как грязный в результате внешних операций, о которых движок не знает, например, внешнее приложение программно добавляет, удаляет или обновляет этот узел.

В следующем примере показан упрощенный сценарий, описывающий поведение дочерних сущностей при повторной установке родительской сущности. Предположим, у вас есть следующие сущности TypedXmlDocument в рабочей памяти: Parent, Child1, Child2 и Child3.

  • Родитель — это сущность TypedXmlDocument верхнего уровня.
  • Каждый дочерний элемент содержит поле с именем ExampleField, где значение равно 1, например, Child1.ExampleField = 1`.

Предположим, что действие правила выполняет следующие операции над дочерними сущностями.

  • Значение ExampleField для Child2 обновляется от 1 до 0.
  • Пользовательский код удаляет Child3.
  • Пользовательский код добавляет новую дочернюю сущность TypedXmlDocument с именем NewChild в Parent.

В следующем примере показано новое представление объектов в рабочей памяти:

Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild

Предположим, что вы повторно подтвердите родительскую сущность, что приведет к следующему поведению дочерних сущностей:

  • Child2 повторно установлено, так как было изменено после обновления его поля.
  • Элемент3 удалён из рабочей памяти.
  • NewChild вводится в рабочую память.
  • Child1 остается неизменным в рабочей памяти, поскольку его не обновили до того, как Parent был повторно активирован.

Функция обновления

Чтобы повторно включить объект в обработчик правил для повторной оценки на основе новых данных и состояния, используйте функцию Update в Microsoft Rules Composer. Объект может иметь тип класса .NET или тип TypedXmlDocument . Вы также можете использовать функцию обновления для повышения производительности подсистемы и предотвращения бесконечных сценариев цикла.

Внимание

Максимальное число циклов по умолчанию для повторной оценки правил равно 2^32, поэтому для определенных правил выполнение набора правил может длиться долго. Чтобы уменьшить число циклов, измените свойство Maximum Execution Loop Depth в версии набора правил.

Обновление объекта .NET

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Update в качестве действия.

  3. В окне "Facts Explorer" выберите .NET Классы.

  4. На вкладке классов .NET перетащите класс в аргумент функции Update .

Как правило, вы используете Assert для размещения нового объекта в рабочей памяти обработчика правил и использования Update для обновления уже существующего объекта в рабочей памяти. При добавлении нового объекта как факта машина переоценивает условия во всех правилах. Однако при обновлении существующего объекта подсистема переоценивает только условия, использующие обновленный факт и добавляющие действия в повестку дня, если эти условия оцениваются как истинные.

Например, предположим, что у вас есть следующие правила, а объекты с именем ItemA и ItemB уже существуют в рабочей памяти.

  • Правило 1 вычисляет свойство Id в ItemA, задает свойство Id в ItemB, а затем повторно принимает элемент ItemB после изменения. При повторном определении ItemB подсистема обрабатывает ItemB как новый объект, и подсистема повторно вычисляет все правила, использующие ItemB в предикатах или действиях. Это поведение гарантирует, что подсистема переоценивает правило 2 в отношении нового значения в ItemB.Id , как указано в правиле 1.

    Правило 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • Правило 2 может не пройти первую проверку, но принимает значение true во время второй проверки.

    Правило 2

    IF ItemB.Id == 2
    THEN ItemB.Value = 100
    

Возможность повторного ввода объектов в рабочую память обеспечивает явный контроль над поведением системы в сценариях цепочки выведения вперед. Однако в этом примере показан побочный эффект повторной оценки, когда правило 1 также повторно оценивается. При ItemA.Id без изменений, Правило 1 снова оценивается как true, и действие Assert(ItemB) снова запускается. В результате правило создает ситуацию бесконечного цикла.

Предотвращение бесконечных циклов

Вы должны быть в состоянии восстановить объекты без создания бесконечных циклов. Чтобы избежать таких сценариев, можно использовать функцию Update . Как и функция Reassert, функция Update выполняет функции Retract и Assert для связанных экземпляров объектов, которые изменяются действиями правила, но со следующими ключевыми различиями:

  • В повестке дня действия правил остаются актуальными, если тип экземпляра используется только в действиях, а не в предикатах.

  • Правила, использующие только тип экземпляра в действиях, не пересматриваются.

В результате правила, которые используют типы экземпляров, как только в предикатах, так и в действиях, пересматриваются, и действия правил добавляются в список, когда это уместно.

Изменив предыдущий пример, чтобы использовать функцию Update, можно убедиться, что подсистема переоценивает только правило 2, так как условие для правила 2 использует ItemB. Обработчик не переоценит правило 1, так как ItemB используется только в действиях правила 1*, устраняя сценарий циклирования.

Правило 1

IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)

Правило 2

IF ItemB.Id == 2
THEN ItemB.Value = 100

Несмотря на использование функции Update таким образом, возможность по-прежнему существует для создания циклических сценариев. Например, рассмотрим следующее правило:

IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)

Предикат использует ItemA, поэтому подсистема переоценивает правило при вызове обновления в ItemA. Если значение для ItemA.Id не изменяется в другом месте, правило 1 продолжает оцениваться как true, что приводит к повторному вызову обновления в ItemA.

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

В следующем примере показано простой способ решения проблемы в предыдущем примере, добавив флажок ItemA.Value , который не позволяет правилу повторно оценивать значение true после первого выполнения действий правила.

IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)

Обновление сущности TypedXmlDocument

  1. В окне обозревателя правил найдите и выберите нужное правило.

  2. В области "Затем" в разделе "Действия" добавьте встроенную функцию Update в качестве действия.

  3. В окне обозревателя фактов выберите XML-схемы.

  4. На вкладке «Схемы XML» перетащите нужный узел сущности в аргумент функции обновления.

Например, предположим, что у вас есть следующие правила:

  • Правило 1 оценивает общее количество элементов в сообщении заказа на покупку.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • Правило 2 задает состояние "Требует утверждения", если общее число больше или равно 10.

    Правило 2

    IF ProcessPO.Order:/Order/Items/TotalCount >= 10
    THEN ProcessPO.Order:/Order/Status = "Needs approval"
    

Если вы передаете следующее сообщение заказа на покупку в качестве входных данных в этот набор правил, вы заметите, что состояние не задано как "Требует утверждения", даже если totalCount равен 14. Это происходит, так как правило 2 вычисляется только в начале, когда значение TotalCount равно 0. Правило не оценивается каждый раз, когда происходит обновление TotalCount.

<ns0:Order xmlns:ns0="http://ProcessPO.Order">
    <Items>
        <Item>
            <Id>ITM1</Id>
            <Count>2</Count>
        </Item>
        <Item>
            <Id>ITM2</Id>
            <Count>5</Count>
        </Item>
        <Item>
            <Id>ITM3</Id>
            <Count>7</Count>
        </Item>
        <TotalCount>0</TotalCount>
    </Items>
    <Status>No approval needed</Status>
</ns0:Order>

Чтобы подсистема повторно вычисляла условия при каждом обновлении TotalCount , необходимо вызвать функцию Update на родительском узле (Items) для обновленного узла (TotalCount). Если изменить правило 1 следующим образом и проверить правило еще раз, для поля "Состояние " задано значение "Требуется утверждение":

Правило 1 (обновлено)

IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND
Update(ProcessPO.Order:/Order/Items)