@@ -59,7 +59,7 @@ def is_materialized(self) -> bool:
5959 @property
6060 def only_latest (self ) -> bool :
6161 """Whether or not this model only cares about latest date to render."""
62- return self .model_kind_name in ( ModelKindName . VIEW , ModelKindName . FULL )
62+ return self .is_view or self . is_full
6363
6464
6565class ModelKindName (str , ModelKindMixin , Enum ):
@@ -81,18 +81,80 @@ def model_kind_name(self) -> ModelKindName:
8181class ModelKind (PydanticModel , ModelKindMixin ):
8282 name : ModelKindName
8383
84- def to_expression (self , ** kwargs : t .Any ) -> d .ModelKind :
85- return d .ModelKind (this = self .name .value .upper (), ** kwargs )
84+ @classmethod
85+ def field_validator (cls ) -> classmethod :
86+ def _model_kind_validator (v : t .Any ) -> ModelKind :
87+ if isinstance (v , ModelKind ):
88+ return v
89+
90+ if isinstance (v , d .ModelKind ):
91+ name = v .this
92+ props = {prop .name : prop .args .get ("value" ) for prop in v .expressions }
93+ klass : t .Type [ModelKind ] = ModelKind
94+ if name == ModelKindName .INCREMENTAL_BY_TIME_RANGE :
95+ klass = IncrementalByTimeRangeKind
96+ elif name == ModelKindName .INCREMENTAL_BY_UNIQUE_KEY :
97+ klass = IncrementalByUniqueKeyKind
98+ elif name == ModelKindName .SEED :
99+ klass = SeedKind
100+ else :
101+ props ["name" ] = ModelKindName (name )
102+ return klass (** props )
103+
104+ if isinstance (v , dict ):
105+ if v .get ("name" ) == ModelKindName .INCREMENTAL_BY_TIME_RANGE :
106+ klass = IncrementalByTimeRangeKind
107+ elif v .get ("name" ) == ModelKindName .INCREMENTAL_BY_UNIQUE_KEY :
108+ klass = IncrementalByUniqueKeyKind
109+ elif v .get ("name" ) == ModelKindName .SEED :
110+ klass = SeedKind
111+ else :
112+ klass = ModelKind
113+ return klass (** v )
114+
115+ name = (v .name if isinstance (v , exp .Expression ) else str (v )).upper ()
116+
117+ try :
118+ return ModelKind (name = ModelKindName (name ))
119+ except ValueError :
120+ raise ConfigError (f"Invalid model kind '{ name } '" )
121+
122+ return validator ("kind" , pre = True , allow_reuse = True )(_model_kind_validator )
86123
87124 @property
88125 def model_kind_name (self ) -> ModelKindName :
89126 return self .name
90127
128+ def to_expression (self , ** kwargs : t .Any ) -> d .ModelKind :
129+ return d .ModelKind (this = self .name .value .upper (), ** kwargs )
130+
91131
92132class TimeColumn (PydanticModel ):
93133 column : str
94134 format : t .Optional [str ] = None
95135
136+ @classmethod
137+ def field_validator (cls ) -> classmethod :
138+ def _time_column_validator (v : t .Any ) -> TimeColumn :
139+ if isinstance (v , exp .Tuple ):
140+ kwargs = {
141+ key : v .expressions [i ].name
142+ for i , key in enumerate (("column" , "format" )[: len (v .expressions )])
143+ }
144+ return TimeColumn (** kwargs )
145+
146+ if isinstance (v , exp .Identifier ):
147+ return TimeColumn (column = v .name )
148+
149+ if isinstance (v , exp .Expression ):
150+ return TimeColumn (column = v .name )
151+
152+ if isinstance (v , str ):
153+ return TimeColumn (column = v )
154+ return v
155+
156+ return validator ("time_column" , pre = True , allow_reuse = True )(_time_column_validator )
157+
96158 @validator ("column" , pre = True )
97159 def _column_validator (cls , v : str ) -> str :
98160 if not v :
@@ -126,6 +188,9 @@ def to_expression(self, dialect: str) -> exp.Column | exp.Tuple:
126188 ]
127189 )
128190
191+ def to_property (self , dialect : str = "" ) -> exp .Property :
192+ return exp .Property (this = "time_column" , value = self .to_expression (dialect ))
193+
129194
130195class _Incremental (ModelKind ):
131196 batch_size : t .Optional [int ]
@@ -156,31 +221,10 @@ class IncrementalByTimeRangeKind(_Incremental):
156221 name : ModelKindName = Field (ModelKindName .INCREMENTAL_BY_TIME_RANGE , const = True )
157222 time_column : TimeColumn
158223
159- @validator ("time_column" , pre = True )
160- def _parse_time_column (cls , v : t .Any ) -> TimeColumn :
161- if isinstance (v , exp .Tuple ):
162- kwargs = {
163- key : v .expressions [i ].name
164- for i , key in enumerate (("column" , "format" )[: len (v .expressions )])
165- }
166- return TimeColumn (** kwargs )
167-
168- if isinstance (v , exp .Identifier ):
169- return TimeColumn (column = v .name )
170-
171- if isinstance (v , exp .Expression ):
172- return TimeColumn (column = v .name )
173-
174- if isinstance (v , str ):
175- return TimeColumn (column = v )
176- return v
224+ _time_column_validator = TimeColumn .field_validator ()
177225
178226 def to_expression (self , dialect : str = "" , ** kwargs : t .Any ) -> d .ModelKind :
179- return super ().to_expression (
180- expressions = [
181- exp .Property (this = "time_column" , value = self .time_column .to_expression (dialect ))
182- ],
183- )
227+ return super ().to_expression (expressions = [self .time_column .to_property (dialect )])
184228
185229
186230class IncrementalByUniqueKeyKind (_Incremental ):
@@ -228,43 +272,3 @@ def to_expression(self, **kwargs: t.Any) -> d.ModelKind:
228272 ),
229273 ],
230274 )
231-
232-
233- def _model_kind_validator (v : t .Any ) -> ModelKind :
234- if isinstance (v , ModelKind ):
235- return v
236-
237- if isinstance (v , d .ModelKind ):
238- name = v .this
239- props = {prop .name : prop .args .get ("value" ) for prop in v .expressions }
240- klass : t .Type [ModelKind ] = ModelKind
241- if name == ModelKindName .INCREMENTAL_BY_TIME_RANGE :
242- klass = IncrementalByTimeRangeKind
243- elif name == ModelKindName .INCREMENTAL_BY_UNIQUE_KEY :
244- klass = IncrementalByUniqueKeyKind
245- elif name == ModelKindName .SEED :
246- klass = SeedKind
247- else :
248- props ["name" ] = ModelKindName (name )
249- return klass (** props )
250-
251- if isinstance (v , dict ):
252- if v .get ("name" ) == ModelKindName .INCREMENTAL_BY_TIME_RANGE :
253- klass = IncrementalByTimeRangeKind
254- elif v .get ("name" ) == ModelKindName .INCREMENTAL_BY_UNIQUE_KEY :
255- klass = IncrementalByUniqueKeyKind
256- elif v .get ("name" ) == ModelKindName .SEED :
257- klass = SeedKind
258- else :
259- klass = ModelKind
260- return klass (** v )
261-
262- name = (v .name if isinstance (v , exp .Expression ) else str (v )).upper ()
263-
264- try :
265- return ModelKind (name = ModelKindName (name ))
266- except ValueError :
267- raise ConfigError (f"Invalid model kind '{ name } '" )
268-
269-
270- model_kind_validator = validator ("kind" , pre = True , allow_reuse = True )(_model_kind_validator )
0 commit comments