Skip to content

Commit f9124c6

Browse files
split model diff and table diff functionality
1 parent 8ac9df4 commit f9124c6

File tree

6 files changed

+221
-262
lines changed

6 files changed

+221
-262
lines changed

sqlmesh/cli/main.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -891,27 +891,26 @@ def create_external_models(obj: Context, **kwargs: t.Any) -> None:
891891
type=str,
892892
help="Schema used for temporary tables. It can be `CATALOG.SCHEMA` or `SCHEMA`. Default: `sqlmesh_temp`",
893893
)
894+
@click.option(
895+
"--select-model",
896+
type=str,
897+
multiple=True,
898+
help="Select specific model that should be diffed.",
899+
)
894900
@click.pass_obj
895901
@error_handler
896902
@cli_analytics
897903
def table_diff(
898904
obj: Context, source_to_target: str, model: t.Optional[str], **kwargs: t.Any
899905
) -> None:
900-
"""Show the diff between two tables or all impacted when no model is specified."""
906+
"""Show the diff between two tables or a selection of models when they are specified."""
901907
source, target = source_to_target.split(":")
902-
if model:
903-
obj.table_diff(
904-
source=source,
905-
target=target,
906-
model_or_snapshot=model,
907-
**kwargs,
908-
)
909-
else:
910-
obj.table_diff_impacted_models(
911-
source=source,
912-
target=target,
913-
**kwargs,
914-
)
908+
obj.table_diff(
909+
source=source,
910+
target=target,
911+
model_or_snapshot=model,
912+
**kwargs,
913+
)
915914

916915

917916
@cli.command("rewrite")

sqlmesh/core/console.py

Lines changed: 63 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -217,25 +217,15 @@ def show_model_difference_summary(
217217
) -> None:
218218
"""Displays a summary of differences for the given models."""
219219

220-
@abc.abstractmethod
221-
def show_impacted_tables_diff(
222-
self,
223-
table_diffs: t.List[TableDiff],
224-
show_sample: bool = True,
225-
skip_grain_check: bool = False,
226-
temp_schema: t.Optional[str] = None,
227-
) -> None:
228-
"""Display the table diff between all mismatched tables."""
229-
230220
@abc.abstractmethod
231221
def show_table_diff(
232222
self,
233-
table_diff: TableDiff,
223+
table_diffs: t.List[TableDiff],
234224
show_sample: bool = True,
235225
skip_grain_check: bool = False,
236226
temp_schema: t.Optional[str] = None,
237227
) -> None:
238-
"""Display the table diff between two tables."""
228+
"""Display the table diff between two or multiple tables."""
239229

240230
@abc.abstractmethod
241231
def show_table_diff_summary(self, table_diff: TableDiff) -> None:
@@ -668,29 +658,21 @@ def loading_start(self, message: t.Optional[str] = None) -> uuid.UUID:
668658
def loading_stop(self, id: uuid.UUID) -> None:
669659
pass
670660

671-
def show_impacted_tables_diff(
672-
self,
673-
table_diffs: t.List[TableDiff],
674-
show_sample: bool = True,
675-
skip_grain_check: bool = False,
676-
temp_schema: t.Optional[str] = None,
677-
) -> None:
678-
pass
679-
680661
def show_table_diff(
681662
self,
682-
table_diff: TableDiff,
663+
table_diffs: t.List[TableDiff],
683664
show_sample: bool = True,
684665
skip_grain_check: bool = False,
685666
temp_schema: t.Optional[str] = None,
686667
) -> None:
687-
self.show_table_diff_summary(table_diff)
688-
self.show_schema_diff(table_diff.schema_diff())
689-
self.show_row_diff(
690-
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
691-
show_sample=show_sample,
692-
skip_grain_check=skip_grain_check,
693-
)
668+
for table_diff in table_diffs:
669+
self.show_table_diff_summary(table_diff)
670+
self.show_schema_diff(table_diff.schema_diff())
671+
self.show_row_diff(
672+
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
673+
show_sample=show_sample,
674+
skip_grain_check=skip_grain_check,
675+
)
694676

695677
def show_table_diff_summary(self, table_diff: TableDiff) -> None:
696678
pass
@@ -2158,30 +2140,6 @@ def show_row_diff(
21582140
self.console.print(row_diff.t_sample.to_string(index=False), end="\n\n")
21592141

21602142
def show_table_diff(
2161-
self,
2162-
table_diff: TableDiff,
2163-
show_sample: bool = True,
2164-
skip_grain_check: bool = False,
2165-
temp_schema: t.Optional[str] = None,
2166-
) -> None:
2167-
"""Display the table diff between two tables.
2168-
2169-
Args:
2170-
table_diff: The TableDiff object containing schema and summary differences
2171-
show_sample: Show the sample dataframe in the console. Requires show=True.
2172-
skip_grain_check: Skip check for rows that contain null or duplicate grains.
2173-
temp_schema: The schema to use for temporary tables.
2174-
"""
2175-
2176-
self.show_table_diff_summary(table_diff)
2177-
self.show_schema_diff(table_diff.schema_diff())
2178-
self.show_row_diff(
2179-
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
2180-
show_sample=show_sample,
2181-
skip_grain_check=skip_grain_check,
2182-
)
2183-
2184-
def show_impacted_tables_diff(
21852143
self,
21862144
table_diffs: t.List[TableDiff],
21872145
show_sample: bool = True,
@@ -2219,12 +2177,13 @@ def show_impacted_tables_diff(
22192177
f"[{self.TABLE_DIFF_SOURCE_BLUE}]{m.source}[/{self.TABLE_DIFF_SOURCE_BLUE}] - [{self.TABLE_DIFF_TARGET_GREEN}]{m.target}[/{self.TABLE_DIFF_TARGET_GREEN}]"
22202178
)
22212179
self._print(m_tree)
2222-
for diff in mismatched_tables:
2223-
self.show_table_diff(
2224-
table_diff=diff,
2180+
for table_diff in mismatched_tables:
2181+
self.show_table_diff_summary(table_diff)
2182+
self.show_schema_diff(table_diff.schema_diff())
2183+
self.show_row_diff(
2184+
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
22252185
show_sample=show_sample,
22262186
skip_grain_check=skip_grain_check,
2227-
temp_schema=temp_schema,
22282187
)
22292188

22302189
def print_environments(self, environments_summary: t.Dict[str, int]) -> None:
@@ -2814,6 +2773,53 @@ def show_model_difference_summary(
28142773
context_diff, modified_snapshots, environment_naming_info, default_catalog, no_diff
28152774
)
28162775

2776+
def show_table_diff(
2777+
self,
2778+
table_diffs: t.List[TableDiff],
2779+
show_sample: bool = True,
2780+
skip_grain_check: bool = False,
2781+
temp_schema: t.Optional[str] = None,
2782+
) -> None:
2783+
"""
2784+
Display the table diff between all mismatched tables.
2785+
"""
2786+
mismatched_tables = []
2787+
fully_matched = []
2788+
for table_diff in table_diffs:
2789+
if (
2790+
table_diff.row_diff(
2791+
temp_schema=temp_schema, skip_grain_check=skip_grain_check
2792+
).full_match_pct
2793+
== 100
2794+
):
2795+
fully_matched.append(table_diff)
2796+
else:
2797+
mismatched_tables.append(table_diff)
2798+
2799+
if fully_matched:
2800+
m_tree = Tree("\n[b]Identical Tables")
2801+
for m in fully_matched:
2802+
m_tree.add(
2803+
f"[{self.TABLE_DIFF_SOURCE_BLUE}]{m.source}[/{self.TABLE_DIFF_SOURCE_BLUE}] - [{self.TABLE_DIFF_TARGET_GREEN}]{m.target}[/{self.TABLE_DIFF_TARGET_GREEN}]"
2804+
)
2805+
self._print(m_tree)
2806+
2807+
if mismatched_tables:
2808+
m_tree = Tree("\n[b]Mismatched Tables")
2809+
for m in mismatched_tables:
2810+
m_tree.add(
2811+
f"[{self.TABLE_DIFF_SOURCE_BLUE}]{m.source}[/{self.TABLE_DIFF_SOURCE_BLUE}] - [{self.TABLE_DIFF_TARGET_GREEN}]{m.target}[/{self.TABLE_DIFF_TARGET_GREEN}]"
2812+
)
2813+
self._print(m_tree)
2814+
for table_diff in mismatched_tables:
2815+
self.show_table_diff_summary(table_diff)
2816+
self.show_schema_diff(table_diff.schema_diff())
2817+
self.show_row_diff(
2818+
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
2819+
show_sample=show_sample,
2820+
skip_grain_check=skip_grain_check,
2821+
)
2822+
28172823
def _print_models_with_threshold(
28182824
self,
28192825
environment_naming_info: EnvironmentNamingInfo,

0 commit comments

Comments
 (0)