Resolved some remaining chicken and egg when parsing BNF nodes
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import core.utils
|
||||
from core.builtin_concepts import BuiltinConcepts, ErrorConcept
|
||||
from core.concept import Concept, DEFINITION_TYPE_DEF, ensure_concept
|
||||
from core.concept import Concept, DEFINITION_TYPE_DEF, ensure_concept, DEFINITION_TYPE_BNF
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
from sdp.sheerkaDataProvider import SheerkaDataProviderDuplicateKeyError
|
||||
|
||||
@@ -64,7 +64,6 @@ class SheerkaCreateNewConcept(BaseService):
|
||||
resolved_concepts_by_first_keyword = init_ret_value.body
|
||||
|
||||
# if everything is fine
|
||||
|
||||
concept.freeze_definition_hash()
|
||||
cache_manager.add_concept(concept)
|
||||
cache_manager.put(sheerka.CONCEPTS_BY_FIRST_KEYWORD_ENTRY, False, concepts_by_first_keyword)
|
||||
@@ -74,9 +73,36 @@ class SheerkaCreateNewConcept(BaseService):
|
||||
# allow search by definition when definition relevant
|
||||
cache_manager.put(self.sheerka.CONCEPTS_BY_NAME_ENTRY, concept.metadata.definition, concept)
|
||||
|
||||
# update references
|
||||
for ref in self.compute_references(concept):
|
||||
cache_manager.put(sheerka.CONCEPTS_REFERENCES, ref, concept.id)
|
||||
|
||||
# TODO : this line seems to be useless
|
||||
# The grammar is never reset
|
||||
if concept.bnf and init_bnf_ret_value is not None and init_bnf_ret_value.status:
|
||||
sheerka.cache_manager.clear(sheerka.CONCEPTS_GRAMMARS_ENTRY)
|
||||
|
||||
# process the return if needed
|
||||
ret = sheerka.ret(self.NAME, True, sheerka.new(BuiltinConcepts.NEW_CONCEPT, body=concept))
|
||||
return ret
|
||||
|
||||
def compute_references(self, concept):
|
||||
"""
|
||||
We need to keep a track of all concepts used by the current concept
|
||||
So that if one of these are modified, we can modify the current concept accordingly
|
||||
:param concept:
|
||||
:return:
|
||||
"""
|
||||
refs = set()
|
||||
|
||||
if concept.metadata.definition_type == DEFINITION_TYPE_BNF:
|
||||
from parsers.BnfNodeParser import BnfNodeConceptExpressionVisitor
|
||||
other_concepts_visitor = BnfNodeConceptExpressionVisitor()
|
||||
other_concepts_visitor.visit(concept.bnf)
|
||||
|
||||
for concept in other_concepts_visitor.references:
|
||||
if isinstance(concept, str):
|
||||
concept = self.sheerka.get_by_key(concept)
|
||||
refs.add(concept.id)
|
||||
|
||||
return refs
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
from parsers.BnfParser import BnfParser
|
||||
|
||||
|
||||
class SheerkaModifyConcept(BaseService):
|
||||
@@ -36,6 +37,10 @@ class SheerkaModifyConcept(BaseService):
|
||||
BuiltinConcepts.CONCEPT_ALREADY_DEFINED,
|
||||
body=concept))
|
||||
|
||||
old_references = self.sheerka.cache_manager.get(self.sheerka.CONCEPTS_REFERENCES, concept.id)
|
||||
if old_references:
|
||||
old_references = old_references.copy()
|
||||
|
||||
self.sheerka.cache_manager.update_concept(old_version, concept)
|
||||
|
||||
# TODO : update concept by first keyword
|
||||
@@ -45,3 +50,21 @@ class SheerkaModifyConcept(BaseService):
|
||||
|
||||
ret = self.sheerka.ret(self.NAME, True, self.sheerka.new(BuiltinConcepts.NEW_CONCEPT, body=concept))
|
||||
return ret
|
||||
|
||||
def update_references(self, context, concept):
|
||||
"""
|
||||
Updates all the concepts that reference concept
|
||||
:param context:
|
||||
:param concept:
|
||||
:return:
|
||||
"""
|
||||
|
||||
refs = self.sheerka.cache_manager.get(self.sheerka.CONCEPTS_REFERENCES, concept.id)
|
||||
if not refs:
|
||||
return
|
||||
|
||||
for concept_id in refs:
|
||||
concept = self.sheerka.get_by_id(concept_id)
|
||||
|
||||
if concept.bnf is not None:
|
||||
BnfParser.update_recurse_id(context, concept_id, concept.bnf)
|
||||
|
||||
@@ -4,6 +4,7 @@ from cache.SetCache import SetCache
|
||||
from core.ast.nodes import python_to_concept
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.concept import Concept, ConceptParts, ensure_concept, DEFINITION_TYPE_BNF
|
||||
from core.sheerka.services.SheerkaModifyConcept import SheerkaModifyConcept
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
|
||||
GROUP_PREFIX = 'All_'
|
||||
@@ -54,7 +55,13 @@ class SheerkaSetsManager(BaseService):
|
||||
if not res.status:
|
||||
return res
|
||||
|
||||
return self.add_concept_to_set(context, concept, concept_set)
|
||||
res = self.add_concept_to_set(context, concept, concept_set)
|
||||
|
||||
# update concept_set references
|
||||
self.sheerka.services[SheerkaModifyConcept.NAME].update_references(context, concept_set)
|
||||
self.concepts_in_set.delete(concept_set.id)
|
||||
|
||||
return res
|
||||
|
||||
def add_concept_to_set(self, context, concept, concept_set):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user