# -*- coding: utf-8 -*- from typing import Optional, List, Any from .ColumnSet import ColumnSet from .SingleForeignKey import SingleForeignKey class CompositeForeignKey: # export def __init__(self, child_col_set: ColumnSet, parent_col_set: ColumnSet): # TODO: Implement alternative ways to construct def __table(s): ret = None for c in s: if ret is None: ret = c.table else: assert(ret == c.table) assert(ret is not None) return ret self.__child_col_set = child_col_set self.__parent_col_set = parent_col_set self.__child_table = __table(child_col_set) self.__parent_table = __table(parent_col_set) assert(len(self.__child_col_set) == len(self.__parent_col_set)) self.__len = len(self.__child_col_set) self.__column_relations: Optional[List[SingleForeignKey]] = None def __table_rel_str(self): return f'{self.__child_table.name} => {self.__parent_table.name}' def __cols_rel_str(self, child, parent): return f'{child.name} -> {parent.name}' def __len__(self): return self.__len def __iter__(self): yield from self.column_relations def __repr__(self): ret = self.__table_rel_str() ret += '|| ' + ' | '.join([self.__cols_rel_str(rel.child_col, rel.parent_col) for rel in self.column_relations]) return ret def __eq__(self, rhs): if rhs.__child_col_set != self.__child_col_set: return False if rhs.__parent_col_set != self.__parent_col_set: return False return True @property def child_table(self) -> Any: return self.__child_table @property def parent_table(self) -> Any: return self.__parent_table @property def child_columns(self) -> ColumnSet: return self.__child_col_set @property def parent_columns(self) -> ColumnSet: return self.__parent_col_set @property def column_relations(self) -> List[Any]: ret = [] if self.__column_relations is None: for i in range(0, self.__len): ret.append(SingleForeignKey(self.__child_col_set[i], self.__parent_col_set[i])) self.__column_relations = ret return self.__column_relations