diff --git a/src/core_plugins/kibana/public/context/api/anchor.js b/src/core_plugins/kibana/public/context/api/anchor.js new file mode 100644 index 00000000000000..28ceeedceb431f --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/anchor.js @@ -0,0 +1,26 @@ +import _ from 'lodash'; + +import {addComputedFields} from './utils/fields'; +import {createAnchorQuery} from './utils/queries'; + + +async function fetchAnchor(es, indexPattern, uid, sort) { + const indices = await indexPattern.toIndexList(); + const response = await es.search({ + index: indices, + body: addComputedFields(indexPattern, createAnchorQuery(uid, sort)), + }); + + if (_.get(response, ['hits', 'total'], 0) < 1) { + throw new Error('Failed to load anchor row.'); + } + + return _.assign({}, response.hits.hits[0], { + $$_isAnchor: true, + }); +} + + +export { + fetchAnchor, +}; diff --git a/src/core_plugins/kibana/public/context/api/context.js b/src/core_plugins/kibana/public/context/api/context.js new file mode 100644 index 00000000000000..d2699a502757f7 --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/context.js @@ -0,0 +1,41 @@ +import _ from 'lodash'; + +import {addComputedFields} from './utils/fields'; +import {getDocumentUid} from './utils/ids'; +import {createSuccessorsQuery} from './utils/queries.js'; +import {reverseQuerySort} from './utils/sorting'; + + +async function fetchContext(es, indexPattern, anchorDocument, sort, size) { + const indices = await indexPattern.toIndexList(); + const anchorUid = getDocumentUid(anchorDocument._type, anchorDocument._id); + const successorsQuery = addComputedFields( + indexPattern, + createSuccessorsQuery(anchorUid, anchorDocument.sort, sort, size) + ); + const predecessorsQuery = reverseQuerySort(successorsQuery); + + const response = await es.msearch({ + body: [ + {index: indices}, + predecessorsQuery, + {index: indices}, + successorsQuery, + ], + }); + + const predecessors = _.get(response, ['responses', 0, 'hits', 'hits'], []); + const successors = _.get(response, ['responses', 1, 'hits', 'hits'], []); + + predecessors.reverse(); + + return { + predecessors, + successors, + }; +} + + +export { + fetchContext, +}; diff --git a/src/core_plugins/kibana/public/context/api/utils/fields.js b/src/core_plugins/kibana/public/context/api/utils/fields.js new file mode 100644 index 00000000000000..b9a78aec3a20b8 --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/utils/fields.js @@ -0,0 +1,17 @@ +import _ from 'lodash'; + + +function addComputedFields(indexPattern, query) { + const computedFields = indexPattern.getComputedFields(); + + return _.assign({}, query, { + script_fields: computedFields.scriptFields, + docvalue_fields: computedFields.docvalueFields, + stored_fields: computedFields.storedFields, + }); +}; + + +export { + addComputedFields, +}; diff --git a/src/core_plugins/kibana/public/context/api/utils/ids.js b/src/core_plugins/kibana/public/context/api/utils/ids.js new file mode 100644 index 00000000000000..42bd4fac8b5114 --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/utils/ids.js @@ -0,0 +1,8 @@ +function getDocumentUid(type, id) { + return `${type}#${id}`; +} + + +export { + getDocumentUid, +}; diff --git a/src/core_plugins/kibana/public/context/api/utils/queries.js b/src/core_plugins/kibana/public/context/api/utils/queries.js new file mode 100644 index 00000000000000..410c2d85e50fc6 --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/utils/queries.js @@ -0,0 +1,29 @@ +function createAnchorQuery(uid, contextSort) { + return { + _source: true, + query: { + terms: { + _uid: [uid], + }, + }, + sort: [contextSort], + }; +}; + +function createSuccessorsQuery(anchorUid, anchorSortValues, contextSort, size) { + return { + _source: true, + query: { + match_all: {}, + }, + size, + sort: [ contextSort, { _uid: 'asc' } ], + search_after: anchorSortValues.concat([ anchorUid ]), + }; +}; + + +export { + createAnchorQuery, + createSuccessorsQuery, +}; diff --git a/src/core_plugins/kibana/public/context/api/utils/sorting.js b/src/core_plugins/kibana/public/context/api/utils/sorting.js new file mode 100644 index 00000000000000..ac2ce09f622bbc --- /dev/null +++ b/src/core_plugins/kibana/public/context/api/utils/sorting.js @@ -0,0 +1,35 @@ +import _ from 'lodash'; + + +function reverseQuerySort(query) { + return _.assign({}, query, { + sort: _.get(query, 'sort', []).map(reverseSortDirective), + }); +} + +function reverseSortDirective(sortDirective) { + if (_.isString(sortDirective)) { + return { + [sortDirective]: (sortDirective === '_score' ? 'asc' : 'desc'), + }; + } else if (_.isObject(sortDirective)) { + return _.mapValues(sortDirective, reverseSortDirection); + } else { + return sortDirective; + } +} + +function reverseSortDirection(sortDirection) { + if (_.isObject(sortDirection)) { + return sortDirection.order = reverseSortDirection(sortDirection.order); + } else { + return (sortDirection === 'asc' ? 'desc' : 'asc'); + } +} + + +export { + reverseQuerySort, + reverseSortDirection, + reverseSortDirective, +}; diff --git a/src/core_plugins/kibana/public/context/app.html b/src/core_plugins/kibana/public/context/app.html new file mode 100644 index 00000000000000..ae0d21cba24cea --- /dev/null +++ b/src/core_plugins/kibana/public/context/app.html @@ -0,0 +1,32 @@ +