From bebe4349a9070265efb41ba87be35ddb4939373d Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Fri, 20 Jun 2025 17:21:29 +0800 Subject: [PATCH] fix(server): convert date and timestamp value to Date instance (#12867) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### PR Dependency Tree * **PR #12867** 👈 * **PR #12863** * **PR #12837** * **PR #12866** This tree was auto-generated by [Charcoal](https://github.com/danerwilliams/charcoal) ## Summary by CodeRabbit - **New Features** - Date fields in search results are now returned as JavaScript Date objects instead of strings or numeric timestamps. - **Bug Fixes** - Improved consistency and correctness of date field types across different search providers. - **Tests** - Added tests to verify that date fields are correctly returned as Date objects. - Updated existing test snapshots to reflect the new Date object format for date fields. --- .../__snapshots__/elasticsearch.spec.ts.md | 8 ++-- .../__snapshots__/elasticsearch.spec.ts.snap | Bin 4996 -> 5043 bytes .../__snapshots__/manticoresearch.spec.ts.md | 4 +- .../manticoresearch.spec.ts.snap | Bin 6154 -> 6207 bytes .../__tests__/providers/elasticsearch.spec.ts | 43 ++++++++++++++++++ .../providers/manticoresearch.spec.ts | 43 ++++++++++++++++++ .../indexer/providers/elasticsearch.ts | 41 +++++++++++++++-- .../indexer/providers/manticoresearch.ts | 27 +++++++++-- .../src/plugins/indexer/tables/index.ts | 2 + 9 files changed, 153 insertions(+), 15 deletions(-) diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md index 4f23bb22d..be3918856 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.md @@ -67,7 +67,7 @@ Generated by [AVA](https://avajs.dev). 'title8 hello hello hello hello hello hello hello hello hello hello, hello hello hello hello hello hello hello hello some link https://linear.app/affine-design/issue/AF-1379/slash-commands-%E6%BF%80%E6%B4%BB%E6%8F%92%E5%85%A5-link-%E7%9A%84%E5%BC%B9%E7%AA%97%E9%87%8C%EF%BC%8C%E8%BE%93%E5%85%A5%E9%93%BE%E6%8E%A5%E4%B9%8B%E5%90%8E%E4%B8%8D%E5%BA%94%E8%AF%A5%E7%9B%B4%E6%8E%A5%E5%AF%B9%E9%93%BE%E6%8E%A5%E8%BF%9B%E8%A1%8C%E5%88%86%E8%AF%8D%E6%90%9C%E7%B4%A2', ], created_at: [ - '2025-03-08T06:04:13.278Z', + Date 2025-03-08 06:04:13 278ms UTC {}, ], doc_id: [ 'docId2', @@ -89,7 +89,7 @@ Generated by [AVA](https://avajs.dev). 'docId1', ], updated_at: [ - '2025-03-08T06:04:13.278Z', + Date 2025-03-08 06:04:13 278ms UTC {}, ], }, highlights: { @@ -119,7 +119,7 @@ Generated by [AVA](https://avajs.dev). 'title8 hello hello hello hello hello hello hello hello hello hello, hello hello hello hello hello hello hello hello some link https://linear.app/affine-design/issue/AF-1379/slash-commands-%E6%BF%80%E6%B4%BB%E6%8F%92%E5%85%A5-link-%E7%9A%84%E5%BC%B9%E7%AA%97%E9%87%8C%EF%BC%8C%E8%BE%93%E5%85%A5%E9%93%BE%E6%8E%A5%E4%B9%8B%E5%90%8E%E4%B8%8D%E5%BA%94%E8%AF%A5%E7%9B%B4%E6%8E%A5%E5%AF%B9%E9%93%BE%E6%8E%A5%E8%BF%9B%E8%A1%8C%E5%88%86%E8%AF%8D%E6%90%9C%E7%B4%A2', ], created_at: [ - '2025-03-08T06:04:13.278Z', + Date 2025-03-08 06:04:13 278ms UTC {}, ], doc_id: [ 'docId2', @@ -141,7 +141,7 @@ Generated by [AVA](https://avajs.dev). 'docId1', ], updated_at: [ - '2025-03-08T06:04:13.278Z', + Date 2025-03-08 06:04:13 278ms UTC {}, ], }, highlights: { diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.snap b/packages/backend/server/src/plugins/indexer/__tests__/providers/__snapshots__/elasticsearch.spec.ts.snap index dc889bfecf3023b6d557a78ce3ecf67802df1312..b2ff26081ae8fb58ed073803247f2aab41efe9ba 100644 GIT binary patch literal 5043 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 literal 6154 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 diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts b/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts index 0af7ce0fa..4124b70d1 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/elasticsearch.spec.ts @@ -1477,6 +1477,49 @@ test('should not return not exists field:ref_doc_id', async t => { t.snapshot(result.nodes.map(node => omit(node, ['_score']))); }); +test('should created_at and updated_at is date type', async t => { + const result = await searchProvider.search(SearchTable.block, { + _source: ['workspace_id', 'doc_id', 'created_at', 'updated_at'], + sort: [ + '_score', + { + updated_at: 'desc', + }, + 'doc_id', + 'block_id', + ], + query: { + match_all: {}, + }, + fields: ['created_at', 'updated_at'], + size: 2, + }); + + t.truthy(result.total); + t.truthy(result.nodes[0].fields.created_at); + t.truthy(result.nodes[0].fields.updated_at); + t.true( + result.nodes[0].fields.created_at[0] instanceof Date, + 'created_at should be date type, but got ' + + result.nodes[0].fields.created_at[0] + ); + t.true( + result.nodes[0].fields.updated_at[0] instanceof Date, + 'updated_at should be date type, but got ' + + result.nodes[0].fields.updated_at[0] + ); + t.true( + result.nodes[0]._source.created_at instanceof Date, + 'created_at should be date type, but got ' + + result.nodes[0]._source.created_at + ); + t.true( + result.nodes[0]._source.updated_at instanceof Date, + 'updated_at should be date type, but got ' + + result.nodes[0]._source.updated_at + ); +}); + // #endregion // #region aggregate diff --git a/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts b/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts index 0706a8b1e..ae16c76ac 100644 --- a/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts +++ b/packages/backend/server/src/plugins/indexer/__tests__/providers/manticoresearch.spec.ts @@ -1232,6 +1232,49 @@ test('should not return not exists field:ref_doc_id', async t => { t.snapshot(result.nodes.map(node => omit(node, ['_score']))); }); +test('should created_at and updated_at is date type', async t => { + const result = await searchProvider.search(SearchTable.block, { + _source: ['workspace_id', 'doc_id', 'created_at', 'updated_at'], + sort: [ + '_score', + { + updated_at: 'desc', + }, + 'doc_id', + 'block_id', + ], + query: { + match_all: {}, + }, + fields: ['created_at', 'updated_at'], + size: 2, + }); + + t.truthy(result.total); + t.truthy(result.nodes[0].fields.created_at); + t.truthy(result.nodes[0].fields.updated_at); + t.true( + result.nodes[0].fields.created_at[0] instanceof Date, + 'created_at should be date type, but got ' + + result.nodes[0].fields.created_at[0] + ); + t.true( + result.nodes[0].fields.updated_at[0] instanceof Date, + 'updated_at should be date type, but got ' + + result.nodes[0].fields.updated_at[0] + ); + t.true( + result.nodes[0]._source.created_at instanceof Date, + 'created_at should be date type, but got ' + + result.nodes[0]._source.created_at + ); + t.true( + result.nodes[0]._source.updated_at instanceof Date, + 'updated_at should be date type, but got ' + + result.nodes[0]._source.updated_at + ); +}); + // #endregion // #region aggregate diff --git a/packages/backend/server/src/plugins/indexer/providers/elasticsearch.ts b/packages/backend/server/src/plugins/indexer/providers/elasticsearch.ts index 46eedaa0e..f80d765ce 100644 --- a/packages/backend/server/src/plugins/indexer/providers/elasticsearch.ts +++ b/packages/backend/server/src/plugins/indexer/providers/elasticsearch.ts @@ -5,7 +5,7 @@ import { InvalidSearchProviderRequest, } from '../../../base'; import { SearchProviderType } from '../config'; -import { SearchTable, SearchTableUniqueId } from '../tables'; +import { DateFieldNames, SearchTable, SearchTableUniqueId } from '../tables'; import { AggregateQueryDSL, AggregateResult, @@ -161,8 +161,8 @@ export class ElasticsearchProvider extends SearchProvider { nodes: data.hits.hits.map(hit => ({ _id: hit._id, _score: hit._score, - _source: hit._source, - fields: hit.fields, + _source: this.formatDateFields(hit._source), + fields: this.formatDateFields(hit.fields), highlights: hit.highlight, })), }; @@ -187,8 +187,8 @@ export class ElasticsearchProvider extends SearchProvider { nodes: bucket.result.hits.hits.map(hit => ({ _id: hit._id, _score: hit._score, - _source: hit._source, - fields: hit.fields, + _source: this.formatDateFields(hit._source), + fields: this.formatDateFields(hit.fields), highlights: hit.highlight, })), }, @@ -196,6 +196,37 @@ export class ElasticsearchProvider extends SearchProvider { }; } + protected formatDateFields>( + fieldsOrSource: T + ): T { + for (const fieldName of DateFieldNames) { + let values = fieldsOrSource[fieldName]; + if (!values) { + continue; + } + if (Array.isArray(values)) { + // { created_at: ['2025-06-20T03:02:43.442Z'] } => { created_at: [new Date('2025-06-20T03:02:43.442Z')] } + values = values.map(this.formatDateValue); + } else { + // { created_at: '2025-06-20T03:02:43.442Z' } => { created_at: new Date('2025-06-20T03:02:43.442Z') } + values = this.formatDateValue(values); + } + // @ts-expect-error ignore type check + fieldsOrSource[fieldName] = values; + } + return fieldsOrSource; + } + + /** + * elasticsearch return date value as string, we need to convert it to Date object + */ + protected formatDateValue(value: unknown) { + if (value && typeof value === 'string') { + return new Date(value); + } + return value; + } + protected async requestSearch(table: SearchTable, body: Record) { const url = `${this.config.provider.endpoint}/${table}/_search`; const jsonBody = JSON.stringify(body); diff --git a/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts b/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts index 822515a43..cdf0ac2de 100644 --- a/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts +++ b/packages/backend/server/src/plugins/indexer/providers/manticoresearch.ts @@ -141,8 +141,12 @@ export class ManticoresearchProvider extends ElasticsearchProvider { nodes: data.hits.hits.map(hit => ({ _id: hit._id, _score: hit._score, - _source: this.#formatSource(dsl._source, hit._source), - fields: this.#formatFieldsFromSource(dsl.fields, hit._source), + _source: this.formatDateFields( + this.#formatSource(dsl._source, hit._source) + ), + fields: this.formatDateFields( + this.#formatFieldsFromSource(dsl.fields, hit._source) + ), highlights: this.#formatHighlights( dsl.highlight?.fields, hit.highlight @@ -176,8 +180,12 @@ export class ManticoresearchProvider extends ElasticsearchProvider { const node = { _id: hit._id, _score: hit._score, - _source: this.#formatSource(topHits._source, hit._source), - fields: this.#formatFieldsFromSource(topHits.fields, hit._source), + _source: this.formatDateFields( + this.#formatSource(topHits._source, hit._source) + ), + fields: this.formatDateFields( + this.#formatFieldsFromSource(topHits.fields, hit._source) + ), highlights: this.#formatHighlights( topHits.highlight?.fields, hit.highlight @@ -236,6 +244,17 @@ export class ManticoresearchProvider extends ElasticsearchProvider { return data; } + /** + * manticoresearch return date value as timestamp, we need to convert it to Date object + */ + protected override formatDateValue(value: unknown) { + if (value && typeof value === 'number') { + // 1750389254 => new Date(1750389254 * 1000) + return new Date(value * 1000); + } + return value; + } + private parseESQuery( query: Record, options?: { diff --git a/packages/backend/server/src/plugins/indexer/tables/index.ts b/packages/backend/server/src/plugins/indexer/tables/index.ts index 444b46af6..729d11a65 100644 --- a/packages/backend/server/src/plugins/indexer/tables/index.ts +++ b/packages/backend/server/src/plugins/indexer/tables/index.ts @@ -11,5 +11,7 @@ export const SearchTableUniqueId = { [SearchTable.doc]: getDocUniqueId, }; +export const DateFieldNames = ['created_at', 'updated_at']; + export * from './block'; export * from './doc';