From 126d2d2e4545dcb070a8f231bfa0a0fc9d1b247a Mon Sep 17 00:00:00 2001 From: Mateusz Kwasniewski Date: Thu, 6 Apr 2023 15:34:08 +0200 Subject: [PATCH] feat: save memory on reading stats (#3472) --- src/lib/db/feature-toggle-store.ts | 10 +++++----- src/lib/services/project-service.ts | 16 ++++++++-------- src/lib/types/stores/feature-toggle-store.ts | 4 ++-- src/test/fixtures/fake-feature-toggle-store.ts | 6 +++--- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lib/db/feature-toggle-store.ts b/src/lib/db/feature-toggle-store.ts index 29613d3028..d43e62ed86 100644 --- a/src/lib/db/feature-toggle-store.ts +++ b/src/lib/db/feature-toggle-store.ts @@ -110,16 +110,16 @@ export default class FeatureToggleStore implements IFeatureToggleStore { return rows.map(this.rowToFeature); } - async getByDate(queryModifiers: { + async countByDate(queryModifiers: { archived?: boolean; project?: string; date?: string; range?: string[]; dateAccessor: string; - }): Promise { + }): Promise { const { project, archived, dateAccessor } = queryModifiers; let query = this.db - .select(FEATURE_COLUMNS) + .count() .from(TABLE) .where({ project }) .modify(FeatureToggleStore.filterByArchived, archived); @@ -135,8 +135,8 @@ export default class FeatureToggleStore implements IFeatureToggleStore { ]); } - const rows = await query; - return rows.map(this.rowToFeature); + const queryResult = await query.first(); + return parseInt(queryResult.count || 0); } /** diff --git a/src/lib/services/project-service.ts b/src/lib/services/project-service.ts index 2fddcb4c0a..a68f3aab92 100644 --- a/src/lib/services/project-service.ts +++ b/src/lib/services/project-service.ts @@ -704,12 +704,12 @@ export default class ProjectService { const dateMinusSixtyDays = subDays(new Date(), 60).toISOString(); const [createdCurrentWindow, createdPastWindow] = await Promise.all([ - await this.featureToggleStore.getByDate({ + await this.featureToggleStore.countByDate({ project: projectId, dateAccessor: 'created_at', date: dateMinusThirtyDays, }), - await this.featureToggleStore.getByDate({ + await this.featureToggleStore.countByDate({ project: projectId, dateAccessor: 'created_at', range: [dateMinusSixtyDays, dateMinusThirtyDays], @@ -717,13 +717,13 @@ export default class ProjectService { ]); const [archivedCurrentWindow, archivedPastWindow] = await Promise.all([ - await this.featureToggleStore.getByDate({ + await this.featureToggleStore.countByDate({ project: projectId, archived: true, dateAccessor: 'archived_at', date: dateMinusThirtyDays, }), - await this.featureToggleStore.getByDate({ + await this.featureToggleStore.countByDate({ project: projectId, archived: true, dateAccessor: 'archived_at', @@ -795,10 +795,10 @@ export default class ProjectService { updates: { avgTimeToProdCurrentWindow: currentWindowTimeToProdReadModel.calculateAverageTimeToProd(), - createdCurrentWindow: createdCurrentWindow.length, - createdPastWindow: createdPastWindow.length, - archivedCurrentWindow: archivedCurrentWindow.length, - archivedPastWindow: archivedPastWindow.length, + createdCurrentWindow: createdCurrentWindow, + createdPastWindow: createdPastWindow, + archivedCurrentWindow: archivedCurrentWindow, + archivedPastWindow: archivedPastWindow, projectActivityCurrentWindow: projectActivityCurrentWindow, projectActivityPastWindow: projectActivityPastWindow, projectMembersAddedCurrentWindow: diff --git a/src/lib/types/stores/feature-toggle-store.ts b/src/lib/types/stores/feature-toggle-store.ts index f6e1ad6326..441f9db0e1 100644 --- a/src/lib/types/stores/feature-toggle-store.ts +++ b/src/lib/types/stores/feature-toggle-store.ts @@ -25,13 +25,13 @@ export interface IFeatureToggleStore extends Store { revive(featureName: string): Promise; getAll(query?: Partial): Promise; getAllByNames(names: string[]): Promise; - getByDate(queryModifiers: { + countByDate(queryModifiers: { archived?: boolean; project?: string; date?: string; range?: string[]; dateAccessor: string; - }): Promise; + }): Promise; /** * @deprecated - Variants should be fetched from FeatureEnvironmentStore (since variants are now; since 4.18, connected to environments) * @param featureName diff --git a/src/test/fixtures/fake-feature-toggle-store.ts b/src/test/fixtures/fake-feature-toggle-store.ts index 5015766a4c..b4fb17a7eb 100644 --- a/src/test/fixtures/fake-feature-toggle-store.ts +++ b/src/test/fixtures/fake-feature-toggle-store.ts @@ -213,13 +213,13 @@ export default class FakeFeatureToggleStore implements IFeatureToggleStore { return Promise.resolve(newVariants); } - async getByDate(queryModifiers: { + async countByDate(queryModifiers: { archived?: boolean; project?: string; date?: string; range?: string[]; dateAccessor: string; - }): Promise { + }): Promise { return this.features.filter((feature) => { if (feature.archived === queryModifiers.archived) { return true; @@ -245,7 +245,7 @@ export default class FakeFeatureToggleStore implements IFeatureToggleStore { ) { return true; } - }); + }).length; } dropAllVariants(): Promise {