korbit-ai[bot] commented on code in PR #33341:
URL: https://github.com/apache/superset/pull/33341#discussion_r2070956796


##########
superset-frontend/src/explore/components/controls/ViewQuery.tsx:
##########
@@ -51,25 +53,92 @@ const StyledSyntaxContainer = styled.div`
   flex-direction: column;
 `;
 
+const StyledHeaderMenuContainer = styled.div`
+  display: flex;
+  flex-direction: row;
+  column-gap: ${({ theme }) => theme.gridUnit * 2}px;
+  margin-top: ${({ theme }) => -theme.gridUnit * 4}px;
+  align-items: baseline;
+`;
+
 const StyledSyntaxHighlighter = styled(SyntaxHighlighter)`
   flex: 1;
 `;
 
 const ViewQuery: FC<ViewQueryProps> = props => {
-  const { sql, language = 'sql' } = props;
+  const { sql, language = 'sql', datasource } = props;
+  const datasetId = datasource.split('__')[0];

Review Comment:
   ### Unexplained Magic String Separator <sub>![category 
Readability](https://img.shields.io/badge/Readability-0284c7)</sub>
   
   <details>
     <summary>Tell me more</summary>
   
   ###### What is the issue?
   Magic string separator '__' is hardcoded without explanation of its 
significance in parsing the datasource identifier.
   
   ###### Why this matters
   Future developers may not understand the format of datasource identifiers, 
making maintenance risky and debugging harder.
   
   ###### Suggested change ∙ *Feature Preview*
   Extract the separator into a named constant with a descriptive name:
   ```typescript
   const DATASOURCE_ID_SEPARATOR = '__';
   const datasetId = datasource.split(DATASOURCE_ID_SEPARATOR)[0];
   ```
   
   
   ###### Provide feedback to improve future suggestions
   [![Nice 
Catch](https://img.shields.io/badge/👍%20Nice%20Catch-71BC78)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/2fe9cd54-19ac-40da-bcd0-aa3443b507c5/upvote)
 
[![Incorrect](https://img.shields.io/badge/👎%20Incorrect-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/2fe9cd54-19ac-40da-bcd0-aa3443b507c5?what_not_true=true)
  [![Not in 
Scope](https://img.shields.io/badge/👎%20Out%20of%20PR%20scope-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/2fe9cd54-19ac-40da-bcd0-aa3443b507c5?what_out_of_scope=true)
 [![Not in coding 
standard](https://img.shields.io/badge/👎%20Not%20in%20our%20standards-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/2fe9cd54-19ac-40da-bcd0-aa3443b507c5?what_not_in_standard=true)
 
[![Other](https://img.shields.io/badge/👎%20Other-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/2fe9cd54-19ac-40da-bcd0-aa3443b507c5)
   </details>
   
   <sub>
   
   💬 Looking for more details? Reply to this comment to chat with Korbit.
   </sub>
   
   <!--- korbi internal id:949df9d7-c3e9-4e3c-a779-6d982bc2a357 -->
   
   
   [](949df9d7-c3e9-4e3c-a779-6d982bc2a357)



##########
superset-frontend/src/explore/components/controls/ViewQuery.tsx:
##########
@@ -51,25 +53,92 @@ const StyledSyntaxContainer = styled.div`
   flex-direction: column;
 `;
 
+const StyledHeaderMenuContainer = styled.div`
+  display: flex;
+  flex-direction: row;
+  column-gap: ${({ theme }) => theme.gridUnit * 2}px;
+  margin-top: ${({ theme }) => -theme.gridUnit * 4}px;
+  align-items: baseline;
+`;
+
 const StyledSyntaxHighlighter = styled(SyntaxHighlighter)`
   flex: 1;
 `;
 
 const ViewQuery: FC<ViewQueryProps> = props => {
-  const { sql, language = 'sql' } = props;
+  const { sql, language = 'sql', datasource } = props;
+  const datasetId = datasource.split('__')[0];
+  const [formattedSQL, setFormattedSQL] = useState<string>();
+  const [showFormatSQL, setShowFormatSQL] = useState(false);
+  const history = useHistory();
+  const currentSQL = (showFormatSQL ? formattedSQL : sql) ?? sql;
+
+  const formatCurrentQuery = useCallback(() => {
+    if (formattedSQL) {
+      setShowFormatSQL(val => !val);
+    } else {
+      const queryParams = rison.encode({
+        keys: ['none'],
+        columns: ['database.backend'],
+      });
+      SupersetClient.get({
+        endpoint: `/api/v1/dataset/${datasetId}?q=${queryParams}`,
+      }).then(({ json }) => {
+        SupersetClient.post({
+          endpoint: `/api/v1/sqllab/format_sql/`,
+          body: JSON.stringify({
+            sql,
+            engine: json.result.database.backend,
+          }),
+          headers: { 'Content-Type': 'application/json' },
+        }).then(({ json }) => {
+          setFormattedSQL(json.result);
+          setShowFormatSQL(true);
+        });
+      });

Review Comment:
   ### Missing Error Handling in API Calls <sub>![category Error 
Handling](https://img.shields.io/badge/Error%20Handling-ea580c)</sub>
   
   <details>
     <summary>Tell me more</summary>
   
   ###### What is the issue?
   The API calls lack error handling, which could lead to unhandled exceptions 
if the network requests fail or return unexpected responses.
   
   ###### Why this matters
   Users won't receive any feedback if the SQL formatting fails, and the 
application might appear unresponsive.
   
   ###### Suggested change ∙ *Feature Preview*
   Add error handling to the API calls:
   ```typescript
   formatCurrentQuery = useCallback(() => {
       if (formattedSQL) {
         setShowFormatSQL(val => !val);
       } else {
         const queryParams = rison.encode({
           keys: ['none'],
           columns: ['database.backend'],
         });
         SupersetClient.get({
           endpoint: `/api/v1/dataset/${datasetId}?q=${queryParams}`,
         })
           .then(({ json }) => {
             return SupersetClient.post({
               endpoint: '/api/v1/sqllab/format_sql/',
               body: JSON.stringify({
                 sql,
                 engine: json.result.database.backend,
               }),
               headers: { 'Content-Type': 'application/json' },
             });
           })
           .then(({ json }) => {
             setFormattedSQL(json.result);
             setShowFormatSQL(true);
           })
           .catch(error => {
             // Handle the error appropriately, e.g., show a notification
             console.error('Failed to format SQL:', error);
           });
       }
     }, [sql, datasetId, formattedSQL]);
   ```
   
   
   ###### Provide feedback to improve future suggestions
   [![Nice 
Catch](https://img.shields.io/badge/👍%20Nice%20Catch-71BC78)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/46e59f53-7820-400d-91ea-2754a37000a2/upvote)
 
[![Incorrect](https://img.shields.io/badge/👎%20Incorrect-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/46e59f53-7820-400d-91ea-2754a37000a2?what_not_true=true)
  [![Not in 
Scope](https://img.shields.io/badge/👎%20Out%20of%20PR%20scope-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/46e59f53-7820-400d-91ea-2754a37000a2?what_out_of_scope=true)
 [![Not in coding 
standard](https://img.shields.io/badge/👎%20Not%20in%20our%20standards-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/46e59f53-7820-400d-91ea-2754a37000a2?what_not_in_standard=true)
 
[![Other](https://img.shields.io/badge/👎%20Other-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/46e59f53-7820-400d-91ea-2754a37000a2)
   </details>
   
   <sub>
   
   💬 Looking for more details? Reply to this comment to chat with Korbit.
   </sub>
   
   <!--- korbi internal id:9886e005-bb5b-433d-83f2-debdb8ce548e -->
   
   
   [](9886e005-bb5b-433d-83f2-debdb8ce548e)



##########
superset-frontend/src/explore/components/controls/ViewQuery.tsx:
##########
@@ -51,25 +53,92 @@ const StyledSyntaxContainer = styled.div`
   flex-direction: column;
 `;
 
+const StyledHeaderMenuContainer = styled.div`
+  display: flex;
+  flex-direction: row;
+  column-gap: ${({ theme }) => theme.gridUnit * 2}px;
+  margin-top: ${({ theme }) => -theme.gridUnit * 4}px;
+  align-items: baseline;
+`;
+
 const StyledSyntaxHighlighter = styled(SyntaxHighlighter)`
   flex: 1;
 `;
 
 const ViewQuery: FC<ViewQueryProps> = props => {
-  const { sql, language = 'sql' } = props;
+  const { sql, language = 'sql', datasource } = props;
+  const datasetId = datasource.split('__')[0];
+  const [formattedSQL, setFormattedSQL] = useState<string>();
+  const [showFormatSQL, setShowFormatSQL] = useState(false);
+  const history = useHistory();
+  const currentSQL = (showFormatSQL ? formattedSQL : sql) ?? sql;
+
+  const formatCurrentQuery = useCallback(() => {
+    if (formattedSQL) {
+      setShowFormatSQL(val => !val);
+    } else {
+      const queryParams = rison.encode({
+        keys: ['none'],
+        columns: ['database.backend'],
+      });

Review Comment:
   ### Unexplained API Query Parameters <sub>![category 
Readability](https://img.shields.io/badge/Readability-0284c7)</sub>
   
   <details>
     <summary>Tell me more</summary>
   
   ###### What is the issue?
   Magic values 'none' and 'database.backend' are hardcoded without explanation 
of their purpose in the API query.
   
   ###### Why this matters
   The meaning and necessity of these specific query parameters is unclear, 
making the code harder to maintain or modify correctly.
   
   ###### Suggested change ∙ *Feature Preview*
   Extract these values into named constants with descriptive names:
   ```typescript
   const DATASET_QUERY_PARAMS = {
     KEYS: ['none'],
     REQUIRED_COLUMNS: ['database.backend'],
   };
   const queryParams = rison.encode(DATASET_QUERY_PARAMS);
   ```
   
   
   ###### Provide feedback to improve future suggestions
   [![Nice 
Catch](https://img.shields.io/badge/👍%20Nice%20Catch-71BC78)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ff8b6658-d817-40eb-a6e8-acfb253f33d2/upvote)
 
[![Incorrect](https://img.shields.io/badge/👎%20Incorrect-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ff8b6658-d817-40eb-a6e8-acfb253f33d2?what_not_true=true)
  [![Not in 
Scope](https://img.shields.io/badge/👎%20Out%20of%20PR%20scope-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ff8b6658-d817-40eb-a6e8-acfb253f33d2?what_out_of_scope=true)
 [![Not in coding 
standard](https://img.shields.io/badge/👎%20Not%20in%20our%20standards-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ff8b6658-d817-40eb-a6e8-acfb253f33d2?what_not_in_standard=true)
 
[![Other](https://img.shields.io/badge/👎%20Other-white)](https://app.korbit.ai/feedback/aa91ff46-6083-4491-9416-b83dd1994b51/ff8b6658-d817-40eb-a6e8-acfb253f33d2)
   </details>
   
   <sub>
   
   💬 Looking for more details? Reply to this comment to chat with Korbit.
   </sub>
   
   <!--- korbi internal id:a61fa4a9-ef03-45c0-9190-371b8e594489 -->
   
   
   [](a61fa4a9-ef03-45c0-9190-371b8e594489)



-- 
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: notifications-unsubscr...@superset.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@superset.apache.org
For additional commands, e-mail: notifications-h...@superset.apache.org

Reply via email to