From e4417acf09bc4b841fce24d98886286880dc0c51 Mon Sep 17 00:00:00 2001 From: Mike Gouline <1960272+gouline@users.noreply.github.com> Date: Fri, 13 Dec 2024 16:57:52 +1100 Subject: [PATCH] remove redundant calls to extract_card_exposures with empty cards --- dbtmetabase/_exposures.py | 44 ++++++++++++++------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/dbtmetabase/_exposures.py b/dbtmetabase/_exposures.py index 842a2d50..2feca9c3 100644 --- a/dbtmetabase/_exposures.py +++ b/dbtmetabase/_exposures.py @@ -140,7 +140,7 @@ def extract_exposures( f"Visualization: {entity.get('display', 'Unknown').title()}" ) - result = self.__extract_card_exposures(ctx, card=entity) + result = self.__extract_card_exposures(ctx, entity) depends.update(result["depends"]) native_query = result["native_query"] @@ -168,12 +168,9 @@ def extract_exposures( if "id" not in card: continue - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card(uid=card["id"]), - )["depends"] - ) + if card := self.metabase.find_card(uid=card["id"]): + result = self.__extract_card_exposures(ctx, card) + depends.update(result["depends"]) else: _logger.warning("Unexpected collection item '%s'", item["model"]) continue @@ -231,11 +228,7 @@ def extract_exposures( return exposures - def __extract_card_exposures( - self, - ctx: __Context, - card: Optional[Mapping], - ) -> Mapping: + def __extract_card_exposures(self, ctx: __Context, card: Mapping) -> Mapping: """Extracts exposures from Metabase questions.""" depends = set() @@ -251,14 +244,11 @@ def __extract_card_exposures( if str(query_source).startswith("card__"): # Handle questions based on other questions - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card( - uid=query_source.split("__")[-1] - ), - )["depends"] - ) + if source_card := self.metabase.find_card( + uid=query_source.split("__")[-1] + ): + result = self.__extract_card_exposures(ctx, source_card) + depends.update(result["depends"]) elif query_source in ctx.table_names: # Normal question source_table = ctx.table_names.get(query_source) @@ -273,14 +263,12 @@ def __extract_card_exposures( if str(join_source).startswith("card__"): # Handle questions based on other questions - depends.update( - self.__extract_card_exposures( - ctx, - card=self.metabase.find_card( - uid=join_source.split("__")[-1] - ), - )["depends"] - ) + if source_card := self.metabase.find_card( + uid=join_source.split("__")[-1] + ): + result = self.__extract_card_exposures(ctx, source_card) + depends.update(result["depends"]) + continue # Joined model parsed