规则链

This commit is contained in:
XM-GO
2023-04-17 17:15:36 +08:00
parent 8b6f18ef6b
commit 9a7bab6cf3
10 changed files with 101 additions and 89 deletions

View File

@@ -2,12 +2,10 @@ package rule_engine
import (
"context"
"fmt"
"github.com/sirupsen/logrus"
"pandax/pkg/rule_engine/manifest"
"pandax/pkg/rule_engine/message"
"pandax/pkg/rule_engine/nodes"
"strings"
)
// ruleChainInstance is rulechain's runtime instance that manage all nodes in this chain,
@@ -31,56 +29,15 @@ func NewRuleChainInstance(data []byte) (*ruleChainInstance, []error) {
// newWithManifest create rule chain by user's manifest file
func newInstanceWithManifest(m *manifest.Manifest) (*ruleChainInstance, []error) {
errs := make([]error, 0)
nodes, err := nodes.GetNodes(m)
if err != nil {
errs = append(errs, err)
return nil, errs
}
r := &ruleChainInstance{
firstRuleNodeId: m.FirstRuleNodeId,
nodes: make(map[string]nodes.Node),
nodes: nodes,
}
// Create All nodes
for _, n := range m.Nodes {
metadata := nodes.NewMetadataWithValues(n.Properties)
node, err := nodes.NewNode(n.Type, n.Id, metadata)
if err != nil {
errs = append(errs, err)
continue
}
if _, found := r.nodes[n.Id]; found {
err := fmt.Errorf("node '%s' already exist in rulechain", n.Id)
errs = append(errs, err)
continue
}
r.nodes[n.Id] = node
}
for _, edge := range m.Edges {
originalNode, found := r.nodes[edge.SourceNodeId]
if !found {
err := fmt.Errorf("original node '%s' no exist in", originalNode.Name())
errs = append(errs, err)
continue
}
targetNode, found := r.nodes[edge.TargetNodeId]
if !found {
err := fmt.Errorf("target node '%s' no exist in rulechain", targetNode.Name())
errs = append(errs, err)
continue
}
//可以有多个类型
split := strings.Split(edge.Properties["type"].(string), "/")
for _, ty := range split {
originalNode.AddLinkedNode(ty, targetNode)
}
}
for name, node := range r.nodes {
targetNodes := node.GetLinkedNodes()
mustLabels := node.MustLabels()
for _, label := range mustLabels {
if _, found := targetNodes[label]; !found {
err := fmt.Errorf("the label '%s' in node '%s' no exist'", label, name)
errs = append(errs, err)
continue
}
}
}
return r, errs
}