瀏覽代碼

[impala] Added database and table dropdowns

Enrico Berti 11 年之前
父節點
當前提交
222335c

+ 66 - 2
apps/impala/src/impala/templates/dashboard.mako

@@ -98,8 +98,13 @@ ${ commonheader(None, "impala", user) | n,unicode }
   <form class="form-search" style="margin: 0" data-bind="submit: search">
     <strong>${_("Search")}</strong>
     <span data-bind="text: $root.dashboard.properties()[0].database"></span>.<span data-bind="text: $root.dashboard.properties()[0].table"></span>
-      <div class="input-append">
 
+    <select data-bind="options: $root.dashboard.dropdownDbs, value: $root.dashboard.selectedDropdownDb" class="input-medium chosen-select chosen-server hide" data-placeholder="${_('Choose a database...')}"></select>
+    <select data-bind="options: $root.dashboard.dropdownTables, value: $root.dashboard.selectedDropdownTable" class="input-medium chosen-select chosen-table hide" data-placeholder="${_('Choose a table...')}"></select>
+
+    <a title="${_('Manually refresh the dropdowns')}" rel="tooltip" data-placement="bottom" class="pointer" data-bind="click: resetDropdownsCache"><i class="fa fa-refresh"></i></a>
+
+      <div class="input-append">
       <span data-bind="foreach: query.qs">
         <input data-bind="clearable: q" maxlength="4096" type="text" class="search-query input-xlarge">
   ##      <!-- ko if: $index() >= 1 -->
@@ -265,6 +270,7 @@ ${ dashboard.import_layout() }
 
 ${ dashboard.import_bindings() }
 
+<script src="/beeswax/static/js/autocomplete.utils.js" type="text/javascript" charset="utf-8"></script>
 <script src="/impala/static/js/impala-dashboard.ko.js" type="text/javascript" charset="utf-8"></script>
 
 ${ dashboard.import_charts() }
@@ -274,9 +280,67 @@ ${ dashboard.import_charts() }
   var viewModel = new ImpalaDashboardViewModel(${ query_json | n,unicode }, ${ dashboard_json | n,unicode  });
   ko.applyBindings(viewModel);
 
+  var HIVE_AUTOCOMPLETE_BASE_URL = "/impala/api/autocomplete/";
+  var HIVE_AUTOCOMPLETE_FAILS_QUIETLY_ON = [500]; // error codes from beeswax/views.py - autocomplete
+  var HIVE_AUTOCOMPLETE_USER = "${ user }";
+
+  function resetDropdownsCache(){
+    $.totalStorage(hac_getTotalStorageUserPrefix() + 'databases', null);
+    getDatabases(function(){
+      $.totalStorage(hac_getTotalStorageUserPrefix() + 'tables_' + viewModel.dashboard.selectedDropdownDb(), null);
+      $.totalStorage(hac_getTotalStorageUserPrefix() + 'timestamp_tables_' + viewModel.dashboard.selectedDropdownDb(), null);
+    });
+  }
+
+  function getDatabases(callback){
+    $(document).one('fetched.databases', function() {
+      window.setTimeout(function(){
+        $(".chosen-server").chosen({
+          disable_search_threshold: 5,
+          width: "130px",
+          no_results_text: "${_('Oops, no database found!')}"
+        }).change(function () {
+          getTables();
+        });
+        $(".chosen-select").trigger("chosen:updated");
+      }, 200)
+    });
+    hac_getDatabases(function (dbs) {
+      viewModel.dashboard.updateDropdownDatabases(dbs);
+
+      if (typeof callback != "undefined"){
+        callback(dbs);
+      }
+      $(document).trigger('fetched.databases', [dbs]);
+    });
+  }
+
+  function getTables(callback) {
+    hac_getTables(viewModel.dashboard.selectedDropdownDb(), function (data) {
+      viewModel.dashboard.dropdownTables(data.split(" "));
+      window.setTimeout(function(){
+        $(".chosen-table").chosen({
+          disable_search_threshold: 5,
+          width: "130px",
+          no_results_text: "${_('Oops, no table found!')}"
+          }).change(function () {
+
+          });
+        $(".chosen-select").trigger("chosen:updated");
+      }, 200);
+      if (typeof callback != "undefined"){
+        callback(data);
+      }
+    });
+  }
+
   $(document).ready(function(){
     window.setTimeout(function(){
-      viewModel.init();
+      viewModel.init(function(){
+        getDatabases(function(){
+          getTables();
+        });
+      });
     }, 50);
   });
 

+ 4 - 0
apps/impala/static/css/impala-dashboard.css

@@ -284,4 +284,8 @@ em {
 
 .draggable-icon {
   cursor: move;
+}
+
+.chosen-container .chosen-results li {
+  text-align: left;
 }

+ 16 - 1
apps/impala/static/js/impala-dashboard.ko.js

@@ -101,6 +101,20 @@ var Dashboard = function (vm, dashboard) {
   self.facets = ko.mapping.fromJS(dashboard.facets);
   self.properties = ko.mapping.fromJS(dashboard.properties);
 
+  self.dropdownDbs = ko.observableArray([]);
+  self.selectedDropdownDb = ko.observable("");
+  self.dropdownTables = ko.observableArray([]);
+  self.selectedDropdownTable = ko.observable("");
+
+  self.updateDropdownDatabases = function(databases) {
+    if (databases) {
+      var i = databases.indexOf("_impala_builtins"); // Blacklist of system databases
+      if (i != -1) {
+        databases.splice(i, 1);
+      }
+      self.dropdownDbs(databases);
+    }
+  };
 
   self.fields = ko.computed(function () {
 	return self.properties()[0].fields();
@@ -180,8 +194,9 @@ var ImpalaDashboardViewModel = function (query_json, dashboard_json) {
     self.results_facet = ko.observableArray([]);
     self.results_cols = ko.observableArray([]);
 
-    self.init = function() {
+    self.init = function(callback) {
       self.search();
+      callback();
     }
     
     self.search = function (callback) {

+ 4 - 0
desktop/core/static/js/jquery.hiveautocomplete.js

@@ -21,6 +21,7 @@
 (function ($, window, document, undefined) {
   var pluginName = "jHueHiveAutocomplete",
       defaults = {
+        serverType: "HIVE",
         home: "/",
         skipColumns: false,
         onEnter: function () {
@@ -187,6 +188,9 @@
     });
 
     var BASE_PATH = "/beeswax/api/autocomplete/";
+    if (_this.options.serverType == "IMPALA"){
+      BASE_PATH = "/impala/api/autocomplete/";
+    }
     var _currentFiles = [];
 
     function showHiveAutocomplete(callback) {