Browse Source

fix: cast boolean to integer when using rollup on bool type in pg (#3378)

pull/8900/head
Pranav C 6 months ago
parent
commit
b77bbbb958
  1. 45
      packages/nocodb/src/db/genRollupSelectv2.ts
  2. 1
      packages/nocodb/src/models/RollupColumn.ts
  3. 1
      packages/nocodb/src/schema/swagger-v2.json
  4. 1
      packages/nocodb/src/schema/swagger.json

45
packages/nocodb/src/db/genRollupSelectv2.ts

@ -43,6 +43,26 @@ export default async function ({
dbDriver: knex,
});
const applyFunction = (qb: any) => {
// if postgres and rollup function is sum/sumDistinct/avgDistinct/avg, then cast the column to integer when type is boolean
if (
baseModelSqlv2.isPg &&
['sum', 'sumDistinct', 'avgDistinct', 'avg'].includes(
columnOptions.rollup_function,
) &&
['bool', 'boolean'].includes(rollupColumn.dt)
) {
qb[columnOptions.rollup_function as string]?.(
knex.raw('??.??::integer', [refTableAlias, rollupColumn.column_name]),
);
return;
}
qb[columnOptions.rollup_function as string]?.(
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`),
);
};
switch (relationColumnOption.type) {
case RelationTypes.HAS_MANY: {
const queryBuilder: any = knex(
@ -50,11 +70,7 @@ export default async function ({
childBaseModel.getTnPath(childModel),
refTableAlias,
]),
)
[columnOptions.rollup_function as string]?.(
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`),
)
.where(
).where(
knex.ref(
`${alias || parentBaseModel.getTnPath(parentModel.table_name)}.${
parentCol.column_name
@ -63,6 +79,7 @@ export default async function ({
'=',
knex.ref(`${refTableAlias}.${childCol.column_name}`),
);
applyFunction(queryBuilder);
return {
builder: queryBuilder,
@ -75,11 +92,7 @@ export default async function ({
childBaseModel.getTnPath(childModel?.table_name),
refTableAlias,
]),
)
[columnOptions.rollup_function as string]?.(
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`),
)
.where(
).where(
knex.ref(
`${alias || parentBaseModel.getTnPath(parentModel.table_name)}.${
parentCol.column_name
@ -89,6 +102,7 @@ export default async function ({
knex.ref(`${refTableAlias}.${childCol.column_name}`),
);
applyFunction(qb);
return {
builder: qb,
};
@ -113,19 +127,16 @@ export default async function ({
parentBaseModel.getTnPath(parentModel?.table_name),
refTableAlias,
]),
)
[columnOptions.rollup_function as string]?.(
knex.ref(`${refTableAlias}.${rollupColumn.column_name}`),
)
.innerJoin(
assocBaseModel.getTnPath(mmModel.table_name),
assocBaseModel.getTnPath(mmModel.table_name) as any,
knex.ref(
`${assocBaseModel.getTnPath(mmModel.table_name)}.${
mmParentCol.column_name
}`,
),
) as any,
'=',
knex.ref(`${refTableAlias}.${parentCol.column_name}`),
knex.ref(`${refTableAlias}.${parentCol.column_name}`) as any,
)
.where(
knex.ref(
@ -141,6 +152,8 @@ export default async function ({
),
);
applyFunction(qb);
return {
builder: qb,
};

1
packages/nocodb/src/models/RollupColumn.ts

@ -15,6 +15,7 @@ export const ROLLUP_FUNCTIONS = <const>[
'countDistinct',
'sumDistinct',
'avgDistinct',
'sum',
];
export default class RollupColumn implements RollupType {

1
packages/nocodb/src/schema/swagger-v2.json

@ -17156,6 +17156,7 @@
"min",
"max",
"avg",
"sum",
"countDistinct",
"sumDistinct",
"avgDistinct"

1
packages/nocodb/src/schema/swagger.json

@ -23461,6 +23461,7 @@
"min",
"max",
"avg",
"sum",
"countDistinct",
"sumDistinct",
"avgDistinct"

Loading…
Cancel
Save