Repository: ambari Updated Branches: refs/heads/trunk 27710808b -> 11137ea88
AMBARI-15210. Combo Search: Implement "component state" related filters (rzang) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/11137ea8 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/11137ea8 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/11137ea8 Branch: refs/heads/trunk Commit: 11137ea88607dae63c3bf330c298d19df57cc890 Parents: 2771080 Author: Richard Zang <[email protected]> Authored: Fri Feb 26 17:17:04 2016 -0800 Committer: Richard Zang <[email protected]> Committed: Fri Feb 26 17:17:33 2016 -0800 ---------------------------------------------------------------------- .../app/controllers/global/update_controller.js | 3 + ambari-web/app/controllers/main/host.js | 6 ++ .../controllers/main/host/combo_search_box.js | 90 +++++++++++++++++--- .../mixins/common/table_server_view_mixin.js | 13 +-- .../app/views/main/host/combo_search_box.js | 37 +++++--- 5 files changed, 121 insertions(+), 28 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/11137ea8/ambari-web/app/controllers/global/update_controller.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/global/update_controller.js b/ambari-web/app/controllers/global/update_controller.js index ebefd0f..72b3ca2 100644 --- a/ambari-web/app/controllers/global/update_controller.js +++ b/ambari-web/app/controllers/global/update_controller.js @@ -158,6 +158,9 @@ App.UpdateController = Em.Controller.extend({ }, this); params += customKey; break; + case 'COMBO': + params += App.router.get('mainHostComboSearchBoxController').generateQueryParam(param); + break; } params += '&'; }); http://git-wip-us.apache.org/repos/asf/ambari/blob/11137ea8/ambari-web/app/controllers/main/host.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/host.js b/ambari-web/app/controllers/main/host.js index dac005b..b7f6208 100644 --- a/ambari-web/app/controllers/main/host.js +++ b/ambari-web/app/controllers/main/host.js @@ -146,6 +146,11 @@ App.MainHostController = Em.ArrayController.extend(App.TableServerMixin, { name: 'hostStackVersion', key: 'stack_versions', type: 'EQUAL' + }, + { + name: 'componentState', + key: '(host_components/HostRoles/component_name={0}&host_components/HostRoles/state={1})', + type: 'COMBO' } ], @@ -564,6 +569,7 @@ App.MainHostController = Em.ArrayController.extend(App.TableServerMixin, { associations[12] = 'rack'; associations[13] = 'services'; associations[14] = 'state'; + associations[15] = 'componentState'; return associations; }.property() http://git-wip-us.apache.org/repos/asf/ambari/blob/11137ea8/ambari-web/app/controllers/main/host/combo_search_box.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/controllers/main/host/combo_search_box.js b/ambari-web/app/controllers/main/host/combo_search_box.js index 3cbb602..339ddc9 100644 --- a/ambari-web/app/controllers/main/host/combo_search_box.js +++ b/ambari-web/app/controllers/main/host/combo_search_box.js @@ -22,18 +22,6 @@ App.MainHostComboSearchBoxController = Em.Controller.extend({ name: 'mainHostComboSearchBoxController', currentSuggestion: [], page_size: 10, - nameColumnMap: { - 'Host Name': 'hostName', - 'IP': 'ip', - 'Health Status': 'hostName', - 'Host Name': 'healthClass', - 'Rack': 'rack', - 'Cores': 'cpu', - 'RAM': 'memoryFormatted', - 'Service': 'service', - 'Has Component': 'hostComponents', - 'State': 'state' - }, getPropertySuggestions: function(facet, searchTerm) { return App.ajax.send({ name: 'hosts.with_searchTerm', @@ -61,5 +49,83 @@ App.MainHostComboSearchBoxController = Em.Controller.extend({ commonSuggestionErrorCallback:function() { // handle suggestion error + }, + + isComponentStateFacet: function(facet) { + return App.HostComponent.find().filterProperty('componentName', facet).length > 0; + }, + + isClientComponent: function(name) { + return name.indexOf('CLIENT') >= 0; + }, + + generateQueryParam: function(param) { + var expression = param.key; + var filterName = App.router.get('mainHostController.filterProperties').findProperty('key', expression).name; + if (filterName == 'componentState') { + var pHash = this.createComboParamHash(param); + return this.createComboParamURL(pHash, expression); + } + }, + + /** + * @param pHash {k1:v1, k2:[v1,v2], ...} + * @param expression + * @returns {string} 'k1=v1&(k2=v1|k2=v2)' + */ + createComboParamURL: function(pHash, expression) { + var result = ''; + for (key in pHash) { + var v = pHash[key]; + if (Em.isArray(v)) { + var ex = '('; + v.forEach(function(item) { + var toAdd = expression.replace('{0}', key); + toAdd = toAdd.replace('{1}', item); + ex += toAdd + '|'; + }); + ex = ex.substring(0, ex.length - 1); + result += ex + ')'; + } else { + var ex = expression.replace('{0}', key); + ex = ex.replace('{1}', v); + result += ex; + } + result += '&'; + } + + return result.substring(0, result.length - 1); + }, + + /** + * @param param ['k1:v1','k2:v1', 'k2:v2'] or 'k1:v1' + * @returns {k1:v1, k2:[v1,v2], ...} + */ + createComboParamHash: function(param) { + var pHash = {}; + if (Em.isArray(param.value)) { + param.value.forEach(function(item) { + var values = item.split(':'); + var k = values[0]; + var v = values[1]; + if (v == 'STOPPED') { v = 'INSTALLED'; } // 'STOPPED' is not a valid internal state + if (!pHash[k]) { + pHash[k] = v; + } else { + if (Em.isArray(pHash[k])) { + if (pHash[k].indexOf(v) == -1) { + pHash[k].push(v); + } + } else { + pHash[k] = [pHash[k], v]; + } + } + }); + } else { + var values = param.value.split(':'); + if (values[1] == 'STOPPED') { values[1] = 'INSTALLED'; } + pHash[values[0]] = values[1]; + } + return pHash; } }); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ambari/blob/11137ea8/ambari-web/app/mixins/common/table_server_view_mixin.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/mixins/common/table_server_view_mixin.js b/ambari-web/app/mixins/common/table_server_view_mixin.js index 0f84633..b126efa 100644 --- a/ambari-web/app/mixins/common/table_server_view_mixin.js +++ b/ambari-web/app/mixins/common/table_server_view_mixin.js @@ -89,25 +89,28 @@ App.TableServerViewMixin = Em.Mixin.create({ updateComboFilter: function(searchCollection) { var self = this; + var comboController = App.router.get('mainHostComboSearchBoxController'); clearTimeout(this.get('timeOut')); this.set('controller.resetStartIndex', true); this.set('filterConditions', []); this.clearFilterConditionsFromLocalStorage(); searchCollection.models.forEach(function (model) { var tag = model.attributes; - var iColumn = App.router.get('mainHostController').get('colPropAssoc').indexOf(tag.category); + var isComponentState = comboController.isComponentStateFacet(tag.category); + var iColumn = App.router.get('mainHostController').get('colPropAssoc').indexOf(isComponentState? 'componentState' : tag.category); var filterCondition = self.get('filterConditions').findProperty('iColumn', iColumn); + var filterValue = isComponentState? (tag.category + ':' + tag.value) : tag.value; if (filterCondition) { if (typeof filterCondition.value == 'string') { - filterCondition.value = [filterCondition.value, tag.value]; - } else if (Em.isArray(filterCondition.value) && filterCondition.value.indexOf(tag.value) == -1) { - filterCondition.value.push(tag.value); + filterCondition.value = [filterCondition.value, filterValue]; + } else if (Em.isArray(filterCondition.value) && filterCondition.value.indexOf(filterValue) == -1) { + filterCondition.value.push(filterValue); } } else { filterCondition = { skipFilter: false, iColumn: iColumn, - value: tag.value, + value: filterValue, type: 'string' }; self.get('filterConditions').push(filterCondition); http://git-wip-us.apache.org/repos/asf/ambari/blob/11137ea8/ambari-web/app/views/main/host/combo_search_box.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/main/host/combo_search_box.js b/ambari-web/app/views/main/host/combo_search_box.js index 73dd347..b52d91f 100644 --- a/ambari-web/app/views/main/host/combo_search_box.js +++ b/ambari-web/app/views/main/host/combo_search_box.js @@ -37,26 +37,39 @@ App.MainHostComboSearchBoxView = Em.View.extend({ ], callbacks: { search: function (query, searchCollection) { - console.error('query: ' + query); var tableView = self.get('parentView').get('parentView'); tableView.updateComboFilter(searchCollection); }, facetMatches: function (callback) { - callback([ - {label: 'hostName', category: 'Host'}, - {label: 'ip', category: 'Host'}, - // {label: 'version', category: 'Host'}, - {label: 'healthClass', category: 'Host'}, - {label: 'rack', category: 'Host'}, - {label: 'services', category: 'Service'}, - {label: 'hostComponents', category: 'Service'}, - // {label: 'state', category: 'Service'} - ]); + var list = [ + {label: 'Host Name', value: 'hostName', category: 'Host'}, + {label: 'IP', value: 'ip', category: 'Host'}, + {label: 'Heath Status', value: 'healthClass', category: 'Host'}, + {label: 'Rack', value: 'rack', category: 'Host'}, + {label: 'Service', value: 'services', category: 'Service'}, + {label: 'Has Component', value: 'hostComponents', category: 'Service'}, + ]; + var hostComponentHash = {}; + App.HostComponent.find().toArray().forEach(function(component) { + hostComponentHash[component.get('displayName')] = component; + }); + for (key in hostComponentHash) { + var name = hostComponentHash[key].get('componentName'); + var displayName = hostComponentHash[key].get('displayName'); + if (displayName != null && !controller.isClientComponent(name)) { + list.push({label: displayName, value: name, category: 'Component'}); + } + } + // Append host components + callback(list, {preserveOrder: true}); }, valueMatches: function (facet, searchTerm, callback) { var category_mocks = require('data/host/categories'); + if (controller.isComponentStateFacet(facet)) { + facet = 'componentState' + } switch (facet) { case 'hostName': case 'ip': @@ -83,6 +96,8 @@ App.MainHostComboSearchBoxView = Em.View.extend({ case 'state': callback(App.HostComponentStatus.getStatusesList(), {preserveOrder: true}); break; + case 'componentState': + callback(['STARTED', 'STOPPED'], {preserveOrder: true}); } } }
