Assert
La aserción es el proceso de agregar instancias de objeto a la memoria de trabajo del motor de reglas de negocios. El motor procesa las instancias de acuerdo con las condiciones y acciones que se escriben en el tipo de instancia, mediante las fases de acción o resolución de conflictos o coincidencias.
En los temas siguientes se describen los comportamientos resultantes del uso de la función Assert para distintos tipos de hechos.
Objetos .NET
Cada objeto se agrega a la memoria de trabajo como una instancia independiente. Esto significa que cada predicado que haga referencia al tipo de objeto analiza la instancia en cuestión (por ejemplo, IF Object.Property = 1). También se pone a disposición para aquellas acciones de regla que hagan referencia al tipo, en función de los resultados que se obtengan de las condiciones de regla.
Considere el ejemplo siguiente.
Regla 1
IF A.Value = 1
THEN A.Status = "good"
Regla 2
IF B.Value = 1
THEN A.Status = "good"
En la regla 1, solo las instancias de A que tengan un valor de 1 tendrán actualizada su propiedad Status . Sin embargo, en la regla 2, si la condición se evalúa como true, todas las instancias de A tendrán su estado actualizado. De hecho, si hay varias instancias de B, las instancias A se actualizarán cada vez que la condición se evalúe como true para una instancia B.
Para declarar un objeto .NET desde dentro de una regla, puede agregar la función Assert integrada como una acción de regla. Tenga en cuenta que el motor de reglas tiene una función CreateObject , pero no se muestra como una función independiente en business Rule Composer. Su invocación se genera al arrastrar un método de construcción del objeto que desea crear desde la vista Clase .NET del Explorador de hechos hasta el panel de acciones. A continuación, el Compositor de reglas de negocios traduce el método constructor a una llamada CreateObject en la definición de regla.
TypedXmlDocument
Cuando se afirma un TypedXmlDocument , el motor de reglas de negocios crea instancias de TypedXmlDocument secundarias basadas en los selectores definidos en la regla.
Los selectores y los campos son expresiones XPath. Los selectores pueden considerarse una forma de aislar los nodos de un documento XML y los campos pueden usarse como elementos específicos de identificación en el selector. El motor agrupa todos los campos de un selector en un objeto. Al seleccionar un nodo en la pestaña Esquemas XML del Explorador de hechos, Business Rule Composer rellena automáticamente la propiedad Selector XPath para todos los nodos y la propiedad Campo XPath para cualquier nodo que no contenga nodos secundarios. Como alternativa, puede escribir sus propias expresiones XPath para XPath Selector y XPath Field si es necesario.
Si el selector coincide con varias partes del documento XML, varios objetos de este tipo se imponen en la memoria de trabajo del motor de reglas o se retiran de ella. Suponga que dispone del siguiente documento 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>
Si usa el selector /root/order (o //order), se agregan dos objetos a la memoria de trabajo.
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>
En cada selector se hace referencia a los campos individuales mediante XPaths.
Si usa el selector /root/order/item (o (//order/item o //item), se agregan cuatro objetos a la memoria de trabajo del motor de reglas, los dos elementos de Joe y los dos elementos de Jane.
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Cada objeto tiene acceso a tres campos: @name, @quantityy @cost. Dado que el objeto constituye una referencia en el documento original, puede hacer referencia a los campos principales (por ejemplo, "../@customer").
Puede usar varios selectores en el mismo documento. Esto le permite ver distintas partes del documento. Por ejemplo, si una sección es el pedido y otra contiene la dirección de envío). No obstante, tenga en cuenta que los objetos creados se definen mediante la cadena XPath que los ha creado. El uso de una expresión XPath diferente, incluso si se resuelve en el mismo nodo, da como resultado un typedXmlDocument único.
El motor de reglas admite los tipos escalares básicos de .NET de forma nativa, además de los objetos de los tipos de referencia. Los documentos XML están formados básicamente de texto, pero el valor de campo puede ser de cualquier tipo en función del tipo que se especificó al generar la regla. Además, dado que los campos son expresiones XPath, éstos pueden devolver Nodeset, en cuyo caso se usa como valor el primer elemento del conjunto.
En segundo plano, el motor de reglas puede convertir un valor de campo de texto en cualquiera de los tipos admitidos a través de la función XmlConvert . Esto puede especificarse al establecer el tipo en el Compositor de reglas de negocio. Si la conversión no es posible, se lanza una excepción. Los tipos bool y double solo se pueden recuperar como su tipo, cadenas u objetos respectivos.
TypedDataTable
Cuando se afirma una Clase TypedDataTable , todos los dataRows contenidos en DataTable se declaran automáticamente en el motor como TypedDataRows. Cada vez que se usa una tabla o columna de tabla como argumento de regla, la expresión se evalúa con el TypedDataRows individual y no con TypedDataTable.
Suponga, por ejemplo, que cuenta con la regla siguiente generada en una tabla "Customers":
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Nota
Para compilar una regla en una tabla de base de datos, debe usar Tabla de datos o fila como tipo de enlace de base de datos.
Supongamos que se afirma la siguiente DataTable con tres DataRows en el motor (como TypedDataTable).
CustomerID | ContactTitle |
---|---|
001 | Supply Clerk |
002 | Supply Clerk |
003 | Supply Clerk |
El motor inserta tres TypedDataRows: 001, 002 y 003.
Cada TypedDataRow se evalúa de forma independiente con respecto a la regla. El primer TypedDataRow cumple la condición de regla y los dos segundos producen un error. Los resultados aparecen de la forma siguiente.
CustomerID | ContactTitle |
---|---|
001 | Purchasing Manager |
002 | Supply Clerk |
003 | Supply Clerk |
Nota
Las TypedDataRows también pueden imponerse directamente en el motor. Se procesan tal y como se detalló con anterioridad.
DataSetName.DataTableName se considera un identificador único. Por lo tanto, si se afirma una segunda TypedDataTable con el mismo nombre dataSet y el nombre de DataTable , sustituye a la primera TypedDataTable. Todos los TypedDataRowasociados al primer TypedDataTable se retiran y se afirma la segunda TypedDataTable .
DataConnection
Al igual que con typedDataTable, al arrastrar una tabla o columna como argumento de regla en el Compositor de reglas de negocios, se generan reglas creadas con el TypedDataRowdevuelto en lugar del propio DataConnection .
Supongamos que se crea la siguiente regla y se afirma una clase DataConnection que contiene sqlConnection a Northwind.Customers:
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Cuando el motor evalúa la regla usada en la sección TypedDataTable , compila dinámicamente una consulta similar a la siguiente:
SELECT *
FROM Northwind.Customers
WHERE CustomerID = 1
Dado que solo una fila de la base de datos cumple este criterio, solo se crea un TypedDataRow y se afirma en el motor para su posterior procesamiento.
Resumen de tipos de instancia y entidades impuestas
En la tabla siguiente se resume el comportamiento que adopta la función Imponer en los distintos tipos. La tabla refleja el número de instancias resultantes que se crean en el motor para cada entidad impuesta y el tipo que se aplica a cada instancia para identificarla.
Entidad | Número de instancias impuestas | Tipo de instancia |
---|---|---|
.NET (objeto) | 1 (el objeto en sí) | Clase .NET completa |
TypedXmlDocument | 1-N TypedXmlDocument(s): basado en enlaces selector creados y contenido del documento | DocumentType.Selector |
TypedDataTable | 1-N TypedDataRow: Una para cada DataRow de la DataTable |
DataSetName.DataTableName |
TypedDataRow | 1 (la TypedDataRow impuesta) | DataSetName.DataTableName |
DataConnection | 1-N (una para cada TypedDataRow devuelta por la consulta a DataConnection) | DataSetName.DataTableName |