Skip to content

Commit ec857e7

Browse files
authored
Merge pull request #883 from khoatxp/create-db-report/refactor-java-style-code
eda.create-db-report: restructure create_db_report and clean java style code
2 parents 5e50232 + 015952b commit ec857e7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+883
-1008
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
from .table import Table
2+
3+
4+
class ForeignKeyConstraint:
5+
imported_key_cascade = 0
6+
imported_key_restrict = 1
7+
imported_key_set_null = 2
8+
imported_key_no_action = 3
9+
10+
def __init__(self, child: Table, name: str, delete_rule: str, update_rule: int):
11+
self.name = name
12+
self.child_table = child
13+
self.delete_rule = delete_rule
14+
self.update_rule = update_rule
15+
self.parent_columns = []
16+
self.child_columns = []
17+
self.parent_table = None
18+
19+
def add_parent_column(self, column):
20+
if column is not None:
21+
self.parent_columns.append(column)
22+
self.parent_table = column.table
23+
24+
def add_child_column(self, column):
25+
if column is not None:
26+
self.child_columns.append(column)
27+
28+
def is_cascade_on_delete(self):
29+
return self.delete_rule == self.imported_key_cascade
30+
31+
def is_restrict_delete(self):
32+
return (
33+
self.delete_rule == self.imported_key_no_action
34+
or self.delete_rule == self.imported_key_restrict
35+
)
36+
37+
def is_null_on_delete(self):
38+
return self.delete_rule == self.imported_key_set_null
39+
40+
def get_delete_rule_name(self):
41+
if self.delete_rule == self.imported_key_cascade:
42+
return "Cascade on delete"
43+
elif (
44+
self.delete_rule == self.imported_key_restrict
45+
or self.delete_rule == self.imported_key_no_action
46+
):
47+
return "Restrict delete"
48+
elif self.delete_rule == self.imported_key_set_null:
49+
return "Null on delete"
50+
else:
51+
return ""
52+
53+
def get_delete_rule_description(self):
54+
if self.delete_rule == self.imported_key_cascade:
55+
return "Cascade on delete:\nDeletion of parent deletes child"
56+
elif (
57+
self.delete_rule == self.imported_key_restrict
58+
or self.delete_rule == self.imported_key_no_action
59+
):
60+
return "Restrict delete:\nParent cannot be deleted if children exist"
61+
elif self.delete_rule == self.imported_key_set_null:
62+
return "Null on delete:\nForeign key to parent set to NULL when parent deleted"
63+
else:
64+
return ""
65+
66+
def get_delete_rule_alias(self):
67+
if self.delete_rule == self.imported_key_cascade:
68+
return "C"
69+
elif (
70+
self.delete_rule == self.imported_key_restrict
71+
or self.delete_rule == self.imported_key_no_action
72+
):
73+
return "R"
74+
elif self.delete_rule == self.imported_key_set_null:
75+
return "N"
76+
else:
77+
return ""
78+
79+
@staticmethod
80+
def get_all_foreign_key_constraints(tables):
81+
constraints = []
82+
83+
for table in tables:
84+
constraints.extend(table.get_foreign_keys())
85+
86+
return constraints
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from .db_meta import DbMeta
2+
3+
4+
class Database:
5+
def __init__(self, name: str, schema: str, stats: DbMeta) -> None:
6+
self.name = name
7+
self.schema = schema
8+
self.tables = {}
9+
self.views = {}
10+
for key, value in stats.__dict__.items():
11+
if not hasattr(self, key):
12+
setattr(self, key, value)
13+
14+
def add_table(self, table_name: str, table_object):
15+
self.tables[table_name] = table_object
16+
17+
def add_view(self, view_name: str, view_object):
18+
self.views[view_name] = view_object
19+
20+
def get_tables(self):
21+
return self.tables.values()
22+
23+
def get_views(self):
24+
return self.views.values()

dataprep/eda/create_db_report/model/db_metadata.py renamed to dataprep/eda/create_db_report/db_models/db_meta.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ def __init__(
2929
self.num_of_uk = num_of_uk
3030
self.num_of_pk = num_of_pk
3131
self.num_of_table = num_of_tables
32-
self.databaseProduct = self.engine_name_dict[engine_name] + " - " + product_version
32+
self.database_product = self.engine_name_dict[engine_name] + " - " + product_version
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from .database import Database
2+
from .table_index import TableIndex
3+
4+
5+
class Table:
6+
def __init__(self, database: Database, schema: str, name: str) -> None:
7+
self.database = database
8+
self.schema = schema
9+
self.name = name
10+
self.foreign_keys = {}
11+
self.columns = {}
12+
self.primary_keys = []
13+
self.indexes = {}
14+
self.id = None
15+
self.check_constraints = {}
16+
self.num_of_rows = 0
17+
self.num_of_cols = 0
18+
self.comments = None
19+
self.max_children = 0
20+
self.max_parents = 0
21+
self.type = None
22+
23+
def set_columns(self, columns):
24+
self.columns.update(columns)
25+
26+
def set_index(self, name: str, index: TableIndex):
27+
self.indexes[name] = index
28+
29+
def num_columns(self, col_size: int):
30+
self.num_of_cols = col_size
31+
32+
def get_indexes(self):
33+
return self.indexes.values()
34+
35+
def get_index(self, index_name: str):
36+
return self.indexes[index_name]
37+
38+
def get_columns(self):
39+
return self.columns.values()
40+
41+
def add_primary_key(self, primary_key):
42+
self.primary_keys.append(primary_key)
43+
44+
def add_column(self, col_name: str, col):
45+
self.columns[col_name] = col
46+
47+
def add_max_parents(self):
48+
self.max_parents += 1
49+
50+
def add_max_children(self):
51+
self.max_children += 1
52+
53+
def get_view_definition(self):
54+
return None
55+
56+
def is_view(self):
57+
return False
58+
59+
def get_type(self):
60+
if self.is_view():
61+
return "View"
62+
return "Table"
63+
64+
def get_column(self, col_name: str):
65+
return self.columns[col_name]
66+
67+
def add_check_constraint(self, constraint_name: str, text: str):
68+
self.check_constraints[constraint_name] = text
69+
70+
def get_foreign_keys(self):
71+
return self.foreign_keys.values()
72+
73+
def add_foreign_key(self, foreign_key):
74+
self.foreign_keys[foreign_key.name] = foreign_key
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from .table import Table
2+
from .constraint import ForeignKeyConstraint
3+
4+
5+
class TableColumn:
6+
def __init__(
7+
self,
8+
table: Table,
9+
name: str,
10+
type_name: str,
11+
not_null: bool,
12+
default_value: str,
13+
is_auto_updated: bool,
14+
comments: str,
15+
):
16+
self.table = table
17+
self.name = name
18+
self.type_name = type_name
19+
self.not_null = not_null
20+
self.default_value = default_value
21+
self.comments = comments
22+
self.parents = {}
23+
self.children = {}
24+
self.type = 0
25+
self.decimal_digits = 0
26+
self.detailed_size = None
27+
self.is_auto_updated = is_auto_updated
28+
self.index = False
29+
30+
def set_index(self):
31+
self.index = True
32+
33+
def is_primary(self):
34+
if self.table.primary_keys is not None:
35+
return self in self.table.primary_keys
36+
return False
37+
38+
def is_foreign_key(self):
39+
return len(self.parents) != 0
40+
41+
def get_default_value(self):
42+
return self.default_value
43+
44+
def set_comments(self, comments: str):
45+
if comments is None or len(comments.strip()) == 0:
46+
self.comments = None
47+
else:
48+
self.comments = comments.strip()
49+
50+
def add_parent(self, parent, constraint: ForeignKeyConstraint):
51+
self.parents[parent] = constraint
52+
self.table.add_max_parents()
53+
54+
def add_child(self, child, constraint: ForeignKeyConstraint):
55+
self.children[child] = constraint
56+
self.table.add_max_children()
57+
58+
def get_parents(self):
59+
return list(self.parents)
60+
61+
def get_children(self):
62+
return list(self.children)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class TableIndex:
2+
def __init__(self, name: str, index_type: str) -> None:
3+
self.name = name
4+
self.is_unique = False
5+
self.is_primary = False
6+
self.columns = {}
7+
self.index_type = index_type
8+
9+
def add_column(self, col_string: str, column):
10+
if column is not None:
11+
self.columns[col_string] = column
12+
13+
def set_primary(self):
14+
self.is_primary = True
15+
16+
def set_unique(self):
17+
self.is_unique = True
18+
19+
def get_type(self):
20+
if self.is_primary:
21+
return "Primary key"
22+
if self.is_unique:
23+
return "Must be unique"
24+
return "Performance"
25+
26+
def get_index_type(self):
27+
return self.index_type
28+
29+
def columns_as_string(self):
30+
return "".join(self.columns.keys())

dataprep/eda/create_db_report/model/init_view.py renamed to dataprep/eda/create_db_report/db_models/view.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
1-
from .init_table import Table
2-
from .init_database import Database
1+
from .table import Table
2+
from .database import Database
33

44

55
class View(Table):
66
def __init__(self, db: Database, schema: str, name: str, view_def: str) -> None:
77
self.viewDefinition = None
88
super().__init__(db, schema, name)
9-
self.setViewDefinition(view_def)
9+
self.set_view_definition(view_def)
1010

11-
def setViewDefinition(self, view_definition: str):
11+
def set_view_definition(self, view_definition: str):
1212
if view_definition is not None and len(view_definition.strip()) > 0:
1313
self.viewDefinition = view_definition
1414

15-
def getViewDefinition(self):
15+
def get_view_definition(self):
1616
return self.viewDefinition
1717

1818
def is_view(self):

0 commit comments

Comments
 (0)