mirror of
https://github.com/elastic/kibana.git
synced 2025-04-24 09:48:58 -04:00
Merge branch 'master' of github.com:elasticsearch/kibana
This commit is contained in:
commit
05766e516a
3 changed files with 84 additions and 45 deletions
|
@ -1,5 +1,5 @@
|
|||
define(function (require) {
|
||||
return function buildHierarchicalDataProvider(Private) {
|
||||
return function buildHierarchicalDataProvider(Private, Notifier) {
|
||||
var _ = require('lodash');
|
||||
var buildSplit = Private(require('components/agg_response/hierarchical/_build_split'));
|
||||
var extractBuckets = require('components/agg_response/hierarchical/_extract_buckets');
|
||||
|
@ -9,6 +9,10 @@ define(function (require) {
|
|||
|
||||
var AggConfigResult = require('components/vis/_agg_config_result');
|
||||
|
||||
var notify = new Notifier({
|
||||
location: 'Pie chart response converter'
|
||||
});
|
||||
|
||||
return function (vis, resp) {
|
||||
// Create a refrenece to the buckets
|
||||
var buckets = vis.aggs.bySchemaGroup.buckets;
|
||||
|
@ -47,48 +51,42 @@ define(function (require) {
|
|||
var firstAgg = buckets[0];
|
||||
var aggData = resp.aggregations[firstAgg.id];
|
||||
|
||||
var convertKey = function (key) {
|
||||
if (firstAgg.params.field.format) {
|
||||
return firstAgg.params.field.format.convert(key);
|
||||
}
|
||||
|
||||
return key;
|
||||
};
|
||||
|
||||
// If the firstAgg is a split then we need to map
|
||||
// the split aggregations into rows.
|
||||
if (firstAgg.schema.name === 'split') {
|
||||
var rows = _.map(extractBuckets(aggData), function (bucket) {
|
||||
var agg = firstAgg._next;
|
||||
var split = buildSplit(agg, metric, bucket[agg.id]);
|
||||
// Since splits display labels we need to set it.
|
||||
split.label = convertKey(bucket.key) + ': ' + firstAgg.params.field.displayName;
|
||||
split.tooltipFormatter = tooltipFormatter(raw.columns);
|
||||
var aggConfigResult = new AggConfigResult(firstAgg, null, null, bucket.key);
|
||||
split.split = { aggConfig: firstAgg, aggConfigResult: aggConfigResult, key: bucket.key };
|
||||
_.each(split.slices.children, function (child) {
|
||||
child.aggConfigResult.$parent = aggConfigResult;
|
||||
});
|
||||
return split;
|
||||
});
|
||||
var result = { hits: resp.hits.total, raw: raw };
|
||||
if (firstAgg.params.row) {
|
||||
result.rows = rows;
|
||||
} else {
|
||||
result.columns = rows;
|
||||
}
|
||||
return result;
|
||||
// otherwise we can start at the first bucket.
|
||||
} else {
|
||||
return (function () {
|
||||
var split = buildSplit(firstAgg, metric, aggData);
|
||||
split.hits = resp.hits.total;
|
||||
split.raw = raw;
|
||||
split.tooltipFormatter = tooltipFormatter(raw.columns);
|
||||
return split;
|
||||
})();
|
||||
if (!firstAgg._next && firstAgg.schema.name === 'split') {
|
||||
notify.error('Splitting charts without splitting slices is not supported. Pretending that we are just splitting slices.');
|
||||
}
|
||||
|
||||
// start with splitting slices
|
||||
if (!firstAgg._next || firstAgg.schema.name === 'segment') {
|
||||
var split = buildSplit(firstAgg, metric, aggData);
|
||||
split.hits = resp.hits.total;
|
||||
split.raw = raw;
|
||||
split.tooltipFormatter = tooltipFormatter(raw.columns);
|
||||
return split;
|
||||
}
|
||||
|
||||
// map the split aggregations into rows.
|
||||
var rows = _.map(extractBuckets(aggData), function (bucket) {
|
||||
var agg = firstAgg._next;
|
||||
var split = buildSplit(agg, metric, bucket[agg.id]);
|
||||
// Since splits display labels we need to set it.
|
||||
split.label = firstAgg.fieldFormatter()(bucket.key) + ': ' + firstAgg.field().displayName;
|
||||
split.tooltipFormatter = tooltipFormatter(raw.columns);
|
||||
var aggConfigResult = new AggConfigResult(firstAgg, null, null, bucket.key);
|
||||
split.split = { aggConfig: firstAgg, aggConfigResult: aggConfigResult, key: bucket.key };
|
||||
_.each(split.slices.children, function (child) {
|
||||
child.aggConfigResult.$parent = aggConfigResult;
|
||||
});
|
||||
return split;
|
||||
});
|
||||
|
||||
var result = { hits: resp.hits.total, raw: raw };
|
||||
if (firstAgg.params.row) {
|
||||
result.rows = rows;
|
||||
} else {
|
||||
result.columns = rows;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
};
|
||||
});
|
||||
|
|
|
@ -1,16 +1,22 @@
|
|||
define(function (require) {
|
||||
var _ = require('lodash');
|
||||
var fixtures = require('fixtures/fake_hierarchical_data');
|
||||
var sinon = require('test_utils/auto_release_sinon');
|
||||
|
||||
var AggConfigs;
|
||||
var Vis;
|
||||
var Notifier;
|
||||
var AggConfigs;
|
||||
var indexPattern;
|
||||
var buildHierarchicalData;
|
||||
|
||||
describe('buildHierarchicalData()', function () {
|
||||
|
||||
beforeEach(module('kibana'));
|
||||
beforeEach(inject(function (Private) {
|
||||
beforeEach(inject(function (Private, $injector) {
|
||||
// stub the error method before requiring vis causes Notifier#error to be bound
|
||||
Notifier = $injector.get('Notifier');
|
||||
sinon.stub(Notifier.prototype, 'error');
|
||||
|
||||
Vis = Private(require('components/vis/vis'));
|
||||
AggConfigs = Private(require('components/vis/_agg_configs'));
|
||||
indexPattern = Private(require('fixtures/stubbed_logstash_index_pattern'));
|
||||
|
@ -232,6 +238,41 @@ define(function (require) {
|
|||
|
||||
});
|
||||
|
||||
describe('oneFilterBucket that is a split', function () {
|
||||
var vis, results;
|
||||
|
||||
beforeEach(function () {
|
||||
var id = 1;
|
||||
vis = new Vis(indexPattern, {
|
||||
type: 'pie',
|
||||
aggs: [
|
||||
{ type: 'count', schema: 'metric' },
|
||||
{ type: 'filters', schema: 'split', params: {
|
||||
filters: [
|
||||
{ input: { query: { query_string: { query: '_type:apache' } } } },
|
||||
{ input: { query: { query_string: { query: '_type:nginx' } } } }
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
// We need to set the aggs to a known value.
|
||||
_.each(vis.aggs, function (agg) { agg.id = 'agg_' + id++; });
|
||||
results = buildHierarchicalData(vis, fixtures.oneFilterBucket);
|
||||
});
|
||||
|
||||
it('should set the hits attribute for the results', function () {
|
||||
var errCall = Notifier.prototype.error.getCall(0);
|
||||
expect(errCall).to.be.ok();
|
||||
expect(errCall.args[0]).to.contain('not supported');
|
||||
|
||||
expect(results).to.have.property('slices');
|
||||
expect(results).to.have.property('names');
|
||||
expect(results.names).to.have.length(2);
|
||||
expect(results).to.have.property('raw');
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ define(function (require) {
|
|||
'_source': {
|
||||
'extension': 'html',
|
||||
'bytes': 100,
|
||||
'point': {lat: 7, lon: 7},
|
||||
'area': [{lat: 7, lon: 7}],
|
||||
'noMapping': 'hasNoMapping',
|
||||
'objectArray': [{foo: true}, {bar: false}]
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ define(function (require) {
|
|||
});
|
||||
|
||||
it('should NOT apply a filter when clicking non-filterable fields', function () {
|
||||
var cell = $elem.find('td[title="point"]').next();
|
||||
var cell = $elem.find('td[title="area"]').next();
|
||||
|
||||
cell.find('.fa-search-plus').first().click();
|
||||
expect($scope.filter.calledOnce).to.be(false);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue