Assert
어설션 은 비즈니스 규칙 엔진의 작업 메모리에 개체 인스턴스를 추가하는 프로세스입니다. 비즈니스 규칙 엔진은 일치-충돌 해결-작업 단계를 사용하여 인스턴스 유형에 대해 작성된 조건과 작업에 따라 각 인스턴스를 처리합니다.
다음 topics 다양한 팩트 형식에 Assert 함수를 사용하여 발생하는 동작에 대해 설명합니다.
각 개체는 작업 메모리에 별도의 인스턴스로 어설션됩니다. 즉, 개체의 유형을 참조하는 각 조건부(예: IF Object.Property = 1)에 의해 인스턴스가 분석됩니다. 이러한 개체는 규칙 조건의 결과에 따라 해당 유형을 참조하는 규칙 작업에 사용될 수도 있습니다.
아래 예제를 고려해 보세요.
규칙 1
IF A.Value = 1
THEN A.Status = "good"
규칙 2
IF B.Value = 1
THEN A.Status = "good"
규칙 1에서 값이 1인 A의 인스턴스만 Status 속성을 업데이트합니다. 그러나 규칙 2에서 조건이 true로 평가되면 A의 모든 인스턴스는 해당 상태 업데이트됩니다. 실제로 B 인스턴스가 여러 개 있는 경우 B instance 조건이 true로 평가될 때마다 A 인스턴스가 업데이트됩니다.
규칙 내에서 .NET 개체를 어설션하려면 기본 제공 Assert 함수를 규칙 작업으로 추가할 수 있습니다. 규칙 엔진에는 CreateObject 함수가 있지만 비즈니스 규칙 작성기에서 별도의 함수로 표시되지는 않습니다. 이 함수의 호출을 작성하려면 만들려는 개체의 생성자 메서드를 팩트 탐색기의 .NET 클래스 보기에서 작업 창으로 끕니다. 그런 다음 비즈니스 규칙 작성기는 생성자 메서드를 규칙 정의의 CreateObject 호출로 변환합니다.
TypedXmlDocument가 어설션되면 비즈니스 규칙 엔진은 규칙에 정의된 선택기를 기반으로 자식 TypedXmlDocument 인스턴스를 만듭니다.
선택기와 필드는 모두 XPath 식입니다. 선택기 내의 특정 항목을 식별할 때 XML 문서의 노드와 필드를 격리하는 하나의 방법으로 선택기를 사용할 수 있습니다. 한 선택기 내의 모든 필드는 엔진에 의해 단일 개체로 그룹화됩니다. 팩트 Explorer XML 스키마 탭에서 노드를 선택하면 비즈니스 규칙 작성기가 모든 노드의 XPath 선택기 속성과 자식 노드가 포함되지 않은 노드의 XPath Field 속성을 자동으로 채웁니다. 또는 필요한 경우 XPath 선택기 및 XPath 필드에 대한 고유한 XPath 식을 입력할 수 있습니다.
선택기가 XML 문서의 여러 부분과 일치하면 이 유형의 여러 개체가 규칙 엔진 작업 메모리로 어설션되거나 이 작업 메모리에서 제거됩니다. 다음과 같은 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>
각 선택기 내에서 개별 필드는 XPath에 의해 참조됩니다.
선택기 /root/order/item(또는 (//order/item 또는 //item)을 사용하는 경우 4개의 개체가 규칙 엔진 작업 메모리, Joe의 두 항목 및 Jane의 두 항목에 추가됩니다.
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
각 개체는 세 필드(@name, @quantity및 )에 액세스할 수 있습니다 @cost. 각 개체는 원본 문서에 대한 참조이므로 부모 필드(예: "../@customer")를 참조할 수 있습니다.
동일 문서 내에서 여러 개의 선택기를 사용할 수 있습니다. 따라서 한 섹션에는 주문이 포함되어 있고 다른 섹션에는 배송 주소가 포함되어 있는 경우 등에서 문서의 여러 부분을 볼 수 있습니다 그러나 만들어진 개체는 해당 개체를 만든 XPath 문자열에 의해 정의됩니다. 동일한 노드로 확인되더라도 다른 XPath 식을 사용하면 고유한 TypedXmlDocument가 생성됩니다.
규칙 엔진은 참조 유형에 대한 개체뿐만 아니라 기본 .NET 스칼라 유형도 지원합니다. XML 문서는 기본적으로 텍스트이지만 규칙 작성 시 지정한 유형에 따라 필드 값에 임의의 유형을 지정할 수 있습니다. 또한 필드는 XPath 식이므로 노드 집합을 반환할 수 있으며 이 경우 집합의 첫 번째 항목이 값으로 사용됩니다.
백그라운드에서 규칙 엔진은 XmlConvert 함수를 통해 텍스트 필드 값을 지원되는 형식 중 하나로 변환할 수 있습니다. 비즈니스 규칙 작성기에서 유형을 설정하여 이를 지정할 수 있습니다. 변환이 가능하지 않으면 예외가 throw됩니다. bool 및 double 형식은 해당 형식, 문자열 또는 개체로만 검색할 수 있습니다.
TypedDataTable이 어설션되면 DataTable에 포함된 모든 DataRows가 자동으로 엔진에 TypedDataRows로 어설션됩니다. 테이블 또는 테이블 열이 규칙 인수로 사용될 때마다 식은 TypedDataTable이 아닌 개별 TypedDataRows에 대해 평가됩니다.
예를 들어 "Customers" 테이블에 대해 작성된 다음 규칙이 있다고 가정합니다.
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
참고
데이터베이스 테이블에 대한 규칙을 빌드하려면 데이터 테이블/행 을 데이터베이스 바인딩 형식으로 사용해야 합니다.
세 개의 DataRows를 사용하여 다음 DataTable을 엔진에 어설션한다고 가정합니다(TypedDataTable).
CustomerID | ContactTitle |
---|---|
001 | Supply Clerk |
002 | Supply Clerk |
003 | Supply Clerk |
엔진은 001, 002 및 003의 세 가지 TypedDataRows를 삽입합니다.
각 TypedDataRow 는 규칙에 대해 독립적으로 평가됩니다. 첫 번째 TypedDataRow 는 규칙 조건을 충족하고 두 번째 TypedDataRow는 실패합니다. 결과는 다음과 같이 나타납니다.
CustomerID | ContactTitle |
---|---|
001 | Purchasing Manager |
002 | Supply Clerk |
003 | Supply Clerk |
참고
TypedDataRows는 엔진으로 직접 어설션될 수도 있으며 앞에서 설명한 것과 동일한 방법으로 처리됩니다.
DataSetName.DataTableName은 고유 식별자로 간주됩니다. 따라서 두 번째 TypedDataTable 이 동일한 DataSet 이름과DataTable 이름으로 어설션되면 첫 번째 TypedDataTable을 대체합니다. 첫 번째 TypedDataTable과 연결된 모든 TypedDataRow가 철회되고 두 번째 TypedDataTable이 어설션됩니다.
TypedDataTable과 마찬가지로 비즈니스 규칙 작성기에서 테이블 또는 열을 규칙 인수로 끌어오면 DataConnection 자체가 아닌 반환된 TypedDataRow에 대해 빌드된 규칙이 생성됩니다.
다음 규칙이 만들어지고 Northwind.Customers에 대한 SqlConnection이 포함된 DataConnection이 어설션되었다고 가정합니다.
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
엔진이 TypedDataTable 섹션에서 사용되는 규칙을 평가하면 다음과 같은 쿼리를 동적으로 빌드합니다.
SELECT *
FROM Northwind.Customers
WHERE CustomerID = 1
데이터베이스의 행 하나만 이 조건을 충족하므로 추가 처리를 위해 하나의 TypedDataRow 만 만들어지고 엔진에 어설션됩니다.
다음 표는 어설션된 각 엔터티에 대해 엔진에 만들어지는 결과 인스턴스 수 및 이러한 인스턴스를 식별하기 위해 각 인스턴스에 적용되는 유형을 보여 주면서 다양한 유형에 대한 어설션 동작을 요약합니다.
엔터티 | 어설션된 인스턴스 수 | 인스턴스 유형 |
---|---|---|
.NET 개체 | 1(개체 자체) | 정규화된 .NET 클래스 |
TypedXmlDocument | 1-N TypedXmlDocument: 만든 선택기 바인딩 및 문서 콘텐츠 기반 | DocumentType.Selector |
TypedDataTable | 1-N TypedDataRow DataTable에 있는 DataRow당 하나 |
DataSetName.DataTableName |
TypedDataRow | 1(어설션된 TypedDataRow) | DataSetName.DataTableName |
DataConnection | 1-N(DataConnection을 쿼리한 결과 반환되는 TypedDataRow당 하나) | DataSetName.DataTableName |