You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ma...@apache.org on 2020/06/25 19:20:29 UTC

[incubator-superset] branch master updated: fix: [search query view] edit link is broken (#10128)

This is an automated email from the ASF dual-hosted git repository.

maximebeauchemin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 1781ebb  fix: [search query view] edit link is broken (#10128)
1781ebb is described below

commit 1781ebbaa40b0bad89ea101ca91431cb07b9dbed
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Thu Jun 25 12:20:10 2020 -0700

    fix: [search query view] edit link is broken (#10128)
    
    * fix: [search query view] edit link is broken
    
    * eslint + mypy
    
    * rever app.py changes
    
    * addressing comments
    
    * use api/v1/query
    
    * fix test
---
 setup.cfg                                          |  2 +-
 superset-frontend/src/SqlLab/actions/sqlLab.js     | 24 ++++++++++++++++++++--
 .../src/SqlLab/components/QueryTable.jsx           | 19 +++++------------
 .../src/SqlLab/components/RunQueryActionButton.tsx |  2 +-
 .../src/SqlLab/components/TabbedSqlEditors.jsx     | 10 ++++++++-
 superset/models/sql_lab.py                         |  1 +
 superset/queries/api.py                            |  1 +
 tests/queries/api_tests.py                         |  4 +++-
 8 files changed, 43 insertions(+), 20 deletions(-)

diff --git a/setup.cfg b/setup.cfg
index eef0e37..e7eedf7 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -45,7 +45,7 @@ combine_as_imports = true
 include_trailing_comma = true
 line_length = 88
 known_first_party = superset
-known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,geohash,geopy,humanize,isodate,jinja2,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parsedatetime,pathlib2,polyline,prison,pyarrow,pyhive,pytz,retry,selenium,setuptools,simplejson,slack,sphinx_rtd_theme,sqlalchemy,s [...]
+known_third_party =alembic,apispec,backoff,bleach,cachelib,celery,click,colorama,contextlib2,croniter,cryptography,dateutil,flask,flask_appbuilder,flask_babel,flask_caching,flask_compress,flask_login,flask_migrate,flask_sqlalchemy,flask_talisman,flask_testing,flask_wtf,geohash,geopy,humanize,isodate,jinja2,markdown,markupsafe,marshmallow,msgpack,numpy,pandas,parameterized,parsedatetime,pathlib2,polyline,prison,pyarrow,pyhive,pytz,retry,selenium,setuptools,simplejson,slack,sphinx_rtd_them [...]
 multi_line_output = 3
 order_by_type = false
 
diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.js b/superset-frontend/src/SqlLab/actions/sqlLab.js
index 122d9ec..8f9f509 100644
--- a/superset-frontend/src/SqlLab/actions/sqlLab.js
+++ b/superset-frontend/src/SqlLab/actions/sqlLab.js
@@ -101,6 +101,7 @@ export const CtasEnum = {
   TABLE: 'TABLE',
   VIEW: 'VIEW',
 };
+const ERR_MSG_CANT_LOAD_QUERY = t("The query couldn't be loaded");
 
 // a map of SavedQuery field names to the different names used client-side,
 // because for now making the names consistent is too complicated
@@ -1182,7 +1183,7 @@ export function popStoredQuery(urlId) {
           }),
         ),
       )
-      .catch(() => dispatch(addDangerToast(t("The query couldn't be loaded"))));
+      .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
   };
 }
 export function popSavedQuery(saveQueryId) {
@@ -1197,7 +1198,26 @@ export function popSavedQuery(saveQueryId) {
         };
         return dispatch(addQueryEditor(queryEditorProps));
       })
-      .catch(() => dispatch(addDangerToast(t("The query couldn't be loaded"))));
+      .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
+  };
+}
+export function popQuery(queryId) {
+  return function (dispatch) {
+    return SupersetClient.get({
+      endpoint: `/api/v1/query/${queryId}`,
+    })
+      .then(({ json }) => {
+        const queryData = json.result;
+        const queryEditorProps = {
+          dbId: queryData.database.id,
+          schema: queryData.schema,
+          sql: queryData.sql,
+          title: `Copy of ${queryData.tab_name}`,
+          autorun: false,
+        };
+        return dispatch(addQueryEditor(queryEditorProps));
+      })
+      .catch(() => dispatch(addDangerToast(ERR_MSG_CANT_LOAD_QUERY)));
   };
 }
 export function popDatasourceQuery(datasourceKey, sql) {
diff --git a/superset-frontend/src/SqlLab/components/QueryTable.jsx b/superset-frontend/src/SqlLab/components/QueryTable.jsx
index b16aad4..3e227df 100644
--- a/superset-frontend/src/SqlLab/components/QueryTable.jsx
+++ b/superset-frontend/src/SqlLab/components/QueryTable.jsx
@@ -28,7 +28,6 @@ import ResultSet from './ResultSet';
 import ModalTrigger from '../../components/ModalTrigger';
 import HighlightedSql from './HighlightedSql';
 import { fDuration } from '../../modules/dates';
-import { storeQuery } from '../../utils/common';
 import QueryStateLabel from './QueryStateLabel';
 
 const propTypes = {
@@ -57,18 +56,10 @@ class QueryTable extends React.PureComponent {
       activeQuery: null,
     };
   }
-  callback(url) {
+  openQuery(id) {
+    const url = `/superset/sqllab?queryId=${id}`;
     window.open(url);
   }
-  openQuery(dbId, schema, sql) {
-    const newQuery = {
-      dbId,
-      title: t('Untitled Query'),
-      schema,
-      sql,
-    };
-    storeQuery(newQuery).then(url => this.callback(url));
-  }
   hideVisualizeModal() {
     this.setState({ showVisualizeModal: false });
   }
@@ -127,10 +118,10 @@ class QueryTable extends React.PureComponent {
           <div style={{ width: '100px' }}>
             <button
               className="btn btn-link btn-xs"
-              onClick={this.openQuery.bind(this, q.dbId, q.schema, q.sql)}
+              onClick={this.openQuery.bind(this, q.queryId)}
             >
-              <i className="fa fa-external-link" />
-              {t('Open in SQL Editor')}
+              <i className="fa fa-external-link m-r-3" />
+              {t('Edit')}
             </button>
           </div>
         );
diff --git a/superset-frontend/src/SqlLab/components/RunQueryActionButton.tsx b/superset-frontend/src/SqlLab/components/RunQueryActionButton.tsx
index d6c1974..f1b4c5c 100644
--- a/superset-frontend/src/SqlLab/components/RunQueryActionButton.tsx
+++ b/superset-frontend/src/SqlLab/components/RunQueryActionButton.tsx
@@ -40,7 +40,7 @@ const RunQueryActionButton = ({
   runQuery = NO_OP,
   selectedText,
   stopQuery = NO_OP,
-  sql,
+  sql = '',
 }: Props) => {
   const runBtnText = selectedText ? t('Run Selected Query') : t('Run');
   const btnStyle = selectedText ? 'warning' : 'primary';
diff --git a/superset-frontend/src/SqlLab/components/TabbedSqlEditors.jsx b/superset-frontend/src/SqlLab/components/TabbedSqlEditors.jsx
index dc7d557..6fda416 100644
--- a/superset-frontend/src/SqlLab/components/TabbedSqlEditors.jsx
+++ b/superset-frontend/src/SqlLab/components/TabbedSqlEditors.jsx
@@ -108,11 +108,19 @@ class TabbedSqlEditors extends React.PureComponent {
     };
 
     // Popping a new tab based on the querystring
-    if (query.id || query.sql || query.savedQueryId || query.datasourceKey) {
+    if (
+      query.id ||
+      query.sql ||
+      query.savedQueryId ||
+      query.datasourceKey ||
+      query.queryId
+    ) {
       if (query.id) {
         this.props.actions.popStoredQuery(query.id);
       } else if (query.savedQueryId) {
         this.props.actions.popSavedQuery(query.savedQueryId);
+      } else if (query.queryId) {
+        this.props.actions.popQuery(query.queryId);
       } else if (query.datasourceKey) {
         this.props.actions.popDatasourceQuery(query.datasourceKey, query.sql);
       } else if (query.sql) {
diff --git a/superset/models/sql_lab.py b/superset/models/sql_lab.py
index 886d0c5..414dec4 100644
--- a/superset/models/sql_lab.py
+++ b/superset/models/sql_lab.py
@@ -112,6 +112,7 @@ class Query(Model, ExtraJSONMixin):
             "errorMessage": self.error_message,
             "executedSql": self.executed_sql,
             "id": self.client_id,
+            "queryId": self.id,
             "limit": self.limit,
             "progress": self.progress,
             "rows": self.rows,
diff --git a/superset/queries/api.py b/superset/queries/api.py
index 0d49bc3..7f2b32e 100644
--- a/superset/queries/api.py
+++ b/superset/queries/api.py
@@ -49,6 +49,7 @@ class QueryRestApi(BaseSupersetModelRestApi):
         "status",
         "tab_name",
         "sql_editor_id",
+        "database.id",
         "schema",
         "sql",
         "select_sql",
diff --git a/tests/queries/api_tests.py b/tests/queries/api_tests.py
index 4f43c77..5016812 100644
--- a/tests/queries/api_tests.py
+++ b/tests/queries/api_tests.py
@@ -78,8 +78,9 @@ class QueryApiTests(SupersetTestCase):
         """
         admin = self.get_user("admin")
         client_id = self.get_random_string()
+        example_db = get_example_database()
         query = self.insert_query(
-            get_example_database().id,
+            example_db.id,
             admin.id,
             client_id,
             sql="SELECT col1, col2 from table1",
@@ -92,6 +93,7 @@ class QueryApiTests(SupersetTestCase):
         self.assertEqual(rv.status_code, 200)
 
         expected_result = {
+            "database": {"id": example_db.id},
             "client_id": client_id,
             "end_result_backend_time": None,
             "error_message": None,