11import { Injectable , Logger , NotFoundException } from '@nestjs/common' ;
22import 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' ;
94import { PrismaService } from '@teable/db-main-prisma' ;
105import 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' ;
2115import { Knex } from 'knex' ;
22- import { keyBy } from 'lodash' ;
16+ import { isNumber , keyBy } from 'lodash' ;
2317import { InjectModel } from 'nest-knexjs' ;
2418import { CustomHttpException } from '../../../../custom.exception' ;
2519import { 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