From de2bd1113e0cc6ba833ef97d9570116c27a9cdc9 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Sep 2022 15:38:05 +0200 Subject: [PATCH 1/2] refactor: Improve Statistics Query --- .../graphql/resolver/StatisticsResolver.ts | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts index 4c1500839..c2cebbed5 100644 --- a/backend/src/graphql/resolver/StatisticsResolver.ts +++ b/backend/src/graphql/resolver/StatisticsResolver.ts @@ -7,49 +7,49 @@ import { getConnection } from '@dbTools/typeorm' import Decimal from 'decimal.js-light' import { calculateDecay } from '@/util/decay' +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ + @Resolver() export class StatisticsResolver { @Authorized([RIGHTS.COMMUNITY_STATISTICS]) @Query(() => CommunityStatistics) - async communityStatistics(): Promise { - const allUsers = await DbUser.find({ withDeleted: true }) + async communityStatistics(@Info() info: any): Promise { - let totalUsers = 0 - let activeUsers = 0 - let deletedUsers = 0 + const allUsers = await DbUser.count({ withDeleted: true }) + const totalUsers = await DbUser.count() + const deletedUsers = allUsers - totalUsers let totalGradidoAvailable: Decimal = new Decimal(0) let totalGradidoUnbookedDecayed: Decimal = new Decimal(0) const receivedCallDate = new Date() - for (let i = 0; i < allUsers.length; i++) { - if (allUsers[i].deletedAt) { - deletedUsers++ - } else { - totalUsers++ - const lastTransaction = await DbTransaction.findOne({ - where: { userId: allUsers[i].id }, - order: { balanceDate: 'DESC' }, - }) - if (lastTransaction) { - activeUsers++ - const decay = calculateDecay( - lastTransaction.balance, - lastTransaction.balanceDate, - receivedCallDate, - ) - if (decay) { - totalGradidoAvailable = totalGradidoAvailable.plus(decay.balance.toString()) - totalGradidoUnbookedDecayed = totalGradidoUnbookedDecayed.plus(decay.decay.toString()) - } - } - } - } - const queryRunner = getConnection().createQueryRunner() await queryRunner.connect() + const lastUserTransactions = await queryRunner.manager + .createQueryBuilder(DbUser, 'user') + .select('transaction.balance', 'balance') + .addSelect('transaction.balance_date', 'balanceDate') + .innerJoin(DbTransaction, 'transaction', 'user.id = transaction.user_id') + .where( + `transaction.balance_date = (SELECT MAX(t.balance_date) FROM transactions AS t WHERE t.user_id = user.id)`, + ) + .orderBy('transaction.balance_date', 'DESC') + .addOrderBy('transaction.id', 'DESC') + .getRawMany() + + const activeUsers = lastUserTransactions.length + + lastUserTransactions.forEach(({ balance, balanceDate }) => { + const decay = calculateDecay(new Decimal(balance), new Date(balanceDate), receivedCallDate) + if (decay) { + totalGradidoAvailable = totalGradidoAvailable.plus(decay.balance.toString()) + totalGradidoUnbookedDecayed = totalGradidoUnbookedDecayed.plus(decay.decay.toString()) + } + }) + const { totalGradidoCreated } = await queryRunner.manager .createQueryBuilder() .select('SUM(transaction.amount) AS totalGradidoCreated') From eb8a245c2d526758c2d9f751a0ebe4fee8a63369 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Thu, 1 Sep 2022 16:26:57 +0200 Subject: [PATCH 2/2] fix resolver args --- backend/src/graphql/resolver/StatisticsResolver.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/graphql/resolver/StatisticsResolver.ts b/backend/src/graphql/resolver/StatisticsResolver.ts index c2cebbed5..b0c061d91 100644 --- a/backend/src/graphql/resolver/StatisticsResolver.ts +++ b/backend/src/graphql/resolver/StatisticsResolver.ts @@ -14,8 +14,7 @@ import { calculateDecay } from '@/util/decay' export class StatisticsResolver { @Authorized([RIGHTS.COMMUNITY_STATISTICS]) @Query(() => CommunityStatistics) - async communityStatistics(@Info() info: any): Promise { - + async communityStatistics(): Promise { const allUsers = await DbUser.count({ withDeleted: true }) const totalUsers = await DbUser.count() const deletedUsers = allUsers - totalUsers