Skip to content

Commit 76c9e5a

Browse files
committed
PR feedback
1 parent 9ad98ac commit 76c9e5a

3 files changed

Lines changed: 43 additions & 39 deletions

File tree

sqlmesh/core/model/common.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def make_python_env(
7474
# If this macro has been seen before as a non-metadata macro, prioritize that
7575
used_macros[name] = (
7676
macros[name],
77-
(used_macros.get(name) or (None, is_metadata))[1],
77+
used_macros.get(name, (None, is_metadata))[1],
7878
)
7979
if name == c.VAR:
8080
args = macro_func_or_var.this.expressions
@@ -92,7 +92,7 @@ def make_python_env(
9292
# If this macro has been seen before as a non-metadata macro, prioritize that
9393
used_macros[name] = (
9494
macros[name],
95-
(used_macros.get(name) or (None, is_metadata))[1],
95+
used_macros.get(name, (None, is_metadata))[1],
9696
)
9797
elif name in variables:
9898
used_variables.add(name)
@@ -114,14 +114,13 @@ def make_python_env(
114114
if isinstance(used_macro, Executable):
115115
python_env[name] = used_macro
116116
elif not hasattr(used_macro, c.SQLMESH_BUILTIN) and name not in python_env:
117-
used_macro_func = used_macro.func
118-
previous_is_metadata = getattr(used_macro_func, c.SQLMESH_METADATA, None)
119-
120-
if is_metadata:
121-
setattr(used_macro_func, c.SQLMESH_METADATA, is_metadata)
122-
123-
build_env(used_macro.func, env=env, name=name, path=module_path)
124-
setattr(used_macro_func, c.SQLMESH_METADATA, previous_is_metadata)
117+
build_env(
118+
used_macro.func,
119+
env=env,
120+
name=name,
121+
path=module_path,
122+
is_metadata_obj=is_metadata,
123+
)
125124

126125
python_env.update(serialize_env(env, path=module_path))
127126
return _add_variables_to_python_env(

sqlmesh/migrations/v0078_warn_if_non_migratable_python_env_and_make_audits_and_signals_macros_metadata.py

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ def migrate(state_sync, **kwargs): # type: ignore
3434
warning = (
3535
"SQLMesh detected that it may not be able to fully migrate the state database. This should not impact "
3636
"the migration process, but may result in unexpected changes being reported by the next `sqlmesh plan` "
37-
"command. Please run the `sqlmesh diff` (https://sqlmesh.readthedocs.io/en/stable/reference/cli/?h=cli#diff) "
38-
"command after the migration has completed, before making any new changes. If any unexpected changes are reported, "
39-
"consider running a forward-only plan (https://sqlmesh.readthedocs.io/en/stable/concepts/plans/#forward-only-plans) "
40-
"to avoid unnecessary backfills.\n"
37+
"command. Please run `sqlmesh diff prod` after the migration has completed, before making any new "
38+
"changes. If any unexpected changes are reported, consider running a forward-only plan to apply these "
39+
"changes and avoid unnecessary backfills: sqlmesh plan prod --forward-only. "
40+
"See https://sqlmesh.readthedocs.io/en/stable/concepts/plans/#forward-only-plans for more details.\n"
4141
)
4242

4343
for (snapshot,) in engine_adapter.fetchall(
@@ -50,7 +50,6 @@ def migrate(state_sync, **kwargs): # type: ignore
5050
if node.get("source_type") == "audit":
5151
continue
5252

53-
name = node["name"]
5453
python_env = node.get("python_env") or {}
5554

5655
has_metadata = False
@@ -69,29 +68,33 @@ def migrate(state_sync, **kwargs): # type: ignore
6968
dialect = node.get("dialect")
7069
metadata_hash_statements = []
7170

72-
if on_virtual_update := node.get("on_virtual_update"):
73-
metadata_hash_statements.extend(parse_expression(on_virtual_update, dialect))
74-
75-
for _, audit_args in func_call_validator(node.get("audits") or []):
76-
metadata_hash_statements.extend(audit_args.values())
77-
78-
for signal_name, signal_args in func_call_validator(
79-
node.get("signals") or [], is_signal=True
80-
):
81-
metadata_hash_statements.extend(signal_args.values())
82-
83-
if audit_definitions := node.get("audit_definitions"):
84-
audit_queries = [
85-
parse_expression(audit["query"], audit["dialect"])
86-
for audit in audit_definitions.values()
87-
]
88-
metadata_hash_statements.extend(audit_queries)
89-
90-
for macro_name in extract_used_macros(metadata_hash_statements):
91-
serialized_macro = python_env.get(macro_name)
92-
if isinstance(serialized_macro, dict) and not serialized_macro.get("is_metadata"):
93-
get_console().log_warning(warning)
94-
return
71+
# We use try-except here as a conservative measure to avoid any unexpected exceptions
72+
try:
73+
if on_virtual_update := node.get("on_virtual_update"):
74+
metadata_hash_statements.extend(parse_expression(on_virtual_update, dialect))
75+
76+
for _, audit_args in func_call_validator(node.get("audits") or []):
77+
metadata_hash_statements.extend(audit_args.values())
78+
79+
for signal_name, signal_args in func_call_validator(
80+
node.get("signals") or [], is_signal=True
81+
):
82+
metadata_hash_statements.extend(signal_args.values())
83+
84+
if audit_definitions := node.get("audit_definitions"):
85+
audit_queries = [
86+
parse_expression(audit["query"], audit["dialect"])
87+
for audit in audit_definitions.values()
88+
]
89+
metadata_hash_statements.extend(audit_queries)
90+
91+
for macro_name in extract_used_macros(metadata_hash_statements):
92+
serialized_macro = python_env.get(macro_name)
93+
if isinstance(serialized_macro, dict) and not serialized_macro.get("is_metadata"):
94+
get_console().log_warning(warning)
95+
return
96+
except Exception:
97+
pass
9598

9699

97100
def extract_used_macros(expressions):

sqlmesh/utils/metaprogramming.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ def build_env(
269269
env: t.Dict[str, t.Tuple[t.Any, t.Optional[bool]]],
270270
name: str,
271271
path: Path,
272+
is_metadata_obj: t.Optional[bool] = None,
272273
) -> None:
273274
"""Fills in env dictionary with all globals needed to execute the object.
274275
@@ -279,6 +280,7 @@ def build_env(
279280
env: Dictionary to store the env.
280281
name: Name of the object in the env.
281282
path: The module path to serialize. Other modules will not be walked and treated as imports.
283+
is_metadata_obj: An optional flag that determins whether the input object is metadata-only.
282284
"""
283285
# We don't rely on `env` to keep track of visited objects, because it's populated in post-order
284286
visited: t.Set[str] = set()
@@ -356,7 +358,7 @@ def walk(obj: t.Any, name: str, is_metadata: t.Optional[bool] = None) -> None:
356358
env[name] = (obj, is_metadata)
357359

358360
# The "metadata only" annotation of the object is transitive
359-
walk(obj, name, getattr(obj, c.SQLMESH_METADATA, None))
361+
walk(obj, name, is_metadata_obj or getattr(obj, c.SQLMESH_METADATA, None))
360362

361363

362364
@dataclass

0 commit comments

Comments
 (0)