From 2a0976d08837727d578154d393947422db9e95b3 Mon Sep 17 00:00:00 2001 From: andreas-unleash Date: Thu, 28 Sep 2023 11:12:52 +0300 Subject: [PATCH] Improve the setLastSeen function by using better sql operation Signed-off-by: andreas-unleash --- src/lib/db/feature-toggle-store.ts | 38 ++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/src/lib/db/feature-toggle-store.ts b/src/lib/db/feature-toggle-store.ts index 4b5ec8d429..8791d3b6ed 100644 --- a/src/lib/db/feature-toggle-store.ts +++ b/src/lib/db/feature-toggle-store.ts @@ -178,17 +178,35 @@ export default class FeatureToggleStore implements IFeatureToggleStore { last_seen_at: now, environment: value.environment, })); - const dataToPersist: typeof enhancedData = []; - for (const input of enhancedData) { - if (await this.exists(input.feature_name)) { - dataToPersist.push(input); - } - } + try { - await this.db(FEATURE_ENVIRONMENTS_METRICS_TABLE) - .insert(dataToPersist) - .onConflict(['feature_name', 'environment']) - .merge(['last_seen_at']); + await this.db.transaction(async (trx) => { + // Create a CTE with the data to be inserted + const cte = trx('features') + .select('name') + .whereIn( + 'name', + enhancedData.map((entry) => entry.feature_name), + ); + + // Insert only the rows that exist in the CTE (subquery) + await trx.raw( + ` + INSERT INTO ${FEATURE_ENVIRONMENTS_METRICS_TABLE} (feature_name, last_seen_at, environment) + SELECT ed.feature_name, ?, ed.environment + FROM (SELECT ? AS feature_name, ? AS environment) AS ed + WHERE EXISTS (SELECT 1 FROM ? AS cte WHERE cte.name = ed.feature_name) + ON CONFLICT (feature_name, environment) + DO UPDATE SET last_seen_at = EXCLUDED.last_seen_at + `, + [ + now, + enhancedData[0].feature_name, + enhancedData[0].environment, + cte, + ], + ); + }); } catch (err) { this.logger.error('Could not update lastSeen, error: ', err); }