@@ -4,12 +4,12 @@ import (
4
4
"context"
5
5
"fmt"
6
6
"math"
7
+ "time"
7
8
8
9
"github.com/project-flogo/rules/common/model"
9
10
10
11
"container/list"
11
12
"sync"
12
- "time"
13
13
)
14
14
15
15
type RtcOprn int
@@ -23,7 +23,7 @@ const (
23
23
24
24
//Network ... the rete network
25
25
type Network interface {
26
- AddRule (model.Rule ) error
26
+ AddRule (rule model.Rule ) error
27
27
String () string
28
28
RemoveRule (string ) model.Rule
29
29
GetRules () []model.Rule
@@ -34,7 +34,7 @@ type Network interface {
34
34
35
35
retractInternal (ctx context.Context , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn )
36
36
37
- assertInternal (ctx context.Context , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn )
37
+ assertInternal (ctx context.Context , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn , forRule string )
38
38
getOrCreateHandle (ctx context.Context , tuple model.Tuple ) reteHandle
39
39
getHandle (tuple model.Tuple ) reteHandle
40
40
@@ -43,6 +43,7 @@ type Network interface {
43
43
GetAssertedTupleByStringKey (key string ) model.Tuple
44
44
//RtcTransactionHandler
45
45
RegisterRtcTransactionHandler (txnHandler model.RtcTransactionHandler , txnContext interface {})
46
+ ReplayTuplesForRule (ruleName string , rs model.RuleSession ) (err error )
46
47
}
47
48
48
49
type reteNetworkImpl struct {
@@ -63,7 +64,7 @@ type reteNetworkImpl struct {
63
64
currentId int
64
65
65
66
assertLock sync.Mutex
66
- crudLock sync.Mutex
67
+ // crudLock sync.Mutex
67
68
txnHandler model.RtcTransactionHandler
68
69
txnContext interface {}
69
70
}
@@ -84,9 +85,8 @@ func (nw *reteNetworkImpl) initReteNetwork() {
84
85
}
85
86
86
87
func (nw * reteNetworkImpl ) AddRule (rule model.Rule ) (err error ) {
87
-
88
- nw .crudLock .Lock ()
89
- defer nw .crudLock .Unlock ()
88
+ nw .assertLock .Lock ()
89
+ defer nw .assertLock .Unlock ()
90
90
91
91
if nw .allRules [rule .GetName ()] != nil {
92
92
return fmt .Errorf ("Rule already exists.." + rule .GetName ())
@@ -137,6 +137,22 @@ func (nw *reteNetworkImpl) AddRule(rule model.Rule) (err error) {
137
137
138
138
//Add NodeLinks
139
139
nw .ruleNameClassNodeLinksOfRule [rule .GetName ()] = classNodeLinksOfRule
140
+
141
+ return nil
142
+ }
143
+
144
+ func (nw * reteNetworkImpl ) ReplayTuplesForRule (ruleName string , rs model.RuleSession ) error {
145
+ if rule , exists := nw .allRules [ruleName ]; ! exists {
146
+ return fmt .Errorf ("Rule not found [%s]" , ruleName )
147
+ } else {
148
+ for _ , h := range nw .allHandles {
149
+ tt := h .getTuple ().GetTupleType ()
150
+ if ContainedByFirst (rule .GetIdentifiers (), []model.TupleType {tt }) {
151
+ //assert it but only for this rule.
152
+ nw .assert (nil , rs , h .getTuple (), nil , ADD , ruleName )
153
+ }
154
+ }
155
+ }
140
156
return nil
141
157
}
142
158
@@ -146,8 +162,8 @@ func (nw *reteNetworkImpl) setClassNodeAndLinkJoinTables(nodesOfRule *list.List,
146
162
147
163
func (nw * reteNetworkImpl ) RemoveRule (ruleName string ) model.Rule {
148
164
149
- nw .crudLock .Lock ()
150
- defer nw .crudLock .Unlock ()
165
+ nw .assertLock .Lock ()
166
+ defer nw .assertLock .Unlock ()
151
167
152
168
rule := nw .allRules [ruleName ]
153
169
delete (nw .allRules , ruleName )
@@ -180,7 +196,8 @@ func (nw *reteNetworkImpl) RemoveRule(ruleName string) model.Rule {
180
196
}
181
197
}
182
198
}
183
-
199
+ rstr := nw .String ()
200
+ fmt .Printf (rstr )
184
201
return rule
185
202
}
186
203
@@ -262,7 +279,7 @@ func (nw *reteNetworkImpl) buildNetwork(rule model.Rule, nodesOfRule *list.List,
262
279
lastNode = fNode
263
280
}
264
281
//Yoohoo! We have a Rule!!
265
- ruleNode := newRuleNode (rule )
282
+ ruleNode := newRuleNode (nw , rule )
266
283
newNodeLink (nw , lastNode , ruleNode , false )
267
284
nodesOfRule .PushBack (ruleNode )
268
285
} else {
@@ -528,36 +545,7 @@ func (nw *reteNetworkImpl) printClassNode(ruleName string, classNodeImpl *classN
528
545
}
529
546
530
547
func (nw * reteNetworkImpl ) Assert (ctx context.Context , rs model.RuleSession , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn ) {
531
-
532
- if ctx == nil {
533
- ctx = context .Background ()
534
- }
535
-
536
- reteCtxVar , isRecursive , newCtx := getOrSetReteCtx (ctx , nw , rs )
537
-
538
- if ! isRecursive {
539
- nw .crudLock .Lock ()
540
- defer nw .crudLock .Unlock ()
541
- nw .assertInternal (newCtx , tuple , changedProps , mode )
542
- reteCtxVar .getConflictResolver ().resolveConflict (newCtx )
543
- //if Timeout is 0, remove it from rete
544
- td := model .GetTupleDescriptor (tuple .GetTupleType ())
545
- if td != nil {
546
- if td .TTLInSeconds == 0 { //remove immediately.
547
- nw .removeTupleFromRete (tuple )
548
- } else if td .TTLInSeconds > 0 { // TTL for the tuple type, after that, remove it from RETE
549
- go time .AfterFunc (time .Second * time .Duration (td .TTLInSeconds ), func () {
550
- nw .removeTupleFromRete (tuple )
551
- })
552
- } //else, its -ve and means, never expire
553
- }
554
- if nw .txnHandler != nil {
555
- rtcTxn := newRtcTxn (reteCtxVar .getRtcAdded (), reteCtxVar .getRtcModified (), reteCtxVar .getRtcDeleted ())
556
- nw .txnHandler (ctx , rs , rtcTxn , nw .txnContext )
557
- }
558
- } else {
559
- reteCtxVar .getOpsList ().PushBack (newAssertEntry (tuple , changedProps , mode ))
560
- }
548
+ nw .assert (ctx , rs , tuple , changedProps , mode , "" )
561
549
}
562
550
563
551
func (nw * reteNetworkImpl ) removeTupleFromRete (tuple model.Tuple ) {
@@ -575,8 +563,8 @@ func (nw *reteNetworkImpl) Retract(ctx context.Context, tuple model.Tuple, chang
575
563
}
576
564
reteCtxVar , isRecursive , _ := getOrSetReteCtx (ctx , nw , nil )
577
565
if ! isRecursive {
578
- nw .crudLock .Lock ()
579
- defer nw .crudLock .Unlock ()
566
+ nw .assertLock .Lock ()
567
+ defer nw .assertLock .Unlock ()
580
568
nw .retractInternal (ctx , tuple , changedProps , mode )
581
569
if nw .txnHandler != nil && mode == DELETE {
582
570
rtcTxn := newRtcTxn (reteCtxVar .getRtcAdded (), reteCtxVar .getRtcModified (), reteCtxVar .getRtcDeleted ())
@@ -622,12 +610,12 @@ func (nw *reteNetworkImpl) GetAssertedTupleByStringKey(key string) model.Tuple {
622
610
return nil
623
611
}
624
612
625
- func (nw * reteNetworkImpl ) assertInternal (ctx context.Context , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn ) {
613
+ func (nw * reteNetworkImpl ) assertInternal (ctx context.Context , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn , forRule string ) {
626
614
tupleType := tuple .GetTupleType ()
627
615
listItem := nw .allClassNodes [string (tupleType )]
628
616
if listItem != nil {
629
617
classNodeVar := listItem .(classNode )
630
- classNodeVar .assert (ctx , tuple , changedProps )
618
+ classNodeVar .assert (ctx , tuple , changedProps , forRule )
631
619
}
632
620
td := model .GetTupleDescriptor (tuple .GetTupleType ())
633
621
if td != nil {
@@ -667,3 +655,36 @@ func (nw *reteNetworkImpl) RegisterRtcTransactionHandler(txnHandler model.RtcTra
667
655
nw .txnHandler = txnHandler
668
656
nw .txnContext = txnContext
669
657
}
658
+
659
+ func (nw * reteNetworkImpl ) assert (ctx context.Context , rs model.RuleSession , tuple model.Tuple , changedProps map [string ]bool , mode RtcOprn , forRule string ) {
660
+
661
+ if ctx == nil {
662
+ ctx = context .Background ()
663
+ }
664
+
665
+ reteCtxVar , isRecursive , newCtx := getOrSetReteCtx (ctx , nw , rs )
666
+
667
+ if ! isRecursive {
668
+ nw .assertLock .Lock ()
669
+ defer nw .assertLock .Unlock ()
670
+ nw .assertInternal (newCtx , tuple , changedProps , mode , forRule )
671
+ reteCtxVar .getConflictResolver ().resolveConflict (newCtx )
672
+ //if Timeout is 0, remove it from rete
673
+ td := model .GetTupleDescriptor (tuple .GetTupleType ())
674
+ if td != nil {
675
+ if td .TTLInSeconds == 0 { //remove immediately.
676
+ nw .removeTupleFromRete (tuple )
677
+ } else if td .TTLInSeconds > 0 { // TTL for the tuple type, after that, remove it from RETE
678
+ go time .AfterFunc (time .Second * time .Duration (td .TTLInSeconds ), func () {
679
+ nw .removeTupleFromRete (tuple )
680
+ })
681
+ } //else, its -ve and means, never expire
682
+ }
683
+ if nw .txnHandler != nil {
684
+ rtcTxn := newRtcTxn (reteCtxVar .getRtcAdded (), reteCtxVar .getRtcModified (), reteCtxVar .getRtcDeleted ())
685
+ nw .txnHandler (ctx , rs , rtcTxn , nw .txnContext )
686
+ }
687
+ } else {
688
+ reteCtxVar .getOpsList ().PushBack (newAssertEntry (tuple , changedProps , mode ))
689
+ }
690
+ }
0 commit comments