Browse Source

HUE-4217 [editor] Autocomplete for DESCRIBE

This adds autocompletion for Hive and Impala DESCRIBE statements, I've also restructure the parser and cleaned up some unused constructs.
Johan Ahlen 9 years ago
parent
commit
f0e3dac

File diff suppressed because it is too large
+ 1342 - 1146
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.jison


File diff suppressed because it is too large
+ 0 - 0
desktop/core/src/desktop/static/desktop/js/autocomplete/sql.js


+ 1 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpec.js

@@ -18,6 +18,7 @@ define([
   'desktop/js/autocomplete/sql',
   'desktop/spec/autocompleterTestUtils',
   'desktop/spec/autocomplete/sqlSpecCreate',
+  'desktop/spec/autocomplete/sqlSpecDescribe',
   'desktop/spec/autocomplete/sqlSpecDrop',
   'desktop/spec/autocomplete/sqlSpecLoad',
   'desktop/spec/autocomplete/sqlSpecSelect',

+ 453 - 0
desktop/core/src/desktop/static/desktop/spec/autocomplete/sqlSpecDescribe.js

@@ -0,0 +1,453 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+define([
+  'knockout',
+  'desktop/js/autocomplete/sql',
+  'desktop/spec/autocompleterTestUtils'
+], function(ko, sql, testUtils) {
+
+  describe('sql.js DESCRIBE statements', function() {
+
+    beforeAll(function () {
+      sql.yy.parseError = function (msg) {
+        throw Error(msg);
+      };
+      jasmine.addMatchers(testUtils.testDefinitionMatcher);
+    });
+
+    var assertAutoComplete = testUtils.assertAutocomplete;
+
+
+    describe('hive specific', function () {
+      it('should handle DESCRIBE tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE tbl.col.field', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl.col.field;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle EXTENDED tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE EXTENDED tbl;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle EXTENDED tbl.col.field', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE EXTENDED tbl.col.field;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle FORMATTED tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED tbl;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle FORMATTED tbl.col.field', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED tbl.col.field;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest keywords and tables after DESCRIBE', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['DATABASE', 'EXTENDED', 'FORMATTED', 'SCHEMA'],
+            suggestTables: {}
+          }
+        });
+      });
+
+      it('should suggest keywords and tables after DESCRIBE partial', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['DATABASE', 'EXTENDED', 'FORMATTED', 'SCHEMA'],
+            suggestTables: {}
+          }
+        });
+      });
+
+      it('should suggest columns after DESCRIBE tbl.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              table: 'tbl'
+            }
+          }
+        });
+      });
+
+      it('should suggest fields after DESCRIBE tbl.bla.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl.bla.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              identifierChain: [{ name: 'bla' }],
+              table: 'tbl'
+            }
+          }
+        });
+      });
+
+      it('should handle DESCRIBE DATABASE db', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE DATABASE db;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE DATABASE EXTENDED db', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE DATABASE EXTENDED db;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE SCHEMA db', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE SCHEMA db;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE SCHEMA EXTENDED db', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE SCHEMA EXTENDED db;',
+          afterCursor: '',
+          dialect: 'hive',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest keywords and databases after DESCRIBE DATABASE', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE DATABASE ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['EXTENDED'],
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest keywords and databases after DESCRIBE DATABASE partial', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE DATABASE db',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['EXTENDED'],
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest databases after DESCRIBE DATABASE EXTENDED', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE DATABASE EXTENDED ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest keyworda and databases after DESCRIBE SCHEMA', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE SCHEMA ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['EXTENDED'],
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest keywords and databases after DESCRIBE SCHEMA partial', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE SCHEMA db',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['EXTENDED'],
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest databases after DESCRIBE SCHEMA EXTENDED', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE SCHEMA EXTENDED ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestDatabases: {}
+          }
+        });
+      });
+
+      it('should suggest tables after DESCRIBE EXTENDED', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE EXTENDED ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {}
+          }
+        });
+      });
+
+      it('should suggest columns after DESCRIBE EXTENDED tbl.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE EXTENDED tbl.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              table: 'tbl'
+            }
+          }
+        });
+      });
+
+      it('should suggest fields after DESCRIBE EXTENDED tbl.bla.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE EXTENDED tbl.bla.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              identifierChain: [{ name: 'bla' }],
+              table: 'tbl'
+            }
+          }
+        });
+      });
+
+      it('should suggest tables after DESCRIBE FORMATTED', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED ',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {}
+          }
+        });
+      });
+
+      it('should suggest columns after DESCRIBE FORMATTED tbl.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED tbl.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              table: 'tbl'
+            }
+          }
+        });
+      });
+
+      it('should suggest fields after DESCRIBE FORMATTED tbl.bla.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED tbl.bla.',
+          afterCursor: '',
+          dialect: 'hive',
+          expectedResult: {
+            lowerCase: false,
+            suggestColumns: {
+              identifierChain: [{ name: 'bla' }],
+              table: 'tbl'
+            }
+          }
+        });
+      });
+    });
+
+    describe('impala specific', function () {
+      it('should handle DESCRIBE tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE tbl;',
+          afterCursor: '',
+          dialect: 'impala',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE db.tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE db.tbl;',
+          afterCursor: '',
+          dialect: 'impala',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should handle DESCRIBE FORMATTED db.tbl', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE FORMATTED db.tbl;',
+          afterCursor: '',
+          dialect: 'impala',
+          containsKeywords: ['SELECT'],
+          expectedResult: {
+            lowerCase: false
+          }
+        });
+      });
+
+      it('should suggest tables and keywords after DESCRIBE', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE ',
+          afterCursor: '',
+          dialect: 'impala',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['FORMATTED'],
+            suggestTables: {},
+            suggestDatabases: {
+              appendDot: true
+            }
+          }
+        });
+      });
+
+      it('should suggest tables and keywords after DESCRIBE partial', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE db',
+          afterCursor: '',
+          dialect: 'impala',
+          expectedResult: {
+            lowerCase: false,
+            suggestKeywords: ['FORMATTED'],
+            suggestTables: {},
+            suggestDatabases: {
+              appendDot: true
+            }
+          }
+        });
+      });
+
+      it('should suggest tables after DESCRIBE db.', function() {
+        assertAutoComplete({
+          beforeCursor: 'DESCRIBE db.',
+          afterCursor: '',
+          dialect: 'impala',
+          expectedResult: {
+            lowerCase: false,
+            suggestTables: {
+              database: 'db'
+            }
+          }
+        });
+      });
+    });
+  });
+});

Some files were not shown because too many files changed in this diff