Source code for lodstorage.schema

"""
Created on 2021-01-26

@author: wf
"""
from collections import Counter


[docs] class SchemaManager( object, ): """ a manager for schemas """ def __init__(self, schemaDefs=None, baseUrl: str = None): """ constructor Args: schemaDefs(dict): a dictionary of schema names baseUrl(str): the base url to use for links """ self.baseUrl = baseUrl self.schemasByName = {} if schemaDefs is None: schemaDefs = {} for key, name in schemaDefs.items(): self.schemasByName[key] = Schema(key, name) pass
[docs] class Schema(object): """ a relational Schema """ def __init__(self, name: str, title: str): """ Constructor Args: name(str): the name of the schema title(str): the title of the schema """ self.name = name self.title = title self.propsByName = {}
[docs] @staticmethod def generalizeColumn(tableList, colName: str): """ remove the column with the given name from all tables in the tablelist and return it Args: tableList(list): a list of Tables colName(string): the name of the column to generalize Returns: string: the column having been generalized and removed """ gCol = None for table in tableList: for col in table["columns"]: if col["name"] == colName: gCol = col.copy() # no linking yet @FIXME - will need this later if "link" in gCol: gCol.pop("link") # is generalization protected for this column? if not "special" in col or not col["special"]: table["columns"].remove(col) return gCol
[docs] @staticmethod def getGeneral(tableList, name: str, debug: bool = False): """ derive a general table from the given table list Args: tableList(list): a list of tables name(str): name of the general table debug(bool): True if column names should be shown Returns: at table dict for the generalized table """ general = {"name": name, "columns": []} colCount = Counter() for table in tableList: for col in table["columns"]: columnId = "%s.%s" % (col["name"], col["type"]) if debug: print(columnId) colCount[columnId] += 1 for columnId, count in colCount.items(): if count == len(tableList): colName = columnId.split(".")[0] generalCol = Schema.generalizeColumn(tableList, colName) general["columns"].append(generalCol) return general
[docs] @staticmethod def getGeneralViewDDL(tableList, name: str, debug=False) -> str: """ get the DDL statement to create a general view Args: tableList: the list of tables name(str): the name of the view debug(bool): True if debug should be set """ general = Schema.getGeneral(tableList, name, debug) cols = "" delim = "" for col in general["columns"]: cols += "%s%s" % (delim, col["name"]) delim = "," ddl = "CREATE VIEW %s AS \n" % name delim = "" for table in tableList: ddl += "%s SELECT %s FROM %s" % (delim, cols, table["name"]) delim = "\nUNION\n" return ddl