sqlmesh.core.model.decorator
1from __future__ import annotations 2 3import typing as t 4from pathlib import Path 5import inspect 6import re 7 8from sqlglot import exp 9from sqlglot.dialects.dialect import DialectType 10 11from sqlmesh.core.config.common import VirtualEnvironmentMode 12from sqlmesh.core.macros import MacroRegistry 13from sqlmesh.core.signal import SignalRegistry 14from sqlmesh.utils.jinja import JinjaMacroRegistry 15from sqlmesh.core import constants as c 16from sqlmesh.core.dialect import MacroFunc, parse_one 17from sqlmesh.core.model.definition import ( 18 Model, 19 create_python_model, 20 create_sql_model, 21 create_models_from_blueprints, 22 get_model_name, 23 parse_defaults_properties, 24 render_meta_fields, 25 render_model_defaults, 26) 27from sqlmesh.core.model.kind import ModelKindName, _ModelKind 28from sqlmesh.utils import registry_decorator, DECORATOR_RETURN_TYPE 29from sqlmesh.utils.errors import ConfigError, raise_config_error 30from sqlmesh.utils.metaprogramming import build_env, serialize_env 31 32 33if t.TYPE_CHECKING: 34 from sqlmesh.core.audit import ModelAudit 35 36 37class model(registry_decorator): 38 """Specifies a function is a python based model.""" 39 40 registry_name = "python_models" 41 _dialect: DialectType = None 42 43 def __init__(self, name: t.Optional[str] = None, is_sql: bool = False, **kwargs: t.Any) -> None: 44 if not is_sql and "columns" not in kwargs: 45 raise ConfigError("Python model must define column schema.") 46 47 self.name_provided = bool(name) 48 self.name = name or "" 49 self.is_sql = is_sql 50 self.kwargs = kwargs 51 52 # Make sure that argument values are expressions in order to pass validation in ModelMeta. 53 for function_call_attribute in ("audits", "signals"): 54 calls = self.kwargs.pop(function_call_attribute, []) 55 self.kwargs[function_call_attribute] = [ 56 ( 57 (call, {}) 58 if isinstance(call, str) 59 else ( 60 call[0], 61 { 62 arg_key: exp.convert( 63 tuple(arg_value) if isinstance(arg_value, list) else arg_value 64 ) 65 for arg_key, arg_value in call[1].items() 66 }, 67 ) 68 ) 69 for call in calls 70 ] 71 72 if "default_catalog" in kwargs: 73 raise ConfigError("`default_catalog` cannot be set on a per-model basis.") 74 75 self.columns = { 76 column_name: ( 77 column_type 78 if isinstance(column_type, exp.DataType) 79 else exp.DataType.build( 80 str(column_type), dialect=self.kwargs.get("dialect", self._dialect) 81 ) 82 ) 83 for column_name, column_type in self.kwargs.pop("columns", {}).items() 84 } 85 86 def __call__( 87 self, func: t.Callable[..., DECORATOR_RETURN_TYPE] 88 ) -> t.Callable[..., DECORATOR_RETURN_TYPE]: 89 if not self.name_provided: 90 self.name = get_model_name(Path(inspect.getfile(func))) 91 return super().__call__(func) 92 93 def models( 94 self, 95 get_variables: t.Callable[[t.Optional[str]], t.Dict[str, str]], 96 path: Path, 97 module_path: Path, 98 dialect: t.Optional[str] = None, 99 default_catalog_per_gateway: t.Optional[t.Dict[str, str]] = None, 100 **loader_kwargs: t.Any, 101 ) -> t.List[Model]: 102 blueprints = self.kwargs.pop("blueprints", None) 103 104 if isinstance(blueprints, str): 105 blueprints = parse_one(blueprints, dialect=dialect) 106 107 if isinstance(blueprints, MacroFunc): 108 from sqlmesh.core.model.definition import render_expression 109 110 blueprints = render_expression( 111 expression=blueprints, 112 module_path=module_path, 113 macros=loader_kwargs.get("macros"), 114 jinja_macros=loader_kwargs.get("jinja_macros"), 115 variables=get_variables(None), 116 path=path, 117 dialect=dialect, 118 default_catalog=loader_kwargs.get("default_catalog"), 119 ) 120 if not blueprints: 121 raise_config_error("Failed to render blueprints property", path) 122 123 if len(blueprints) > 1: 124 blueprints = [exp.Tuple(expressions=blueprints)] 125 126 blueprints = blueprints[0] 127 128 return create_models_from_blueprints( 129 gateway=self.kwargs.get("gateway"), 130 blueprints=blueprints, 131 get_variables=get_variables, 132 loader=self.model, 133 path=path, 134 module_path=module_path, 135 dialect=dialect, 136 default_catalog_per_gateway=default_catalog_per_gateway, 137 **loader_kwargs, 138 ) 139 140 def model( 141 self, 142 *, 143 module_path: Path, 144 path: Path, 145 defaults: t.Optional[t.Dict[str, t.Any]] = None, 146 macros: t.Optional[MacroRegistry] = None, 147 jinja_macros: t.Optional[JinjaMacroRegistry] = None, 148 signal_definitions: t.Optional[SignalRegistry] = None, 149 audit_definitions: t.Optional[t.Dict[str, ModelAudit]] = None, 150 dialect: t.Optional[str] = None, 151 time_column_format: str = c.DEFAULT_TIME_COLUMN_FORMAT, 152 physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None, 153 project: str = "", 154 default_catalog: t.Optional[str] = None, 155 variables: t.Optional[t.Dict[str, t.Any]] = None, 156 infer_names: t.Optional[bool] = False, 157 blueprint_variables: t.Optional[t.Dict[str, t.Any]] = None, 158 virtual_environment_mode: VirtualEnvironmentMode = VirtualEnvironmentMode.default, 159 ) -> Model: 160 """Get the model registered by this function.""" 161 env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]] = {} 162 entrypoint = self.func.__name__ 163 164 if not self.name_provided and not infer_names: 165 raise ConfigError("Python model must have a name.") 166 167 kind = self.kwargs.get("kind", None) 168 if kind is not None: 169 if isinstance(kind, _ModelKind): 170 from sqlmesh.core.console import get_console 171 172 get_console().log_warning( 173 f"""Python model "{self.name}"'s `kind` argument was passed a SQLMesh `{type(kind).__name__}` object. This may result in unexpected behavior - provide a dictionary instead.""" 174 ) 175 elif isinstance(kind, dict): 176 if "name" not in kind or not isinstance(kind.get("name"), ModelKindName): 177 raise ConfigError( 178 f"""Python model "{self.name}"'s `kind` dictionary must contain a `name` key with a valid ModelKindName enum value.""" 179 ) 180 181 build_env(self.func, env=env, name=entrypoint, path=module_path) 182 183 rendered_fields = render_meta_fields( 184 fields={"name": self.name, **self.kwargs}, 185 module_path=module_path, 186 macros=macros, 187 jinja_macros=jinja_macros, 188 variables=variables, 189 path=path, 190 dialect=dialect, 191 default_catalog=default_catalog, 192 blueprint_variables=blueprint_variables, 193 ) 194 195 rendered_name = rendered_fields["name"] 196 if isinstance(rendered_name, exp.Expr): 197 rendered_fields["name"] = rendered_name.sql(dialect=dialect) 198 199 rendered_defaults = ( 200 render_model_defaults( 201 defaults=defaults, 202 module_path=module_path, 203 macros=macros, 204 jinja_macros=jinja_macros, 205 variables=variables, 206 path=path, 207 dialect=dialect, 208 default_catalog=default_catalog, 209 ) 210 if defaults 211 else {} 212 ) 213 214 rendered_defaults = parse_defaults_properties(rendered_defaults, dialect=dialect) 215 216 common_kwargs = { 217 "defaults": rendered_defaults, 218 "path": path, 219 "time_column_format": time_column_format, 220 "python_env": serialize_env(env, path=module_path), 221 "physical_schema_mapping": physical_schema_mapping, 222 "project": project, 223 "default_catalog": default_catalog, 224 "variables": variables, 225 "dialect": dialect, 226 "columns": self.columns if self.columns else None, 227 "module_path": module_path, 228 "macros": macros, 229 "jinja_macros": jinja_macros, 230 "audit_definitions": audit_definitions, 231 "signal_definitions": signal_definitions, 232 "blueprint_variables": blueprint_variables, 233 "virtual_environment_mode": virtual_environment_mode, 234 **rendered_fields, 235 } 236 237 for key in ("pre_statements", "post_statements", "on_virtual_update"): 238 statements = common_kwargs.get(key) 239 if statements: 240 common_kwargs[key] = [ 241 parse_one(s, dialect=common_kwargs.get("dialect")) if isinstance(s, str) else s 242 for s in statements 243 ] 244 245 if self.is_sql: 246 query = MacroFunc(this=exp.Anonymous(this=entrypoint)) 247 return create_sql_model(query=query, **common_kwargs) 248 return create_python_model(entrypoint=entrypoint, **common_kwargs)
38class model(registry_decorator): 39 """Specifies a function is a python based model.""" 40 41 registry_name = "python_models" 42 _dialect: DialectType = None 43 44 def __init__(self, name: t.Optional[str] = None, is_sql: bool = False, **kwargs: t.Any) -> None: 45 if not is_sql and "columns" not in kwargs: 46 raise ConfigError("Python model must define column schema.") 47 48 self.name_provided = bool(name) 49 self.name = name or "" 50 self.is_sql = is_sql 51 self.kwargs = kwargs 52 53 # Make sure that argument values are expressions in order to pass validation in ModelMeta. 54 for function_call_attribute in ("audits", "signals"): 55 calls = self.kwargs.pop(function_call_attribute, []) 56 self.kwargs[function_call_attribute] = [ 57 ( 58 (call, {}) 59 if isinstance(call, str) 60 else ( 61 call[0], 62 { 63 arg_key: exp.convert( 64 tuple(arg_value) if isinstance(arg_value, list) else arg_value 65 ) 66 for arg_key, arg_value in call[1].items() 67 }, 68 ) 69 ) 70 for call in calls 71 ] 72 73 if "default_catalog" in kwargs: 74 raise ConfigError("`default_catalog` cannot be set on a per-model basis.") 75 76 self.columns = { 77 column_name: ( 78 column_type 79 if isinstance(column_type, exp.DataType) 80 else exp.DataType.build( 81 str(column_type), dialect=self.kwargs.get("dialect", self._dialect) 82 ) 83 ) 84 for column_name, column_type in self.kwargs.pop("columns", {}).items() 85 } 86 87 def __call__( 88 self, func: t.Callable[..., DECORATOR_RETURN_TYPE] 89 ) -> t.Callable[..., DECORATOR_RETURN_TYPE]: 90 if not self.name_provided: 91 self.name = get_model_name(Path(inspect.getfile(func))) 92 return super().__call__(func) 93 94 def models( 95 self, 96 get_variables: t.Callable[[t.Optional[str]], t.Dict[str, str]], 97 path: Path, 98 module_path: Path, 99 dialect: t.Optional[str] = None, 100 default_catalog_per_gateway: t.Optional[t.Dict[str, str]] = None, 101 **loader_kwargs: t.Any, 102 ) -> t.List[Model]: 103 blueprints = self.kwargs.pop("blueprints", None) 104 105 if isinstance(blueprints, str): 106 blueprints = parse_one(blueprints, dialect=dialect) 107 108 if isinstance(blueprints, MacroFunc): 109 from sqlmesh.core.model.definition import render_expression 110 111 blueprints = render_expression( 112 expression=blueprints, 113 module_path=module_path, 114 macros=loader_kwargs.get("macros"), 115 jinja_macros=loader_kwargs.get("jinja_macros"), 116 variables=get_variables(None), 117 path=path, 118 dialect=dialect, 119 default_catalog=loader_kwargs.get("default_catalog"), 120 ) 121 if not blueprints: 122 raise_config_error("Failed to render blueprints property", path) 123 124 if len(blueprints) > 1: 125 blueprints = [exp.Tuple(expressions=blueprints)] 126 127 blueprints = blueprints[0] 128 129 return create_models_from_blueprints( 130 gateway=self.kwargs.get("gateway"), 131 blueprints=blueprints, 132 get_variables=get_variables, 133 loader=self.model, 134 path=path, 135 module_path=module_path, 136 dialect=dialect, 137 default_catalog_per_gateway=default_catalog_per_gateway, 138 **loader_kwargs, 139 ) 140 141 def model( 142 self, 143 *, 144 module_path: Path, 145 path: Path, 146 defaults: t.Optional[t.Dict[str, t.Any]] = None, 147 macros: t.Optional[MacroRegistry] = None, 148 jinja_macros: t.Optional[JinjaMacroRegistry] = None, 149 signal_definitions: t.Optional[SignalRegistry] = None, 150 audit_definitions: t.Optional[t.Dict[str, ModelAudit]] = None, 151 dialect: t.Optional[str] = None, 152 time_column_format: str = c.DEFAULT_TIME_COLUMN_FORMAT, 153 physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None, 154 project: str = "", 155 default_catalog: t.Optional[str] = None, 156 variables: t.Optional[t.Dict[str, t.Any]] = None, 157 infer_names: t.Optional[bool] = False, 158 blueprint_variables: t.Optional[t.Dict[str, t.Any]] = None, 159 virtual_environment_mode: VirtualEnvironmentMode = VirtualEnvironmentMode.default, 160 ) -> Model: 161 """Get the model registered by this function.""" 162 env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]] = {} 163 entrypoint = self.func.__name__ 164 165 if not self.name_provided and not infer_names: 166 raise ConfigError("Python model must have a name.") 167 168 kind = self.kwargs.get("kind", None) 169 if kind is not None: 170 if isinstance(kind, _ModelKind): 171 from sqlmesh.core.console import get_console 172 173 get_console().log_warning( 174 f"""Python model "{self.name}"'s `kind` argument was passed a SQLMesh `{type(kind).__name__}` object. This may result in unexpected behavior - provide a dictionary instead.""" 175 ) 176 elif isinstance(kind, dict): 177 if "name" not in kind or not isinstance(kind.get("name"), ModelKindName): 178 raise ConfigError( 179 f"""Python model "{self.name}"'s `kind` dictionary must contain a `name` key with a valid ModelKindName enum value.""" 180 ) 181 182 build_env(self.func, env=env, name=entrypoint, path=module_path) 183 184 rendered_fields = render_meta_fields( 185 fields={"name": self.name, **self.kwargs}, 186 module_path=module_path, 187 macros=macros, 188 jinja_macros=jinja_macros, 189 variables=variables, 190 path=path, 191 dialect=dialect, 192 default_catalog=default_catalog, 193 blueprint_variables=blueprint_variables, 194 ) 195 196 rendered_name = rendered_fields["name"] 197 if isinstance(rendered_name, exp.Expr): 198 rendered_fields["name"] = rendered_name.sql(dialect=dialect) 199 200 rendered_defaults = ( 201 render_model_defaults( 202 defaults=defaults, 203 module_path=module_path, 204 macros=macros, 205 jinja_macros=jinja_macros, 206 variables=variables, 207 path=path, 208 dialect=dialect, 209 default_catalog=default_catalog, 210 ) 211 if defaults 212 else {} 213 ) 214 215 rendered_defaults = parse_defaults_properties(rendered_defaults, dialect=dialect) 216 217 common_kwargs = { 218 "defaults": rendered_defaults, 219 "path": path, 220 "time_column_format": time_column_format, 221 "python_env": serialize_env(env, path=module_path), 222 "physical_schema_mapping": physical_schema_mapping, 223 "project": project, 224 "default_catalog": default_catalog, 225 "variables": variables, 226 "dialect": dialect, 227 "columns": self.columns if self.columns else None, 228 "module_path": module_path, 229 "macros": macros, 230 "jinja_macros": jinja_macros, 231 "audit_definitions": audit_definitions, 232 "signal_definitions": signal_definitions, 233 "blueprint_variables": blueprint_variables, 234 "virtual_environment_mode": virtual_environment_mode, 235 **rendered_fields, 236 } 237 238 for key in ("pre_statements", "post_statements", "on_virtual_update"): 239 statements = common_kwargs.get(key) 240 if statements: 241 common_kwargs[key] = [ 242 parse_one(s, dialect=common_kwargs.get("dialect")) if isinstance(s, str) else s 243 for s in statements 244 ] 245 246 if self.is_sql: 247 query = MacroFunc(this=exp.Anonymous(this=entrypoint)) 248 return create_sql_model(query=query, **common_kwargs) 249 return create_python_model(entrypoint=entrypoint, **common_kwargs)
Specifies a function is a python based model.
model(name: Optional[str] = None, is_sql: bool = False, **kwargs: Any)
44 def __init__(self, name: t.Optional[str] = None, is_sql: bool = False, **kwargs: t.Any) -> None: 45 if not is_sql and "columns" not in kwargs: 46 raise ConfigError("Python model must define column schema.") 47 48 self.name_provided = bool(name) 49 self.name = name or "" 50 self.is_sql = is_sql 51 self.kwargs = kwargs 52 53 # Make sure that argument values are expressions in order to pass validation in ModelMeta. 54 for function_call_attribute in ("audits", "signals"): 55 calls = self.kwargs.pop(function_call_attribute, []) 56 self.kwargs[function_call_attribute] = [ 57 ( 58 (call, {}) 59 if isinstance(call, str) 60 else ( 61 call[0], 62 { 63 arg_key: exp.convert( 64 tuple(arg_value) if isinstance(arg_value, list) else arg_value 65 ) 66 for arg_key, arg_value in call[1].items() 67 }, 68 ) 69 ) 70 for call in calls 71 ] 72 73 if "default_catalog" in kwargs: 74 raise ConfigError("`default_catalog` cannot be set on a per-model basis.") 75 76 self.columns = { 77 column_name: ( 78 column_type 79 if isinstance(column_type, exp.DataType) 80 else exp.DataType.build( 81 str(column_type), dialect=self.kwargs.get("dialect", self._dialect) 82 ) 83 ) 84 for column_name, column_type in self.kwargs.pop("columns", {}).items() 85 }
def
models( self, get_variables: Callable[[Optional[str]], Dict[str, str]], path: pathlib.Path, module_path: pathlib.Path, dialect: Optional[str] = None, default_catalog_per_gateway: Optional[Dict[str, str]] = None, **loader_kwargs: Any) -> List[Union[sqlmesh.core.model.definition.SqlModel, sqlmesh.core.model.definition.SeedModel, sqlmesh.core.model.definition.PythonModel, sqlmesh.core.model.definition.ExternalModel]]:
94 def models( 95 self, 96 get_variables: t.Callable[[t.Optional[str]], t.Dict[str, str]], 97 path: Path, 98 module_path: Path, 99 dialect: t.Optional[str] = None, 100 default_catalog_per_gateway: t.Optional[t.Dict[str, str]] = None, 101 **loader_kwargs: t.Any, 102 ) -> t.List[Model]: 103 blueprints = self.kwargs.pop("blueprints", None) 104 105 if isinstance(blueprints, str): 106 blueprints = parse_one(blueprints, dialect=dialect) 107 108 if isinstance(blueprints, MacroFunc): 109 from sqlmesh.core.model.definition import render_expression 110 111 blueprints = render_expression( 112 expression=blueprints, 113 module_path=module_path, 114 macros=loader_kwargs.get("macros"), 115 jinja_macros=loader_kwargs.get("jinja_macros"), 116 variables=get_variables(None), 117 path=path, 118 dialect=dialect, 119 default_catalog=loader_kwargs.get("default_catalog"), 120 ) 121 if not blueprints: 122 raise_config_error("Failed to render blueprints property", path) 123 124 if len(blueprints) > 1: 125 blueprints = [exp.Tuple(expressions=blueprints)] 126 127 blueprints = blueprints[0] 128 129 return create_models_from_blueprints( 130 gateway=self.kwargs.get("gateway"), 131 blueprints=blueprints, 132 get_variables=get_variables, 133 loader=self.model, 134 path=path, 135 module_path=module_path, 136 dialect=dialect, 137 default_catalog_per_gateway=default_catalog_per_gateway, 138 **loader_kwargs, 139 )
def
model( self, *, module_path: pathlib.Path, path: pathlib.Path, defaults: Optional[Dict[str, Any]] = None, macros: Optional[sqlmesh.utils.UniqueKeyDict[str, Union[sqlmesh.utils.metaprogramming.Executable, sqlmesh.core.macros.macro]]] = None, jinja_macros: Optional[sqlmesh.utils.jinja.JinjaMacroRegistry] = None, signal_definitions: Optional[sqlmesh.utils.UniqueKeyDict[str, sqlmesh.core.signal.signal]] = None, audit_definitions: Optional[Dict[str, sqlmesh.core.audit.definition.ModelAudit]] = None, dialect: Optional[str] = None, time_column_format: str = '%Y-%m-%d', physical_schema_mapping: Optional[Dict[re.Pattern, str]] = None, project: str = '', default_catalog: Optional[str] = None, variables: Optional[Dict[str, Any]] = None, infer_names: Optional[bool] = False, blueprint_variables: Optional[Dict[str, Any]] = None, virtual_environment_mode: sqlmesh.core.config.common.VirtualEnvironmentMode = FULL) -> Union[sqlmesh.core.model.definition.SqlModel, sqlmesh.core.model.definition.SeedModel, sqlmesh.core.model.definition.PythonModel, sqlmesh.core.model.definition.ExternalModel]:
141 def model( 142 self, 143 *, 144 module_path: Path, 145 path: Path, 146 defaults: t.Optional[t.Dict[str, t.Any]] = None, 147 macros: t.Optional[MacroRegistry] = None, 148 jinja_macros: t.Optional[JinjaMacroRegistry] = None, 149 signal_definitions: t.Optional[SignalRegistry] = None, 150 audit_definitions: t.Optional[t.Dict[str, ModelAudit]] = None, 151 dialect: t.Optional[str] = None, 152 time_column_format: str = c.DEFAULT_TIME_COLUMN_FORMAT, 153 physical_schema_mapping: t.Optional[t.Dict[re.Pattern, str]] = None, 154 project: str = "", 155 default_catalog: t.Optional[str] = None, 156 variables: t.Optional[t.Dict[str, t.Any]] = None, 157 infer_names: t.Optional[bool] = False, 158 blueprint_variables: t.Optional[t.Dict[str, t.Any]] = None, 159 virtual_environment_mode: VirtualEnvironmentMode = VirtualEnvironmentMode.default, 160 ) -> Model: 161 """Get the model registered by this function.""" 162 env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]] = {} 163 entrypoint = self.func.__name__ 164 165 if not self.name_provided and not infer_names: 166 raise ConfigError("Python model must have a name.") 167 168 kind = self.kwargs.get("kind", None) 169 if kind is not None: 170 if isinstance(kind, _ModelKind): 171 from sqlmesh.core.console import get_console 172 173 get_console().log_warning( 174 f"""Python model "{self.name}"'s `kind` argument was passed a SQLMesh `{type(kind).__name__}` object. This may result in unexpected behavior - provide a dictionary instead.""" 175 ) 176 elif isinstance(kind, dict): 177 if "name" not in kind or not isinstance(kind.get("name"), ModelKindName): 178 raise ConfigError( 179 f"""Python model "{self.name}"'s `kind` dictionary must contain a `name` key with a valid ModelKindName enum value.""" 180 ) 181 182 build_env(self.func, env=env, name=entrypoint, path=module_path) 183 184 rendered_fields = render_meta_fields( 185 fields={"name": self.name, **self.kwargs}, 186 module_path=module_path, 187 macros=macros, 188 jinja_macros=jinja_macros, 189 variables=variables, 190 path=path, 191 dialect=dialect, 192 default_catalog=default_catalog, 193 blueprint_variables=blueprint_variables, 194 ) 195 196 rendered_name = rendered_fields["name"] 197 if isinstance(rendered_name, exp.Expr): 198 rendered_fields["name"] = rendered_name.sql(dialect=dialect) 199 200 rendered_defaults = ( 201 render_model_defaults( 202 defaults=defaults, 203 module_path=module_path, 204 macros=macros, 205 jinja_macros=jinja_macros, 206 variables=variables, 207 path=path, 208 dialect=dialect, 209 default_catalog=default_catalog, 210 ) 211 if defaults 212 else {} 213 ) 214 215 rendered_defaults = parse_defaults_properties(rendered_defaults, dialect=dialect) 216 217 common_kwargs = { 218 "defaults": rendered_defaults, 219 "path": path, 220 "time_column_format": time_column_format, 221 "python_env": serialize_env(env, path=module_path), 222 "physical_schema_mapping": physical_schema_mapping, 223 "project": project, 224 "default_catalog": default_catalog, 225 "variables": variables, 226 "dialect": dialect, 227 "columns": self.columns if self.columns else None, 228 "module_path": module_path, 229 "macros": macros, 230 "jinja_macros": jinja_macros, 231 "audit_definitions": audit_definitions, 232 "signal_definitions": signal_definitions, 233 "blueprint_variables": blueprint_variables, 234 "virtual_environment_mode": virtual_environment_mode, 235 **rendered_fields, 236 } 237 238 for key in ("pre_statements", "post_statements", "on_virtual_update"): 239 statements = common_kwargs.get(key) 240 if statements: 241 common_kwargs[key] = [ 242 parse_one(s, dialect=common_kwargs.get("dialect")) if isinstance(s, str) else s 243 for s in statements 244 ] 245 246 if self.is_sql: 247 query = MacroFunc(this=exp.Anonymous(this=entrypoint)) 248 return create_sql_model(query=query, **common_kwargs) 249 return create_python_model(entrypoint=entrypoint, **common_kwargs)
Get the model registered by this function.