nestjs-paginate
nestjs-paginate copied to clipboard
Nested Filtering doesn't work with virtual column
Nested relation filtering works properly with columns but not with virtual column.
Error encountered
[Nest] 29684 - 11/12/2023, 5:54:13 PM ERROR [ExceptionsHandler] Unknown column '__root_memberOrganizations_rel.isMembershipComplete' in 'where clause'
QueryFailedError: Unknown column '__root_memberOrganizations_rel.isMembershipComplete' in 'where clause'
at Query.onResult (/home/alberto/WebstormProjects/ad-gestionale/src/driver/mysql/MysqlQueryRunner.ts:222:33)
at Query.execute (/home/alberto/WebstormProjects/ad-gestionale/node_modules/mysql2/lib/commands/command.js:36:14)
at PoolConnection.handlePacket (/home/alberto/WebstormProjects/ad-gestionale/node_modules/mysql2/lib/connection.js:478:34)
at PacketParser.onPacket (/home/alberto/WebstormProjects/ad-gestionale/node_modules/mysql2/lib/connection.js:97:12)
at PacketParser.executeStart (/home/alberto/WebstormProjects/ad-gestionale/node_modules/mysql2/lib/packet_parser.js:75:16)
at Socket.<anonymous> (/home/alberto/WebstormProjects/ad-gestionale/node_modules/mysql2/lib/connection.js:104:25)
at Socket.emit (node:events:514:28)
at addChunk (node:internal/streams/readable:343:12)
at readableAddChunk (node:internal/streams/readable:316:9)
at Socket.Readable.push (node:internal/streams/readable:253:10)
Virtual column (Error)
SELECT DISTINCT
`distinctAlias`.`__root_id` AS `ids___root_id`
FROM
(
SELECT
`__root`.`id` AS `__root_id`,
`__root`.`taxCode` AS `__root_taxCode`,
`__root`.`telephone` AS `__root_telephone`,
`__root`.`email` AS `__root_email`,
`__root`.`medicalCertificateDate` AS `__root_medicalCertificateDate`,
(
SELECT
CONCAT(`__root`.name, ' ', `__root`.surname)
) AS `__root_fullName`,
(
SELECT CASE WHEN
DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) <= 0 THEN 'notValid' WHEN DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) > 365 THEN 'expired' WHEN DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) >= 335 THEN 'expiring' ELSE 'valid'
END
) AS `__root_medicalCertificateValidity`,
`__root_roles_rel`.`name` AS `__root_roles_rel_name`,
`__root_memberOrganizations_rel`.`id` AS `__root_memberOrganizations_rel_id`,
`__root_memberOrganizations_rel`.`status` AS `__root_memberOrganizations_rel_status`,
`__root_memberOrganizations_rel`.`cardNumber` AS `__root_memberOrganizations_rel_cardNumber`,
`__root_memberOrganizations_rel`.`sportOrganizationId` AS `__root_memberOrganizations_rel_sportOrganizationId`,
(
SELECT
`__root_memberOrganizations_rel`.status = TRUE AND `__root_memberOrganizations_rel`.cardNumber != ''
) AS `__root_memberOrganizations_rel_isMembershipComplete`
FROM
`member` `__root`
LEFT JOIN `member_roles_member_role` `__root___root_roles_rel` ON
`__root___root_roles_rel`.`memberId` = `__root`.`id`
LEFT JOIN `member_role` `__root_roles_rel` ON
`__root_roles_rel`.`id` = `__root___root_roles_rel`.`memberRoleId`
LEFT JOIN `member_organization` `__root_memberOrganizations_rel` ON
`__root_memberOrganizations_rel`.`memberId` = `__root`.`id`
WHERE
1 = 1 AND(
`__root_memberOrganizations_rel`.`isMembershipComplete` = 1
)
) `distinctAlias`
ORDER BY
"__root_fullName" ASC,
`__root_id` ASC
LIMIT 20
Normal Column (Works like a charm)
SELECT
`__root`.`id` AS `__root_id`,
`__root`.`taxCode` AS `__root_taxCode`,
`__root`.`telephone` AS `__root_telephone`,
`__root`.`email` AS `__root_email`,
`__root`.`medicalCertificateDate` AS `__root_medicalCertificateDate`,
(
SELECT
CONCAT(`__root`.name, ' ', `__root`.surname)
) AS `__root_fullName`,
(
SELECT CASE WHEN
DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) <= 0 THEN 'notValid' WHEN DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) > 365 THEN 'expired' WHEN DATEDIFF(
CURDATE(), `__root`.medicalCertificateDate) >= 335 THEN 'expiring' ELSE 'valid'
END
) AS `__root_medicalCertificateValidity`,
`__root_roles_rel`.`name` AS `__root_roles_rel_name`,
`__root_memberOrganizations_rel`.`id` AS `__root_memberOrganizations_rel_id`,
`__root_memberOrganizations_rel`.`status` AS `__root_memberOrganizations_rel_status`,
`__root_memberOrganizations_rel`.`cardNumber` AS `__root_memberOrganizations_rel_cardNumber`,
`__root_memberOrganizations_rel`.`sportOrganizationId` AS `__root_memberOrganizations_rel_sportOrganizationId`,
(
SELECT
`__root_memberOrganizations_rel`.status = TRUE AND `__root_memberOrganizations_rel`.cardNumber != ''
) AS `__root_memberOrganizations_rel_isMembershipComplete`
FROM
`member` `__root`
LEFT JOIN `member_roles_member_role` `__root___root_roles_rel` ON
`__root___root_roles_rel`.`memberId` = `__root`.`id`
LEFT JOIN `member_role` `__root_roles_rel` ON
`__root_roles_rel`.`id` = `__root___root_roles_rel`.`memberRoleId`
LEFT JOIN `member_organization` `__root_memberOrganizations_rel` ON
`__root_memberOrganizations_rel`.`memberId` = `__root`.`id`
WHERE
(
1 = 1 AND(
`__root_memberOrganizations_rel`.`sportOrganizationId` = 1
)
) AND(`__root`.`id` IN(1, 3))
ORDER BY
"__root_fullName" ASC
can you write a simple test for reproducing this issue?
we have coverage for virtual cols but probably it's not sufficient
Sorry for the late response, I was busy.
I have forked the repo and created a branch with the test case.
It seems that the problem is the virtual column with the OneToMany relation, when it arrives at the end of extractVirtualProperty the metadata is undefined, and that's seems caused by Typeorm.
The columns of toys are not there at all instead home are there.
I have created a test and if you comment isMouse lines and uncomment isBox you will see that with a OneToOne relation works.
Maybe is related to this?
Hello, did you checked the repo?
Hi! Thanks for the reproducer, I'm subscribing myself to remind me to take a look when I have time (not often).