kibana-123
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
90 lines (72 loc) • 3.09 kB
JavaScript
import ObjDefine from 'ui/utils/obj_define';
import IndexPatternsFieldFormatFieldFormatProvider from 'ui/index_patterns/_field_format/field_format';
import IndexPatternsFieldTypesProvider from 'ui/index_patterns/_field_types';
import RegistryFieldFormatsProvider from 'ui/registry/field_formats';
export default function FieldObjectProvider(Private, shortDotsFilter, $rootScope, Notifier) {
let notify = new Notifier({ location: 'IndexPattern Field' });
let FieldFormat = Private(IndexPatternsFieldFormatFieldFormatProvider);
let fieldTypes = Private(IndexPatternsFieldTypesProvider);
let fieldFormats = Private(RegistryFieldFormatsProvider);
function Field(indexPattern, spec) {
// unwrap old instances of Field
if (spec instanceof Field) spec = spec.$$spec;
// constuct this object using ObjDefine class, which
// extends the Field.prototype but gets it's properties
// defined using the logic below
let obj = new ObjDefine(spec, Field.prototype);
if (spec.name === '_source') {
spec.type = '_source';
}
// find the type for this field, fallback to unknown type
let type = fieldTypes.byName[spec.type];
if (spec.type && !type) {
notify.error(
'Unknown field type "' + spec.type + '"' +
' for field "' + spec.name + '"' +
' in indexPattern "' + indexPattern.id + '"'
);
}
if (!type) type = fieldTypes.byName.unknown;
let format = spec.format;
if (!format || !(format instanceof FieldFormat)) {
format = indexPattern.fieldFormatMap[spec.name] || fieldFormats.getDefaultInstance(spec.type);
}
let indexed = !!spec.indexed;
let scripted = !!spec.scripted;
let sortable = spec.name === '_score' || ((indexed || scripted) && type.sortable);
let filterable = spec.name === '_id' || scripted || (indexed && type.filterable);
let searchable = !!spec.searchable || scripted;
let aggregatable = !!spec.aggregatable || scripted;
let visualizable = aggregatable;
obj.fact('name');
obj.fact('type');
obj.writ('count', spec.count || 0);
// scripted objs
obj.fact('scripted', scripted);
obj.writ('script', scripted ? spec.script : null);
obj.writ('lang', scripted ? (spec.lang || 'painless') : null);
// mapping info
obj.fact('indexed', indexed);
obj.fact('analyzed', !!spec.analyzed);
obj.fact('doc_values', !!spec.doc_values);
// stats
obj.fact('searchable', searchable);
obj.fact('aggregatable', aggregatable);
// usage flags, read-only and won't be saved
obj.comp('format', format);
obj.comp('sortable', sortable);
obj.comp('filterable', filterable);
obj.comp('visualizable', visualizable);
// computed values
obj.comp('indexPattern', indexPattern);
obj.comp('displayName', shortDotsFilter(spec.name));
obj.comp('$$spec', spec);
// conflict info
obj.writ('conflictDescriptions');
return obj.create();
}
Field.prototype.routes = {
edit: '/management/kibana/indices/{{indexPattern.id}}/field/{{name}}'
};
return Field;
};