Skip to content

Commit 4bf5252

Browse files
authored
[sqllab] add autocomplete to AceEditor for table and column names (#1475)
* [sqllab] add autocomplete to AceEditor for table and column names * addressing comment about getCompletions as a component method
1 parent 45efcb3 commit 4bf5252

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

caravel/assets/javascripts/SqlLab/components/AceEditorWrapper.jsx

+31-2
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@ import AceEditor from 'react-ace';
33
import 'brace/mode/sql';
44
import 'brace/theme/github';
55
import 'brace/ext/language_tools';
6+
import ace from 'brace';
7+
8+
const langTools = ace.acequire('ace/ext/language_tools');
69

710
const propTypes = {
8-
sql: React.PropTypes.string.isRequired,
911
onBlur: React.PropTypes.func,
12+
sql: React.PropTypes.string.isRequired,
13+
tables: React.PropTypes.array,
1014
};
1115

1216
const defaultProps = {
1317
onBlur: () => {},
18+
tables: [],
1419
};
1520

1621
class AceEditorWrapper extends React.PureComponent {
@@ -26,8 +31,32 @@ class AceEditorWrapper extends React.PureComponent {
2631
onBlur() {
2732
this.props.onBlur(this.state.sql);
2833
}
29-
34+
getCompletions(aceEditor, session, pos, prefix, callback) {
35+
let words = [];
36+
const columns = {};
37+
const tables = this.props.tables || [];
38+
tables.forEach(t => {
39+
words.push({ name: t.name, value: t.name, score: 55, meta: 'table' });
40+
t.columns.forEach(col => {
41+
columns[col.name] = null; // using an object as a unique set
42+
});
43+
});
44+
words = words.concat(Object.keys(columns).map(col => (
45+
{ name: col, value: col, score: 50, meta: 'column' }
46+
)));
47+
callback(null, words);
48+
}
49+
setAutoCompleter() {
50+
// Loading table and column names as auto-completable words
51+
const completer = {
52+
getCompletions: this.getCompletions.bind(this),
53+
};
54+
if (langTools) {
55+
langTools.setCompleters([completer, langTools.keyWordCompleter]);
56+
}
57+
}
3058
render() {
59+
this.setAutoCompleter();
3160
return (
3261
<AceEditor
3362
mode="sql"

caravel/assets/javascripts/SqlLab/components/SqlEditor.jsx

+1
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ class SqlEditor extends React.PureComponent {
208208
</Col>
209209
<Col md={9}>
210210
<AceEditorWrapper
211+
tables={this.props.tables}
211212
sql={this.props.queryEditor.sql}
212213
onBlur={this.setQueryEditorSql.bind(this)}
213214
/>

0 commit comments

Comments
 (0)