UNPKG

@spalger/kibana

Version:

Kibana is an open source (Apache Licensed), browser based analytics and search dashboard for Elasticsearch. Kibana is a snap to setup and start using. Kibana strives to be easy to get started with, while also being flexible and powerful, just like Elastic

95 lines (82 loc) 2.79 kB
define(function (require) { var _ = require('lodash'); var extractBuckets = require('ui/agg_response/hierarchical/_extract_buckets'); return function (vis, resp) { // Create the initial results structure var results = { rows: [] }; // Create a reference to the buckets and metrics var metrics = vis.aggs.bySchemaGroup.metrics; var buckets = vis.aggs.bySchemaGroup.buckets; var aggs = []; if (buckets) { _.each(buckets, function (bucket) { aggs.push(bucket); aggs.push(metrics); }); } else { aggs.push(metrics); } // Create the columns results.columns = _(aggs) .flattenDeep() .map(function (agg) { return { categoryName: agg.schema.name, id: agg.id, aggConfig: agg, aggType: agg.type, field: agg.params.field, label: agg.type.makeLabel(agg) }; }) .value(); // if there are no buckets then we need to just set the value and return if (!buckets) { var value = resp.aggregations && resp.aggregations[metrics[0].id] && resp.aggregations[metrics[0].id].value || resp.hits.total; results.rows.push([value]); return results; } /** * Walk the buckets and create records for each leaf * @param {aggConfig} agg The aggConfig for the current level * @param {object} data The aggergation object * @param {array} [record] The record that will eventually get pushed to the rows * @returns {void} */ function walkBuckets(agg, data, record) { if (!_.isArray(record)) { record = []; } // iterate through all the buckets _.each(extractBuckets(data[agg.id]), function (bucket) { var _record = _.flattenDeep([record, bucket.key]); _.each(metrics, function (metric) { var value = bucket.doc_count; if (bucket[metric.id] && !_.isUndefined(bucket[metric.id].value)) { value = bucket[metric.id].value; } _record.push(value); }); // If there is another agg to call we need to check to see if it has // buckets. If it does then we need to keep on walking the tree. // This is where the recursion happens. if (agg._next) { var nextBucket = bucket[agg._next.id]; if (nextBucket && nextBucket.buckets) { walkBuckets(agg._next, bucket, _record); } } // if there are no more aggs to walk then push the record to the rows. else { results.rows.push(_record); } }); } // Start walking the buckets at the beginning of the aggregations object. walkBuckets(buckets[0], resp.aggregations); return results; }; });