From 05447283d142ebdeb95cb63a00d9845a6e6a8b6a Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sat, 12 Aug 2023 12:01:45 +0200 Subject: [PATCH] search-backend-module-elasticsearch: switch translator customization to extension point Signed-off-by: Patrik Oldsberg --- .changeset/popular-beds-invent.md | 2 +- .../alpha-api-report.md | 11 +++ .../src/alpha.ts | 68 +++++++++---------- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/.changeset/popular-beds-invent.md b/.changeset/popular-beds-invent.md index 73c28d629e..61d0cf0545 100644 --- a/.changeset/popular-beds-invent.md +++ b/.changeset/popular-beds-invent.md @@ -4,4 +4,4 @@ Index templates can now be configured through configuration under the `search.elasticsearch.indexTemplates`. In addition, the `ElasticSearchSearchEngine.fromConfig` now also accepts a `LoggerService` as the `logger` option as well as a new `translator` option. -The alpha `searchModuleElasticsearchEngine` export no longer accepts options. +The alpha `searchModuleElasticsearchEngine` export no longer accepts options and a new alpha `elasticsearchTranslatorExtensionPoint` export has been added which lets you customize the query translator. diff --git a/plugins/search-backend-module-elasticsearch/alpha-api-report.md b/plugins/search-backend-module-elasticsearch/alpha-api-report.md index ecbe3f2700..9e5e7c2136 100644 --- a/plugins/search-backend-module-elasticsearch/alpha-api-report.md +++ b/plugins/search-backend-module-elasticsearch/alpha-api-report.md @@ -4,6 +4,17 @@ ```ts import { BackendFeature } from '@backstage/backend-plugin-api'; +import { ElasticSearchQueryTranslator } from '@backstage/plugin-search-backend-module-elasticsearch'; +import { ExtensionPoint } from '@backstage/backend-plugin-api'; + +// @alpha (undocumented) +export interface ElasticSearchQueryTranslatorExtensionPoint { + // (undocumented) + setTranslator(translator: ElasticSearchQueryTranslator): void; +} + +// @alpha +export const elasticsearchTranslatorExtensionPoint: ExtensionPoint; // @alpha export const searchModuleElasticsearchEngine: () => BackendFeature; diff --git a/plugins/search-backend-module-elasticsearch/src/alpha.ts b/plugins/search-backend-module-elasticsearch/src/alpha.ts index 54f5f07777..9801cf4643 100644 --- a/plugins/search-backend-module-elasticsearch/src/alpha.ts +++ b/plugins/search-backend-module-elasticsearch/src/alpha.ts @@ -16,52 +16,51 @@ import { coreServices, createBackendModule, + createExtensionPoint, } from '@backstage/backend-plugin-api'; import { searchEngineRegistryExtensionPoint } from '@backstage/plugin-search-backend-node/alpha'; -import { ElasticSearchSearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch'; +import { + ElasticSearchQueryTranslator, + ElasticSearchSearchEngine, +} from '@backstage/plugin-search-backend-module-elasticsearch'; + +/** @alpha */ +export interface ElasticSearchQueryTranslatorExtensionPoint { + setTranslator(translator: ElasticSearchQueryTranslator): void; +} + +/** + * Extension point used to customize the ElasticSearch query translator. + * + * @alpha + */ +export const elasticsearchTranslatorExtensionPoint = + createExtensionPoint({ + id: 'search.elasticsearchEngine.translator', + }); /** * Search backend module for the Elasticsearch engine. * * @alpha - * @remarks - * - * If you need to customize the search engine beyond what is supported by the - * static configuration, you can create a custom module using the `ElasticSearchSearchEngine`. - * - * For example, this lets you configure your own query translator: - * - * ```ts - * export const searchModuleElasticsearchEngine = createBackendModule({ - * moduleId: 'elasticsearchEngine', - * pluginId: 'search', - * register(env) { - * env.registerInit({ - * deps: { - * searchEngineRegistry: searchEngineRegistryExtensionPoint, - * logger: coreServices.logger, - * config: coreServices.rootConfig, - * }, - * async init({ searchEngineRegistry, logger, config }) { - * searchEngineRegistry.setSearchEngine( - * await ElasticSearchSearchEngine.fromConfig({ - * logger, - * config, - * translator(query) { - * return ... // translated query - * } - * }), - * ); - * }, - * }); - * }, - * }); - * ``` */ export const searchModuleElasticsearchEngine = createBackendModule({ moduleId: 'elasticsearchEngine', pluginId: 'search', register(env) { + let translator: ElasticSearchQueryTranslator | undefined; + + env.registerExtensionPoint(elasticsearchTranslatorExtensionPoint, { + setTranslator(newTranslator) { + if (translator) { + throw new Error( + 'ElasticSearch query translator may only be set once', + ); + } + translator = newTranslator; + }, + }); + env.registerInit({ deps: { searchEngineRegistry: searchEngineRegistryExtensionPoint, @@ -73,6 +72,7 @@ export const searchModuleElasticsearchEngine = createBackendModule({ await ElasticSearchSearchEngine.fromConfig({ logger, config, + translator, }), ); },