Simplified bottom context

This commit is contained in:
Andrei Bondarenko 2021-07-17 15:58:05 +02:00
parent 8382d7bfc4
commit 249a07894a

View file

@ -2,30 +2,32 @@ from state.base import INTEGER, FLOAT, BOOLEAN, STRING, TYPE, State
from core.element import Element, String from core.element import Element, String
class Bottom: class BottomContext:
def __init__(self, state: State): def __init__(self, state: State, model: Element):
self.state = state self.state = state
self.model = model
def create_model(self, name: String) -> Element: def __enter__(self):
bottom = self.state.create_nodevalue(name.value) return self
self.state.create_dict(bottom, "Model", self.state.create_node())
return Element(id=bottom)
def add_node(self, model: Element, name: String): def __exit__(self):
model_root = self.state.read_dict(model.id, "Model") pass
def add_node(self, name: String):
model_root = self.state.read_dict(self.model.id, "Model")
# create model element # create model element
element = self.state.create_node() element = self.state.create_node()
# connect to model root # connect to model root
self.state.create_dict(model_root, name.value, element) self.state.create_dict(model_root, name.value, element)
# confirm that element has been added to the model # confirm that element has been added to the model
element = self.state.read_dict(model_root, name.value) element_found = self.state.read_dict(model_root, name.value)
if element is None: if element_found is None:
self.state.delete_node(element) self.state.delete_node(element)
print(f"Warning: Invalid name {name.value}, element not created.") print(f"Warning: Invalid name {name.value}, element not created.")
return return
def add_value(self, model: Element, name: String, value: Element): def add_value(self, name: String, value: Element):
model_root = self.state.read_dict(model.id, "Model") model_root = self.state.read_dict(self.model.id, "Model")
# create model element # create model element
element = self.state.create_nodevalue(value.value) element = self.state.create_nodevalue(value.value)
if element is None: if element is None:
@ -40,8 +42,8 @@ class Bottom:
print(f"Warning: Invalid name {name.value}, element not created.") print(f"Warning: Invalid name {name.value}, element not created.")
return return
def add_edge(self, model: Element, name: String, source: String, target: String): def add_edge(self, name: String, source: String, target: String):
model_root = self.state.read_dict(model.id, "Model") model_root = self.state.read_dict(self.model.id, "Model")
source_element = self.state.read_dict(model_root, source.value) source_element = self.state.read_dict(model_root, source.value)
if source_element is None: if source_element is None:
print(f"Warning: Unknown source element {source.value}, edge not created.") print(f"Warning: Unknown source element {source.value}, edge not created.")
@ -55,34 +57,35 @@ class Bottom:
# connect to model root # connect to model root
self.state.create_dict(model_root, name.value, element) self.state.create_dict(model_root, name.value, element)
# confirm that element has been added to the model # confirm that element has been added to the model
element = self.state.read_dict(model_root, name.value) element_found = self.state.read_dict(model_root, name.value)
if element is None: if element_found is None:
self.state.delete_edge(element) self.state.delete_edge(element)
print(f"Warning: Invalid name {name.value}, element not created.") print(f"Warning: Invalid name {name.value}, element not created.")
def delete_element(self, model: Element, name: String): def delete_element(self, name: String):
model_root = self.state.read_dict(model.id, "Model") model_root = self.state.read_dict(self.model.id, "Model")
element = self.state.read_dict(model_root, name.value) element = self.state.read_dict(model_root, name.value)
# could be both a node or an edge # could be both a node or an edge
self.state.delete_node(element) self.state.delete_node(element)
self.state.delete_edge(element) self.state.delete_edge(element)
def list_elements(self, model: Element): def list_elements(self):
def is_edge(elem: Element) -> bool: def is_edge(element: str) -> bool:
edge = self.state.read_edge(elem.id) edge = self.state.read_edge(element)
return edge is not None return edge is not None
def value_type(value) -> str: def value_type(value) -> str:
map = { mapping = {
int: INTEGER, int: INTEGER,
float: FLOAT, float: FLOAT,
str: STRING, str: STRING,
bool: BOOLEAN, bool: BOOLEAN,
tuple: TYPE tuple: TYPE
} }
return map[type(value)][0] return mapping[type(value)][0]
unsorted = [] unsorted = []
model_root = self.state.read_dict(model.id, "Model") model_root = self.state.read_dict(self.model.id, "Model")
for elem_edge in self.state.read_outgoing(model_root): for elem_edge in self.state.read_outgoing(model_root):
# get element name # get element name
label_edge, = self.state.read_outgoing(elem_edge) label_edge, = self.state.read_outgoing(elem_edge)