Skip to content

Commit

Permalink
Merge pull request #14 from olivierdalang/deterministic_column_order
Browse files Browse the repository at this point in the history
Deterministic column order
  • Loading branch information
olivierdalang authored Jun 1, 2021
2 parents 20103ba + 7f9a29f commit 3c6368d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 16 deletions.
31 changes: 19 additions & 12 deletions pirogue/multiple_inheritance.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ def __view(self) -> str:
:return:
"""

sorted_joins = sorted(self.joins.items())

sql = """
CREATE OR REPLACE VIEW {vs}.{vn} AS
SELECT
Expand All @@ -219,7 +221,7 @@ def __view(self) -> str:
types='\n '.join(["WHEN {shal}.{mrf} IS NOT NULL THEN '{al}'::{vs}.{tn}"
.format(shal=table_def['short_alias'], mrf=table_def['ref_master_key'],
al=alias, vs=self.view_schema, tn=self.type_name)
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
no_subtype="'{type}'::{vs}.{tn}".format(type=self.view_alias if self.allow_parent_only else 'unknown',
vs=self.view_schema, tn=self.type_name),
type_name=self.type_name,
Expand All @@ -239,7 +241,7 @@ def __view(self) -> str:
.format(ta=table_def['short_alias'],
rmk=table_def['ref_master_key'],
col=col)
for alias, table_def in self.joins.items()
for alias, table_def in sorted_joins
if col in columns(self.cursor, table_def['table_schema'], table_def['table_name'], skip_columns=table_def.get('skip_columns', []))]),
cast=self.merge_column_cast.get(col, '')
)
Expand All @@ -253,19 +255,19 @@ def __view(self) -> str:
remap_columns=table_def.get('remap_columns', {}),
indent=4,
separate_first=True)
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
additional_columns=''.join([',\n {cdef} AS {alias}'.format(cdef=cdef,alias=alias)
for alias, cdef in self.additional_columns.items()]),
mt=self.master_schema,
ms=self.master_table,
sa=self.short_alias,
joined_tables='\n '.join(["LEFT JOIN {tbl} {tal} ON {tal}.{rmk} = {msa}.{mpk}"
.format(tbl=table_def['table'],
tal=table_def['short_alias'],
rmk=table_def['ref_master_key'],
.format(tbl=table_def[1]['table'],
tal=table_def[1]['short_alias'],
rmk=table_def[1]['ref_master_key'],
msa=self.short_alias,
mpk=self.master_pkey)
for table_def in self.joins.values()]),
for table_def in sorted_joins]),
additional_joins='\n {ad}'.format(ad=self.additional_joins) if self.additional_joins else ''
)
return sql
Expand All @@ -275,6 +277,9 @@ def __insert_trigger(self) -> str:
:return:
"""

sorted_joins = sorted(self.joins.items())

sql = """-- INSERT TRIGGER
CREATE OR REPLACE FUNCTION {vs}.ft_{vn}_insert() RETURNS trigger AS
$BODY$
Expand Down Expand Up @@ -328,7 +333,7 @@ def __insert_trigger(self) -> str:
remap_columns=table_def.get('remap_columns', {}),
remove_pkey=False,
indent=4))
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
raise_notice='NULL;' if self.allow_parent_only else "RAISE NOTICE '{vn} type not known ({percent_char})', NEW.{type_name}; -- ERROR"
.format(vn=self.view_name,
percent_char='%%' if self.variables else '%', # if variables, % should be escaped because cursor.execute is run with variables
Expand All @@ -338,6 +343,7 @@ def __insert_trigger(self) -> str:


def __update_trigger(self):
sorted_joins = sorted(self.joins.items())
sql = """-- UPDATE TRIGGER
CREATE OR REPLACE FUNCTION {vs}.ft_{vn}_update() RETURNS trigger AS
$BODY$
Expand Down Expand Up @@ -398,7 +404,7 @@ def __update_trigger(self):
tn=table_def['table_name'],
rmk=table_def['ref_master_key'],
mpk=self.master_pkey)
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
inserts='\n '.join(["WHEN NEW.{type_name} = '{alias}'::{vs}.{type_name} "
"THEN INSERT INTO {ts}.{tn} "
"({rmk}) VALUES (OLD.{mpk});"
Expand All @@ -409,7 +415,7 @@ def __update_trigger(self):
tn=table_def['table_name'],
rmk=table_def['ref_master_key'],
mpk=self.master_pkey)
for alias, table_def in self.joins.items()])),
for alias, table_def in sorted_joins])),
update_joins='\n '.join(["WHEN NEW.{type_name} = '{alias}'::{vs}.{type_name} THEN"
"\n {update_join}".format(type_name=self.type_name,
alias=alias,
Expand All @@ -423,7 +429,7 @@ def __update_trigger(self):
update_values={**{table_def['pkey']: 'OLD.{c}'.format(c=self.master_pkey)},
**table_def.get('update_values', {})},
indent=4))
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
raise_notice='NULL;' if self.allow_parent_only
else "RAISE NOTICE '{vn} type not known ({percent_char})', NEW.{type_name}; -- ERROR"
.format(vn=self.view_name,
Expand All @@ -433,6 +439,7 @@ def __update_trigger(self):
return sql

def __delete_trigger(self):
sorted_joins = sorted(self.joins.items())
sql = """
CREATE OR REPLACE FUNCTION {vs}.ft_{vn}_delete() RETURNS trigger AS
$BODY$
Expand Down Expand Up @@ -462,7 +469,7 @@ def __delete_trigger(self):
tn=table_def['table_name'],
rmk=table_def['ref_master_key'],
mpk=self.master_pkey)
for alias, table_def in self.joins.items()]),
for alias, table_def in sorted_joins]),
ts=self.master_schema,
tn=self.master_table,
mpk=self.master_pkey,
Expand Down
11 changes: 7 additions & 4 deletions pirogue/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -410,13 +410,16 @@ def __column_alias(column: str,
return col_alias


def __column_priority(column: str, columns_on_top: list=[], columns_at_end: list=[]) -> int:
def __column_priority(column: str, columns_on_top: list=[], columns_at_end: list=[]):
"""
Returns a value to sort columns first by priority (on top / at end), then alphabetically
"""
if column in columns_on_top:
return 0
return [0, column]
elif column in columns_at_end:
return 2
return [2, column]
else:
return 1
return [1, column]


def __print_comma(next_comma_printed: list, is_skipped: bool) -> bool:
Expand Down

0 comments on commit 3c6368d

Please sign in to comment.