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

erikrit 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 4281ad5  chore: type ResultSet.tsx (#10226)
4281ad5 is described below

commit 4281ad5486f976107b3fb3637519defe63133b9b
Author: Erik Ritter <erik.rit...@airbnb.com>
AuthorDate: Thu Jul 2 10:12:31 2020 -0700

    chore: type ResultSet.tsx (#10226)
---
 .../spec/javascripts/sqllab/fixtures.js            |   4 +-
 superset-frontend/src/SqlLab/actions/sqlLab.js     |   2 +-
 .../components/{ResultSet.jsx => ResultSet.tsx}    | 108 ++++++++++-----------
 .../src/SqlLab/components/SqlEditor.jsx            |   2 +-
 superset-frontend/src/SqlLab/reducers/sqlLab.js    |   8 +-
 superset-frontend/src/SqlLab/types.ts              |  57 +++++++++++
 6 files changed, 117 insertions(+), 64 deletions(-)

diff --git a/superset-frontend/spec/javascripts/sqllab/fixtures.js 
b/superset-frontend/spec/javascripts/sqllab/fixtures.js
index a88f938..45bbb2e 100644
--- a/superset-frontend/spec/javascripts/sqllab/fixtures.js
+++ b/superset-frontend/spec/javascripts/sqllab/fixtures.js
@@ -387,7 +387,7 @@ export const stoppedQuery = {
   startDttm: 1497400851936,
   state: 'stopped',
   tab: 'Untitled Query 2',
-  tempTableName: '',
+  tempTable: '',
 };
 export const runningQuery = {
   dbId: 1,
@@ -428,7 +428,7 @@ export const query = {
   sql: 'SELECT * FROM something',
   sqlEditorId: defaultQueryEditor.id,
   tab: 'unimportant',
-  tempTableName: null,
+  tempTable: null,
   runAsync: false,
   ctas: false,
   cached: false,
diff --git a/superset-frontend/src/SqlLab/actions/sqlLab.js 
b/superset-frontend/src/SqlLab/actions/sqlLab.js
index 8f9f509..e38a4fe 100644
--- a/superset-frontend/src/SqlLab/actions/sqlLab.js
+++ b/superset-frontend/src/SqlLab/actions/sqlLab.js
@@ -350,7 +350,7 @@ export function runQuery(query) {
       sql: query.sql,
       sql_editor_id: query.sqlEditorId,
       tab: query.tab,
-      tmp_table_name: query.tempTableName,
+      tmp_table_name: query.tempTable,
       select_as_cta: query.ctas,
       ctas_method: query.ctas_method,
       templateParams: query.templateParams,
diff --git a/superset-frontend/src/SqlLab/components/ResultSet.jsx 
b/superset-frontend/src/SqlLab/components/ResultSet.tsx
similarity index 84%
rename from superset-frontend/src/SqlLab/components/ResultSet.jsx
rename to superset-frontend/src/SqlLab/components/ResultSet.tsx
index 5dd3469..75273b3 100644
--- a/superset-frontend/src/SqlLab/components/ResultSet.jsx
+++ b/superset-frontend/src/SqlLab/components/ResultSet.tsx
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import React from 'react';
-import PropTypes from 'prop-types';
+import React, { CSSProperties } from 'react';
 import { Alert, Button, ButtonGroup, ProgressBar } from 'react-bootstrap';
 import shortid from 'shortid';
 import { t } from '@superset-ui/translation';
@@ -31,40 +30,50 @@ import QueryStateLabel from './QueryStateLabel';
 import CopyToClipboard from '../../components/CopyToClipboard';
 import { prepareCopyToClipboardTabularData } from '../../utils/common';
 import { CtasEnum } from '../actions/sqlLab';
-
-const propTypes = {
-  actions: PropTypes.object,
-  csv: PropTypes.bool,
-  query: PropTypes.object,
-  search: PropTypes.bool,
-  showSql: PropTypes.bool,
-  visualize: PropTypes.bool,
-  cache: PropTypes.bool,
-  height: PropTypes.number.isRequired,
-  database: PropTypes.object,
-  displayLimit: PropTypes.number.isRequired,
-};
-const defaultProps = {
-  search: true,
-  visualize: true,
-  showSql: false,
-  csv: true,
-  actions: {},
-  cache: false,
-  database: {},
-};
+import { Query } from '../types';
 
 const SEARCH_HEIGHT = 46;
 
-const LOADING_STYLES = { position: 'relative', minHeight: 100 };
+const LOADING_STYLES: CSSProperties = { position: 'relative', minHeight: 100 };
+
+interface ResultSetProps {
+  actions: Record<string, any>;
+  cache?: boolean;
+  csv?: boolean;
+  database?: Record<string, any>;
+  displayLimit: number;
+  height: number;
+  query: Query;
+  search?: boolean;
+  showSql?: boolean;
+  visualize?: boolean;
+}
 
-export default class ResultSet extends React.PureComponent {
-  constructor(props) {
+interface ResultSetState {
+  searchText: string;
+  showExploreResultsButton: boolean;
+  data: Record<string, any>[];
+}
+
+export default class ResultSet extends React.PureComponent<
+  ResultSetProps,
+  ResultSetState
+> {
+  static defaultProps = {
+    cache: false,
+    csv: true,
+    database: {},
+    search: true,
+    showSql: false,
+    visualize: true,
+  };
+
+  constructor(props: ResultSetProps) {
     super(props);
     this.state = {
       searchText: '',
       showExploreResultsButton: false,
-      data: null,
+      data: [],
     };
 
     this.changeSearch = this.changeSearch.bind(this);
@@ -79,7 +88,7 @@ export default class ResultSet extends React.PureComponent {
     // only do this the first time the component is rendered/mounted
     this.reRunQueryIfSessionTimeoutErrorOnMount();
   }
-  UNSAFE_componentWillReceiveProps(nextProps) {
+  UNSAFE_componentWillReceiveProps(nextProps: ResultSetProps) {
     // when new results comes in, save them locally and clear in store
     if (
       this.props.cache &&
@@ -88,8 +97,7 @@ export default class ResultSet extends React.PureComponent {
       nextProps.query.results.data &&
       nextProps.query.results.data.length > 0
     ) {
-      this.setState(
-        { data: nextProps.query.results.data },
+      this.setState({ data: nextProps.query.results.data }, () =>
         this.clearQueryResults(nextProps.query),
       );
     }
@@ -100,16 +108,16 @@ export default class ResultSet extends 
React.PureComponent {
       this.fetchResults(nextProps.query);
     }
   }
-  clearQueryResults(query) {
+  clearQueryResults(query: Query) {
     this.props.actions.clearQueryResults(query);
   }
-  popSelectStar(tmpSchema, tmpTable) {
+  popSelectStar(tempSchema: string | null, tempTable: string) {
     const qe = {
       id: shortid.generate(),
-      title: tmpTable,
+      title: tempTable,
       autorun: false,
       dbId: this.props.query.dbId,
-      sql: `SELECT * FROM ${tmpSchema}.${tmpTable}`,
+      sql: `SELECT * FROM ${tempSchema ? `${tempSchema}.` : ''}${tempTable}`,
     };
     this.props.actions.addQueryEditor(qe);
   }
@@ -118,13 +126,13 @@ export default class ResultSet extends 
React.PureComponent {
       showExploreResultsButton: !this.state.showExploreResultsButton,
     });
   }
-  changeSearch(event) {
+  changeSearch(event: React.ChangeEvent<HTMLInputElement>) {
     this.setState({ searchText: event.target.value });
   }
-  fetchResults(query) {
+  fetchResults(query: Query) {
     this.props.actions.fetchQueryResults(query, this.props.displayLimit);
   }
-  reFetchQueryResults(query) {
+  reFetchQueryResults(query: Query) {
     this.props.actions.reFetchQueryResults(query);
   }
   reRunQueryIfSessionTimeoutErrorOnMount() {
@@ -218,14 +226,7 @@ export default class ResultSet extends React.PureComponent 
{
         </Alert>
       );
     } else if (query.state === 'success' && query.ctas) {
-      // Async queries
-      let tmpSchema = query.tempSchema;
-      let tmpTable = query.tempTableName;
-      // Sync queries, query.results.query contains the source of truth for 
them.
-      if (query.results && query.results.query) {
-        tmpTable = query.results.query.tempTable;
-        tmpSchema = query.results.query.tempSchema;
-      }
+      const { tempSchema, tempTable } = query;
       let object = 'Table';
       if (query.ctas_method === CtasEnum.VIEW) {
         object = 'View';
@@ -235,20 +236,21 @@ export default class ResultSet extends 
React.PureComponent {
           <Alert bsStyle="info">
             {t(object)} [
             <strong>
-              {tmpSchema}.{tmpTable}
+              {tempSchema ? `${tempSchema}.` : ''}
+              {tempTable}
             </strong>
             ] {t('was created')} &nbsp;
             <ButtonGroup>
               <Button
                 bsSize="small"
                 className="m-r-5"
-                onClick={() => this.popSelectStar(tmpSchema, tmpTable)}
+                onClick={() => this.popSelectStar(tempSchema, tempTable)}
               >
                 {t('Query in a new tab')}
               </Button>
               <ExploreCtasResultsButton
-                table={tmpTable}
-                schema={tmpSchema}
+                table={tempTable}
+                schema={tempSchema}
                 dbId={exploreDBId}
                 database={this.props.database}
                 actions={this.props.actions}
@@ -333,9 +335,7 @@ export default class ResultSet extends React.PureComponent {
       trackingUrl = (
         <Button
           bsSize="small"
-          onClick={() => {
-            window.open(query.trackingUrl);
-          }}
+          onClick={() => query.trackingUrl && window.open(query.trackingUrl)}
         >
           {t('Track Job')}
         </Button>
@@ -358,5 +358,3 @@ export default class ResultSet extends React.PureComponent {
     );
   }
 }
-ResultSet.propTypes = propTypes;
-ResultSet.defaultProps = defaultProps;
diff --git a/superset-frontend/src/SqlLab/components/SqlEditor.jsx 
b/superset-frontend/src/SqlLab/components/SqlEditor.jsx
index 54f729c..5f78f41 100644
--- a/superset-frontend/src/SqlLab/components/SqlEditor.jsx
+++ b/superset-frontend/src/SqlLab/components/SqlEditor.jsx
@@ -293,7 +293,7 @@ class SqlEditor extends React.PureComponent {
       sqlEditorId: qe.id,
       tab: qe.title,
       schema: qe.schema,
-      tempTableName: ctas ? this.state.ctas : '',
+      tempTable: ctas ? this.state.ctas : '',
       templateParams: qe.templateParams,
       queryLimit: qe.queryLimit || this.props.defaultQueryLimit,
       runAsync: this.props.database
diff --git a/superset-frontend/src/SqlLab/reducers/sqlLab.js 
b/superset-frontend/src/SqlLab/reducers/sqlLab.js
index 3dbd45f..6257ce8 100644
--- a/superset-frontend/src/SqlLab/reducers/sqlLab.js
+++ b/superset-frontend/src/SqlLab/reducers/sqlLab.js
@@ -324,16 +324,14 @@ export default function sqlLabReducer(state = {}, action) 
{
       });
     },
     [actions.QUERY_SUCCESS]() {
-      let rows;
-      if (action.results.data) {
-        rows = action.results.data.length;
-      }
       const alts = {
         endDttm: now(),
         progress: 100,
         results: action.results,
-        rows,
+        rows: action?.results?.data?.length,
         state: 'success',
+        tempSchema: action?.results?.query?.tempSchema,
+        tempTable: action?.results?.query?.tempTable,
         errorMessage: null,
         cached: false,
       };
diff --git a/superset-frontend/src/SqlLab/types.ts 
b/superset-frontend/src/SqlLab/types.ts
new file mode 100644
index 0000000..3b1c4e1
--- /dev/null
+++ b/superset-frontend/src/SqlLab/types.ts
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { CtasEnum } from './actions/sqlLab';
+
+export type Column = {
+  name: string;
+};
+
+export type Query = {
+  cached: boolean;
+  ctas: boolean;
+  ctas_method?: keyof typeof CtasEnum;
+  dbId: number;
+  errorMessage: string | null;
+  extra: {
+    progress: string | null;
+  };
+  id: string;
+  isDataPreview: boolean;
+  link?: string;
+  progress: number;
+  results: {
+    columns: Column[];
+    data: Record<string, unknown>[];
+    expanded_columns: Column[];
+  };
+  resultsKey: string | null;
+  sql: string;
+  sqlEditorId: string;
+  state:
+    | 'stopped'
+    | 'failed'
+    | 'pending'
+    | 'running'
+    | 'scheduled'
+    | 'success'
+    | 'timed_out';
+  tempSchema: string | null;
+  tempTable: string;
+  trackingUrl: string | null;
+};

Reply via email to