GruleEngine.go
中FetchMatchingRules
函数的将会获取所有能够满足事实的所有有效规则,并返回按优先级排序的 ast.RuleEntry
列表。
rule DuplicateRule1 "Duplicate Rule 1" salience 5 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule2 "Duplicate Rule 2" salience 6 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule3 "Duplicate Rule 3" salience 7 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule4 "Duplicate Rule 4" salience 8 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule UniqueRule5 "Unique Rule 5" salience 0 {
when
(Fact.Distance > 5000 && Fact.Duration == 120) && (Fact.Result == false)
Then
Output.NetAmount=143.320007;
Fact.Result=true;
}
除了 UniqueRule5
规则之外,所有以上的规则除了优先级不一样之外都是重复的. 正如我们所了解的,有更高优先级的规则将会在发生冲突的时候会被优先执行。
fact := &Fact{
Distance: 6000,
Duration: 121,
}
engine := engine.NewGruleEngine()
ruleEntries, err := engine.FetchMatchingRules(dctx, kb)
if err != nil {
panic(err)
}
Returns []*ast.RuleEntry (All Matching Rule Entries sorted by Salience)
rule DuplicateRule4 "Duplicate Rule 4" salience 8 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule3 "Duplicate Rule 3" salience 7 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule2 "Duplicate Rule 2" salience 6 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}
rule DuplicateRule1 "Duplicate Rule 1" salience 5 {
when
(Fact.Distance > 5000 && Fact.Duration > 120) && (Fact.Result == false)
Then
Fact.NetAmount=143.320007;
Fact.Result=true;
}