RAMification + pattern matching: put typing information straight into the Vertices, as a Python attribute (don't put it in separate Vertices+Edges).
This commit is contained in:
parent
700a4d103f
commit
ae5eaedb4b
8 changed files with 284 additions and 129 deletions
|
|
@ -4,6 +4,9 @@ from services.bottom.V0 import Bottom
|
|||
from services.primitives.integer_type import Integer
|
||||
from services.primitives.string_type import String
|
||||
|
||||
def get_attr_link_name(class_name: str, attr_name: str):
|
||||
return f"{class_name}_{attr_name}"
|
||||
|
||||
# Object Diagrams service
|
||||
|
||||
class OD:
|
||||
|
|
@ -47,6 +50,9 @@ class OD:
|
|||
|
||||
def get_class_of_object(self, object_name: str):
|
||||
object_node, = self.bottom.read_outgoing_elements(self.model, object_name) # get the object
|
||||
return self._get_class_of_object(object_node)
|
||||
|
||||
def _get_class_of_object(self, object_node: UUID):
|
||||
type_el, = self.bottom.read_outgoing_elements(object_node, "Morphism")
|
||||
for key in self.bottom.read_keys(self.type_model):
|
||||
type_el2, = self.bottom.read_outgoing_elements(self.type_model, key)
|
||||
|
|
@ -55,10 +61,22 @@ class OD:
|
|||
|
||||
def create_slot(self, attr_name: str, object_name: str, target_name: str):
|
||||
class_name = self.get_class_of_object(object_name)
|
||||
attr_link_name = f"{class_name}_{attr_name}"
|
||||
attr_link_name = get_attr_link_name(class_name, attr_name)
|
||||
# An attribute-link is indistinguishable from an ordinary link:
|
||||
return self.create_link(attr_link_name, object_name, target_name)
|
||||
|
||||
def get_slot(self, object_node: UUID, attr_name: str):
|
||||
# I really don't like how complex and inefficient it is to read an attribute of an object...
|
||||
class_name = self._get_class_of_object(object_node)
|
||||
attr_link_name = get_attr_link_name(class_name, attr_name)
|
||||
print(attr_link_name)
|
||||
type_edge, = self.bottom.read_outgoing_elements(self.type_model, attr_link_name)
|
||||
for outgoing_edge in self.bottom.read_outgoing_edges(object_node):
|
||||
if type_edge in self.bottom.read_outgoing_elements(outgoing_edge, "Morphism"):
|
||||
slot_ref = self.bottom.read_edge_target(outgoing_edge)
|
||||
slot_node = UUID(self.bottom.read_value(slot_ref))
|
||||
return slot_node
|
||||
|
||||
def create_integer_value(self, name: str, value: int):
|
||||
from services.primitives.integer_type import Integer
|
||||
int_node = self.bottom.create_node()
|
||||
|
|
@ -84,16 +102,15 @@ class OD:
|
|||
# create element + morphism links
|
||||
element_node = self.bottom.create_node(str(model)) # create element node
|
||||
self.bottom.create_edge(self.model, element_node, name) # attach to model
|
||||
scd_node, = self.bottom.read_outgoing_elements(self.type_model, type_name) # retrieve type
|
||||
self.bottom.create_edge(element_node, scd_node, "Morphism") # create morphism link
|
||||
type_node, = self.bottom.read_outgoing_elements(self.type_model, type_name) # retrieve type
|
||||
self.bottom.create_edge(element_node, type_node, "Morphism") # create morphism link
|
||||
|
||||
|
||||
def create_link(self, assoc_name: str, src_obj_name: str, tgt_obj_name: str):
|
||||
print(tgt_obj_name)
|
||||
src_obj_node, = self.bottom.read_outgoing_elements(self.model, src_obj_name)
|
||||
tgt_obj_node, = self.bottom.read_outgoing_elements(self.model, tgt_obj_name)
|
||||
|
||||
link_edge = self.bottom.create_edge(src_obj_node, tgt_obj_node);
|
||||
link_edge = self.bottom.create_edge(src_obj_node, tgt_obj_node)
|
||||
|
||||
# generate a unique name for the link
|
||||
i = 0;
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ class Integer:
|
|||
self.type_model = UUID(self.bottom.read_value(type_model_id_node))
|
||||
|
||||
def create(self, value: int):
|
||||
# delete existing integer, if there is one
|
||||
if "string" in self.bottom.read_keys(self.model):
|
||||
instance, = self.bottom.read_outgoing_elements(self.model, "integer")
|
||||
self.bottom.delete_element(instance)
|
||||
|
|
@ -18,3 +19,7 @@ class Integer:
|
|||
self.bottom.create_edge(self.model, _instance, "integer")
|
||||
_type, = self.bottom.read_outgoing_elements(self.type_model, "Integer")
|
||||
self.bottom.create_edge(_instance, _type, "Morphism")
|
||||
|
||||
def read(self):
|
||||
instance, = self.bottom.read_outgoing_elements(self.model, "integer")
|
||||
return self.bottom.read_value(instance)
|
||||
|
|
@ -330,10 +330,12 @@ class SCD:
|
|||
attr_link_node, = self.bottom.read_outgoing_elements(self.scd_model, "AttributeLink")
|
||||
class_node, = self.bottom.read_outgoing_elements(self.model, class_name)
|
||||
name_to_attr = {}
|
||||
for edge in self.bottom.read_outgoing_edges(class_node):
|
||||
edge_types = self.bottom.read_outgoing_elements(edge, "Morphism")
|
||||
if attr_link_node in edge_types:
|
||||
name_to_attr[key] = edge
|
||||
for name in self.bottom.read_keys(class_node):
|
||||
edges = self.bottom.read_outgoing_edges(class_node, name)
|
||||
for edge in edges:
|
||||
edge_types = self.bottom.read_outgoing_elements(edge, "Morphism")
|
||||
if attr_link_node in edge_types:
|
||||
name_to_attr[name] = edge
|
||||
return name_to_attr
|
||||
|
||||
def delete_element(self, name: str):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue