From c0c813edfd53835d40fdc9ae101f50875f0e2f80 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Mon, 16 Jun 2025 16:34:23 +0800 Subject: [PATCH] feat(server): search blob names from indexer (#12822) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### PR Dependency Tree * **PR #12822** 👈 This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) ## Summary by CodeRabbit - **New Features** - Added the ability to search for blob names by their IDs within a workspace. - **Tests** - Introduced new test cases and snapshot tests to validate searching blob names and reading filenames from document snapshots. --- .../test-doc-with-blob.snapshot.bin | Bin 0 -> 1868 bytes .../src/__tests__/mocks/doc-snapshot.mock.ts | 6 +- .../__snapshots__/blocksute.spec.ts.md | 87 +++++++++++++++ .../__snapshots__/blocksute.spec.ts.snap | Bin 6717 -> 12181 bytes .../core/utils/__tests__/blocksute.spec.ts | 17 +++ .../__snapshots__/service.spec.ts.md | 27 +++++ .../__snapshots__/service.spec.ts.snap | Bin 3696 -> 3946 bytes .../plugins/indexer/__tests__/service.spec.ts | 100 ++++++++++++++++++ .../server/src/plugins/indexer/service.ts | 46 ++++++++ 9 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 packages/backend/server/src/__tests__/__fixtures__/test-doc-with-blob.snapshot.bin diff --git a/packages/backend/server/src/__tests__/__fixtures__/test-doc-with-blob.snapshot.bin b/packages/backend/server/src/__tests__/__fixtures__/test-doc-with-blob.snapshot.bin new file mode 100644 index 0000000000000000000000000000000000000000..a69decc9627e8938e0dea019f89a4d67d8795e04 GIT binary patch literal 1868 zcma)6T~8B16zyPJphc=N1Ro^9NTP|Xwpa?S;Q^{>gZP0YMvO7joxALWWoF%(?RIN0 zKKfUD@kt+j^{@CNd~tWDbfzlC_ND2$d(XM|p0jA<`==jYe}4NsnY)gPU60#GqEvtR zaHr!w9c=EP8@Ul)6tQSgf+7Pq;BpE(9`5llKv5Yx4rS2t@ge+P)Pq1!&d|xkb=`d? zecX1bM*?6u11R|c_gj)m4<@w47qM@*ACS<$Z%8a^i5l1J#c_$VLx~~`9BdmZRozHs zL5nG#rLuTFQwbg%1CzqgRL;xT2NYddQp*jggcfBI0*1X7!;mrbe5| zCkxlp=nc3BHOnTCUaW$_R?!>KxZXfzd;_OPVq6;ItD@2PNQ^d9fvi`QXPg9QNo`@d;M*^NAF{ln?xh8T|)WM??NTp z?4m#w`AXBP~{?9|2czM{jV}xlF*m86Dv?=R44<8d)#gdu=gjtlV)M`#WL%ZKwHW+uwiNiG3&9F#0I_D$hi-E)VE{Gl{)@ zcZ}|Amk&o)shiGHmn84CLGkYxv{eiOF0o8Zm@^)n&vM{!E>mZ9l9)*9Pzccbk+p6n z*81z2m0&pT0x`4IzLfPm28mmC00|}8l<3`79Kp^P-z5LDa4Sa9QoUirYIDuDs?Bw5 u)$K;j!nJC{vSF>czOn{(jTlKW=|Z23(|tIDZdmx=bm%l^6W6BiPW=Ko66QMq literal 0 HcmV?d00001 diff --git a/packages/backend/server/src/__tests__/mocks/doc-snapshot.mock.ts b/packages/backend/server/src/__tests__/mocks/doc-snapshot.mock.ts index ac8ae5295e..9fcecd5082 100644 --- a/packages/backend/server/src/__tests__/mocks/doc-snapshot.mock.ts +++ b/packages/backend/server/src/__tests__/mocks/doc-snapshot.mock.ts @@ -12,6 +12,7 @@ export type MockDocSnapshotInput = { docId?: string; blob?: Uint8Array; updatedAt?: Date; + snapshotFile?: string; }; export type MockedDocSnapshot = Snapshot; @@ -23,7 +24,10 @@ export class MockDocSnapshot extends Mocker< override async create(input: MockDocSnapshotInput) { if (!input.blob) { const snapshot = await readFile( - path.join(import.meta.dirname, '../__fixtures__/test-doc.snapshot.bin') + path.join( + import.meta.dirname, + `../__fixtures__/${input.snapshotFile ?? 'test-doc.snapshot.bin'}` + ) ); input.blob = snapshot; } diff --git a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md index cc8182962e..0b02895056 100644 --- a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md +++ b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.md @@ -646,6 +646,93 @@ Generated by [AVA](https://avajs.dev). title: 'Write, Draw, Plan all at Once.', } +## can read blob filename from doc snapshot + +> Snapshot 1 + + { + blocks: [ + { + additional: { + displayMode: 'edgeless', + }, + blockId: '4YHKIhPzAK', + content: 'index file name', + docId: 'doc-0', + flavour: 'affine:page', + yblock: { + 'prop:title': 'index file name', + 'sys:children': [ + 'WypcCGdupE', + 'hZ1-cdLW5e', + ], + 'sys:flavour': 'affine:page', + 'sys:id': '4YHKIhPzAK', + 'sys:version': 2, + }, + }, + { + additional: { + displayMode: 'edgeless', + }, + blockId: 'WypcCGdupE', + content: [], + docId: 'doc-0', + flavour: 'affine:surface', + parentBlockId: '4YHKIhPzAK', + parentFlavour: 'affine:page', + yblock: { + 'prop:elements': { + type: '$blocksuite:internal:native$', + value: {}, + }, + 'sys:children': [], + 'sys:flavour': 'affine:surface', + 'sys:id': 'WypcCGdupE', + 'sys:version': 5, + }, + }, + { + additional: { + displayMode: 'page', + noteBlockId: 'hZ1-cdLW5e', + }, + blob: [ + 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=', + ], + blockId: 'tfz1yFZdnn', + content: 'test file name here.txt', + docId: 'doc-0', + flavour: 'affine:attachment', + parentBlockId: 'hZ1-cdLW5e', + parentFlavour: 'affine:note', + yblock: { + 'prop:embed': false, + 'prop:footnoteIdentifier': null, + 'prop:index': 'a0', + 'prop:lockedBySelf': false, + 'prop:meta:createdAt': 1750036953927, + 'prop:meta:createdBy': '46ce597c-098a-4c61-a106-ce79827ec1de', + 'prop:meta:updatedAt': 1750036953928, + 'prop:meta:updatedBy': '46ce597c-098a-4c61-a106-ce79827ec1de', + 'prop:name': 'test file name here.txt', + 'prop:rotate': 0, + 'prop:size': 3, + 'prop:sourceId': 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=', + 'prop:style': 'horizontalThin', + 'prop:type': 'text/plain', + 'prop:xywh': '[0,0,0,0]', + 'sys:children': [], + 'sys:flavour': 'affine:attachment', + 'sys:id': 'tfz1yFZdnn', + 'sys:version': 1, + }, + }, + ], + summary: '', + title: 'index file name', + } + ## can read all blocks from doc snapshot without workspace snapshot > Snapshot 1 diff --git a/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap b/packages/backend/server/src/core/utils/__tests__/__snapshots__/blocksute.spec.ts.snap index 3d84ff9c2dc34069fba8532cfcdd468403615bdb..8c97b9a14d0e49523399ff0b0b763569e8899cf6 100644 GIT binary patch literal 12181 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 literal 6717 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 diff --git a/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts b/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts index d5c56449c7..25c79cece1 100644 --- a/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts +++ b/packages/backend/server/src/core/utils/__tests__/blocksute.spec.ts @@ -56,6 +56,23 @@ test('can read all blocks from doc snapshot', async t => { }); }); +test('can read blob filename from doc snapshot', async t => { + const docSnapshot = await module.create(Mockers.DocSnapshot, { + workspaceId: workspace.id, + user: owner, + snapshotFile: 'test-doc-with-blob.snapshot.bin', + }); + + const result = await readAllBlocksFromDocSnapshot( + workspace.id, + 'doc-0', + docSnapshot.blob + ); + + // NOTE: avoid snapshot result directly, because it will cause hanging + t.snapshot(JSON.parse(JSON.stringify(result))); +}); + test('can read all blocks from doc snapshot without workspace snapshot', async t => { const doc = await models.doc.get(workspace.id, docSnapshot.id); t.truthy(doc); diff --git a/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.md b/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.md index e472c3492e..91c2ab9488 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.md +++ b/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.md @@ -494,3 +494,30 @@ Generated by [AVA](https://avajs.dev). ], }, ] + +## should search blob names from doc snapshot work + +> Snapshot 1 + + Map { + 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=' => 'test file name here.txt', + } + +## should search blob names work + +> Snapshot 1 + + [ + [ + 'blob1', + 'blob1 name.txt', + ], + [ + 'blob2', + 'blob2 name.md', + ], + [ + 'blob3', + 'blob3 name.docx', + ], + ] diff --git a/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.snap b/packages/backend/server/src/plugins/indexer/__tests__/__snapshots__/service.spec.ts.snap index 80e888c3acb26f4cc8a4c0f7fccd2ec7c862d6a0..1c27fea9df625b78af491aa1dfb594b08ce9b13c 100644 GIT binary patch literal 3946 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 E07QbFC;$Ke literal 3696 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 O@&5qH(t_!TJpce9&?hYb diff --git a/packages/backend/server/src/plugins/indexer/__tests__/service.spec.ts b/packages/backend/server/src/plugins/indexer/__tests__/service.spec.ts index b3b1ec2dcf..6759b2c014 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/service.spec.ts +++ b/packages/backend/server/src/plugins/indexer/__tests__/service.spec.ts @@ -2113,3 +2113,103 @@ test('should index doc work', async t => { t.is(module.event.count('doc.indexer.updated'), count + 1); }); // #endregion + +// #region searchBlobNames() + +test('should search blob names from doc snapshot work', async t => { + const docSnapshot = await module.create(Mockers.DocSnapshot, { + workspaceId: workspace.id, + user, + snapshotFile: 'test-doc-with-blob.snapshot.bin', + }); + + await indexerService.indexDoc(workspace.id, docSnapshot.id, { + refresh: true, + }); + + const blobNameMap = await indexerService.searchBlobNames(workspace.id, [ + 'ldZMrM4PDlsNG4Q4YvCsz623h6TKu4qI9_FpTqIypfw=', + ]); + + t.snapshot(blobNameMap); +}); + +test('should search blob names work', async t => { + const workspaceId = randomUUID(); + const blobId1 = 'blob1'; + const blobId2 = 'blob2'; + const blobId3 = 'blob3'; + const blobId4 = 'blob4'; + + await indexerService.write( + SearchTable.block, + [ + { + workspaceId, + blob: blobId1, + content: 'blob1 name.txt', + flavour: 'affine:attachment', + docId: randomUUID(), + blockId: randomUUID(), + createdByUserId: user.id, + updatedByUserId: user.id, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + workspaceId, + blob: blobId2, + content: 'blob2 name.md', + flavour: 'affine:attachment', + docId: randomUUID(), + blockId: randomUUID(), + createdByUserId: user.id, + updatedByUserId: user.id, + createdAt: new Date(), + updatedAt: new Date(), + }, + { + workspaceId, + blob: blobId3, + content: 'blob3 name.docx', + flavour: 'affine:attachment', + docId: randomUUID(), + blockId: randomUUID(), + createdByUserId: user.id, + updatedByUserId: user.id, + createdAt: new Date(), + updatedAt: new Date(), + }, + // no attachment + { + workspaceId, + blob: blobId3, + content: 'mock blob3 content', + flavour: 'affine:page', + docId: randomUUID(), + blockId: randomUUID(), + createdByUserId: user.id, + updatedByUserId: user.id, + createdAt: new Date(), + updatedAt: new Date(), + }, + ], + { + refresh: true, + } + ); + + const blobNameMap = await indexerService.searchBlobNames(workspaceId, [ + blobId1, + blobId2, + blobId3, + blobId4, + ]); + + t.is(blobNameMap.size, 3); + t.snapshot( + Array.from(blobNameMap.entries()).sort((a, b) => a[0].localeCompare(b[0])) + ); +}); + +// #endregion diff --git a/packages/backend/server/src/plugins/indexer/service.ts b/packages/backend/server/src/plugins/indexer/service.ts index 64d5e6e3ce..d0fd67ba82 100644 --- a/packages/backend/server/src/plugins/indexer/service.ts +++ b/packages/backend/server/src/plugins/indexer/service.ts @@ -387,6 +387,52 @@ export class IndexerService { await searchProvider.deleteByQuery(table, dsl, options); } + async searchBlobNames(workspaceId: string, blobIds: string[]) { + const result = await this.search({ + table: SearchTable.block, + query: { + type: SearchQueryType.boolean, + occur: SearchQueryOccur.must, + queries: [ + { + type: SearchQueryType.match, + field: 'workspaceId', + match: workspaceId, + }, + { + type: SearchQueryType.match, + field: 'flavour', + match: 'affine:attachment', + }, + { + type: SearchQueryType.boolean, + occur: SearchQueryOccur.should, + queries: blobIds.map(blobId => ({ + type: SearchQueryType.match, + field: 'blob', + match: blobId, + })), + }, + ], + }, + options: { + fields: ['blob', 'content'], + pagination: { + limit: 10000, + }, + }, + }); + const blobNameMap = new Map(); + for (const node of result.nodes) { + const blobId = node.fields.blob[0] as string; + const content = node.fields.content[0] as string; + if (blobId && content) { + blobNameMap.set(blobId, content); + } + } + return blobNameMap; + } + #formatSearchNodes(nodes: SearchNode[]) { return nodes.map(node => ({ ...node,