From 65663777402c6770b796ca3f65fedc59d756da82 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Tue, 4 Apr 2017 12:19:44 -0700 Subject: [PATCH] [sql lab] fix table dropdown with large schema make UI unresponsive (#2547) Indexing was done on render, moving to doing it only when the data changes. --- .../SqlLab/components/RunQueryActionButton.jsx | 6 +++++- .../assets/javascripts/SqlLab/components/SqlEditor.jsx | 2 +- .../javascripts/SqlLab/components/SqlEditorLeftBar.jsx | 10 +++++----- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx b/superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx index d117318460..9d0865c136 100644 --- a/superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx +++ b/superset/assets/javascripts/SqlLab/components/RunQueryActionButton.jsx @@ -3,12 +3,15 @@ import Button from '../../components/Button'; const propTypes = { allowAsync: PropTypes.bool.isRequired, - dbId: PropTypes.number.isRequired, + dbId: PropTypes.number, queryState: PropTypes.string.isRequired, runQuery: PropTypes.func.isRequired, selectedText: PropTypes.string, stopQuery: PropTypes.func.isRequired, }; +const defaultProps = { + allowAsync: false, +}; export default function RunQueryActionButton(props) { const runBtnText = props.selectedText ? 'Run Selected Query' : 'Run Query'; @@ -69,3 +72,4 @@ export default function RunQueryActionButton(props) { } RunQueryActionButton.propTypes = propTypes; +RunQueryActionButton.defaultProps = defaultProps; diff --git a/superset/assets/javascripts/SqlLab/components/SqlEditor.jsx b/superset/assets/javascripts/SqlLab/components/SqlEditor.jsx index 6765d90121..86ca358a9d 100644 --- a/superset/assets/javascripts/SqlLab/components/SqlEditor.jsx +++ b/superset/assets/javascripts/SqlLab/components/SqlEditor.jsx @@ -148,7 +148,7 @@ class SqlEditor extends React.PureComponent {
({ options: data.options })); } - // TODO: move fetching methods to the actions. fetchTables(dbId, schema, substr) { + // This can be large so it shouldn't be put in the Redux store if (dbId && schema) { this.setState({ tableLoading: true, tableOptions: [] }); const url = `/superset/tables/${dbId}/${schema}/${substr}/`; $.get(url, (data) => { + const filterOptions = createFilterOptions({ options: data.options }); this.setState({ + filterOptions, tableLoading: false, tableOptions: data.options, tableLength: data.tableLength, }); }); } else { - this.setState({ tableLoading: false, tableOptions: [] }); + this.setState({ tableLoading: false, tableOptions: [], filterOptions: null }); } } changeTable(tableOpt) { @@ -126,8 +128,6 @@ class SqlEditorLeftBar extends React.PureComponent { } render() { const shouldShowReset = window.location.search === '?reset=1'; - const options = this.state.tableOptions; - const filterOptions = createFilterOptions({ options }); return (
@@ -173,7 +173,7 @@ class SqlEditorLeftBar extends React.PureComponent { placeholder={`Add a table (${this.state.tableOptions.length})`} autosize={false} onChange={this.changeTable.bind(this)} - filterOptions={filterOptions} + filterOptions={this.state.filterOptions} options={this.state.tableOptions} /> }