From 455b97b127dfc18befd2a6bda053b705ed6666ec Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Tue, 1 Jun 2021 11:15:52 +0200 Subject: [PATCH] Make type(s) readonly properties of Collator/Decorator classes Signed-off-by: Eric Peterson --- packages/backend/src/plugins/search.ts | 1 - packages/search-common/src/types.ts | 7 ++-- .../src/search/DefaultCatalogCollator.ts | 1 + .../src/IndexBuilder.test.ts | 38 +++++++++++-------- .../search-backend-node/src/IndexBuilder.ts | 19 ++++------ plugins/search-backend-node/src/types.ts | 11 ------ 6 files changed, 35 insertions(+), 42 deletions(-) diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 861723ad47..cfd3bb03eb 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -30,7 +30,6 @@ export default async function createPlugin({ const indexBuilder = new IndexBuilder({ logger, searchEngine }); indexBuilder.addCollator({ - type: 'software-catalog', defaultRefreshIntervalSeconds: 10, collator: new DefaultCatalogCollator({ discovery }), }); diff --git a/packages/search-common/src/types.ts b/packages/search-common/src/types.ts index 2aa45e0510..792b9f3a2a 100644 --- a/packages/search-common/src/types.ts +++ b/packages/search-common/src/types.ts @@ -58,6 +58,7 @@ export interface IndexableDocument { * search. */ export interface DocumentCollator { + readonly type: string; execute(): Promise; } @@ -66,8 +67,6 @@ export interface DocumentCollator { * additional metadata. */ export interface DocumentDecorator { - execute( - type: string, - documents: IndexableDocument[], - ): Promise; + readonly types?: string[]; + execute(documents: IndexableDocument[]): Promise; } diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts index 068b9e36ae..70b8010d87 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts @@ -30,6 +30,7 @@ export interface CatalogEntityDocument extends IndexableDocument { export class DefaultCatalogCollator implements DocumentCollator { protected discovery: PluginEndpointDiscovery; protected locationTemplate: string; + public readonly type: string = 'software-catalog'; constructor({ discovery, diff --git a/plugins/search-backend-node/src/IndexBuilder.test.ts b/plugins/search-backend-node/src/IndexBuilder.test.ts index 8d28698b18..cac2975781 100644 --- a/plugins/search-backend-node/src/IndexBuilder.test.ts +++ b/plugins/search-backend-node/src/IndexBuilder.test.ts @@ -24,22 +24,33 @@ import { IndexBuilder } from './IndexBuilder'; import { LunrSearchEngine, SearchEngine } from './index'; class TestDocumentCollator implements DocumentCollator { - async execute() { + readonly type: string = 'anything'; + async execute(): Promise { return []; } } +class TypedDocumentCollator extends TestDocumentCollator { + readonly type = 'an-expected-type'; +} + class TestDocumentDecorator implements DocumentDecorator { - async execute(_type: string, documents: IndexableDocument[]) { + async execute(documents: IndexableDocument[]) { return documents; } } +class TypedDocumentDecorator extends TestDocumentDecorator { + readonly types = ['an-expected-type']; +} + +class DifferentlyTypedDocumentDecorator extends TestDocumentDecorator { + readonly types = ['not-the-expected-type']; +} + describe('IndexBuilder', () => { let testSearchEngine: SearchEngine; let testIndexBuilder: IndexBuilder; - let testCollator: DocumentCollator; - let testDecorator: DocumentDecorator; beforeEach(() => { const logger = getVoidLogger(); @@ -48,18 +59,16 @@ describe('IndexBuilder', () => { logger, searchEngine: testSearchEngine, }); - testCollator = new TestDocumentCollator(); - testDecorator = new TestDocumentDecorator(); }); describe('addCollator', () => { it('adds a collator', async () => { jest.useFakeTimers(); + const testCollator = new TestDocumentCollator(); const collatorSpy = jest.spyOn(testCollator, 'execute'); // Add a collator. testIndexBuilder.addCollator({ - type: 'anything', defaultRefreshIntervalSeconds: 6, collator: testCollator, }); @@ -75,11 +84,12 @@ describe('IndexBuilder', () => { describe('addDecorator', () => { it('adds a decorator', async () => { jest.useFakeTimers(); + const testCollator = new TestDocumentCollator(); + const testDecorator = new TestDocumentDecorator(); const decoratorSpy = jest.spyOn(testDecorator, 'execute'); // Add a collator. testIndexBuilder.addCollator({ - type: 'anything', defaultRefreshIntervalSeconds: 6, collator: testCollator, }); @@ -100,7 +110,8 @@ describe('IndexBuilder', () => { it('adds a type-specific decorator', async () => { jest.useFakeTimers(); - const expectedType = 'an-expected-type'; + const testCollator = new TypedDocumentCollator(); + const testDecorator = new TypedDocumentDecorator(); const docFixture = { title: 'Test', text: 'Test text.', @@ -113,14 +124,12 @@ describe('IndexBuilder', () => { // Add a collator. testIndexBuilder.addCollator({ - type: expectedType, defaultRefreshIntervalSeconds: 6, collator: testCollator, }); // Add a decorator for the same type. testIndexBuilder.addDecorator({ - types: [expectedType], decorator: testDecorator, }); @@ -131,16 +140,17 @@ describe('IndexBuilder', () => { // wait for async decorator execution await Promise.resolve(); expect(decoratorSpy).toHaveBeenCalled(); - expect(decoratorSpy).toHaveBeenCalledWith(expectedType, [docFixture]); + expect(decoratorSpy).toHaveBeenCalledWith([docFixture]); }); it('adds a type-specific decorator that should not be called', async () => { - const expectedType = 'an-expected-type'; const docFixture = { title: 'Test', text: 'Test text.', location: '/test/location', }; + const testCollator = new TestDocumentCollator(); + const testDecorator = new DifferentlyTypedDocumentDecorator(); const collatorSpy = jest .spyOn(testCollator, 'execute') .mockImplementation(async () => [docFixture]); @@ -148,14 +158,12 @@ describe('IndexBuilder', () => { // Add a collator. testIndexBuilder.addCollator({ - type: expectedType, defaultRefreshIntervalSeconds: 6, collator: testCollator, }); // Add a decorator for a different type. testIndexBuilder.addDecorator({ - types: ['not-the-expected-type'], decorator: testDecorator, }); diff --git a/plugins/search-backend-node/src/IndexBuilder.ts b/plugins/search-backend-node/src/IndexBuilder.ts index acaa18fc03..046eaf7f34 100644 --- a/plugins/search-backend-node/src/IndexBuilder.ts +++ b/plugins/search-backend-node/src/IndexBuilder.ts @@ -55,28 +55,25 @@ export class IndexBuilder { * given refresh interval. */ addCollator({ - type, collator, defaultRefreshIntervalSeconds, }: RegisterCollatorParameters): void { this.logger.info( - `Added ${collator.constructor.name} collator for type ${type}`, + `Added ${collator.constructor.name} collator for type ${collator.type}`, ); - this.collators[type] = { + this.collators[collator.type] = { refreshInterval: defaultRefreshIntervalSeconds, collate: collator, }; } /** - * Makes the index builder aware of a decorator. If no types are provided, it - * will be applied to documents from all known collators, otherwise it will - * only be applied to documents of the given types. + * Makes the index builder aware of a decorator. If no types are provided on + * the decorator, it will be applied to documents from all known collators, + * otherwise it will only be applied to documents of the given types. */ - addDecorator({ - types = ['*'], - decorator, - }: RegisterDecoratorParameters): void { + addDecorator({ decorator }: RegisterDecoratorParameters): void { + const types = decorator.types || ['*']; this.logger.info( `Added decorator ${decorator.constructor.name} to types ${types.join( ', ', @@ -113,7 +110,7 @@ export class IndexBuilder { this.logger.debug( `Decorating ${type} documents via ${decorators[i].constructor.name}`, ); - documents = await decorators[i].execute(type, documents); + documents = await decorators[i].execute(documents); } if (!documents || documents.length === 0) { diff --git a/plugins/search-backend-node/src/types.ts b/plugins/search-backend-node/src/types.ts index 4abfa77fb1..b47c191a7c 100644 --- a/plugins/search-backend-node/src/types.ts +++ b/plugins/search-backend-node/src/types.ts @@ -26,11 +26,6 @@ import { * Parameters required to register a collator. */ export interface RegisterCollatorParameters { - /** - * The type of document to be indexed (used to name indices, to configure refresh loop, etc). - */ - type: string; - /** * The default interval (in seconds) that the provided collator will be called (can be overridden in config). */ @@ -50,12 +45,6 @@ export interface RegisterDecoratorParameters { * The decorator class responsible for appending or modifying documents of the given type(s). */ decorator: DocumentDecorator; - - /** - * (Optional) An array of document types that the given decorator should apply to. If none are provided, - * the decorator will be applied to all types. - */ - types?: string[]; } /**