bottom.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from state.base import INTEGER, FLOAT, BOOLEAN, STRING, TYPE, State
  2. from core.element import Element, String
  3. class Bottom:
  4. def __init__(self, state: State):
  5. self.state = state
  6. def create_model(self, name: String) -> Element:
  7. bottom = self.state.create_nodevalue(name.value)
  8. self.state.create_dict(bottom, "Model", self.state.create_node())
  9. return Element(id=bottom)
  10. def add_node(self, model: Element, name: String):
  11. model_root = self.state.read_dict(model.id, "Model")
  12. # create model element
  13. element = self.state.create_node()
  14. # connect to model root
  15. self.state.create_dict(model_root, name.value, element)
  16. # confirm that element has been added to the model
  17. element = self.state.read_dict(model_root, name.value)
  18. if element is None:
  19. self.state.delete_node(element)
  20. print(f"Warning: Invalid name {name.value}, element not created.")
  21. return
  22. def add_value(self, model: Element, name: String, value: Element):
  23. model_root = self.state.read_dict(model.id, "Model")
  24. # create model element
  25. element = self.state.create_nodevalue(value.value)
  26. if element is None:
  27. print("Warning: Invalid value, value node not created.")
  28. return
  29. # connect to model root
  30. self.state.create_dict(model_root, name.value, element)
  31. # confirm that element has been added to the model
  32. element_found = self.state.read_dict(model_root, name.value)
  33. if element_found is None:
  34. self.state.delete_node(element)
  35. print(f"Warning: Invalid name {name.value}, element not created.")
  36. return
  37. def add_edge(self, model: Element, name: String, source: String, target: String):
  38. model_root = self.state.read_dict(model.id, "Model")
  39. source_element = self.state.read_dict(model_root, source.value)
  40. if source_element is None:
  41. print(f"Warning: Unknown source element {source.value}, edge not created.")
  42. return
  43. target_element = self.state.read_dict(model_root, target.value)
  44. if target_element is None:
  45. print(f"Warning: Unknown target element {target.value}, edge not created.")
  46. return
  47. # create model element
  48. element = self.state.create_edge(source_element, target_element)
  49. # connect to model root
  50. self.state.create_dict(model_root, name.value, element)
  51. # confirm that element has been added to the model
  52. element = self.state.read_dict(model_root, name.value)
  53. if element is None:
  54. self.state.delete_edge(element)
  55. print(f"Warning: Invalid name {name.value}, element not created.")
  56. def delete_element(self, model: Element, name: String):
  57. model_root = self.state.read_dict(model.id, "Model")
  58. element = self.state.read_dict(model_root, name.value)
  59. # could be both a node or an edge
  60. self.state.delete_node(element)
  61. self.state.delete_edge(element)
  62. def list_elements(self, model: Element):
  63. def is_edge(elem: Element) -> bool:
  64. edge = self.state.read_edge(elem.id)
  65. return edge is not None
  66. def value_type(value) -> str:
  67. map = {
  68. int: INTEGER,
  69. float: FLOAT,
  70. str: STRING,
  71. bool: BOOLEAN,
  72. tuple: TYPE
  73. }
  74. return map[type(value)][0]
  75. unsorted = []
  76. model_root = self.state.read_dict(model.id, "Model")
  77. for elem_edge in self.state.read_outgoing(model_root):
  78. # get element name
  79. label_edge, = self.state.read_outgoing(elem_edge)
  80. _, label_node = self.state.read_edge(label_edge)
  81. label = self.state.read_value(label_node)
  82. # find element bottom type
  83. _, elem = self.state.read_edge(elem_edge)
  84. if is_edge(elem):
  85. bottom_type = "Edge"
  86. else:
  87. # is_node
  88. elem_value = self.state.read_value(elem)
  89. if elem_value is None:
  90. bottom_type = "Node"
  91. else:
  92. bottom_type = value_type
  93. unsorted.append(f"{label} : {bottom_type}")
  94. for i in sorted(unsorted):
  95. print(i)