Forráskód Böngészése

HUE-6083 [metastore] Enable filtering on the partitions tab of a table

Enrico Berti 8 éve
szülő
commit
6906aae26e

+ 49 - 0
apps/metastore/src/metastore/static/metastore/js/metastore.model.js

@@ -228,6 +228,55 @@ var MetastoreTable = (function () {
     self.loaded = ko.observable(false);
     self.loading = ko.observable(true);
 
+    self.sortDesc = ko.observable(true);
+    self.filters = ko.observableArray([]);
+
+    self.typeaheadValues = function (column) {
+      var _vals = [];
+      self.values().forEach(function (row) {
+        var _cell = row.columns[self.keys().indexOf(column())];
+        if (_vals.indexOf(_cell) == -1) {
+          _vals.push(_cell);
+        }
+      });
+      return _vals
+    }
+
+    self.addFilter = function () {
+      self.filters.push(ko.mapping.fromJS({'column': '', 'value': ''}));
+    }
+
+    self.removeFilter = function (data) {
+      self.filters.remove(data);
+      if (self.filters().length == 0) {
+        self.sortDesc(true);
+        self.filter();
+      }
+    }
+
+    self.filter = function () {
+      self.loading(true);
+      self.loaded(false);
+      var _filters = JSON.parse(ko.toJSON(self.filters));
+      var _postData = {};
+      _filters.forEach(function (filter) {
+        _postData[filter.column] = filter.value;
+      });
+      _postData["sort"] = self.sortDesc() ? "desc" : "asc";
+
+      $.ajax({
+        type: "POST",
+        url: '/metastore/table/' + self.metastoreTable.database.name + '/' + self.metastoreTable.name + '/partitions',
+        data: _postData,
+        success: function (data) {
+          self.values(data.partition_values_json);
+          self.loading(false);
+          self.loaded(true);
+        },
+        dataType: "json"
+      });
+    }
+
     self.preview = {
       keys: ko.observableArray(),
       values: ko.observableArray()

+ 23 - 1
apps/metastore/src/metastore/templates/metastore.mako

@@ -716,12 +716,34 @@ ${ components.menubar(is_embeddable) }
   <div class="tile" data-bind="visible: true" style="display: none;">
     <h4>${ _('Partitions') } <i data-bind="visible: loading" class='fa fa-spinner fa-spin' style="display: none;"></i></h4>
     <!-- ko if: loaded -->
+    <div data-bind="visible: filters().length > 0">
+      <div data-bind="foreach: filters">
+          <div class="filter-box">
+            <a href="javascript:void(0)" class="pull-right" data-bind="click: $parent.removeFilter">
+              <i class="fa fa-times"></i>
+            </a>
+            <select class="input-small" data-bind="options: $parent.keys, value: column"></select>
+            &nbsp;
+            <input class="input-small" type="text" data-bind="value: value, typeahead: { target: value, source: $parent.typeaheadValues(column), triggerOnFocus: true, forceUpdateSource: true}" placeholder="${ _('Value to filter...') }" />
+        </div>
+      </div>
+      <div class="pull-left" style="margin-top: 4px; margin-bottom: 10px">
+        <a class="add-filter" href="javascript: void(0)" data-bind="click: addFilter">
+          <i class="fa fa-plus"></i> ${ _('Add') }
+        </a>
+        <label class="checkbox inline pulled">${ _('Sort Desc') } <input type="checkbox" data-bind="checked: sortDesc" /></label>
+        <button class="btn" data-bind="click: filter"><i class="fa fa-filter"></i> ${ _('Filter') }</button>
+      </div>
+    </div>
+    <a class="add-filter" href="javascript: void(0)" data-bind="click: addFilter, visible: values().length > 0 && filters().length == 0" style="margin-bottom: 20px; margin-left: 14px">
+      <i class="fa fa-plus"></i> ${ _('Add a filter') }
+    </a>
+    <div class="clearfix"></div>
     <!-- ko template: { if: values().length, name: 'metastore-partition-values-table' } --><!-- /ko -->
     <span data-bind="visible: !values().length" style="display: none;">${ _('The partition does not contain any values') }</span>
     <!-- /ko -->
   </div>
   <!-- /ko -->
-  <a data-bind="attr: { 'href': '/metastore/table/' + database.name + '/' + name + '/partitions' }">${ _('View all') }</a>
 </script>
 
 <script type="text/html" id="metastore-sample-tab">