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
@@ -118,6 +118,8 @@ class SheerkaConceptManager(BaseService):
self.sheerka.bind_service_method(self.set_id_if_needed, True)
self.sheerka.bind_service_method(self.set_attr, True)
self.sheerka.bind_service_method(self.get_attr, False)
self.sheerka.bind_service_method(self.set_property, True, as_name="set_prop")
self.sheerka.bind_service_method(self.get_property, False, as_name="get_prop")
self.sheerka.bind_service_method(self.get_by_key, False, visible=False)
self.sheerka.bind_service_method(self.get_by_name, False, visible=False)
self.sheerka.bind_service_method(self.get_by_hash, False, visible=False)
@@ -285,15 +287,15 @@ class SheerkaConceptManager(BaseService):
# to_add is a dictionary
# to_add = {
# 'meta' : {<key, value>} of metadata to update,
# 'props' : {<key, value>} of properties to add/update,
# 'variables': {<key, value>} of variables to add/update,
# 'meta' : {<key>: <value>} of metadata to update,
# 'props' : {<key>: <value>} of properties to add/update,
# 'variables': {<key>: <value>} of variables to add/update,
# }
# if the <key> already exists, the entry is updated, otherwise a new value is created
# for props, if the <key> already exists, a new entry is added to the set
#
# to_remove = {
# 'props' : {<key, [value]>} entries to remove. 'value' can be a list or a single entry
# 'props' : {<key>: [value]} entries to remove. 'value' can be a list or a single entry
# 'variables': [<key>] list of keys to remove
# }
#
@@ -401,7 +403,7 @@ class SheerkaConceptManager(BaseService):
if (old_value := concept.get_value(attr)) is not NotInit:
if old_value == value:
return self.sheerka.ret(self.NAME, True, self.sheerka.new(BuiltinConcepts.SUCCESS))
if isinstance(old_value, list):
old_value.append(value)
value = old_value
@@ -429,6 +431,49 @@ class SheerkaConceptManager(BaseService):
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#concept": concept, "#attr": attribute})
return value
def get_property(self, concept, prop):
"""
Returns the value of a concept property
:param concept:
:param prop:
:return:
"""
ensure_concept()
if not self.sheerka.is_success(concept):
return concept
if isinstance(prop, Concept) and prop.get_metadata().is_builtin:
prop = prop.key
if (value := concept.get_prop(prop)) is None:
return self.sheerka.new(BuiltinConcepts.NOT_FOUND, body={"#concept": concept, "#prop": prop})
return value
def set_property(self, context, concept, prop, value, all_concepts=False):
"""
Set the value of a concept property
The concept is modified
:param context:
:param concept:
:param prop:
:param value:
:param all_concepts: if True, updates the definitions of the concept
:return:
"""
ensure_concept()
if not self.sheerka.is_success(concept):
return concept
if isinstance(prop, Concept) and prop.get_metadata().is_builtin:
prop = prop.key
if all_concepts:
return self.modify_concept(context, concept, to_add={'props': {prop: value}}, modify_source=True)
else:
concept.set_prop(prop, value)
return self.sheerka.ret(self.NAME, True, self.sheerka.new(BuiltinConcepts.SUCCESS))
def set_id_if_needed(self, obj: Concept, is_builtin: bool):
"""
Set the key for the concept if needed
@@ -649,7 +694,7 @@ class SheerkaConceptManager(BaseService):
if "props" in to_add:
for k, v in to_add["props"].items():
concept.add_prop(k, v)
concept.set_prop(k, v)
if "variables" in to_add:
for k, v in to_add["variables"].items():