[aggTypes/metrics] implemented per-agg formatting

This commit is contained in:
Spencer Alger 2015-04-23 11:48:38 -07:00
parent b2f71f7017
commit b549710dc4
8 changed files with 52 additions and 23 deletions

View file

@ -3,7 +3,7 @@
"node": true,
// shared with .jshintrc files for browser and node
"unused": true,
"unused": false,
"bitwise": false,
"eqnull": true,
"eqeqeq": true,

View file

@ -1,5 +1,5 @@
define(function (require) {
return function MetricAggTypeProvider(Private, indexPatterns) {
return function MetricAggTypeProvider(Private) {
var _ = require('lodash');
var AggType = Private(require('components/agg_types/_agg_type'));
var fieldFormats = Private(require('registry/field_formats'));
@ -8,9 +8,12 @@ define(function (require) {
function MetricAggType(config) {
MetricAggType.Super.call(this, config);
if (_.isFunction(config.getValue)) {
this.getValue = config.getValue;
}
// allow overriding any value on the prototype
_.forOwn(config, function (val, key) {
if (_.has(MetricAggType.prototype, key)) {
this[key] = val;
}
}, this);
}
/**
@ -22,13 +25,17 @@ define(function (require) {
return bucket[agg.id].value;
};
/**
* Pick a format for the values produced by this agg type,
* overriden by several metrics that always output a simple
* number
*
* @param {agg} agg - the agg to pick a format for
* @return {FieldFromat}
*/
MetricAggType.prototype.getFormat = function (agg) {
var field = agg.field();
if (field && field.type === 'date' && field.format) {
return field.format;
} else {
return fieldFormats.for('number');
}
return field ? field.format : fieldFormats.getDefaultInstance('number');
};
return MetricAggType;

View file

@ -16,4 +16,4 @@ define(function (require) {
]
});
};
});
});

View file

@ -1,6 +1,7 @@
define(function (require) {
return function AggTypeMetricCardinalityProvider(Private) {
var MetricAggType = Private(require('components/agg_types/metrics/_metric_agg_type'));
var fieldFormats = Private(require('registry/field_formats'));
return new MetricAggType({
name: 'cardinality',
@ -8,6 +9,9 @@ define(function (require) {
makeLabel: function (aggConfig) {
return 'Unique count of ' + aggConfig.params.field.displayName;
},
getFormat: function () {
return fieldFormats.getDefaultInstance('number');
},
params: [
{
name: 'field'
@ -15,4 +19,4 @@ define(function (require) {
]
});
};
});
});

View file

@ -1,17 +1,21 @@
define(function (require) {
return function AggTypeMetricCountProvider(Private) {
var MetricAggType = Private(require('components/agg_types/metrics/_metric_agg_type'));
var fieldFormats = Private(require('registry/field_formats'));
return new MetricAggType({
name: 'count',
title: 'Count',
hasNoDsl: true,
makeLabel: function (aggConfig) {
makeLabel: function () {
return 'Count';
},
getValue: function (agg, bucket) {
return bucket.doc_count;
},
getFormat: function () {
return fieldFormats.getDefaultInstance('number');
}
});
};
});
});

View file

@ -4,6 +4,7 @@ define(function (require) {
var MetricAggType = Private(require('components/agg_types/metrics/_metric_agg_type'));
var getResponseAggConfig = Private(require('components/agg_types/metrics/_get_response_agg_config'));
var fieldFormats = Private(require('registry/field_formats'));
require('components/agg_types/controls/_values_list');
var valuesEditor = require('text!components/agg_types/controls/values.html');
@ -51,6 +52,9 @@ define(function (require) {
return new ValueAggConfig(value);
});
},
getFormat: function () {
return fieldFormats.getInstance('percent') || fieldFormats.getDefaultInstance('number');
},
getValue: function (agg, bucket) {
// values for 1, 5, and 10 will come back as 1.0, 5.0, and 10.0 so we
// parse the keys and respond with the value that matches
@ -60,4 +64,4 @@ define(function (require) {
}
});
};
});
});

View file

@ -5,6 +5,7 @@ define(function (require) {
var MetricAggType = Private(require('components/agg_types/metrics/_metric_agg_type'));
var getResponseAggConfig = Private(require('components/agg_types/metrics/_get_response_agg_config'));
var ordinalSuffix = require('utils/ordinal_suffix');
var fieldFormats = Private(require('registry/field_formats'));
require('components/agg_types/controls/_values_list');
var percentEditor = require('text!components/agg_types/controls/percents.html');
@ -52,6 +53,9 @@ define(function (require) {
return new ValueAggConfig(percent);
});
},
getFormat: function () {
return fieldFormats.getInstance('percent') || fieldFormats.getDefaultInstance('number');
},
getValue: function (agg, bucket) {
// percentiles for 1, 5, and 10 will come back as 1.0, 5.0, and 10.0 so we
// parse the keys and respond with the value that matches
@ -61,4 +65,4 @@ define(function (require) {
}
});
};
});
});

View file

@ -16,27 +16,30 @@ define(function (require) {
$rootScope.$on('change:config.format:defaultTypeMap', parseDefaultTypeMap);
}
/**
* Get a FieldFormat type (class) by it's id.
*
* @param {String} formatId - the format id
* @return {Function}
*/
self.type = function (formatId) {
self.getType = function (formatId) {
return self.byId[formatId];
};
/**
* Get the singleton instance of the FieldFormat type by it's id.
*
* @param {String} formatId
* @return {FieldFormat}
*/
self.instance = _.memoize(function (formatId) {
self.getInstance = _.memoize(function (formatId) {
var FieldFormat = self.byId[formatId];
return new FieldFormat();
});
/**
* Get the id of the default type for this field type
* using the format:defaultTypeMap config map
@ -44,10 +47,11 @@ define(function (require) {
* @param {String} fieldType - the field type
* @return {String}
*/
self.defaultTypeId = function (fieldType) {
self.getDefaultTypeId = function (fieldType) {
return defaultMap[fieldType] || defaultMap._default_;
};
/**
* Get the default FieldFormat type (class) for
* a field type, using the format:defaultTypeMap.
@ -55,20 +59,22 @@ define(function (require) {
* @param {String} fieldType
* @return {Function}
*/
self.defaultType = function (fieldType) {
return self.byId[self.defaultTypeId(fieldType)];
self.getDefaultType = function (fieldType) {
return self.byId[self.getDefaultTypeId(fieldType)];
};
/**
* Get the default fieldFormat instance for a field format.
*
* @param {String} fieldType
* @return {FieldFormat}
*/
self.defaultInstance = _.memoize(function (fieldType) {
return self.instance(self.defaultTypeId(fieldType));
self.getDefaultInstance = _.memoize(function (fieldType) {
return self.getInstance(self.getDefaultTypeId(fieldType));
});
function parseDefaultTypeMap() {
defaultMap = config.get('format:defaultTypeMap');
_.forOwn(self, function (fn) {