Skip to content

Commit

Permalink
Can change interceptor
Browse files Browse the repository at this point in the history
Signed-off-by: Kawika Avilla <kavilla414@gmail.com>
  • Loading branch information
kavilla committed Mar 6, 2024
1 parent 4573124 commit 4a3ef4c
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,15 @@ export function buildOpenSearchQuery(
return buildQueryFromSql(sqlQueries, config.dateFormatTZ);
}

const validQueries = queries
.filter((query) => query.language !== 'SQL')
.filter((query) => has(query, 'query'));
const validQueries = queries.filter((query) => has(query, 'query'));
const queriesByLanguage = groupBy(validQueries, 'language');
const unsupportedQueries = Object.keys(queriesByLanguage).filter(
(language) => language !== 'kuery' && language !== 'lucene'
);
if (unsupportedQueries.length > 0) {
return queries;
}

const kueryQuery = buildQueryFromKuery(
indexPattern,
queriesByLanguage.kuery,
Expand Down
6 changes: 6 additions & 0 deletions src/plugins/data/public/search/search_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
private readonly aggsService = new AggsService();
private readonly searchSourceService = new SearchSourceService();
private searchInterceptor!: ISearchInterceptor;
private defaultSearchInterceptor!: ISearchInterceptor;
private usageCollector?: SearchUsageCollector;

constructor(private initializerContext: PluginInitializerContext<ConfigSchema>) {}
Expand All @@ -95,6 +96,7 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
startServices: getStartServices(),
usageCollector: this.usageCollector!,
});
this.defaultSearchInterceptor = this.searchInterceptor;

expressions.registerFunction(opensearchdsl);
expressions.registerType(opensearchRawResponse);
Expand Down Expand Up @@ -154,6 +156,10 @@ export class SearchService implements Plugin<ISearchSetup, ISearchStart> {
this.searchInterceptor.showError(e);
},
searchSource: this.searchSourceService.start(indexPatterns, searchSourceDependencies),
__enhance: (enhancements: SearchEnhancements) => {
this.searchInterceptor = enhancements.searchInterceptor;
},
getDefaultSearchInterceptor: () => this.defaultSearchInterceptor,
};
}

Expand Down
2 changes: 2 additions & 0 deletions src/plugins/data/public/search/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ export interface ISearchStart {
* {@link ISearchStartSearchSource}
*/
searchSource: ISearchStartSearchSource;
__enhance: (enhancements: SearchEnhancements) => void;
getDefaultSearchInterceptor: () => ISearchInterceptor;
}

export { SEARCH_EVENT_TYPE } from './collectors';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,19 @@
import { EuiComboBox, EuiComboBoxOptionOption, PopoverAnchorPosition } from '@elastic/eui';
import { i18n } from '@osd/i18n';
import React from 'react';
import { getUiService } from '../../services';
import { getSearchService, getUiService } from '../../services';

interface Props {
language: string;
onSelectLanguage: (newLanguage: string) => void;
anchorPosition?: PopoverAnchorPosition;
}

function mapExternalLanguagesToOptions(externalLanguages: string[]) {
return externalLanguages.map((language) => ({
function mapExternalLanguageToOptions(language: string) {
return {
label: language,
value: language,
}));
};
}

export function QueryLanguageSwitcher(props: Props) {
Expand Down Expand Up @@ -74,10 +74,10 @@ export function QueryLanguageSwitcher(props: Props) {
},
];

const externalLanguages = getUiService().externalLanguages;
if (externalLanguages.length > 0) {
languageOptions.push(...mapExternalLanguagesToOptions(externalLanguages));
}
const queryEnhancements = getUiService().queryEnhancements;
queryEnhancements.forEach((enhancement) =>
languageOptions.push(mapExternalLanguageToOptions(enhancement.language))
);

const selectedLanguage = {
label: props.language === 'kuery' ? 'DQL' : props.language,
Expand All @@ -86,6 +86,12 @@ export function QueryLanguageSwitcher(props: Props) {
const handleLanguageChange = (newLanguage: EuiComboBoxOptionOption[]) => {
const queryLanguage = newLanguage[0].label === 'DQL' ? 'kuery' : newLanguage[0].label;
props.onSelectLanguage(queryLanguage);
const queryEnhancement = queryEnhancements.get(queryLanguage);
getSearchService().__enhance({
searchInterceptor: queryEnhancement
? queryEnhancement.search
: getSearchService().getDefaultSearchInterceptor(),
});
};

return (
Expand Down
10 changes: 8 additions & 2 deletions src/plugins/data/public/ui/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,24 @@
* GitHub history for details.
*/

import { SearchInterceptor } from '../search';
import { IndexPatternSelectProps } from './index_pattern_select';
import { StatefulSearchBarProps } from './search_bar';

export interface QueryEnhancement {
language: string;
search: SearchInterceptor;
}

export interface UiEnhancements {
externalLanguage: string;
query: QueryEnhancement;
}

/**
* Data plugin prewired UI components
*/
export interface DataPublicPluginStartUi {
externalLanguages: string[];
queryEnhancements: Map<string, QueryEnhancement>;
IndexPatternSelect: React.ComponentType<IndexPatternSelectProps>;
SearchBar: React.ComponentType<StatefulSearchBarProps>;
}
8 changes: 4 additions & 4 deletions src/plugins/data/public/ui/ui_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
*/

import { Plugin, CoreSetup, CoreStart, PluginInitializerContext } from 'src/core/public';
import { DataPublicPluginStartUi, UiEnhancements } from './types';
import { DataPublicPluginStartUi, QueryEnhancement, UiEnhancements } from './types';

import { ConfigSchema } from '../../config';
import { createIndexPatternSelect } from './index_pattern_select';
Expand All @@ -30,7 +30,7 @@ export interface UiServiceStartDependencies {

export class UiService implements Plugin<any, DataPublicPluginStartUi> {
constructor(private _: PluginInitializerContext<ConfigSchema>) {}
private externalLanguages: string[] = [];
private queryEnhancements: Map<string, QueryEnhancement> = new Map();

public setup(
{ http, getStartServices, notifications, uiSettings }: CoreSetup,
Expand All @@ -51,7 +51,7 @@ export class UiService implements Plugin<any, DataPublicPluginStartUi> {
return {
__enhance: (enhancements?: UiEnhancements) => {
if (!enhancements) return;
this.externalLanguages.push(enhancements.externalLanguage);
this.queryEnhancements.set(enhancements.query.language, enhancements.query);
},
};
}
Expand All @@ -64,7 +64,7 @@ export class UiService implements Plugin<any, DataPublicPluginStartUi> {
});

return {
externalLanguages: this.externalLanguages,
queryEnhancements: this.queryEnhancements,
IndexPatternSelect: createIndexPatternSelect(core.savedObjects.client),
SearchBar,
};
Expand Down

0 comments on commit 4a3ef4c

Please sign in to comment.