@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
129 lines (113 loc) • 4.15 kB
JavaScript
define(function (require) {
return function MapperService(Private, Promise, es, config, kbnIndex) {
var _ = require('lodash');
var moment = require('moment');
var IndexPatternMissingIndices = require('ui/errors').IndexPatternMissingIndices;
var transformMappingIntoFields = Private(require('ui/index_patterns/_transform_mapping_into_fields'));
var intervals = Private(require('ui/index_patterns/_intervals'));
var patternToWildcard = Private(require('ui/index_patterns/_pattern_to_wildcard'));
var LocalCache = Private(require('ui/index_patterns/_local_cache'));
function Mapper() {
// Save a reference to mapper
var self = this;
// proper-ish cache, keeps a clean copy of the object, only returns copies of it's copy
var fieldCache = self.cache = new LocalCache();
/**
* Gets an object containing all fields with their mappings
* @param {dataSource} dataSource
* @param {boolean} skipIndexPatternCache - should we ping the index-pattern objects
* @returns {Promise}
* @async
*/
self.getFieldsForIndexPattern = function (indexPattern, skipIndexPatternCache) {
var id = indexPattern.id;
var cache = fieldCache.get(id);
if (cache) return Promise.resolve(cache);
if (!skipIndexPatternCache) {
return es.get({
index: kbnIndex,
type: 'index-pattern',
id: id,
_sourceInclude: ['fields']
})
.then(function (resp) {
if (resp.found && resp._source.fields) {
fieldCache.set(id, JSON.parse(resp._source.fields));
}
return self.getFieldsForIndexPattern(indexPattern, true);
});
}
var promise = Promise.resolve(id);
if (indexPattern.intervalName) {
promise = self.getIndicesForIndexPattern(indexPattern)
.then(function (existing) {
if (existing.matches.length === 0) throw new IndexPatternMissingIndices();
return existing.matches.slice(-config.get('indexPattern:fieldMapping:lookBack')); // Grab the most recent
});
}
return promise.then(function (indexList) {
return es.indices.getFieldMapping({
index: indexList,
field: '*',
ignoreUnavailable: _.isArray(indexList),
allowNoIndices: false,
includeDefaults: true
});
})
.catch(function (err) {
if (err.status >= 400) {
// transform specific error type
throw new IndexPatternMissingIndices();
} else {
// rethrow all others
throw err;
}
})
.then(transformMappingIntoFields)
.then(function (fields) {
fieldCache.set(id, fields);
return fieldCache.get(id);
});
};
self.getIndicesForIndexPattern = function (indexPattern) {
return es.indices.getAliases({
index: patternToWildcard(indexPattern.id)
})
.then(function (resp) {
// var all = Object.keys(resp).sort();
var all = _(resp)
.map(function (index, key) {
if (index.aliases) {
return [Object.keys(index.aliases), key];
} else {
return key;
}
})
.flattenDeep()
.sort()
.uniq(true)
.value();
var matches = all.filter(function (existingIndex) {
var parsed = moment(existingIndex, indexPattern.id);
return existingIndex === parsed.format(indexPattern.id);
});
return {
all: all,
matches: matches
};
});
};
/**
* Clears mapping caches from elasticsearch and from local object
* @param {dataSource} dataSource
* @returns {Promise}
* @async
*/
self.clearCache = function (indexPattern) {
fieldCache.clear(indexPattern);
return Promise.resolve();
};
}
return new Mapper();
};
});