diff --git a/src/db/dal/variant.ts b/src/db/dal/variant.ts index d37ce3d..28c1ca5 100644 --- a/src/db/dal/variant.ts +++ b/src/db/dal/variant.ts @@ -26,22 +26,22 @@ export const getEntriesByUniqueIdsAndOrganizations = async function (uniqueIds: } export const getEntriesByPropertiesFlags = async function (flags: string[], organizationIds: string[]) { - return await VariantModel.findAll({ - attributes: ['unique_id'], - group: ['unique_id'], - where: { - [Op.or]: flags.map(f => { - return { - properties: { - [Op.contains]: { - flags: [f] - } - } - }; - }), - organization_id: { - [Op.in]: organizationIds - } - } + const flagsWhere = flags.map(f => { + return `properties @> '{"flags": ["${f}"]}'`; }); + + const result = await VariantModel.sequelize.query(` + SELECT unique_id, timestamp, properties, rnk + FROM ( + SELECT + unique_id, + timestamp, + properties, + RANK() OVER (PARTITION BY unique_id ORDER BY timestamp DESC) AS rnk + FROM variants + WHERE organization_id IN ('${organizationIds.join("', '")}') + ) s + WHERE rnk = 1 AND (${flagsWhere.join(' OR ')});`); + + return result; } \ No newline at end of file diff --git a/src/routes/variant.ts b/src/routes/variant.ts index bf512e0..3026712 100644 --- a/src/routes/variant.ts +++ b/src/routes/variant.ts @@ -105,7 +105,7 @@ variantRouter.get('/filter', async (req, res, next) => { if (canGet && flags.length > 0) { dbResponse = await getEntriesByPropertiesFlags(flags, userInfo.userOrganizations); - return res.status(StatusCodes.OK).send(dbResponse.map(r => r.unique_id)); + return res.status(StatusCodes.OK).send(dbResponse[0].map(r => r.unique_id)); } else if (!canGet) { return res.sendStatus(StatusCodes.FORBIDDEN); } else {