Skip to content

Commit

Permalink
Merge branch 'orderTermsOnMetric' into multiValueMetricAggs
Browse files Browse the repository at this point in the history
Conflicts:
	src/kibana/components/agg_types/buckets/terms.js
	src/kibana/plugins/visualize/editor/agg.js
  • Loading branch information
Spencer Alger committed Jan 4, 2015
2 parents 4b14f0c + 9255c3d commit ee4002c
Show file tree
Hide file tree
Showing 81 changed files with 2,052 additions and 932 deletions.
59 changes: 19 additions & 40 deletions src/kibana/components/agg_types/_agg_params.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@ define(function (require) {
var _ = require('lodash');
var IndexedArray = require('utils/indexed_array/index');

var BaseAggParam = Private(require('components/agg_types/param_types/base'));
var FieldAggParam = Private(require('components/agg_types/param_types/field'));
var OptionedAggParam = Private(require('components/agg_types/param_types/optioned'));
var RegexAggParam = Private(require('components/agg_types/param_types/regex'));
var StringAggParam = Private(require('components/agg_types/param_types/string'));
var RawJSONAggParam = Private(require('components/agg_types/param_types/raw_json'));
var paramTypeMap = {
field: Private(require('components/agg_types/param_types/field')),
optioned: Private(require('components/agg_types/param_types/optioned')),
regex: Private(require('components/agg_types/param_types/regex')),
string: Private(require('components/agg_types/param_types/string')),
json: Private(require('components/agg_types/param_types/raw_json')),
_default: Private(require('components/agg_types/param_types/base'))
};

/**
* Wraps a list of {{#crossLink "AggParam"}}{{/crossLink}} objects; owned by an {{#crossLink "AggType"}}{{/crossLink}}
*
* used to create:
* - `OptionedAggParam` – When the config has an array of `options: []`
* - `FieldAggParam` – When the config has `name: "field"`
* - `*AggParam` – When the type matches something in the map above
* - `BaseAggParam` – All other params
*
* @class AggParams
Expand All @@ -26,42 +28,19 @@ define(function (require) {
*/
_(AggParams).inherits(IndexedArray);
function AggParams(params) {
if (_.isPlainObject(params)) {
// convert the names: details format into details[].name
params = _.map(params, function (param, name) {
param.name = name;
return param;
});
}

// always append the raw JSON param
params.push({
name: 'json',
type: 'json',
advanced: true
});

AggParams.Super.call(this, {
index: ['name'],
initialSet: params.map(function (param) {
if (param.name === 'field') {
return new FieldAggParam(param);
}
else if (param.type === 'optioned') {
return new OptionedAggParam(param);
}
else if (param.type === 'regex') {
return new RegexAggParam(param);
}
else if (param.type === 'string') {
return new StringAggParam(param);
}
else if (param.type === 'json') {
return new RawJSONAggParam(param);
}
else {
return new BaseAggParam(param);
initialSet: params.map(function (config) {
var type = config.name === 'field' ? config.name : config.type;
var Class = paramTypeMap[type] || paramTypeMap._default;
var param = new Class(config);

// recursively init sub params
if (param.params && !(params.params instanceof AggParams)) {
param.params = new AggParams(param.params);
}

return param;
})
});
}
Expand Down
13 changes: 10 additions & 3 deletions src/kibana/components/agg_types/_agg_type.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,16 @@ define(function (require) {
* @property params
* @type {AggParams}
*/
var params = this.params = config.params || [];
if (!(params instanceof AggParams)) {
params = this.params = new AggParams(params);
this.params = config.params || [];
if (!(this.params instanceof AggParams)) {
// always append the raw JSON param
this.params.push({
name: 'json',
type: 'json',
advanced: true
});

this.params = new AggParams(this.params);
}

/**
Expand Down
3 changes: 3 additions & 0 deletions src/kibana/components/agg_types/buckets/filters.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ define(function (require) {
var _ = require('lodash');
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/filters'));
var decorateQuery = Private(require('components/courier/data_source/_decorate_query'));
var notif = new Notifier({ location: 'Filters Agg' });

return new BucketAggType({
Expand All @@ -25,6 +26,8 @@ define(function (require) {
var query = input.query;
if (!query) return notif.log('malformed filter agg params, missing "query" on input');

decorateQuery(query);

var label = _.deepGet(query, 'query_string.query') || JSON.stringify(query);
filters[label] = input;
}, {});
Expand Down
100 changes: 68 additions & 32 deletions src/kibana/components/agg_types/buckets/terms.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@ define(function (require) {
var _ = require('lodash');
var BucketAggType = Private(require('components/agg_types/buckets/_bucket_agg_type'));
var bucketCountBetween = Private(require('components/agg_types/buckets/_bucket_count_between'));
var AggConfig = Private(require('components/vis/_agg_config'));
var createFilter = Private(require('components/agg_types/buckets/create_filter/terms'));

return new BucketAggType({
name: 'terms',
title: 'Terms',
makeLabel: function (aggConfig) {
var params = aggConfig.params;
makeLabel: function (agg) {
var params = agg.params;
return params.order.display + ' ' + params.size + ' ' + params.field.displayName;
},
createFilter: createFilter,
Expand All @@ -19,54 +20,89 @@ define(function (require) {
scriptable: true,
filterFieldTypes: ['number', 'boolean', 'date', 'ip', 'string']
},
{
name: 'exclude',
type: 'regex',
advanced: true
},
{
name: 'include',
type: 'regex',
advanced: true
},
{
name: 'size',
default: 5
// editor: batched with order
},
{
name: 'order',
type: 'optioned',
default: 'desc',
editor: require('text!components/agg_types/controls/order_and_size.html'),
options: [
{ display: 'Top', val: 'desc' },
{ display: 'Bottom', val: 'asc' }
],
editor: require('text!components/agg_types/controls/order_and_size.html'),
default: 'desc',
write: function (aggConfig, output) {
var sort = output.params.order = {};
var order = aggConfig.params.order.val;

var metricAggConfig = _.first(aggConfig.vis.aggs.bySchemaGroup.metrics);
write: _.noop // prevent default write, it's handled by orderAgg
},
{
name: 'orderBy',
write: _.noop // prevent default write, it's handled by orderAgg
},
{
name: 'orderAgg',
type: AggConfig,
default: null,
editor: require('text!components/agg_types/controls/order_agg.html'),
serialize: function (orderAgg) {
return orderAgg.toJSON();
},
deserialize: function (stateJSON, agg) {
return new AggConfig(agg.vis, stateJSON);
},
controller: function ($scope) {
$scope.safeMakeLabel = function (agg) {
try {
return agg.makeLabel();
} catch (e) {
return '- agg not valid -';
}
};

if (metricAggConfig.type.name === 'count') {
sort._count = order;
return;
}
$scope.$watch('agg.params.orderBy', function (orderBy, prevOrderBy) {
var agg = $scope.agg;
var aggs = agg.vis.aggs;
var params = agg.params;

sort[metricAggConfig.id] = order;
if (orderBy === prevOrderBy && !orderBy) {
params.orderBy = (_.first(aggs.bySchemaGroup.metrics) || { id: 'custom' }).id;
return;
}

var visNotHierarchical = !aggConfig.vis.isHierarchical();
if (!orderBy) return;
if (orderBy !== 'custom') {
params.orderAgg = null;
return;
}
if (params.orderAgg) return;

// if the vis is hierarchical, then the metric will always be copied
// if it's not, then we need to make sure the number of buckets is 0, else wise copy it
var metricNotChild = visNotHierarchical && bucketCountBetween(aggConfig, metricAggConfig) !== 0;
params.orderAgg = new AggConfig(agg.vis, {
schema: _.first(agg.vis.type.schemas.metrics)
});
});
},
write: function (agg, output) {
var dir = agg.params.order.val;
var order = output.params.order = {};

if (metricNotChild) {
output.subAggs = output.subAggs || [];
output.subAggs.push(metricAggConfig);
var orderAgg = agg.params.orderAgg;
if (!orderAgg) {
orderAgg = agg.vis.aggs.byId[agg.params.orderBy];
}

output.subAggs = (output.subAggs || []).concat(orderAgg);
order[orderAgg.id] = dir;
}
},
{
name: 'exclude',
type: 'regex',
advanced: true
},
{
name: 'include',
type: 'regex',
advanced: true
}
]
});
Expand Down
28 changes: 28 additions & 0 deletions src/kibana/components/agg_types/controls/order_agg.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<div ng-controller="agg.type.params.byName.orderAgg.controller">
<div class="form-group">
<label>Order By</label>
<select
name="orderBy"
ng-model="agg.params.orderBy"
required
class="form-control">
<option
ng-repeat="agg in agg.vis.aggs.bySchemaGroup.metrics"
value="{{agg.id}}"
ng-selected="agg.params.orderBy === agg.id || (!agg.params.orderBy && $index === 0)">
metric #{{$index + 1}}: {{safeMakeLabel(agg)}}
</option>
<option value="custom" ng-selected="agg.params.orderBy === 'custom'">
Custom Metric
</option>
</select>
</div>
<div ng-show="agg.params.orderAgg" class="vis-editor-agg-order-agg">
<label>{{params.orderBy.display}} Aggregation</label>
<vis-editor-agg-params
agg="agg.params.orderAgg"
ng-if="agg.params.orderAgg"
group-name="'metrics'">
</vis-editor-agg-params>
</div>
</div>
19 changes: 15 additions & 4 deletions src/kibana/components/config/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,20 +85,31 @@ define(function (require) {
});

config.get = function (key, defaultVal) {
var keyVal;

if (vals[key] == null) {
if (defaultVal == null) {
return defaults[key].value;
keyVal = defaults[key].value;
} else {
return _.cloneDeep(defaultVal);
keyVal = _.cloneDeep(defaultVal);
}
} else {
return vals[key];
keyVal = vals[key];
}

if (defaults[key] && defaults[key].type === 'json') {
return JSON.parse(keyVal);
}
return keyVal;
};

// sets a value in the config
config.set = function (key, val) {
return change(key, val);
if (_.isPlainObject(val)) {
return change(key, JSON.stringify(val));
} else {
return change(key, val);
}
};

// clears a value from the config
Expand Down
5 changes: 5 additions & 0 deletions src/kibana/components/config/defaults.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ define(function (require) {
var _ = require('lodash');

return {
'query:queryString:options': {
value: '{ "analyze_wildcard": true }',
description: 'Options for the lucene query string parser',
type: 'json'
},
'dateFormat': {
value: 'MMMM Do YYYY, HH:mm:ss.SSS',
description: 'When displaying a pretty formatted date, use this format',
Expand Down
11 changes: 11 additions & 0 deletions src/kibana/components/courier/data_source/_abstract.js
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,9 @@ define(function (require) {
}())
.then(function () {
if (type === 'search') {
// This is down here to prevent the circular dependency
var decorateQuery = Private(require('components/courier/data_source/_decorate_query'));

flatState.body = flatState.body || {};

// defaults for the query
Expand All @@ -262,6 +265,8 @@ define(function (require) {
};
}

decorateQuery(flatState.body.query);

var computedFields = flatState.index.getComputedFields();
flatState.body.fields = computedFields.fields;
flatState.body.script_fields = flatState.body.script_fields || {};
Expand Down Expand Up @@ -297,6 +302,12 @@ define(function (require) {
// switch to filtered query if there are filters
if (flatState.filters) {
if (flatState.filters.length) {
_.each(flatState.filters, function (filter) {
if (filter.query) {
decorateQuery(filter.query);
}
});

flatState.body.query = {
filtered: {
query: flatState.body.query,
Expand Down
20 changes: 20 additions & 0 deletions src/kibana/components/courier/data_source/_decorate_query.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
define(function (require) {
var _ = require('lodash');
return function DecorateQuery(config) {
/**
* Decorate queries with default parameters
* @param {query} query object
* @returns {object}
*/
return function (query) {
var queryOptions = config.get('query:queryString:options');

if (_.deepHas(query, 'query_string.query')) {
_.extend(query.query_string, queryOptions);
}

return query;
};
};
});

Loading

0 comments on commit ee4002c

Please sign in to comment.