55from multiprocessing .context import SpawnContext
66
77import time
8- from typing import Any , Dict , List , Optional , Type , Set , Union , FrozenSet , Tuple , Iterable
8+ from typing import (
9+ Any ,
10+ Dict ,
11+ List ,
12+ Optional ,
13+ Type ,
14+ Set ,
15+ Union ,
16+ FrozenSet ,
17+ Tuple ,
18+ Iterable ,
19+ TYPE_CHECKING ,
20+ )
921
10- import agate
1122from dbt .adapters .contracts .relation import RelationConfig
1223
1324import dbt_common .exceptions .base
2435from dbt .adapters .base .impl import FreshnessResponse
2536from dbt .adapters .cache import _make_ref_key_dict # type: ignore
2637from dbt .adapters .capability import Capability , CapabilityDict , CapabilitySupport , Support
27- import dbt_common .clients .agate_helper
2838from dbt .adapters .contracts .connection import AdapterResponse
2939from dbt .adapters .contracts .macros import MacroResolverProtocol
3040from dbt_common .contracts .constraints import ColumnLevelConstraint , ConstraintType , ModelLevelConstraint # type: ignore
5868)
5969from dbt .adapters .bigquery .utility import sql_escape
6070
71+ if TYPE_CHECKING :
72+ # Indirectly imported via agate_helper, which is lazy loaded further downfile.
73+ # Used by mypy for earlier type hints.
74+ import agate
6175
6276logger = AdapterLogger ("BigQuery" )
6377
@@ -334,32 +348,34 @@ def quote(cls, identifier: str) -> str:
334348 return "`{}`" .format (identifier )
335349
336350 @classmethod
337- def convert_text_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
351+ def convert_text_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
338352 return "string"
339353
340354 @classmethod
341- def convert_number_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
355+ def convert_number_type (cls , agate_table : "agate.Table" , col_idx : int ) -> str :
356+ import agate
357+
342358 decimals = agate_table .aggregate (agate .MaxPrecision (col_idx )) # type: ignore[attr-defined]
343359 return "float64" if decimals else "int64"
344360
345361 @classmethod
346- def convert_integer_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
362+ def convert_integer_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
347363 return "int64"
348364
349365 @classmethod
350- def convert_boolean_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
366+ def convert_boolean_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
351367 return "bool"
352368
353369 @classmethod
354- def convert_datetime_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
370+ def convert_datetime_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
355371 return "datetime"
356372
357373 @classmethod
358- def convert_date_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
374+ def convert_date_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
359375 return "date"
360376
361377 @classmethod
362- def convert_time_type (cls , agate_table : agate .Table , col_idx : int ) -> str :
378+ def convert_time_type (cls , agate_table : " agate.Table" , col_idx : int ) -> str :
363379 return "time"
364380
365381 ###
@@ -387,7 +403,7 @@ def _get_dbt_columns_from_bq_table(self, table) -> List[BigQueryColumn]:
387403 return columns
388404
389405 def _agate_to_schema (
390- self , agate_table : agate .Table , column_override : Dict [str , str ]
406+ self , agate_table : " agate.Table" , column_override : Dict [str , str ]
391407 ) -> List [SchemaField ]:
392408 """Convert agate.Table with column names to a list of bigquery schemas."""
393409 bq_schema = []
@@ -655,7 +671,13 @@ def alter_table_add_columns(self, relation, columns):
655671
656672 @available .parse_none
657673 def load_dataframe (
658- self , database , schema , table_name , agate_table , column_override , field_delimiter
674+ self ,
675+ database ,
676+ schema ,
677+ table_name ,
678+ agate_table : "agate.Table" ,
679+ column_override ,
680+ field_delimiter ,
659681 ):
660682 bq_schema = self ._agate_to_schema (agate_table , column_override )
661683 conn = self .connections .get_thread_connection ()
@@ -667,7 +689,7 @@ def load_dataframe(
667689 load_config .skip_leading_rows = 1
668690 load_config .schema = bq_schema
669691 load_config .field_delimiter = field_delimiter
670- with open (agate_table .original_abspath , "rb" ) as f :
692+ with open (agate_table .original_abspath , "rb" ) as f : # type: ignore
671693 job = client .load_table_from_file (f , table_ref , rewind = True , job_config = load_config )
672694
673695 timeout = self .connections .get_job_execution_timeout_seconds (conn ) or 300
@@ -699,8 +721,8 @@ def upload_file(
699721
700722 @classmethod
701723 def _catalog_filter_table (
702- cls , table : agate .Table , used_schemas : FrozenSet [Tuple [str , str ]]
703- ) -> agate .Table :
724+ cls , table : " agate.Table" , used_schemas : FrozenSet [Tuple [str , str ]]
725+ ) -> " agate.Table" :
704726 table = table .rename (
705727 column_names = {col .name : col .name .replace ("__" , ":" ) for col in table .columns }
706728 )
0 commit comments