main
hy.kim 1 year ago
parent 9024d1b861
commit 42be0d7999

@ -20,7 +20,11 @@ pip install durable_rules
```
from durable.lang import *
```
#### Rules (Trigger: @when_all(==, &, <<))
<details>
<summary>Rules (Trigger: @when_all(==, &, <<))</summary>
<div markdown="1">
* 규칙은 프레임워크의 기본 구성 요소입니다.
* 규칙의 선행 조건은 규칙의 결과 조건(동작)을 실행하기 위해 충족되어야 하는 조건을 정의합니다.
* 관례적으로 m은 주어진 규칙에 의해 평가될 데이터를 나타냅니다.
@ -33,7 +37,13 @@ with ruleset('test'):
print ('Hello {0}'.format(c.m.subject))
post('test', { 'subject': 'World' })
```
#### Facts (assert_fact)
</div>
</details>
<details>
<summary>Facts (assert_fact)</summary>
<div markdown="1">
* 사실은 지식 기반을 정의하는 데이터를 나타냅니다.
* 사실은 JSON 객체로 주장되며, 취소될 때까지 저장됩니다.
* 사실이 규칙의 선행 조건을 만족하면, 규칙의 결과 조건이 실행됩니다.
@ -62,7 +72,13 @@ with ruleset('animal'):
print('Fact: {0} {1} {2}'.format(c.m.subject, c.m.predicate, c.m.object))
assert_fact('animal', { 'subject': 'Kermit', 'predicate': 'eats', 'object': 'flies' })
```
#### Events (post)
</div>
</details>
<details>
<summary>Events (post)</summary>
<div markdown="1">
* 이벤트는 규칙에 전달되어 평가될 수 있습니다.
* 이벤트란 일시적인 사실로, 결과를 실행하기 직전에 취소되는 사실입니다.
* 따라서 이벤트는 한 번만 관찰할 수 있습니다.
@ -91,7 +107,13 @@ Fraud detected -> CA, US
이벤트는 일시적인 사실입니다. 사실이 발송될 예정이라면 즉시 취소됩니다. 위 예제에서 post를 사용할 때, 두 번째 쌍이 계산되는 시점에 이미 이벤트가 취소되어 있습니다.
발송 전에 이벤트를 취소함으로써 작업 실행 중 계산해야 할 조합의 수를 줄일 수 있습니다.
#### State (s, update_state)
</div>
</details>
<details>
<summary>State (s, update_state)</summary>
<div markdown="1">
* 규칙의 결과가 실행될 때 컨텍스트 상태를 사용할 수 있습니다.
* 동일한 컨텍스트 상태는 규칙 실행 간에 전달됩니다.
* 컨텍스트 상태는 삭제될 때까지 저장됩니다.
@ -119,7 +141,13 @@ with ruleset('flow'):
c.delete_state()
update_state('flow', { 'status': 'start' })
```
#### Identity (+속성, none(+속성))
</div>
</details>
<details>
<summary>Identity (+속성, none(+속성))</summary>
<div markdown="1">
* 같은 속성 이름과 값이 있는 팩트들은 단언(asserted)되거나 철회(retracted)될 때 동등하다고 간주됩니다.
* 같은 속성 이름과 값이 있는 이벤트들은 게시 시간이 중요하기 때문에 게시될 때 서로 다른 것으로 간주됩니다.
``` python
@ -181,9 +209,13 @@ retract_fact('bookstore', {
'seller': 'bookstore'
})
```
#### Pattern Matching
#### String Operations
#### Correlated Sequence
</div>
</details>
<details>
<summary>Correlated Sequence</summary>
<div markdown="1">
* 규칙은 서로 관련된 이벤트 또는 사실의 시퀀스를 효율적으로 평가하는 데 사용할 수 있습니다. 아래 예시의 사기 탐지 규칙은 세 가지 이벤트 패턴을 보여줍니다: 두 번째 이벤트 금액이 첫 번째 이벤트 금액의 200%를 초과하고 세 번째 이벤트 금액이 다른 두 이벤트의 평균보다 큽니다.
* 기본적으로 관련된 시퀀스는 서로 다른 메시지를 캡처합니다. 아래 예시에서 두 번째 이벤트는 두 번째와 세 번째 조건을 모두 만족하지만, 이벤트는 두 번째 조건에 대해서만 캡처됩니다. distinct 속성을 사용하여 서로 다른 이벤트 또는 사실의 상관 관계를 비활성화할 수 있습니다.
* when_all 주석은 이벤트 또는 사실의 시퀀스를 표현합니다. << 연산자는 이후 표현식에서 참조할 수 있는 이벤트 또는 사실의 이름을 지정하는 데 사용됩니다. 이벤트 또는 사실을 참조할 때 모든 속성을 사용할 수 있습니다. 산술 연산자를 사용하여 복잡한 패턴을 표현할 수 있습니다.
@ -205,7 +237,13 @@ post('risk', { 'amount': 50 })
post('risk', { 'amount': 200 })
post('risk', { 'amount': 251 })
```
#### Choice of Sequences
</div>
</details>
<details>
<summary>Choice of Sequences</summary>
<div markdown="1">
* durable_rules는 보다 풍부한 이벤트 시퀀스를 표현하고 효율적으로 평가할 수 있게 해줍니다. 아래 예시에서 두 이벤트\사실 시퀀스 각각이 동작을 실행합니다.
* 다음 두 함수는 더 풍부한 이벤트 시퀀스를 정의하는 데 사용되고 결합할 수 있습니다:
@ -233,7 +271,13 @@ post('expense', { 'amount': 1000 })
post('expense', { 'subject': 'jumbo' })
post('expense', { 'amount': 10000 })
```
#### Lack of Information
</div>
</details>
<details>
<summary>Lack of Information</summary>
<div markdown="1">
* 일부 경우에는 정보 부족이 중요한 의미를 가집니다. none 함수는 관련된 시퀀스가 있는 규칙에서 정보 부족을 평가하는 데 사용할 수 있습니다.
* 참고: none 함수는 정보 부족에 대한 추론을 위해 정보가 필요합니다. 즉, 해당 규칙에 이벤트나 사실이 등록되지 않은 경우에는 동작을 실행하지 않습니다.
@ -258,7 +302,13 @@ assert_fact('risk', { 'sid': 1, 't': 'withdrawal' })
assert_fact('risk', { 'sid': 1, 't': 'chargeback' })
retract_fact('risk', { 'sid': 1, 't': 'balance' })
```
#### Nested OBjects
</div>
</details>
<details>
<summary>Nested OBjects</summary>
<div markdown="1">
* 중첩된 이벤트 또는 사실에 대한 질의도 지원됩니다.
* . 표기법은 중첩된 객체의 속성에 대한 조건을 정의하는 데 사용됩니다.
``` python
@ -278,7 +328,13 @@ post('expense', {'t': 'bill', 'invoice': {'amount': 100}})
# two levels of nesting
post('expense', {'t': 'account', 'payment': {'invoice': {'amount': 100}}})
```
#### Arrays
</div>
</details>
<details>
<summary>Arrays</summary>
<div markdown="1">
``` python
from durable.lang import *
@ -308,7 +364,13 @@ post('risk', {'payments': [ { 'amount' : 200 }, { 'amount' : 300 }, { 'amount' :
post('risk', {'cards': [ 'one card', 'two cards', 'three cards' ]})
post('risk', {'payments': [ [ 10, 20, 30 ], [ 30, 40, 50 ], [ 10, 20 ] ]})
```
#### Facts and Events as rvalues
</div>
</details>
<details>
<summary>Facts and Events as rvalues</summary>
<div markdown="1">
* 스칼라 값(문자열, 숫자 및 부울 값) 외에도 표현식의 오른쪽에서 관찰된 사실이나 이벤트를 사용할 수 있습니다.
``` python
from durable.lang import *
@ -331,8 +393,16 @@ post('risk', { 'debit': 150, 'credit': 100 })
post('risk', { 'amount': 200 })
post('risk', { 'amount': 500 })
```
</div>
</details>
# Consequents
#### Conflict Resolution
<details>
<summary>Conflict Resolution</summary>
<div markdown="1">
* 이벤트와 사실 평가는 여러 결과를 초래할 수 있습니다. pri (중요도) 함수를 사용하여 트리거 순서를 제어할 수 있습니다. 낮은 값의 작업이 먼저 실행됩니다. 모든 작업의 기본값은 0입니다.
* 이 예시에서, 마지막 규칙이 가장 높은 우선순위를 가지고 있으므로 먼저 트리거됩니다.
@ -356,7 +426,13 @@ assert_fact('attributes', { 'amount': 50 })
assert_fact('attributes', { 'amount': 150 })
assert_fact('attributes', { 'amount': 250 })
```
#### Action Batches
</div>
</details>
<details>
<summary>Action Batches</summary>
<div markdown="1">
* 많은 수의 이벤트 또는 사실이 결과를 만족시킬 때, 결과는 일괄적으로 전달될 수 있습니다.
count: 동작을 예약하기 전에 규칙이 만족해야 하는 정확한 횟수를 정의합니다.
@ -388,7 +464,13 @@ post_batch('expense', [{ 'amount': 10 },
{ 'amount': 400 }])
assert_fact('expense', { 'review': True })
```
#### Async Actions
</div>
</details>
<details>
<summary>Async Actions</summary>
<div markdown="1">
* 결과 동작은 비동기적일 수 있습니다.
* 동작이 완료되면 완료(complete) 함수를 호출해야 합니다.
* 기본적으로 동작은 5초 후에 포기된 것으로 간주됩니다.
@ -434,7 +516,13 @@ with ruleset('flow'):
update_state('flow', { 'state': 'first' })
```
#### Unhandled Exceptions
</div>
</details>
<details>
<summary>Unhandled Exceptions</summary>
<div markdown="1">
* 액션에서 예외가 처리되지 않은 경우, 예외는 컨텍스트 상태에 저장됩니다.
* 이를 통해 예외 처리 규칙을 작성할 수 있습니다.
``` python
@ -454,8 +542,17 @@ with ruleset('flow'):
post('flow', { 'action': 'start' })
```
</div>
</details>
### Flow Structures
#### Statechart
</div>
</details>
<details>
<summary>Statechart</summary>
<div markdown="1">
* 규칙은 상태도(statecharts)를 사용하여 구성할 수 있습니다. 상태도는 결정적 유한 오토마타(DFA)입니다. 상태 컨텍스트는 가능한 여러 상태 중 하나에 있으며, 이러한 상태 간에 조건부 전환을 가집니다.
* 상태도 규칙:
@ -513,7 +610,13 @@ post('expense', { 'sid': 1, 'subject': 'denied' })
# events directed to statechart instance with id '2'
post('expense', { 'sid': 2, 'subject': 'approve', 'amount': 10000 })
```
### Nested States
</div>
</details>
<details>
<summary>Nested States</summary>
<div markdown="1">
* 중첩 상태를 사용하면 컴팩트한 상태도를 작성할 수 있습니다.
* 컨텍스트가 중첩 상태에 있는 경우, 컨텍스트는 묵시적으로 주변 상태에도 있습니다.
* 상태도는 하위 상태 컨텍스트에서 모든 이벤트를 처리하려고 시도합니다. * 하위 상태가 이벤트를 처리하지 않으면, 이벤트는 자동으로 상위 상태 컨텍스트에서 처리됩니다.
@ -554,7 +657,13 @@ post('worker', { 'subject': 'continue' })
# will move the statechart out of the work state
post('worker', { 'subject': 'cancel' })
```
### Flowchart
</div>
</details>
<details>
<summary>Flowchart</summary>
<div markdown="1">
* 플로우차트는 규칙 세트 흐름을 구성하는 또 다른 방법입니다. 플로우차트에서 각 단계는 실행할 액션을 나타냅니다. 따라서 (상태도 상태와 달리) 컨텍스트 상태에 적용되면 다른 단계로 전환됩니다.
* 플로우차트 규칙:
@ -608,7 +717,13 @@ post('expense', { 'subject': 'approve', 'amount': 100 })
# # # event for the flowchart instance '2' immediately denied
# post('expense', { 'sid': 2, 'subject': 'approve', 'amount': 10000})
```
#### Timer
</div>
</details>
<details>
<summary>Timer</summary>
<div markdown="1">
* 이벤트는 타이머를 사용하여 예약할 수 있습니다.
* 시간 초과 조건은 규칙 전제에 포함될 수 있습니다.
* 기본적으로 타임아웃은 이벤트로 트리거됩니다 (한 번만 관찰됨).
@ -658,18 +773,19 @@ with statechart('risk'):
state('fraud')
state('exit')
```
``` python
# three events in a row will trigger the fraud rule
```
post('risk', { 'amount': 200 })
post('risk', { 'amount': 300 })
post('risk', { 'amount': 400 })
```
# two events will exit after 5 seconds
``` python
post('risk', { 'sid': 1, 'amount': 500 })
post('risk', { 'sid': 1, 'amount': 600 })
```
* 이 예제에서는 속도를 측정하기 위해 수동 리셋 타이머를 사용합니다.
``` python
from durable.lang import *
with statechart('risk'):

Loading…
Cancel
Save