Skip to content

Commit

Permalink
Merge pull request #11 from andrewctate/onweek/add-filter-fns
Browse files Browse the repository at this point in the history
[onweek] add filter functions for script authors
  • Loading branch information
drewdaemon authored Apr 29, 2022
2 parents f512ac6 + cb3fdcc commit d6ce3eb
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 0 deletions.
77 changes: 77 additions & 0 deletions src/plugins/vis_type_script/public/kibana_api/kibana_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import {
SqlSearchStrategyResponse,
} from '@kbn/data-plugin/common';
import { DataPublicPluginStart } from '@kbn/data-plugin/public';
import { buildQueryFilter, compareFilters, Filter } from '@kbn/es-query';
import { i18n } from '@kbn/i18n';
import { VisSearchContext } from '../types';

export interface VisTypeScriptKibanaApiDeps {
Expand Down Expand Up @@ -116,4 +118,79 @@ export class VisTypeScriptKibanaApi {

return response.rawResponse;
}

async addFilter(query: any, index?: string, alias?: string) {
const dataViewId = await this.getDataViewIdWithDefault(index);
const newFilter = buildQueryFilter(query, dataViewId, alias);

if (!!this.findMatchingFilter(newFilter)) return;

this.deps.data.query.filterManager.addFilters(newFilter);
}

/**
* Removes a filter matching the query and index if one exists
* @param {object} query Elastic Query DSL snippet, as used in the query DSL editor
* @param {string} [index] as defined in Kibana, or default if missing
*/
async removeFilter(query: any, index?: string) {
const indexId = await this.getDataViewIdWithDefault(index);
const filterToRemove = buildQueryFilter(query, indexId);

const existingFilter = this.findMatchingFilter(filterToRemove);

if (!existingFilter) return;

this.deps.data.query.filterManager.removeFilter(existingFilter);
}

/**
* Removes all filters
*/
removeAllFilters() {
this.deps.data.query.filterManager.removeAll();
}

findMatchingFilter(filter: Filter) {
const currentFilters = this.deps.data.query.filterManager.getFilters();
return currentFilters.find((existing: Filter) => compareFilters(existing, filter));
}

/**
* Find data view by its title, if not given, gets it from spec or a defaults one
* @param {string} [index]
* @returns {Promise<string>} data view id
*/
async getDataViewIdWithDefault(index?: string): Promise<string> {
const dataViews = this.deps.data.dataViews;
let idxObj;

if (index) {
[idxObj] = await dataViews.find(index);
if (!idxObj) {
throw new Error(
i18n.translate('visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage', {
defaultMessage: 'Index {index} not found',
values: { index: `"${index}"` },
})
);
}
} else {
if (!idxObj) {
const defaultIdx = await dataViews.getDefault();

if (defaultIdx) {
idxObj = defaultIdx;
} else {
throw new Error(
i18n.translate('visTypeVega.vegaParser.baseView.unableToFindDefaultIndexErrorMessage', {
defaultMessage: 'Unable to find default index',
})
);
}
}
}

return idxObj.id as string;
}
}
19 changes: 19 additions & 0 deletions src/plugins/vis_type_script/public/renderer/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@ const getSandboxDocument = (script: string, dependencies: string[], nonce: strin
searchSql: (payload, options) => {
return endpoint.call.sqlSearch(payload, options);
},
addFilter: (query, index, alias) => {
return endpoint.call.addFilter(query, index, alias);
},
removeFilter: (query, index) => {
return endpoint.call.removeFilter(query, index);
},
removeAllFilters: () => {
endpoint.call.removeAllFilters();
},
subscribeToResize: (fn) => {
onResize = fn;
},
Expand Down Expand Up @@ -118,6 +127,16 @@ export const ScriptRenderer: React.FunctionComponent<{
): Promise<SQLSearchResponse> => {
return kibanaApi.sqlSearch(payload, options);
},
addFilter: (query: any, indexName?: string, alias?: string) => {
return kibanaApi.addFilter(query, indexName, alias);
},
removeFilter: (query: any, indexName?: string) => {
return kibanaApi.removeFilter(query, indexName);
},
removeAllFilters: () => {
kibanaApi.removeAllFilters();
},
setTimeRange: () => {},
});

return () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,60 @@ const provideSuggestions = (
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
range: wordRange,
},
{
label: 'addFilter',
kind: monacoEditor.languages.CompletionItemKind.Method,
documentation: {
value: 'Adds a Kibana filter',
isTrusted: true,
},
insertText: 'addFilter({$0})',
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
range: wordRange,
},
{
label: 'removeFilter',
kind: monacoEditor.languages.CompletionItemKind.Method,
documentation: {
value: 'Removes a Kibana filter',
isTrusted: true,
},
insertText: 'removeFilter({$0})',
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
range: wordRange,
},
{
label: 'removeAllFilters',
kind: monacoEditor.languages.CompletionItemKind.Method,
documentation: {
value: 'Removes all Kibana filters',
isTrusted: true,
},
insertText: 'removeAllFilters()',
range: wordRange,
},
{
label: 'searchSql',
kind: monacoEditor.languages.CompletionItemKind.Method,
documentation: {
value: 'Runs an Elasticsearch SQL query',
isTrusted: true,
},
insertText: 'searchSql({\n\tquery: "$0"\n})',
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
range: wordRange,
},
{
label: 'searchSql',
kind: monacoEditor.languages.CompletionItemKind.Method,
documentation: {
value: 'Runs an Elasticsearch SQL query',
isTrusted: true,
},
insertText: 'searchSql({\n\tquery: "$0"\n})',
insertTextRules: monacoEditor.languages.CompletionItemInsertTextRule.InsertAsSnippet,
range: wordRange,
},
{
label: 'subscribeToResize',
kind: monacoEditor.languages.CompletionItemKind.Method,
Expand Down

0 comments on commit d6ce3eb

Please sign in to comment.