[settings/fieldFilters] list filter matches, remove excluded fields from fieldata_fields

This commit is contained in:
spalger 2016-04-05 01:59:39 -07:00 committed by Stéphane Campinas
parent d75a63fa34
commit 08f8fd7e0d
5 changed files with 120 additions and 63 deletions

View file

@ -5,66 +5,93 @@
</p>
<div ng-class="{ saving: fieldFilters.saving }" class="field-filters-container">
<form
ng-repeat="filter in fieldFilters.all()"
ng-submit="fieldFilters.save(filter)"
class="field-filter"
name="form">
<div class="value">
<span ng-if="fieldFilters.editting !== filter">{{ filter.value }}</span>
<table class="table table-hover">
<tbody>
<tr ng-repeat="filter in fieldFilters.all()">
<td>
<form
ng-submit="fieldFilters.save(filter)"
class="field-filter"
name="form">
<input
ng-model="filter.value"
ng-if="fieldFilters.editting === filter"
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
type="text"
required
class="form-control">
</div>
<div class="value">
<span ng-if="fieldFilters.editting !== filter">{{ filter.value }}</span>
<div class="controls">
<button
aria-label="Edit field filter"
ng-if="fieldFilters.editting !== filter"
ng-click="fieldFilters.editting = filter"
type="button"
class="btn btn-default">
<i aria-hidden="true" class="fa fa-pencil"></i>
</button>
<button
aria-label="Save field filter"
ng-if="fieldFilters.editting === filter"
type="submit"
class="btn btn-primary">
<i aria-hidden="true" class="fa fa-save"></i>
</button>
<button
aria-label="Delete field filter"
ng-click="fieldFilters.delete(filter)"
type="button"
class="btn btn-danger">
<i aria-hidden="true" class="fa fa-trash"></i>
</button>
</div>
</form>
<input
ng-model="filter.value"
input-focus
ng-if="fieldFilters.editting === filter"
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
type="text"
required
class="form-control">
</div>
<form name="form" ng-submit="fieldFilters.create()">
<div class="input-group">
<input
ng-model="fieldFilters.newValue"
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
type="text"
class="form-control">
<div class="controls">
<button
aria-label="Edit field filter"
ng-if="fieldFilters.editting !== filter"
ng-click="fieldFilters.editting = filter"
type="button"
class="btn btn-default">
<i aria-hidden="true" class="fa fa-pencil"></i>
</button>
<button
aria-label="Save field filter"
ng-if="fieldFilters.editting === filter"
type="submit"
class="btn btn-primary">
<i aria-hidden="true" class="fa fa-save"></i>
</button>
<button
aria-label="Delete field filter"
ng-click="fieldFilters.delete(filter)"
type="button"
class="btn btn-danger">
<i aria-hidden="true" class="fa fa-trash"></i>
</button>
</div>
</form>
</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>
<form name="form" ng-submit="fieldFilters.create()">
<div class="input-group">
<input
ng-model="fieldFilters.newValue"
placeholder="field name filter, accepts wildcards (i.e. `user:*`)"
type="text"
class="form-control">
<div class="input-group-btn" role="group" aria-label="Field Filter Editor Controls">
<button
type="submit"
class="btn btn-primary"
ng-disabled="!fieldFilters.newValue">
Add
</button>
</div>
</div>
</form>
<div class="input-group-btn" role="group" aria-label="Field Filter Editor Controls">
<button
type="submit"
class="btn btn-primary"
ng-disabled="!fieldFilters.newValue">
Add
</button>
</div>
</div>
</form>
</td>
</tr>
</tfoot>
</table>
<div ng-if="fieldFilters.all().length" class="known-matches">
<h4>Known Matches</h4>
<p ng-if="!fieldFilters.sampleMatches">
<em>The selected field filters don't match any known fields.</em>
</p>
<p ng-if="fieldFilters.sampleMatches">
Based on the choosen field filters, these are the known fields that would be excluded from document sources.
</p>
<ul>
<li ng-repeat="match in fieldFilters.sampleMatches">{{match}}</li>
</ul>
</div>
</div>

View file

@ -1,7 +1,8 @@
import { without } from 'lodash';
import { size, without } from 'lodash';
import uiModules from 'ui/modules';
import Notifier from 'ui/notify/notifier';
import { fieldWildcardMatcher } from 'ui/field_wildcard';
import template from './field_filters.html';
import './field_filters.less';
@ -27,10 +28,17 @@ uiModules.get('kibana')
this.saving = false;
this.editting = null;
this.newValue = null;
$scope.$watch('indexPattern.fieldFilters', (filters) => {
const values = filters.map(f => f.value);
const filter = fieldWildcardMatcher(values);
const matches = $scope.indexPattern.fields.map(f => f.name).filter(filter).sort();
this.sampleMatches = size(matches) ? matches : null;
});
}
all() {
return this.$scope.indexPattern.fieldFilters || [];
return this.$scope.indexPattern.fieldFilters;
}
delete(filter) {

View file

@ -15,7 +15,8 @@ settings-indices-field-filters {
align-items: center;
margin: 10px 0;
> .value {
.value {
text-align: left;
flex: 1 1 auto;
padding-right: 5px;
font-family: @font-family-monospace;
@ -26,4 +27,12 @@ settings-indices-field-filters {
}
}
}
.known-matches {
ul li {
font-family: @font-family-monospace;
font-size: @font-size-base;
padding: @table-cell-padding;
}
}
}

View file

@ -7,6 +7,7 @@ import RequestQueueProvider from '../_request_queue';
import ErrorHandlersProvider from '../_error_handlers';
import FetchProvider from '../fetch';
import DecorateQueryProvider from './_decorate_query';
import { fieldWildcardFilter } from '../../field_wildcard';
export default function SourceAbstractFactory(Private, Promise, PromiseEmitter) {
let requestQueue = Private(RequestQueueProvider);
@ -381,6 +382,11 @@ export default function SourceAbstractFactory(Private, Promise, PromiseEmitter)
recurse(agg.aggs || agg.aggregations);
});
}(flatState.body.aggs || flatState.body.aggregations));
if (flatState.body._source && flatState.body.fielddata_fields) {
const filter = fieldWildcardFilter(flatState.body._source.exclude);
flatState.body.fielddata_fields = flatState.body.fielddata_fields.filter(filter);
}
}
return flatState;

View file

@ -4,8 +4,15 @@ export const makeRegEx = memoize(function makeRegEx(glob) {
return new RegExp(glob.replace(/\*/g, '.*'));
});
export function fieldWildcardFilter(globs) {
return function filter(val) {
return !globs.some(p => makeRegEx(p).test(val));
export function fieldWildcardMatcher(globs) {
return function matcher(val) {
return globs.some(p => makeRegEx(p).test(val));
};
}
export function fieldWildcardFilter(globs) {
const matcher = fieldWildcardMatcher(globs);
return function filter(val) {
return !matcher(val);
};
}