11import dataclasses
22import logging
3- from collections .abc import Iterable
3+ from collections .abc import Iterable , Sequence
44from dataclasses import dataclass , field
55from datetime import datetime , timezone
66
@@ -46,41 +46,62 @@ class QueryLinter:
4646 def __init__ (
4747 self ,
4848 ws : WorkspaceClient ,
49+ sql_backend : SqlBackend ,
50+ inventory_database : str ,
4951 migration_index : TableMigrationIndex ,
5052 directfs_crawler : DirectFsAccessCrawler ,
5153 used_tables_crawler : UsedTablesCrawler ,
5254 include_dashboard_ids : list [str ] | None ,
5355 debug_listing_upper_limit : int | None = None ,
5456 ):
5557 self ._ws = ws
58+ self ._sql_backend = sql_backend
5659 self ._migration_index = migration_index
5760 self ._directfs_crawler = directfs_crawler
5861 self ._used_tables_crawler = used_tables_crawler
5962 self ._include_dashboard_ids = include_dashboard_ids
6063 self ._debug_listing_upper_limit = debug_listing_upper_limit
6164
62- def refresh_report (self , sql_backend : SqlBackend , inventory_database : str ) -> None :
65+ self ._catalog = "hive_metastore"
66+ self ._schema = inventory_database
67+ self ._table = "query_problems"
68+
69+ @property
70+ def _full_name (self ) -> str :
71+ """Generates the full name of the table.
72+
73+ Returns:
74+ str: The full table name.
75+ """
76+ return f"{ self ._catalog } .{ self ._schema } .{ self ._table } "
77+
78+ def refresh_report (self ) -> None :
6379 assessment_start = datetime .now (timezone .utc )
6480 context = _ReportingContext ()
6581 self ._lint_dashboards (context )
6682 self ._lint_queries (context )
6783 assessment_end = datetime .now (timezone .utc )
68- self ._dump_problems (context , sql_backend , inventory_database )
69- self ._dump_dfsas (context , assessment_start , assessment_end )
70- self ._dump_used_tables (context , assessment_start , assessment_end )
84+ self ._dump_problems (context . all_problems )
85+ self ._dump_dfsas (context . all_dfsas , assessment_start , assessment_end )
86+ self ._dump_used_tables (context . all_tables , assessment_start , assessment_end )
7187
72- def _dump_problems (self , context : _ReportingContext , sql_backend : SqlBackend , inventory_database : str ) -> None :
73- logger .info (f"Saving { len (context . all_problems )} linting problems..." )
74- sql_backend .save_table (
75- f' { escape_sql_identifier (inventory_database ) } .query_problems' ,
76- context . all_problems ,
88+ def _dump_problems (self , problems : Sequence [ QueryProblem ] ) -> None :
89+ logger .info (f"Saving { len (problems )} linting problems..." )
90+ self . _sql_backend .save_table (
91+ escape_sql_identifier (self . _full_name ) ,
92+ problems ,
7793 QueryProblem ,
7894 mode = 'overwrite' ,
7995 )
8096
81- def _dump_dfsas (self , context : _ReportingContext , assessment_start : datetime , assessment_end : datetime ) -> None :
97+ def _dump_dfsas (
98+ self ,
99+ dfsas : Sequence [DirectFsAccess ],
100+ assessment_start : datetime ,
101+ assessment_end : datetime ,
102+ ) -> None :
82103 processed_dfsas = []
83- for dfsa in context . all_dfsas :
104+ for dfsa in dfsas :
84105 dfsa = dataclasses .replace (
85106 dfsa ,
86107 assessment_start_timestamp = assessment_start ,
@@ -91,18 +112,18 @@ def _dump_dfsas(self, context: _ReportingContext, assessment_start: datetime, as
91112
92113 def _dump_used_tables (
93114 self ,
94- context : _ReportingContext ,
115+ used_tables : Sequence [ UsedTable ] ,
95116 assessment_start : datetime ,
96117 assessment_end : datetime ,
97118 ) -> None :
98119 processed_tables = []
99- for table in context . all_tables :
100- table = dataclasses .replace (
101- table ,
120+ for used_table in used_tables :
121+ used_table = dataclasses .replace (
122+ used_table ,
102123 assessment_start_timestamp = assessment_start ,
103124 assessment_end_timestamp = assessment_end ,
104125 )
105- processed_tables .append (table )
126+ processed_tables .append (used_table )
106127 self ._used_tables_crawler .dump_all (processed_tables )
107128
108129 def _lint_dashboards (self , context : _ReportingContext ) -> None :
0 commit comments