codeant-ai-for-open-source[bot] commented on code in PR #44413:
URL: https://github.com/apache/superset/pull/44413#discussion_r4048159823


##########
superset/models/dashboard.py:
##########
@@ -346,21 +347,37 @@ def data(self) -> dict[str, Any]:
 
     def datasets_trimmed_for_slices(
         self,
-    ) -> list[tuple[BaseDatasource, dict[str, Any]]]:
-        slices_by_datasource: dict[int, set[Slice]] = defaultdict(set)
+    ) -> list[tuple[BaseDatasource | SemanticView, dict[str, Any]]]:
+        """Return trimmed chart metadata, keeping datasource types distinct."""
+        slices_by_datasource: dict[tuple[str, int], set[Slice]] = 
defaultdict(set)
 
         for slc in self.slices:
-            slices_by_datasource[slc.datasource_id].add(slc)
+            slices_by_datasource[(slc.datasource_type, 
slc.datasource_id)].add(slc)
 
-        result: list[tuple[BaseDatasource, dict[str, Any]]] = []
+        result: list[tuple[BaseDatasource | SemanticView, dict[str, Any]]] = []
 
         for _, slices in slices_by_datasource.items():
-            # Use the eagerly-loaded datasource from any slice in the group
-            datasource = next(iter(slices)).datasource
+            # Resolve once per typed datasource, retaining eager-loaded tables.
+            datasource: Datasource | None = 
next(iter(slices)).resolved_datasource
 
-            if datasource:
+            if isinstance(datasource, (BaseDatasource, SemanticView)):
                 # Filter out unneeded fields from the datasource payload
-                result.append((datasource, 
datasource.data_for_slices(list(slices))))
+                try:
+                    payload: dict[str, Any] = dict(
+                        datasource.data_for_slices(list(slices))
+                    )
+                except Exception:  # noqa: BLE001
+                    if not isinstance(datasource, SemanticView):
+                        raise
+                    # Provider discovery must not hide other charts' metadata.
+                    # Exception details may contain credentials or provider 
URLs.
+                    logger.warning(
+                        "Could not serialize semantic view id=%s 
layer_uuid=%s",
+                        datasource.id,
+                        datasource.semantic_layer_uuid,
+                    )
+                    continue

Review Comment:
   Yes—the current broad catch is too permissive. Until the discovery layer 
exposes a shared exception contract, the dashboard code cannot safely 
distinguish provider failures from programming or malformed-metadata errors.
   
   The preferred fix is to establish a semantic-layer-specific discovery 
exception at the boundary:
   
   ```python
   class SemanticProviderDiscoveryError(Exception):
       """Expected failure while discovering semantic-view metadata."""
   ```
   
   Provider adapters should translate expected connection, authentication, and 
discovery failures into this exception. `AttributeError`, schema/serialization 
errors, and other unexpected exceptions should remain uncaught and propagate 
normally.
   
   Then narrow the dashboard handling:
   
   ```python
   try:
       payload = dict(datasource.data_for_slices(list(slices)))
   except SemanticProviderDiscoveryError:
       logger.warning(
           "Could not serialize semantic view id=%s layer_uuid=%s",
           datasource.id,
           datasource.semantic_layer_uuid,
       )
       continue
   ```
   
   The regression test should cover both behaviors:
   
   - a `SemanticProviderDiscoveryError` omits only the failed semantic dataset 
and preserves table metadata;
   - an `AttributeError` or malformed payload error propagates.
   
   Using CRUD command exceptions here would be incorrect because discovery has 
a different failure boundary. This contract should be coordinated with the 
provider/discovery ABC owners, after which the dashboard catch can be narrowed 
safely.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to