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
169 lines (143 loc) • 4.7 kB
JavaScript
/**
* @name AbstractDocSource
*
* NOTE: This class is tightly coupled with _doc_send_to_es. Its primary
* methods (`doUpdate`, `doIndex`, `doCreate`) are all proxies for methods
* exposed by _doc_send_to_es (`update`, `index`, `create`). These methods are
* called with AbstractDocSource as the context. When called, they depend on “private”
* AbstractDocSource methods within their execution.
*/
import _ from 'lodash';
import 'ui/es';
import 'ui/storage';
import DocSendToEsProvider from './_doc_send_to_es';
import AbstractDataSourceProvider from './_abstract';
import DocRequestProvider from '../fetch/request/_abstract_doc';
export default function AbstractDocSourceFactory(Private, Promise, es, sessionStorage) {
const sendToEs = Private(DocSendToEsProvider);
const SourceAbstract = Private(AbstractDataSourceProvider);
const DocRequest = Private(DocRequestProvider);
_.class(AbstractDocSource).inherits(SourceAbstract);
function AbstractDocSource(initialState, strategy) {
AbstractDocSource.Super.call(this, initialState, strategy);
}
AbstractDocSource.prototype.onUpdate = SourceAbstract.prototype.onResults;
AbstractDocSource.prototype.onResults = void 0;
/*****
* PUBLIC API
*****/
AbstractDocSource.prototype._createRequest = function (defer) {
return new DocRequest(this, defer);
};
/**
* List of methods that is turned into a chainable API in the constructor
* @type {Array}
*/
AbstractDocSource.prototype._methods = [
'index',
'type',
'id',
'sourceInclude',
'sourceExclude'
];
/**
* Applies a partial update to the document
* @param {object} fields - The fields to change and their new values (es doc field)
* @return {undefined}
*/
AbstractDocSource.prototype.doUpdate = function (fields) {
if (!this._state.id) return this.doIndex(fields);
return sendToEs.call(this, 'update', false, { doc: fields });
};
/**
* Update the document stored
* @param {[type]} body [description]
* @return {[type]} [description]
*/
AbstractDocSource.prototype.doIndex = function (body) {
return sendToEs.call(this, 'index', false, body);
};
AbstractDocSource.prototype.doCreate = function (body) {
return sendToEs.call(this, 'create', false, body, []);
};
/*****
* PRIVATE API
*****/
/**
* Get the type of this SourceAbstract
* @return {string} - 'doc'
*/
AbstractDocSource.prototype._getType = function () {
return 'doc';
};
/**
* Used to merge properties into the state within ._flatten().
* The state is passed in and modified by the function
*
* @param {object} state - the current merged state
* @param {*} val - the value at `key`
* @param {*} key - The key of `val`
* @return {undefined}
*/
AbstractDocSource.prototype._mergeProp = function (state, val, key) {
const flatKey = '_' + key;
if (val != null && state[flatKey] == null) {
state[flatKey] = val;
}
};
/**
* Creates a key based on the doc's index/type/id
* @return {string}
*/
AbstractDocSource.prototype._versionKey = function () {
const state = this._state;
if (!state.index || !state.type || !state.id) return;
return 'DocVersion:' + (
[ state.index, state.type, state.id ]
.map(encodeURIComponent)
.join('/')
);
};
/**
* Get the cached version number, not the version that is
* stored/shared with other tabs
*
* @return {number} - the version number, or undefined
*/
AbstractDocSource.prototype._getVersion = function () {
if (this._version) return this._version;
else return this._getStoredVersion();
};
/**
* Fetches the stored version from storage
* @return {[type]} [description]
*/
AbstractDocSource.prototype._getStoredVersion = function () {
const key = this._versionKey();
if (!key) return;
const v = sessionStorage.get(key);
this._version = v ? _.parseInt(v) : void 0;
return this._version;
};
/**
* Stores the version into storage
* @param {number, NaN} version - the current version number, NaN works well forcing a refresh
* @return {undefined}
*/
AbstractDocSource.prototype._storeVersion = function (version) {
if (!version) return this._clearVersion();
const key = this._versionKey();
if (!key) return;
this._version = version;
sessionStorage.set(key, version);
};
/**
* Clears the stored version for a AbstractDocSource
*/
AbstractDocSource.prototype._clearVersion = function () {
const key = this._versionKey();
if (!key) return;
sessionStorage.remove(key);
};
return AbstractDocSource;
}