Merge branch 'master' of github.com:elasticsearch/kibana

This commit is contained in:
Rashid Khan 2014-12-10 16:09:34 -07:00
commit 05766e516a
3 changed files with 84 additions and 45 deletions

View file

@ -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;
};
};
});

View file

@ -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');
});
});
});
});

View file

@ -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);