From ded71be73f219884fe3e4a21adc7aef8fb630764 Mon Sep 17 00:00:00 2001 From: Aditya Toshniwal Date: Mon, 16 Dec 2019 18:26:22 +0530 Subject: [PATCH] Improved performance while fetching edit types for each column. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Edit types query is executed for every column when open properties dialog of the table. Change the logic to fetch the edit types for all the distinct column types used in the table at once.  --- .../schemas/tables/columns/__init__.py | 5 ++- .../databases/schemas/tables/columns/utils.py | 37 ++++++++++--------- .../sql/default/edit_mode_types_multi.sql | 13 +++++++ .../columns/sql/default/is_referenced.sql | 6 --- 4 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/edit_mode_types_multi.sql delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/is_referenced.sql diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py index ee082810b..c0c40e417 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/__init__.py @@ -717,7 +717,10 @@ class ColumnsView(PGChildNodeView, DataTypeReader): column_utils.type_formatter(data['cltype']) # We will add table & schema as well - data = column_utils.column_formatter(self.conn, tid, clid, data) + # Passing edit_types_list param so that it does not fetch + # edit types. It is not required here. + data = column_utils.column_formatter(self.conn, tid, clid, + data, []) SQL, name = self.get_sql(scid, tid, None, data, is_sql=True) if not isinstance(SQL, (str, unicode)): diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py index bad938142..7524f482c 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/columns/utils.py @@ -64,7 +64,8 @@ def get_parent(conn, tid, template_path=None): @get_template_path -def column_formatter(conn, tid, clid, data, template_path=None): +def column_formatter(conn, tid, clid, data, edit_types_list=None, + template_path=None): """ This function will return formatted output of query result as per client model format for column node @@ -144,25 +145,17 @@ def column_formatter(conn, tid, clid, data, template_path=None): # we will send filtered types related to current type type_id = data['atttypid'] - SQL = render_template("/".join([template_path, 'is_referenced.sql']), - tid=tid, clid=clid) - - status, is_reference = conn.execute_scalar(SQL) - - edit_types_list = list() - # We will need present type in edit mode - edit_types_list.append(data['cltype']) - - if int(is_reference) == 0: + if edit_types_list is None: + edit_types_list = [] SQL = render_template("/".join([template_path, 'edit_mode_types.sql']), type_id=type_id) status, rset = conn.execute_2darray(SQL) + edit_types_list = [row['typname'] for row in rset['rows']] - for row in rset['rows']: - edit_types_list.append(row['typname']) - - data['edit_types'] = edit_types_list + # We will need present type in edit mode + edit_types_list.append(data['cltype']) + data['edit_types_list'] = edit_types_list data['cltype'] = DataTypeReader.parse_type_name(data['cltype']) @@ -191,9 +184,10 @@ def get_formatted_columns(conn, tid, data, other_columns, raise Exception(res) all_columns = res['rows'] - + edit_types = {} # Add inherited from details from other columns - type, table for col in all_columns: + edit_types[col['atttypid']] = [] for other_col in other_columns: if col['name'] == other_col['name']: col['inheritedfrom' + table_or_type] = \ @@ -202,8 +196,17 @@ def get_formatted_columns(conn, tid, data, other_columns, data['columns'] = all_columns if 'columns' in data and len(data['columns']) > 0: + SQL = render_template("/".join([template_path, + 'edit_mode_types_multi.sql']), + type_ids=",".join(map(lambda x: str(x), + edit_types.keys()))) + status, res = conn.execute_2darray(SQL) + for row in res['rows']: + edit_types[row['main_oid']] = row['edit_types'] + for column in data['columns']: - column_formatter(conn, tid, column['attnum'], column) + column_formatter(conn, tid, column['attnum'], column, + edit_types[col['atttypid']]) return data diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/edit_mode_types_multi.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/edit_mode_types_multi.sql new file mode 100644 index 000000000..3dc79f0e6 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/edit_mode_types_multi.sql @@ -0,0 +1,13 @@ +SELECT t.main_oid, ARRAY_AGG(t.typname) as edit_types +FROM +(SELECT pc.castsource AS main_oid, format_type(tt.oid,NULL) AS typname +FROM pg_type tt + JOIN pg_cast pc ON tt.oid=pc.casttarget + WHERE pc.castsource IN ({{type_ids}}) + AND pc.castcontext IN ('i', 'a') +UNION +SELECT tt.typbasetype AS main_oid, format_type(tt.oid,NULL) AS typname +FROM pg_type tt +WHERE tt.typbasetype IN ({{type_ids}}) +) t +GROUP BY t.main_oid; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/is_referenced.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/is_referenced.sql deleted file mode 100644 index 52a4ffa86..000000000 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/columns/sql/default/is_referenced.sql +++ /dev/null @@ -1,6 +0,0 @@ -SELECT COUNT(1) -FROM pg_depend dep - JOIN pg_class cl ON dep.classid=cl.oid AND relname='pg_rewrite' - WHERE refobjid= {{tid}}::oid - AND classid='pg_class'::regclass - AND refobjsubid= {{clid|qtLiteral}};