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 2019/06/01 16:02:50 UTC
[incubator-superset] branch master updated: Wrapping up #7130
(#7633)
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 687f205 Wrapping up #7130 (#7633)
687f205 is described below
commit 687f20550891769062e856a7e4d81db6a5dfde47
Author: Maxime Beauchemin <ma...@gmail.com>
AuthorDate: Sat Jun 1 09:02:42 2019 -0700
Wrapping up #7130 (#7633)
* [SQL Lab] Adds autocomplete on table names and auto-add to schema browser
Closes #7059
* Wrapping up #7130
For more details see #7130, this PR addresses the merge conflicts.
---
superset/assets/src/SqlLab/actions/sqlLab.js | 10 ++++++++
.../src/SqlLab/components/AceEditorWrapper.jsx | 28 ++++++++++++++++++----
.../assets/src/SqlLab/components/SqlEditor.jsx | 4 +++-
.../src/SqlLab/components/SqlEditorLeftBar.jsx | 10 ++++++++
superset/assets/src/SqlLab/reducers/sqlLab.js | 6 +++++
superset/assets/src/components/TableSelector.jsx | 6 +++++
6 files changed, 59 insertions(+), 5 deletions(-)
diff --git a/superset/assets/src/SqlLab/actions/sqlLab.js b/superset/assets/src/SqlLab/actions/sqlLab.js
index 9c5a9d0..8172c49 100644
--- a/superset/assets/src/SqlLab/actions/sqlLab.js
+++ b/superset/assets/src/SqlLab/actions/sqlLab.js
@@ -42,6 +42,8 @@ export const EXPAND_TABLE = 'EXPAND_TABLE';
export const COLLAPSE_TABLE = 'COLLAPSE_TABLE';
export const QUERY_EDITOR_SETDB = 'QUERY_EDITOR_SETDB';
export const QUERY_EDITOR_SET_SCHEMA = 'QUERY_EDITOR_SET_SCHEMA';
+export const QUERY_EDITOR_SET_SCHEMA_OPTIONS = 'QUERY_EDITOR_SET_SCHEMA_OPTIONS';
+export const QUERY_EDITOR_SET_TABLE_OPTIONS = 'QUERY_EDITOR_SET_TABLE_OPTIONS';
export const QUERY_EDITOR_SET_TITLE = 'QUERY_EDITOR_SET_TITLE';
export const QUERY_EDITOR_SET_AUTORUN = 'QUERY_EDITOR_SET_AUTORUN';
export const QUERY_EDITOR_SET_SQL = 'QUERY_EDITOR_SET_SQL';
@@ -305,6 +307,14 @@ export function queryEditorSetSchema(queryEditor, schema) {
return { type: QUERY_EDITOR_SET_SCHEMA, queryEditor, schema };
}
+export function queryEditorSetSchemaOptions(queryEditor, options) {
+ return { type: QUERY_EDITOR_SET_SCHEMA_OPTIONS, queryEditor, options };
+}
+
+export function queryEditorSetTableOptions(queryEditor, options) {
+ return { type: QUERY_EDITOR_SET_TABLE_OPTIONS, queryEditor, options };
+}
+
export function queryEditorSetAutorun(queryEditor, autorun) {
return { type: QUERY_EDITOR_SET_AUTORUN, queryEditor, autorun };
}
diff --git a/superset/assets/src/SqlLab/components/AceEditorWrapper.jsx b/superset/assets/src/SqlLab/components/AceEditorWrapper.jsx
index 6c87ec2..7815998 100644
--- a/superset/assets/src/SqlLab/components/AceEditorWrapper.jsx
+++ b/superset/assets/src/SqlLab/components/AceEditorWrapper.jsx
@@ -48,7 +48,9 @@ const propTypes = {
actions: PropTypes.object.isRequired,
onBlur: PropTypes.func,
sql: PropTypes.string.isRequired,
+ schemas: PropTypes.array,
tables: PropTypes.array,
+ extendedTables: PropTypes.array,
queryEditor: PropTypes.object.isRequired,
height: PropTypes.string,
hotkeys: PropTypes.arrayOf(PropTypes.shape({
@@ -62,7 +64,9 @@ const propTypes = {
const defaultProps = {
onBlur: () => {},
onChange: () => {},
+ schemas: [],
tables: [],
+ extendedTables: [],
};
class AceEditorWrapper extends React.PureComponent {
@@ -80,7 +84,9 @@ class AceEditorWrapper extends React.PureComponent {
this.setAutoCompleter(this.props);
}
componentWillReceiveProps(nextProps) {
- if (!areArraysShallowEqual(this.props.tables, nextProps.tables)) {
+ if (!areArraysShallowEqual(this.props.tables, nextProps.tables) ||
+ !areArraysShallowEqual(this.props.schemas, nextProps.schemas) ||
+ !areArraysShallowEqual(this.props.extendedTables, nextProps.extendedTables)) {
this.setAutoCompleter(nextProps);
}
if (nextProps.sql !== this.props.sql) {
@@ -126,6 +132,13 @@ class AceEditorWrapper extends React.PureComponent {
getCompletions(aceEditor, session, pos, prefix, callback) {
const completer = {
insertMatch: (editor, data) => {
+ if (data.meta === 'table') {
+ this.props.actions.addTable(
+ this.props.queryEditor,
+ data.value,
+ this.props.queryEditor.schema,
+ );
+ }
editor.completer.insertMatch({ value: data.caption + ' ' });
},
};
@@ -133,13 +146,20 @@ class AceEditorWrapper extends React.PureComponent {
callback(null, words);
}
setAutoCompleter(props) {
- // Loading table and column names as auto-completable words
+ // Loading schema, table and column names as auto-completable words
let words = [];
+ const schemas = props.schemas || [];
+ schemas.forEach((s) => {
+ words.push({ name: s.label, value: s.value, score: 60, meta: 'schema' });
+ });
const columns = {};
const tables = props.tables || [];
+ const extendedTables = props.extendedTables || [];
tables.forEach((t) => {
- words.push({ name: t.name, value: t.name, score: 55, meta: 'table' });
- const cols = t.columns || [];
+ const tableName = t.value.table;
+ words.push({ name: t.label, value: tableName, score: 55, meta: 'table' });
+ const extendedTable = extendedTables.find(et => et.name === tableName);
+ const cols = extendedTable && extendedTable.columns || [];
cols.forEach((col) => {
columns[col.name] = null; // using an object as a unique set
});
diff --git a/superset/assets/src/SqlLab/components/SqlEditor.jsx b/superset/assets/src/SqlLab/components/SqlEditor.jsx
index 87930d9..5d58b23 100644
--- a/superset/assets/src/SqlLab/components/SqlEditor.jsx
+++ b/superset/assets/src/SqlLab/components/SqlEditor.jsx
@@ -298,7 +298,9 @@ class SqlEditor extends React.PureComponent {
onChange={this.onSqlChanged}
queryEditor={this.props.queryEditor}
sql={this.props.queryEditor.sql}
- tables={this.props.tables}
+ schemas={this.props.queryEditor.schemaOptions}
+ tables={this.props.queryEditor.tableOptions}
+ extendedTables={this.props.tables}
height={`${aceEditorHeight}px`}
hotkeys={hotkeys}
/>
diff --git a/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx b/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
index f389641..bc61f83 100644
--- a/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
+++ b/superset/assets/src/SqlLab/components/SqlEditorLeftBar.jsx
@@ -50,6 +50,8 @@ export default class SqlEditorLeftBar extends React.PureComponent {
};
this.resetState = this.resetState.bind(this);
this.onSchemaChange = this.onSchemaChange.bind(this);
+ this.onSchemasLoad = this.onSchemasLoad.bind(this);
+ this.onTablesLoad = this.onTablesLoad.bind(this);
this.onDbChange = this.onDbChange.bind(this);
this.getDbList = this.getDbList.bind(this);
this.onTableChange = this.onTableChange.bind(this);
@@ -57,6 +59,12 @@ export default class SqlEditorLeftBar extends React.PureComponent {
onSchemaChange(schema) {
this.props.actions.queryEditorSetSchema(this.props.queryEditor, schema);
}
+ onSchemasLoad(schemas) {
+ this.props.actions.queryEditorSetSchemaOptions(this.props.queryEditor, schemas);
+ }
+ onTablesLoad(tables) {
+ this.props.actions.queryEditorSetTableOptions(this.props.queryEditor, tables);
+ }
onDbChange(db) {
this.props.actions.queryEditorSetDb(this.props.queryEditor, db.id);
}
@@ -105,6 +113,8 @@ export default class SqlEditorLeftBar extends React.PureComponent {
schema={qe.schema}
onDbChange={this.onDbChange}
onSchemaChange={this.onSchemaChange}
+ onSchemasLoad={this.onSchemasLoad}
+ onTablesLoad={this.onTablesLoad}
getDbList={this.getDbList}
onTableChange={this.onTableChange}
tableNameSticky={false}
diff --git a/superset/assets/src/SqlLab/reducers/sqlLab.js b/superset/assets/src/SqlLab/reducers/sqlLab.js
index 7a21e82..2244096 100644
--- a/superset/assets/src/SqlLab/reducers/sqlLab.js
+++ b/superset/assets/src/SqlLab/reducers/sqlLab.js
@@ -283,6 +283,12 @@ export default function sqlLabReducer(state = {}, action) {
[actions.QUERY_EDITOR_SET_SCHEMA]() {
return alterInArr(state, 'queryEditors', action.queryEditor, { schema: action.schema });
},
+ [actions.QUERY_EDITOR_SET_SCHEMA_OPTIONS]() {
+ return alterInArr(state, 'queryEditors', action.queryEditor, { schemaOptions: action.options });
+ },
+ [actions.QUERY_EDITOR_SET_TABLE_OPTIONS]() {
+ return alterInArr(state, 'queryEditors', action.queryEditor, { tableOptions: action.options });
+ },
[actions.QUERY_EDITOR_SET_TITLE]() {
return alterInArr(state, 'queryEditors', action.queryEditor, { title: action.title });
},
diff --git a/superset/assets/src/components/TableSelector.jsx b/superset/assets/src/components/TableSelector.jsx
index 940e1c2..6d232d4 100644
--- a/superset/assets/src/components/TableSelector.jsx
+++ b/superset/assets/src/components/TableSelector.jsx
@@ -33,6 +33,8 @@ const propTypes = {
schema: PropTypes.string,
onSchemaChange: PropTypes.func,
onDbChange: PropTypes.func,
+ onSchemasLoad: PropTypes.func,
+ onTablesLoad: PropTypes.func,
getDbList: PropTypes.func,
onTableChange: PropTypes.func,
tableNameSticky: PropTypes.bool,
@@ -47,6 +49,8 @@ const propTypes = {
const defaultProps = {
onDbChange: () => {},
onSchemaChange: () => {},
+ onSchemasLoad: () => {},
+ onTablesLoad: () => {},
getDbList: () => {},
onTableChange: () => {},
onChange: () => {},
@@ -136,6 +140,7 @@ export default class TableSelector extends React.PureComponent {
title: o.label,
})),
}));
+ this.props.onTablesLoad(json.options);
})
.catch(() => {
this.setState(() => ({ tableLoading: false, tableOptions: [] }));
@@ -156,6 +161,7 @@ export default class TableSelector extends React.PureComponent {
.then(({ json }) => {
const schemaOptions = json.schemas.map(s => ({ value: s, label: s, title: s }));
this.setState({ schemaOptions, schemaLoading: false });
+ this.props.onSchemasLoad(schemaOptions);
})
.catch(() => {
this.setState({ schemaLoading: false, schemaOptions: [] });