80 lines
3.4 KiB
Python
80 lines
3.4 KiB
Python
from DataVaultGenerator.Components import DataVaultEntity, DataVaultEntityAttribute, ErrorCollection
|
|
|
|
|
|
class Link(DataVaultEntity):
|
|
|
|
def __init__(self, model, filename, definition: dict = None):
|
|
DataVaultEntity.__init__(self, model, filename, definition)
|
|
|
|
self.drivingkeys = self._definition.get('drivingkeys',[])
|
|
key = DataVaultEntityAttribute(self, self.model.config.datavault.keyattribute)
|
|
key.name = self.key_columnname
|
|
self.add_attribute(key)
|
|
|
|
def get_drivingkey_entities(self):
|
|
return [self.model.get_entity(d) for d in self.drivingkeys]
|
|
|
|
def get_foreign_attribute(self, name: str):
|
|
for e in self._definition['hubs']:
|
|
if self.model.get_entity(e).key_attribute.name == name:
|
|
return self.model.get_entity(e).key_attribute
|
|
|
|
def get_foreign_attributes(self):
|
|
fa = []
|
|
for e in self._definition['hubs']:
|
|
fa.append(DataVaultEntityAttribute(self, definition=dict(name=self.model.get_entity(e).key_attribute.name,
|
|
datatype=self.model.get_entity(e).key_attribute.datatype,
|
|
role='fk')
|
|
))
|
|
return fa
|
|
|
|
@property
|
|
def key_columnname(self):
|
|
"""returns name of the primary Key Attribute. If no name was defined in its definition, a template applies."""
|
|
return self._definition.get('key', self.model.basetemplates.get('entity_key_name').render(entity=self))
|
|
|
|
@property
|
|
def key_attribute(self):
|
|
return self.get_role_attribute(self.model.config.datavault.keyattribute.get('role','sk'))
|
|
|
|
def get_linked_entities(self):
|
|
"""returns a list of linked entities."""
|
|
return [self.model.get_entity(le) for le in self._definition['hubs'] + self._definition.get('links',[])]
|
|
|
|
def get_satellites(self):
|
|
return [e for e in self.model.get_entities_by_type('satellite') if e.get_parent_entity() == self]
|
|
|
|
def validate(self):
|
|
|
|
errors = ErrorCollection()
|
|
|
|
for attr in self.attributes.values():
|
|
spec = self.layer.sys_specification
|
|
errors.append(attr.validate(spec))
|
|
|
|
# Validating entity references:
|
|
for name in self._definition['hubs']:
|
|
if self.model.get_entity(name) is None:
|
|
suggest = self.model.get_entity_name_suggestion('hub', name)
|
|
suggest = f'Do you mean <{suggest}>?' if suggest else ''
|
|
errors.add("VALIDATION ERROR",
|
|
(self.filename,"Link", "<" + self.name + ">"),
|
|
f'Hub <{name}> not found. ' + suggest)
|
|
|
|
|
|
|
|
# Validating entity references:
|
|
for name in self._definition.get('links',[]):
|
|
if self.model.get_entity(name) is None:
|
|
suggest = self.model.get_entity_name_suggestion('link', name)
|
|
suggest = f'Do you mean <{suggest}>?' if suggest else ''
|
|
errors.add("VALIDATION ERROR",
|
|
(self.filename,"Link", "<" + self.name + ">"),
|
|
f'Link <{name}> not found. ' + suggest)
|
|
|
|
return errors
|
|
|
|
def get_component_entities(self):
|
|
return [{'entity': self, 'component': c, 'type': c.type} for c in
|
|
self.get_source_entities().values()] # holt derzeit nur die Deliveries über die Mappings
|