Fixed #48 : RelationalExpressionParser: Implement relational operator parser

Fixed #49 : ExpressionParser: Implement ExpressionParser
Fixed #50 : Implement ReteConditionExprVisitor
Fixed #51 : Implement PythonConditionExprVisitor
Fixed #52 : SheerkaConceptManager: I can get and set concept property
This commit is contained in:
2021-03-23 11:35:10 +01:00
parent f8e47e2b38
commit 6cda2686fb
25 changed files with 1083 additions and 978 deletions
@@ -85,7 +85,7 @@ class SheerkaEvaluateRules(BaseService):
results.setdefault(LOW_PRIORITY_RULES, []).append(rule)
continue
res = self.evaluate_rule_old(sub_context, rule, bag)
res = self.evaluate_rule(sub_context, rule, bag)
ok = res.status and self.sheerka.is_success(self.sheerka.objvalue(res))
results.setdefault(ok, []).append(rule)
if ok and success_priority is None:
@@ -96,42 +96,6 @@ class SheerkaEvaluateRules(BaseService):
sub_context.add_values(rules_result=results)
return results
def evaluate_rule_old(self, context, rule, bag):
"""
Evaluate the conditions
:param context:
:param rule:
:param bag:
:return:
"""
results = []
for rule_predicate in rule.compiled_predicates:
if rule_predicate.source in bag:
# simple case where the rule is an item of the bag. No need of complicate evaluation
results.append(context.sheerka.ret(self.NAME, True, bag[rule_predicate.source]))
else:
# do not forget to reset the 'is_evaluated' in the case of a concept
if rule_predicate.evaluator == ConceptEvaluator.NAME:
rule_predicate.concept.get_metadata().is_evaluated = False
evaluator = self.evaluators_by_name[rule_predicate.evaluator]
res = evaluator.eval(context, rule_predicate.predicate)
if res.status and isinstance(res.body, bool) and res.body:
# one successful value found. No need to look any further
results = [res]
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)
def evaluate_rule(self, context, rule, bag):
"""
Evaluate the conditions
@@ -149,6 +113,9 @@ class SheerkaEvaluateRules(BaseService):
if compiled_condition.variables.intersection(bag_variables) != compiled_condition.variables:
continue
if compiled_condition.not_variables.intersection(bag_variables):
continue
if compiled_condition.return_value is None:
# We only want to test the existence of a data
results.append(context.sheerka.ret(self.NAME, True, True))