Reassert
reassert 意味着对已在引擎工作内存中的对象调用 Assert 函数。 重新添加命令相当于向该对象发出取消命令,然后执行添加命令。
首先会取消对象,并删除针使用该对象(在谓词或操作中)的规则议程中的所有操作。 然后,将该对象添加回工作内存中,并将其作为任何新添加的对象进行计算。 这意味着将重新计算所有在谓词中使用该对象的规则,并且根据需要将其操作添加到议程中。 之前评估为 true 且仅在其操作中使用 对象的任何规则都将将其操作重新添加到议程中。
重新确认顶级 TypedXmlDocument (TXD) 时,最初断言顶级 TXD时创建的子 TXD 具有不同的行为,具体取决于子 TXD的状态。 对于新的子节点或脏的子节点,这意味着策略中至少有一个字段已通过使用规则操作进行更改,对子节点执行断言或重新确认操作。 所有未更新的现有子节点都将保留在工作内存中。 以下示例是一个简化的方案,该方案对重新添加其父节点时这些子节点的行为进行了说明。
假设工作内存中当前有三个 TXD: P、 C1、 C2 和 C3。 P 是顶级 TXD,即父节点;每个子节点都包含一个字段 x。
P
C1 (C1。x = 1)
C2 (C2。x = 1)
C3 (C3。x = 1)
接下来,假设已作为规则操作执行了以下操作:
更新 C2 的字段 (x) 值。
使用用户代码删除 C 3。
使用用户代码将其他子节点 D 添加到 P 。
备注
业务规则引擎不会根据其不知道的操作来将节点标记为已更新。 例如,在外部应用程序中通过编程方式添加、删除或修改节点。
工作内存中对象的新表示形式如下所示。
P
C1 (C1。x = 1)
C2 (C2。X = 0)
D
现在,重新获得 P.以下几点汇总了子节点的行为:
节点 C2 已重新验证,因为它在更新其字段后脏。
从工作内存中收回节点 C3。
节点 D 断言到工作内存中。
节点 C1 在工作内存中保持不变,因为它在重新表示 P 之前未更新。
如果在 TypedDataRow 上发出 Reassert,则会收回该行,然后断言到工作内存中。 如果在 TypedDataTable 上发出 Reassert,则会收回所有关联的 TypedDataRow,然后断言。
将收回通过 DataConnection 检索到的所有 TypedDataRow。 然后会重新评估使用 DataConnection 的所有谓词,从而导致重新查询 DataConnection 以创建相关的 TypedDataRows。