Implemented a first and basic version of a Rete rule engine
This commit is contained in:
+17
-3
@@ -5,6 +5,7 @@ import core.utils
|
||||
|
||||
ACTION_TYPE_PRINT = "print"
|
||||
ACTION_TYPE_EXEC = "exec"
|
||||
ACTION_TYPE_TEST = "test"
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -30,17 +31,23 @@ class Rule:
|
||||
rule_id=None,
|
||||
is_enabled=None):
|
||||
self.metadata = RuleMetadata(action_type, name, predicate, action, id=rule_id, is_enabled=is_enabled)
|
||||
self.compiled_predicate = None
|
||||
self.compiled_predicates = None
|
||||
self.compiled_action = None
|
||||
from core.sheerka.services.SheerkaComparisonManager import SheerkaComparisonManager
|
||||
self.priority = priority if priority is not None else SheerkaComparisonManager.DEFAULT_COMPARISON_VALUE
|
||||
self.error_sink = None
|
||||
|
||||
# from SheerkaRete, not quite sure one when it will be used
|
||||
self.rete_net = None
|
||||
self.rete_p_nodes = [] # list of production nodes for this rule
|
||||
self.rete_disjunctions = None # list of list as it may be several interpretation for a rule
|
||||
|
||||
def __repr__(self):
|
||||
rule_id = f"#{self.metadata.id}"
|
||||
if self.name:
|
||||
rule_id += f" ({self.metadata.name})"
|
||||
return f"Rule({rule_id}, when '{self.metadata.predicate}' {self.metadata.action_type} '{self.metadata.action}', priority={self.priority})"
|
||||
action_type = "print" if self.metadata.action_type == "print" else "then"
|
||||
return f"Rule({rule_id}, when '{self.metadata.predicate}' {action_type} '{self.metadata.action}', priority={self.priority})"
|
||||
|
||||
def __eq__(self, other):
|
||||
if id(other) == id(self):
|
||||
@@ -69,8 +76,12 @@ class Rule:
|
||||
self.priority,
|
||||
self.id,
|
||||
self.metadata.is_enabled)
|
||||
copy.compiled_predicate = self.compiled_predicate
|
||||
|
||||
copy.compiled_predicates = self.compiled_predicates
|
||||
copy.compiled_action = self.compiled_action
|
||||
copy.metadata.is_compiled = self.metadata.is_compiled
|
||||
copy.metadata.id_is_unresolved = self.metadata.id_is_unresolved
|
||||
# copy.error_sink = self.error_sink # Uncomment this line if necessary
|
||||
|
||||
return copy
|
||||
|
||||
@@ -102,3 +113,6 @@ class Rule:
|
||||
|
||||
def short_str(self):
|
||||
return f"Rule(#{self.metadata.id}, '{self.metadata.predicate}', priority={self.priority})"
|
||||
|
||||
def get_rete_disjunctions(self):
|
||||
return self.rete_disjunctions
|
||||
|
||||
Reference in New Issue
Block a user