Skip to content

Commit 5af11af

Browse files
committed
perf: rollup field use field_rollup as key
1 parent 1139042 commit 5af11af

File tree

9 files changed

+795
-336
lines changed

9 files changed

+795
-336
lines changed

apps/nestjs-backend/src/features/plugin/official/chart/plugin-chart.service.ts

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
11
import { Injectable, Logger, NotFoundException } from '@nestjs/common';
22
import type { IFilter, ISortItem } from '@teable/core';
3-
import {
4-
HttpErrorCode,
5-
CellFormat,
6-
mergeWithDefaultFilter,
7-
mergeWithDefaultSort,
8-
} from '@teable/core';
3+
import { HttpErrorCode, CellFormat, mergeWithDefaultFilter, getFieldRollupKey } from '@teable/core';
94
import { PrismaService } from '@teable/db-main-prisma';
105
import type {
116
ISqlQuery,
@@ -14,12 +9,11 @@ import type {
149
IChartStorage,
1510
IBaseQueryVoV2,
1611
ITestSqlRo,
17-
FieldRollup,
1812
IStatisticFieldItem,
1913
} from '@teable/openapi';
20-
import { DataSource, AGGREGATE_COUNT_KEY } from '@teable/openapi';
14+
import { DataSource, AGGREGATE_COUNT_KEY, FieldRollup } from '@teable/openapi';
2115
import { Knex } from 'knex';
22-
import { keyBy } from 'lodash';
16+
import { isNumber, keyBy } from 'lodash';
2317
import { InjectModel } from 'nest-knexjs';
2418
import { CustomHttpException } from '../../../../custom.exception';
2519
import { BaseQueryService } from '../../../base/base-query/base-query.service';
@@ -200,7 +194,7 @@ export class PluginChartService {
200194
const columns = columnKeys.map((key) => {
201195
return {
202196
name: key,
203-
isNumber: typeof convertedResult[0][key] === 'number',
197+
isNumber: convertedResult?.some((item) => isNumber(item[key])),
204198
};
205199
});
206200

@@ -293,7 +287,7 @@ export class PluginChartService {
293287
const columns = columnKeys.map((key) => {
294288
return {
295289
name: key,
296-
isNumber: typeof convertedResult[0][key] === 'number',
290+
isNumber: convertedResult?.some((item) => isNumber(item[key])),
297291
};
298292
});
299293

@@ -402,7 +396,7 @@ export class PluginChartService {
402396
const columns = columnKeys.map((key) => {
403397
return {
404398
name: key,
405-
isNumber: typeof convertedResult[0]?.[key] === 'number',
399+
isNumber: convertedResult?.some((item) => isNumber(item[key])),
406400
};
407401
});
408402

@@ -416,21 +410,23 @@ export class PluginChartService {
416410
viewId: string | undefined,
417411
filter: IFilter | undefined
418412
): Promise<{ filter?: IFilter | null; sort?: ISortItem[] | null }> {
419-
const viewQuery = {} as { filter?: IFilter | null; sort?: ISortItem[] | null };
413+
const viewQuery = {
414+
filter: filter,
415+
} as { filter?: IFilter | null };
420416

421417
if (viewId) {
422-
const { filter: viewFilter, sort: viewSort } =
418+
const { filter: viewFilter } =
423419
(await this.prismaService.txClient().view.findFirst({
424420
where: {
425421
id: viewId,
422+
deletedTime: null,
426423
},
427424
select: {
428425
filter: true,
429426
sort: true,
430427
},
431428
})) || {};
432429
viewQuery.filter = mergeWithDefaultFilter(viewFilter, filter);
433-
viewQuery.sort = mergeWithDefaultSort(viewSort, []);
434430
}
435431

436432
return viewQuery;
@@ -457,31 +453,32 @@ export class PluginChartService {
457453
seriesArray.forEach((item) => {
458454
const field = fields.find((field) => field.id === item.fieldId);
459455
const dbFieldName = field?.dbFieldName;
460-
if (dbFieldName && item?.rollup) {
461-
const rollupMethod = item.rollup as 'sum' | 'avg' | 'min' | 'max' | 'count';
456+
if (dbFieldName && item?.rollup && field?.id) {
457+
const rollupMethod = item.rollup as FieldRollup;
458+
const rollupKey = getFieldRollupKey(field.id, rollupMethod);
462459
switch (rollupMethod) {
463-
case 'sum':
464-
queryBuilder.sum({ [`${dbFieldName}_sum`]: dbFieldName });
460+
case FieldRollup.Sum:
461+
queryBuilder.sum({ [rollupKey]: dbFieldName });
465462
break;
466-
case 'avg':
467-
queryBuilder.avg({ [`${dbFieldName}_avg`]: dbFieldName });
463+
case FieldRollup.Avg:
464+
queryBuilder.avg({ [rollupKey]: dbFieldName });
468465
break;
469-
case 'min':
470-
queryBuilder.min({ [`${dbFieldName}_min`]: dbFieldName });
466+
case FieldRollup.Min:
467+
queryBuilder.min({ [rollupKey]: dbFieldName });
471468
break;
472-
case 'max':
473-
queryBuilder.max({ [`${dbFieldName}_max`]: dbFieldName });
469+
case FieldRollup.Max:
470+
queryBuilder.max({ [rollupKey]: dbFieldName });
474471
break;
475-
case 'count':
476-
queryBuilder.count({ [`${dbFieldName}_count`]: dbFieldName });
472+
case FieldRollup.Count:
473+
queryBuilder.count({ [rollupKey]: dbFieldName });
477474
break;
478475
default:
479476
throw new NotFoundException('Unsupported rollup method');
480477
}
481478
}
482479
});
483480
} else {
484-
queryBuilder.select(this.knex.raw(`COUNT(*) as ${AGGREGATE_COUNT_KEY}`));
481+
queryBuilder.count({ [AGGREGATE_COUNT_KEY]: '*' });
485482
}
486483
}
487484

@@ -490,27 +487,28 @@ export class PluginChartService {
490487
seriesArray: string | Array<IStatisticFieldItem>,
491488
fields: Array<{ id: string; dbFieldName: string }>,
492489
fieldsMap: Record<string, { id: string; dbFieldName: string; name: string }>
493-
): string {
490+
): string[] {
494491
if (groupBy) {
495492
const groupByField = fields.find((field) => field.id === groupBy);
496493
if (!groupByField?.dbFieldName) {
497494
throw new NotFoundException('Group by field not found');
498495
}
499-
return groupByField.dbFieldName;
496+
return [groupByField.dbFieldName];
500497
}
501498
if (Array.isArray(seriesArray)) {
502499
const seriesNames = seriesArray
503500
.map((item) => {
504501
const field = fieldsMap[item.fieldId];
505-
return field ? `${field.name}_${item.rollup}` : null;
502+
const rollupKey = getFieldRollupKey(field.id, item.rollup);
503+
return field ? rollupKey : null;
506504
})
507505
.filter((name): name is string => name !== null);
508506
if (seriesNames.length === 0) {
509507
throw new NotFoundException('Series fields not found');
510508
}
511-
return seriesNames[0];
509+
return seriesNames;
512510
}
513-
return AGGREGATE_COUNT_KEY;
511+
return [AGGREGATE_COUNT_KEY];
514512
}
515513

516514
private applyOrderBy(
@@ -536,6 +534,12 @@ export class PluginChartService {
536534
}
537535

538536
const yColumn = this.getYColumnForOrderBy(groupBy, seriesArray, fields, fieldsMap);
539-
queryBuilder.orderBy(on === 'xAxis' ? dbFieldName : yColumn, order);
537+
if (on === 'xAxis') {
538+
queryBuilder.orderBy(dbFieldName, order);
539+
} else {
540+
yColumn.forEach((column) => {
541+
queryBuilder.orderBy(column, order);
542+
});
543+
}
540544
}
541545
}

0 commit comments

Comments
 (0)