V0.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from services.base import Service, UUID
  2. from state.base import State
  3. from typing import Any, List
  4. class Bottom(Service):
  5. def __init__(self, model: UUID, state: State):
  6. super().__init__(model)
  7. self.state = state
  8. def create_node(self, value=None) -> UUID:
  9. if value is None:
  10. return self.state.create_node()
  11. else:
  12. return self.state.create_nodevalue(value)
  13. def create_edge(self, source: UUID, target: UUID, label=None):
  14. pass
  15. def read_model_root(self) -> UUID:
  16. return self.model
  17. def read_value(self, node: UUID) -> Any:
  18. return self.state.read_value(node)
  19. def read_edge_source(self, edge: UUID) -> UUID:
  20. result = self.state.read_edge(edge)
  21. return result[0] if result is not None else result
  22. def read_edge_target(self, edge: UUID) -> UUID:
  23. result = self.state.read_edge(edge)
  24. return result[1] if result is not None else result
  25. def read_incoming_edges(self, target: UUID, label=None) -> List[UUID]:
  26. def read_label(_edge: UUID):
  27. try:
  28. label_edge, = self.state.read_outgoing(_edge)
  29. _, tgt = self.state.read_edge(label_edge)
  30. _label = self.state.read_value(tgt)
  31. return _label
  32. except (TypeError, ValueError):
  33. return None
  34. edges = self.state.read_incoming(target)
  35. if edges is None:
  36. return []
  37. if label is not None:
  38. edges = [e for e in edges if read_label(e) == label]
  39. return edges
  40. def read_outgoing_edges(self, source: UUID, label=None) -> List[UUID]:
  41. def read_label(_edge: UUID):
  42. try:
  43. label_edge, = self.state.read_outgoing(_edge)
  44. _, tgt = self.state.read_edge(label_edge)
  45. _label = self.state.read_value(tgt)
  46. return _label
  47. except (TypeError, ValueError):
  48. return None
  49. edges = self.state.read_outgoing(source)
  50. if edges is None:
  51. return []
  52. if label is not None:
  53. edges = [e for e in edges if read_label(e) == label]
  54. return edges
  55. def read_keys(self, element: UUID) -> List[str]:
  56. key_nodes = self.state.read_dict_keys(element)
  57. unique_keys = {self.state.read_value(node) for node in key_nodes}
  58. return list(unique_keys)
  59. def delete_element(self, element: UUID):
  60. src, tgt = self.state.read_edge(element)
  61. if src is None and tgt is None:
  62. # node
  63. self.state.delete_node(element)
  64. else:
  65. # edge
  66. self.state.delete_edge(element)