From 4df75ec5d0143043f5e49e7abbaa77ad9c706548 Mon Sep 17 00:00:00 2001 From: EYHN Date: Wed, 23 Apr 2025 13:56:58 +0000 Subject: [PATCH] fix(core): subscribe search not unsubscribe (#11929) --- .../linked-doc/src/linked-doc-popover.ts | 1 + .../src/impls/idb/indexer/inverted-index.ts | 34 +++++++++++++------ .../components/ai-chat-chips/add-popover.ts | 15 +++++--- .../extensions/quick-search-service.ts | 12 +++---- .../src/modules/quicksearch/impls/docs.ts | 4 +++ 5 files changed, 44 insertions(+), 22 deletions(-) diff --git a/blocksuite/affine/widgets/linked-doc/src/linked-doc-popover.ts b/blocksuite/affine/widgets/linked-doc/src/linked-doc-popover.ts index ee2192fa6e..5fb76d1fad 100644 --- a/blocksuite/affine/widgets/linked-doc/src/linked-doc-popover.ts +++ b/blocksuite/affine/widgets/linked-doc/src/linked-doc-popover.ts @@ -249,6 +249,7 @@ export class LinkedDocPopover extends SignalWatcher( override disconnectedCallback() { super.disconnectedCallback(); this._menusItemsEffectCleanup(); + this._updateLinkedDocGroupAbortController?.abort(); } override render() { diff --git a/packages/common/nbstore/src/impls/idb/indexer/inverted-index.ts b/packages/common/nbstore/src/impls/idb/indexer/inverted-index.ts index bed3b542e0..2fc61ed712 100644 --- a/packages/common/nbstore/src/impls/idb/indexer/inverted-index.ts +++ b/packages/common/nbstore/src/impls/idb/indexer/inverted-index.ts @@ -225,17 +225,26 @@ export class FullTextInvertedIndex implements InvertedIndex { )?.value ?? 0; for (const token of queryTokens) { const key = InvertedIndexKey.forString(this.fieldKey, token.term); - const objs = await trx - .objectStore('invertedIndex') - .index('key') - .getAll( - IDBKeyRange.bound( - [this.table, key.buffer()], - [this.table, key.add1().buffer()], - false, - true - ) - ); + const objs = [ + // match exact + await trx + .objectStore('invertedIndex') + .index('key') + .get([this.table, key.buffer()]), + // match prefix + ...(await trx + .objectStore('invertedIndex') + .index('key') + .getAll( + IDBKeyRange.bound( + [this.table, key.buffer()], + [this.table, key.add1().buffer()], + true, + true + ), + 5000 // get maximum 5000 items for prefix match + )), + ]; const submatched: { nid: number; score: number; @@ -245,6 +254,9 @@ export class FullTextInvertedIndex implements InvertedIndex { }; }[] = []; for (const obj of objs) { + if (!obj) { + continue; + } const key = InvertedIndexKey.fromBuffer(obj.key); const originTokenTerm = key.asString(); const matchLength = token.term.length; diff --git a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/add-popover.ts b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/add-popover.ts index d2880fb6ae..bf6ba3a3b4 100644 --- a/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/add-popover.ts +++ b/packages/frontend/core/src/blocksuite/ai/components/ai-chat-chips/add-popover.ts @@ -260,6 +260,8 @@ export class ChatPanelAddPopover extends SignalWatcher( @query('.search-input') accessor searchInput!: HTMLInputElement; + private _menuGroupAbortController = new AbortController(); + override connectedCallback() { super.connectedCallback(); this._updateSearchGroup(); @@ -273,6 +275,7 @@ export class ChatPanelAddPopover extends SignalWatcher( override disconnectedCallback() { super.disconnectedCallback(); document.removeEventListener('keydown', this._handleKeyDown); + this._menuGroupAbortController.abort(); } override render() { @@ -385,13 +388,15 @@ export class ChatPanelAddPopover extends SignalWatcher( } private _updateSearchGroup() { + this._menuGroupAbortController.abort(); + this._menuGroupAbortController = new AbortController(); switch (this._mode) { case AddPopoverMode.Tags: { this._searchGroups = [ this.searchMenuConfig.getTagMenuGroup( this._query, this._addTagChip, - this.abortController.signal + this._menuGroupAbortController.signal ), ]; break; @@ -401,7 +406,7 @@ export class ChatPanelAddPopover extends SignalWatcher( this.searchMenuConfig.getCollectionMenuGroup( this._query, this._addCollectionChip, - this.abortController.signal + this._menuGroupAbortController.signal ), ]; break; @@ -410,7 +415,7 @@ export class ChatPanelAddPopover extends SignalWatcher( const docGroup = this.searchMenuConfig.getDocMenuGroup( this._query, this._addDocChip, - this.abortController.signal + this._menuGroupAbortController.signal ); if (!this._query) { this._searchGroups = [docGroup]; @@ -418,12 +423,12 @@ export class ChatPanelAddPopover extends SignalWatcher( const tagGroup = this.searchMenuConfig.getTagMenuGroup( this._query, this._addTagChip, - this.abortController.signal + this._menuGroupAbortController.signal ); const collectionGroup = this.searchMenuConfig.getCollectionMenuGroup( this._query, this._addCollectionChip, - this.abortController.signal + this._menuGroupAbortController.signal ); const nothing = html``; this._searchGroups = [ diff --git a/packages/frontend/core/src/blocksuite/extensions/quick-search-service.ts b/packages/frontend/core/src/blocksuite/extensions/quick-search-service.ts index 1bd98dabc2..0136c65a1f 100644 --- a/packages/frontend/core/src/blocksuite/extensions/quick-search-service.ts +++ b/packages/frontend/core/src/blocksuite/extensions/quick-search-service.ts @@ -37,12 +37,12 @@ export function patchQuickSearchService(framework: FrameworkProvider) { searchResult = await new Promise((resolve, reject) => framework.get(QuickSearchService).quickSearch.show( [ - framework.get(RecentDocsQuickSearchSession), - framework.get(CreationQuickSearchSession), - framework.get(DocsQuickSearchSession), - framework.get(LinksQuickSearchSession), - framework.get(ExternalLinksQuickSearchSession), - framework.get(JournalsQuickSearchSession), + framework.createEntity(RecentDocsQuickSearchSession), + framework.createEntity(CreationQuickSearchSession), + framework.createEntity(DocsQuickSearchSession), + framework.createEntity(LinksQuickSearchSession), + framework.createEntity(ExternalLinksQuickSearchSession), + framework.createEntity(JournalsQuickSearchSession), ], result => { if (result === null) { diff --git a/packages/frontend/core/src/modules/quicksearch/impls/docs.ts b/packages/frontend/core/src/modules/quicksearch/impls/docs.ts index 8cc5bb791f..93580a6e94 100644 --- a/packages/frontend/core/src/modules/quicksearch/impls/docs.ts +++ b/packages/frontend/core/src/modules/quicksearch/impls/docs.ts @@ -116,4 +116,8 @@ export class DocsQuickSearchSession setQuery(query: string) { this.query$.next(query); } + + override dispose(): void { + this.query.unsubscribe(); + } }