Skip to content

Commit 43c9ef2

Browse files
split model diff and table diff functionality
1 parent 104dffc commit 43c9ef2

6 files changed

Lines changed: 221 additions & 262 deletions

File tree

sqlmesh/cli/main.py

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

917916

918917
@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
@@ -2159,30 +2141,6 @@ def show_row_diff(
21592141

21602142

21612143
def show_table_diff(
2162-
self,
2163-
table_diff: TableDiff,
2164-
show_sample: bool = True,
2165-
skip_grain_check: bool = False,
2166-
temp_schema: t.Optional[str] = None,
2167-
) -> None:
2168-
"""Display the table diff between two tables.
2169-
2170-
Args:
2171-
table_diff: The TableDiff object containing schema and summary differences
2172-
show_sample: Show the sample dataframe in the console. Requires show=True.
2173-
skip_grain_check: Skip check for rows that contain null or duplicate grains.
2174-
temp_schema: The schema to use for temporary tables.
2175-
"""
2176-
2177-
self.show_table_diff_summary(table_diff)
2178-
self.show_schema_diff(table_diff.schema_diff())
2179-
self.show_row_diff(
2180-
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
2181-
show_sample=show_sample,
2182-
skip_grain_check=skip_grain_check,
2183-
)
2184-
2185-
def show_impacted_tables_diff(
21862144
self,
21872145
table_diffs: t.List[TableDiff],
21882146
show_sample: bool = True,
@@ -2220,12 +2178,13 @@ def show_impacted_tables_diff(
22202178
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}]"
22212179
)
22222180
self._print(m_tree)
2223-
for diff in mismatched_tables:
2224-
self.show_table_diff(
2225-
table_diff=diff,
2181+
for table_diff in mismatched_tables:
2182+
self.show_table_diff_summary(table_diff)
2183+
self.show_schema_diff(table_diff.schema_diff())
2184+
self.show_row_diff(
2185+
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
22262186
show_sample=show_sample,
22272187
skip_grain_check=skip_grain_check,
2228-
temp_schema=temp_schema,
22292188
)
22302189

22312190
def print_environments(self, environments_summary: t.List[EnvironmentSummary]) -> None:
@@ -2821,6 +2780,53 @@ def show_model_difference_summary(
28212780
context_diff, modified_snapshots, environment_naming_info, default_catalog, no_diff
28222781
)
28232782

2783+
def show_table_diff(
2784+
self,
2785+
table_diffs: t.List[TableDiff],
2786+
show_sample: bool = True,
2787+
skip_grain_check: bool = False,
2788+
temp_schema: t.Optional[str] = None,
2789+
) -> None:
2790+
"""
2791+
Display the table diff between all mismatched tables.
2792+
"""
2793+
mismatched_tables = []
2794+
fully_matched = []
2795+
for table_diff in table_diffs:
2796+
if (
2797+
table_diff.row_diff(
2798+
temp_schema=temp_schema, skip_grain_check=skip_grain_check
2799+
).full_match_pct
2800+
== 100
2801+
):
2802+
fully_matched.append(table_diff)
2803+
else:
2804+
mismatched_tables.append(table_diff)
2805+
2806+
if fully_matched:
2807+
m_tree = Tree("\n[b]Identical Tables")
2808+
for m in fully_matched:
2809+
m_tree.add(
2810+
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}]"
2811+
)
2812+
self._print(m_tree)
2813+
2814+
if mismatched_tables:
2815+
m_tree = Tree("\n[b]Mismatched Tables")
2816+
for m in mismatched_tables:
2817+
m_tree.add(
2818+
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}]"
2819+
)
2820+
self._print(m_tree)
2821+
for table_diff in mismatched_tables:
2822+
self.show_table_diff_summary(table_diff)
2823+
self.show_schema_diff(table_diff.schema_diff())
2824+
self.show_row_diff(
2825+
table_diff.row_diff(temp_schema=temp_schema, skip_grain_check=skip_grain_check),
2826+
show_sample=show_sample,
2827+
skip_grain_check=skip_grain_check,
2828+
)
2829+
28242830
def _print_models_with_threshold(
28252831
self,
28262832
environment_naming_info: EnvironmentNamingInfo,

0 commit comments

Comments
 (0)