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

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


The following commit(s) were added to refs/heads/master by this push:
     new cae1361  Web-console: gate auto complete on current table and schema 
(#8322)
cae1361 is described below

commit cae1361c32a8a506cc5bb228d614b26fb64d9f55
Author: mcbrewster <[email protected]>
AuthorDate: Sat Aug 17 09:34:36 2019 -0700

    Web-console: gate auto complete on current table and schema (#8322)
    
    * gate auto complete on current table and schema
    
    * reset defaults
    
    * add static functions
    
    * move completions to state
---
 .../__snapshots__/query-view.spec.tsx.snap         |   1 +
 .../views/query-view/query-input/query-input.tsx   | 124 +++++++++++++--------
 web-console/src/views/query-view/query-view.tsx    |  17 +++
 3 files changed, 93 insertions(+), 49 deletions(-)

diff --git 
a/web-console/src/views/query-view/__snapshots__/query-view.spec.tsx.snap 
b/web-console/src/views/query-view/__snapshots__/query-view.spec.tsx.snap
index 22338e0..1090f25 100644
--- a/web-console/src/views/query-view/__snapshots__/query-view.spec.tsx.snap
+++ b/web-console/src/views/query-view/__snapshots__/query-view.spec.tsx.snap
@@ -32,6 +32,7 @@ exports[`sql view matches snapshot 1`] = `
       className="control-pane"
     >
       <QueryInput
+        currentSchema="druid"
         onQueryStringChange={[Function]}
         queryString="test"
         runeMode={false}
diff --git a/web-console/src/views/query-view/query-input/query-input.tsx 
b/web-console/src/views/query-view/query-input/query-input.tsx
index 4e761b1..a8806db 100644
--- a/web-console/src/views/query-view/query-input/query-input.tsx
+++ b/web-console/src/views/query-view/query-input/query-input.tsx
@@ -25,7 +25,6 @@ import AceEditor from 'react-ace';
 import { SQL_DATE_TYPES, SQL_FUNCTIONS, SyntaxDescription } from 
'../../../../lib/sql-function-doc';
 import { uniq } from '../../../utils';
 import { ColumnMetadata } from '../../../utils/column-metadata';
-import { ColumnTreeProps, ColumnTreeState } from '../column-tree/column-tree';
 
 import { SQL_CONSTANTS, SQL_DYNAMICS, SQL_EXPRESSION_PARTS, SQL_KEYWORDS } 
from './keywords';
 
@@ -38,59 +37,22 @@ export interface QueryInputProps {
   onQueryStringChange: (newQueryString: string) => void;
   runeMode: boolean;
   columnMetadata?: ColumnMetadata[];
+  currentSchema?: string;
+  currentTable?: string;
 }
 
 export interface QueryInputState {
   // For reasons (https://github.com/securingsincity/react-ace/issues/415) 
react ace editor needs an explicit height
   // Since this component will grown and shrink dynamically we will measure 
its height and then set it.
   editorHeight: number;
+  completions: any[];
   prevColumnMetadata?: ColumnMetadata[];
+  prevCurrentTable?: string;
+  prevCurrentSchema?: string;
 }
 
 export class QueryInput extends React.PureComponent<QueryInputProps, 
QueryInputState> {
-  static getDerivedStateFromProps(props: ColumnTreeProps, state: 
ColumnTreeState) {
-    const { columnMetadata } = props;
-
-    if (columnMetadata && columnMetadata !== state.prevColumnMetadata) {
-      const completions = ([] as any[]).concat(
-        uniq(columnMetadata.map(d => d.TABLE_SCHEMA)).map(v => ({
-          value: v,
-          score: 10,
-          meta: 'schema',
-        })),
-        uniq(columnMetadata.map(d => d.TABLE_NAME)).map(v => ({
-          value: v,
-          score: 49,
-          meta: 'datasource',
-        })),
-        uniq(columnMetadata.map(d => d.COLUMN_NAME)).map(v => ({
-          value: v,
-          score: 50,
-          meta: 'column',
-        })),
-      );
-
-      langTools.addCompleter({
-        getCompletions: (_editor: any, _session: any, _pos: any, _prefix: any, 
callback: any) => {
-          callback(null, completions);
-        },
-      });
-
-      return {
-        prevColumnMetadata: columnMetadata,
-      };
-    }
-    return null;
-  }
-
-  constructor(props: QueryInputProps, context: any) {
-    super(props, context);
-    this.state = {
-      editorHeight: 200,
-    };
-  }
-
-  private replaceDefaultAutoCompleter = () => {
+  static replaceDefaultAutoCompleter(): void {
     if (!langTools) return;
 
     const keywordList = ([] as any[]).concat(
@@ -112,9 +74,9 @@ export class QueryInput extends 
React.PureComponent<QueryInputProps, QueryInputS
       langTools.textCompleter,
       keywordCompleter,
     ]);
-  };
+  }
 
-  private addFunctionAutoCompleter = (): void => {
+  static addFunctionAutoCompleter(): void {
     if (!langTools) return;
 
     const functionList: any[] = SQL_FUNCTIONS.map((entry: SyntaxDescription) 
=> {
@@ -161,11 +123,75 @@ export class QueryInput extends 
React.PureComponent<QueryInputProps, QueryInputS
         }
       },
     });
-  };
+  }
+
+  static getDerivedStateFromProps(props: QueryInputProps, state: 
QueryInputState) {
+    const { columnMetadata, currentSchema, currentTable } = props;
+
+    if (
+      columnMetadata &&
+      (columnMetadata !== state.prevColumnMetadata ||
+        currentSchema !== state.prevCurrentSchema ||
+        currentTable !== state.prevCurrentTable)
+    ) {
+      const completions = ([] as any[]).concat(
+        uniq(columnMetadata.map(d => d.TABLE_SCHEMA)).map(v => ({
+          value: v,
+          score: 10,
+          meta: 'schema',
+        })),
+        uniq(
+          columnMetadata
+            .filter(d => (currentSchema ? d.TABLE_SCHEMA === currentSchema : 
true))
+            .map(d => d.TABLE_NAME),
+        ).map(v => ({
+          value: v,
+          score: 49,
+          meta: 'datasource',
+        })),
+        uniq(
+          columnMetadata
+            .filter(d =>
+              currentTable && currentSchema
+                ? d.TABLE_NAME === currentTable && d.TABLE_SCHEMA === 
currentSchema
+                : true,
+            )
+            .map(d => d.COLUMN_NAME),
+        ).map(v => ({
+          value: v,
+          score: 50,
+          meta: 'column',
+        })),
+      );
+
+      return {
+        completions,
+        prevColumnMetadata: columnMetadata,
+        prevCurrentSchema: currentSchema,
+        prevCurrentTable: currentTable,
+      };
+    }
+    return null;
+  }
+
+  constructor(props: QueryInputProps, context: any) {
+    super(props, context);
+    this.state = {
+      editorHeight: 200,
+      completions: [],
+    };
+  }
 
   componentDidMount(): void {
-    this.replaceDefaultAutoCompleter();
-    this.addFunctionAutoCompleter();
+    QueryInput.replaceDefaultAutoCompleter();
+    QueryInput.addFunctionAutoCompleter();
+    if (langTools) {
+      langTools.addCompleter({
+        getCompletions: (_editor: any, _session: any, _pos: any, _prefix: any, 
callback: any) => {
+          callback(null, this.state.completions);
+        },
+      });
+    }
   }
 
   private handleAceContainerResize = (entries: IResizeEntry[]) => {
diff --git a/web-console/src/views/query-view/query-view.tsx 
b/web-console/src/views/query-view/query-view.tsx
index 732f697..5d3a6c6 100644
--- a/web-console/src/views/query-view/query-view.tsx
+++ b/web-console/src/views/query-view/query-view.tsx
@@ -477,6 +477,21 @@ export class QueryView extends 
React.PureComponent<QueryViewProps, QueryViewStat
       wrapQuery,
     } = this.state;
 
+    let currentSchema;
+    let currentTable;
+
+    if (result && result.parsedQuery instanceof SqlQuery) {
+      currentSchema = result.parsedQuery.getSchema();
+      currentTable = result.parsedQuery.getTableName();
+    } else if (localStorageGet(LocalStorageKeys.QUERY_KEY)) {
+      const defaultQueryString = localStorageGet(LocalStorageKeys.QUERY_KEY);
+      const tempAst = defaultQueryString ? parser(defaultQueryString) : 
undefined;
+      if (tempAst) {
+        currentSchema = tempAst.getSchema();
+        currentTable = tempAst.getTableName();
+      }
+    }
+
     const runeMode = QueryView.isJsonLike(queryString);
     return (
       <SplitterLayout
@@ -491,6 +506,8 @@ export class QueryView extends 
React.PureComponent<QueryViewProps, QueryViewStat
       >
         <div className="control-pane">
           <QueryInput
+            currentSchema={currentSchema ? currentSchema : 'druid'}
+            currentTable={currentTable}
             queryString={queryString}
             onQueryStringChange={this.handleQueryStringChange}
             runeMode={runeMode}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to