Fixed #68: Implement SheerkaQL

Fixed #70: SheerkaFilterManager : Pipe functions
Fixed #71: SheerkaFilterManager : filter_objects
Fixed #75: SheerkaMemory: Enhance memory() to use the filtering capabilities
Fixed #76: SheerkaEvaluateConcept: Concepts that modify the state of the system must not be evaluated during question
This commit is contained in:
2021-04-26 19:13:47 +02:00
parent bef5f3208c
commit 1059ce25c5
57 changed files with 5759 additions and 1302 deletions
@@ -2,7 +2,6 @@ from core.builtin_concepts import BuiltinConcepts
from core.builtin_helpers import expect_one
from core.global_symbols import EVENT_RULE_CREATED, EVENT_RULE_DELETED, EVENT_RULE_ID_DELETED
from core.sheerka.services.sheerka_service import BaseService
from evaluators.ConceptEvaluator import ConceptEvaluator
from sheerkarete.network import ReteNetwork
DISABLED_RULES = "#disabled#"
@@ -105,10 +104,18 @@ class SheerkaEvaluateRules(BaseService):
:return:
"""
results = self.evaluate_conditions(context, rule.compiled_conditions, bag)
debugger = context.get_debugger(SheerkaEvaluateRules.NAME, "evaluate_rule", new_debug_id=False)
debugger.debug_rule(rule, results)
return expect_one(context, results)
def evaluate_conditions(self, context, conditions, bag):
bag_variables = set(bag.keys())
results = []
for compiled_condition in rule.compiled_conditions:
for compiled_condition in conditions:
if compiled_condition.variables.intersection(bag_variables) != compiled_condition.variables:
continue
@@ -123,22 +130,19 @@ class SheerkaEvaluateRules(BaseService):
else:
# do not forget to reset the 'is_evaluated' in the case of a concept
if compiled_condition.evaluator_type == ConceptEvaluator.NAME:
compiled_condition.concept.get_metadata().is_evaluated = False
for concept in compiled_condition.concepts_to_reset:
concept.get_metadata().is_evaluated = False
evaluator = self.evaluators_by_name[compiled_condition.evaluator_type]
res = evaluator.eval(context, compiled_condition.return_value)
if res.status and isinstance(res.body, bool) and res.body:
# one successful value found. No need to look any further
results = [res]
results = [res] # don't we care about the other failing results ?
break
else:
results.append(res)
debugger = context.get_debugger(SheerkaEvaluateRules.NAME, "evaluate_rule", new_debug_id=False)
debugger.debug_rule(rule, results)
return expect_one(context, results)
return results
def remove_from_rete_memory(self, lst):
if lst is None: