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