Skip to content

Commit ba3bc74

Browse files
committed
fix: fix select system field
1 parent c6a8075 commit ba3bc74

File tree

15 files changed

+343
-20
lines changed

15 files changed

+343
-20
lines changed

‎apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field-visitor.postgres.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ import type {
2525
} from '@teable/core';
2626
import { DbFieldType, Relationship } from '@teable/core';
2727
import type { Knex } from 'knex';
28+
import type { AutoNumberFieldDto } from '../../features/field/model/field-dto/auto-number-field.dto';
29+
import type { CreatedByFieldDto } from '../../features/field/model/field-dto/created-by-field.dto';
30+
import type { CreatedTimeFieldDto } from '../../features/field/model/field-dto/created-time-field.dto';
2831
import type { FormulaFieldDto } from '../../features/field/model/field-dto/formula-field.dto';
32+
import type { LastModifiedByFieldDto } from '../../features/field/model/field-dto/last-modified-by-field.dto';
33+
import type { LastModifiedTimeFieldDto } from '../../features/field/model/field-dto/last-modified-time-field.dto';
2934
import type { LinkFieldDto } from '../../features/field/model/field-dto/link-field.dto';
3035
import { SchemaType } from '../../features/field/util';
3136
import type { IFormulaConversionContext } from '../../features/record/query-builder/sql-conversion.visitor';
@@ -187,6 +192,9 @@ export class CreatePostgresDatabaseColumnFieldVisitor implements IFieldVisitor<v
187192
this.context.dbFieldName,
188193
'INTEGER GENERATED ALWAYS AS (__auto_number) STORED'
189194
);
195+
(this.context.field as AutoNumberFieldDto).setMetadata({
196+
persistedAsGeneratedColumn: true,
197+
});
190198
}
191199

192200
visitLinkField(field: LinkFieldCore): void {
@@ -376,13 +384,19 @@ export class CreatePostgresDatabaseColumnFieldVisitor implements IFieldVisitor<v
376384
this.context.dbFieldName,
377385
'TIMESTAMP GENERATED ALWAYS AS (__created_time) STORED'
378386
);
387+
(this.context.field as CreatedTimeFieldDto).setMetadata({
388+
persistedAsGeneratedColumn: true,
389+
});
379390
}
380391

381392
visitLastModifiedTimeField(_field: LastModifiedTimeFieldCore): void {
382393
this.context.table.specificType(
383394
this.context.dbFieldName,
384395
'TIMESTAMP GENERATED ALWAYS AS (__last_modified_time) STORED'
385396
);
397+
(this.context.field as LastModifiedTimeFieldDto).setMetadata({
398+
persistedAsGeneratedColumn: true,
399+
});
386400
}
387401

388402
// User field types
@@ -396,6 +410,9 @@ export class CreatePostgresDatabaseColumnFieldVisitor implements IFieldVisitor<v
396410
this.context.dbFieldName,
397411
'TEXT GENERATED ALWAYS AS (__created_by) STORED'
398412
);
413+
(this.context.field as CreatedByFieldDto).setMetadata({
414+
persistedAsGeneratedColumn: true,
415+
});
399416
}
400417

401418
visitLastModifiedByField(_field: LastModifiedByFieldCore): void {
@@ -404,5 +421,8 @@ export class CreatePostgresDatabaseColumnFieldVisitor implements IFieldVisitor<v
404421
this.context.dbFieldName,
405422
'TEXT GENERATED ALWAYS AS (__last_modified_by) STORED'
406423
);
424+
(this.context.field as LastModifiedByFieldDto).setMetadata({
425+
persistedAsGeneratedColumn: true,
426+
});
407427
}
408428
}

‎apps/nestjs-backend/src/db-provider/create-database-column-query/create-database-column-field-visitor.sqlite.ts‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ import type {
2525
} from '@teable/core';
2626
import { DbFieldType, Relationship } from '@teable/core';
2727
import type { Knex } from 'knex';
28+
import type { AutoNumberFieldDto } from '../../features/field/model/field-dto/auto-number-field.dto';
29+
import type { CreatedByFieldDto } from '../../features/field/model/field-dto/created-by-field.dto';
30+
import type { CreatedTimeFieldDto } from '../../features/field/model/field-dto/created-time-field.dto';
2831
import type { FormulaFieldDto } from '../../features/field/model/field-dto/formula-field.dto';
32+
import type { LastModifiedByFieldDto } from '../../features/field/model/field-dto/last-modified-by-field.dto';
33+
import type { LastModifiedTimeFieldDto } from '../../features/field/model/field-dto/last-modified-time-field.dto';
2934
import type { LinkFieldDto } from '../../features/field/model/field-dto/link-field.dto';
3035
import { SchemaType } from '../../features/field/util';
3136
import type { IFormulaConversionContext } from '../../features/record/query-builder/sql-conversion.visitor';
@@ -187,6 +192,9 @@ export class CreateSqliteDatabaseColumnFieldVisitor implements IFieldVisitor<voi
187192
this.context.dbFieldName,
188193
`INTEGER GENERATED ALWAYS AS (__auto_number) ${storageType}`
189194
);
195+
(this.context.field as AutoNumberFieldDto).setMetadata({
196+
persistedAsGeneratedColumn: true,
197+
});
190198
}
191199

192200
visitLinkField(field: LinkFieldCore): void {
@@ -375,6 +383,9 @@ export class CreateSqliteDatabaseColumnFieldVisitor implements IFieldVisitor<voi
375383
this.context.dbFieldName,
376384
`TEXT GENERATED ALWAYS AS (__created_time) ${storageType}`
377385
);
386+
(this.context.field as CreatedTimeFieldDto).setMetadata({
387+
persistedAsGeneratedColumn: true,
388+
});
378389
}
379390

380391
visitLastModifiedTimeField(_field: LastModifiedTimeFieldCore): void {
@@ -383,6 +394,9 @@ export class CreateSqliteDatabaseColumnFieldVisitor implements IFieldVisitor<voi
383394
this.context.dbFieldName,
384395
`TEXT GENERATED ALWAYS AS (__last_modified_time) ${storageType}`
385396
);
397+
(this.context.field as LastModifiedTimeFieldDto).setMetadata({
398+
persistedAsGeneratedColumn: true,
399+
});
386400
}
387401

388402
// User field types
@@ -397,6 +411,9 @@ export class CreateSqliteDatabaseColumnFieldVisitor implements IFieldVisitor<voi
397411
this.context.dbFieldName,
398412
`TEXT GENERATED ALWAYS AS (__created_by) ${storageType}`
399413
);
414+
(this.context.field as CreatedByFieldDto).setMetadata({
415+
persistedAsGeneratedColumn: true,
416+
});
400417
}
401418

402419
visitLastModifiedByField(_field: LastModifiedByFieldCore): void {
@@ -406,5 +423,8 @@ export class CreateSqliteDatabaseColumnFieldVisitor implements IFieldVisitor<voi
406423
this.context.dbFieldName,
407424
`TEXT GENERATED ALWAYS AS (__last_modified_by) ${storageType}`
408425
);
426+
(this.context.field as LastModifiedByFieldDto).setMetadata({
427+
persistedAsGeneratedColumn: true,
428+
});
409429
}
410430
}

‎apps/nestjs-backend/src/features/field/model/field-dto/auto-number-field.dto.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { AutoNumberFieldCore } from '@teable/core';
2+
import type { IFormulaFieldMeta } from '@teable/core';
23
import type { FieldBase } from '../field-base';
34

45
export class AutoNumberFieldDto extends AutoNumberFieldCore implements FieldBase {
@@ -19,4 +20,8 @@ export class AutoNumberFieldDto extends AutoNumberFieldCore implements FieldBase
1920
}
2021
return value;
2122
}
23+
24+
setMetadata(meta: IFormulaFieldMeta) {
25+
this.meta = meta;
26+
}
2227
}

‎apps/nestjs-backend/src/features/field/model/field-dto/created-by-field.dto.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { IUserCellValue } from '@teable/core';
1+
import type { IFormulaFieldMeta, IUserCellValue } from '@teable/core';
22
import { CreatedByFieldCore } from '@teable/core';
33
import { omit } from 'lodash';
44
import type { FieldBase } from '../field-base';
@@ -35,4 +35,8 @@ export class CreatedByFieldDto extends CreatedByFieldCore implements FieldBase {
3535
}
3636
return value;
3737
}
38+
39+
setMetadata(meta: IFormulaFieldMeta) {
40+
this.meta = meta;
41+
}
3842
}

‎apps/nestjs-backend/src/features/field/model/field-dto/created-time-field.dto.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { CreatedTimeFieldCore } from '@teable/core';
2+
import type { IFormulaFieldMeta } from '@teable/core';
23
import type { FieldBase } from '../field-base';
34

45
export class CreatedTimeFieldDto extends CreatedTimeFieldCore implements FieldBase {
@@ -22,4 +23,8 @@ export class CreatedTimeFieldDto extends CreatedTimeFieldCore implements FieldBa
2223
}
2324
return value;
2425
}
26+
27+
setMetadata(meta: IFormulaFieldMeta) {
28+
this.meta = meta;
29+
}
2530
}

‎apps/nestjs-backend/src/features/field/model/field-dto/last-modified-by-field.dto.ts‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { IUserCellValue } from '@teable/core';
1+
import type { IFormulaFieldMeta, IUserCellValue } from '@teable/core';
22
import { LastModifiedByFieldCore } from '@teable/core';
33
import { omit } from 'lodash';
44
import type { FieldBase } from '../field-base';
@@ -35,4 +35,8 @@ export class LastModifiedByFieldDto extends LastModifiedByFieldCore implements F
3535
}
3636
return value;
3737
}
38+
39+
setMetadata(meta: IFormulaFieldMeta) {
40+
this.meta = meta;
41+
}
3842
}

‎apps/nestjs-backend/src/features/field/model/field-dto/last-modified-time-field.dto.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { LastModifiedTimeFieldCore } from '@teable/core';
2+
import type { IFormulaFieldMeta } from '@teable/core';
23
import type { FieldBase } from '../field-base';
34

45
export class LastModifiedTimeFieldDto extends LastModifiedTimeFieldCore implements FieldBase {
@@ -22,4 +23,8 @@ export class LastModifiedTimeFieldDto extends LastModifiedTimeFieldCore implemen
2223
}
2324
return value;
2425
}
26+
27+
setMetadata(meta: IFormulaFieldMeta) {
28+
this.meta = meta;
29+
}
2530
}

‎apps/nestjs-backend/src/features/record/query-builder/field-select-visitor.ts‎

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,38 @@ export class FieldSelectVisitor implements IFieldVisitor<IFieldSelectName> {
110110
* @param field The field to get the selector for
111111
* @returns String column name with table alias or Raw expression
112112
*/
113-
private getColumnSelector(field: { dbFieldName: string }): IFieldSelectName {
114-
return this.generateColumnSelect(field.dbFieldName);
113+
private getColumnSelector(field: FieldCore): IFieldSelectName {
114+
switch (field.type) {
115+
case FieldType.AutoNumber:
116+
return this.selectSystemColumn(field, '__auto_number');
117+
case FieldType.CreatedTime:
118+
return this.selectSystemColumn(field, '__created_time');
119+
case FieldType.LastModifiedTime:
120+
return this.selectSystemColumn(field, '__last_modified_time');
121+
case FieldType.CreatedBy: {
122+
const alias = this.tableAlias;
123+
const idRef = alias ? `"${alias}"."__created_by"` : `"__created_by"`;
124+
const expr = this.dialect.buildUserJsonObjectById(idRef);
125+
this.state.setSelection(field.id, expr);
126+
return this.qb.client.raw(expr);
127+
}
128+
case FieldType.LastModifiedBy: {
129+
const alias = this.tableAlias;
130+
const idRef = alias ? `"${alias}"."__last_modified_by"` : `"__last_modified_by"`;
131+
const expr = this.dialect.buildUserJsonObjectById(idRef);
132+
this.state.setSelection(field.id, expr);
133+
return this.qb.client.raw(expr);
134+
}
135+
default:
136+
return this.generateColumnSelect(field.dbFieldName);
137+
}
138+
}
139+
140+
private selectSystemColumn(field: FieldCore, columnName: string): IFieldSelectName {
141+
const alias = this.tableAlias;
142+
const selector = alias ? `"${alias}"."${columnName}"` : columnName;
143+
this.state.setSelection(field.id, selector);
144+
return selector;
115145
}
116146

117147
// Typed NULL generation is delegated to the dialect implementation
@@ -467,20 +497,10 @@ export class FieldSelectVisitor implements IFieldVisitor<IFieldSelectName> {
467497
}
468498

469499
visitCreatedByField(field: CreatedByFieldCore): IFieldSelectName {
470-
// Build JSON with user info from system column __created_by
471-
const alias = this.tableAlias;
472-
const idRef = alias ? `"${alias}"."__created_by"` : `"__created_by"`;
473-
const expr = this.dialect.buildUserJsonObjectById(idRef);
474-
this.state.setSelection(field.id, expr);
475-
return this.qb.client.raw(expr);
500+
return this.checkAndSelectLookupField(field);
476501
}
477502

478503
visitLastModifiedByField(field: LastModifiedByFieldCore): IFieldSelectName {
479-
// Build JSON with user info from system column __last_modified_by
480-
const alias = this.tableAlias;
481-
const idRef = alias ? `"${alias}"."__last_modified_by"` : `"__last_modified_by"`;
482-
const expr = this.dialect.buildUserJsonObjectById(idRef);
483-
this.state.setSelection(field.id, expr);
484-
return this.qb.client.raw(expr);
504+
return this.checkAndSelectLookupField(field);
485505
}
486506
}

0 commit comments

Comments
 (0)