11from typing import Any , ClassVar , Dict
22
33from dbt .adapters .base import Column
4+ from dbt_common .exceptions import DbtRuntimeError
45
56
67class FabricColumn (Column ):
78 TYPE_LABELS : ClassVar [Dict [str , str ]] = {
89 "STRING" : "VARCHAR(8000)" ,
10+ "VARCHAR" : "VARCHAR(8000)" ,
11+ "CHAR" : "CHAR(1)" ,
12+ "NCHAR" : "CHAR(1)" ,
13+ "NVARCHAR" : "VARCHAR(8000)" ,
914 "TIMESTAMP" : "DATETIME2(6)" ,
15+ "DATETIME2" : "DATETIME2(6)" ,
16+ "DATETIME2(6)" : "DATETIME2(6)" ,
17+ "DATE" : "DATE" ,
18+ "TIME" : "TIME(6)" ,
1019 "FLOAT" : "FLOAT" ,
20+ "REAL" : "REAL" ,
21+ "INT" : "INT" ,
1122 "INTEGER" : "INT" ,
23+ "BIGINT" : "BIGINT" ,
24+ "SMALLINT" : "SMALLINT" ,
25+ "TINYINT" : "SMALLINT" ,
26+ "BIT" : "BIT" ,
1227 "BOOLEAN" : "BIT" ,
28+ "DECIMAL" : "DECIMAL" ,
29+ "NUMERIC" : "NUMERIC" ,
30+ "MONEY" : "DECIMAL" ,
31+ "SMALLMONEY" : "DECIMAL" ,
32+ "UNIQUEIDENTIFIER" : "UNIQUEIDENTIFIER" ,
33+ "VARBINARY" : "VARBINARY(MAX)" ,
34+ "BINARY" : "BINARY(1)" ,
1335 }
1436
1537 @classmethod
@@ -18,3 +40,43 @@ def string_type(cls, size: int) -> str:
1840
1941 def literal (self , value : Any ) -> str :
2042 return "cast('{}' as {})" .format (value , self .data_type )
43+
44+ @property
45+ def data_type (self ) -> str :
46+ # Always enforce datetime2 precision
47+ if self .dtype .lower () == "datetime2" :
48+ return "datetime2(6)"
49+ if self .is_string ():
50+ return self .string_type (self .string_size ())
51+ elif self .is_numeric ():
52+ return self .numeric_type (self .dtype , self .numeric_precision , self .numeric_scale )
53+ else :
54+ return self .dtype
55+
56+ def is_string (self ) -> bool :
57+ return self .dtype .lower () in ["varchar" , "char" ]
58+
59+ def is_number (self ):
60+ return any ([self .is_integer (), self .is_numeric (), self .is_float ()])
61+
62+ def is_float (self ):
63+ return self .dtype .lower () in ["float" , "real" ]
64+
65+ def is_integer (self ) -> bool :
66+ return self .dtype .lower () in ["int" , "integer" , "bigint" , "smallint" , "tinyint" ]
67+
68+ def is_numeric (self ) -> bool :
69+ return self .dtype .lower () in ["numeric" , "decimal" , "money" , "smallmoney" ]
70+
71+ def string_size (self ) -> int :
72+ if not self .is_string ():
73+ raise DbtRuntimeError ("Called string_size() on non-string field!" )
74+ if self .char_size is None :
75+ return 8000
76+ else :
77+ return int (self .char_size )
78+
79+ def can_expand_to (self , other_column : "FabricColumn" ) -> bool :
80+ if not self .is_string () or not other_column .is_string ():
81+ return False
82+ return other_column .string_size () > self .string_size ()
0 commit comments