From 38646bc5dd93a9053e1223e78d7c26e8ce0769ae Mon Sep 17 00:00:00 2001 From: franzns <93920061+franzns@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:20:24 +0100 Subject: [PATCH] redo wallet/staked balance query (#53) * replace queries, no join but two queries * adding indexes on user addresses in balance tables * filter non-zero balances manually --------- Co-authored-by: gmbronco <83549293+gmbronco@users.noreply.github.com> --- modules/user/lib/user-balance.service.ts | 71 +++++++++++++------ modules/user/user.prisma | 2 + .../migration.sql | 5 ++ prisma/schema.prisma | 2 + 4 files changed, 58 insertions(+), 22 deletions(-) create mode 100644 prisma/migrations/20240119115442_user_address_indexes/migration.sql diff --git a/modules/user/lib/user-balance.service.ts b/modules/user/lib/user-balance.service.ts index fb98fb1f2..5167d30a0 100644 --- a/modules/user/lib/user-balance.service.ts +++ b/modules/user/lib/user-balance.service.ts @@ -10,30 +10,48 @@ export class UserBalanceService { constructor() {} public async getUserPoolBalances(address: string, chains: Chain[]): Promise { - const user = await prisma.prismaUser.findUnique({ - where: { address: address.toLowerCase() }, - include: { - walletBalances: { - where: { chain: { in: chains }, poolId: { not: null }, balanceNum: { gt: 0 } }, - }, - stakedBalances: { - where: { chain: { in: chains }, poolId: { not: null }, balanceNum: { gt: 0 } }, - }, + // this seems to cause heavy load + // const user = await prisma.prismaUser.findUnique({ + // where: { address: address.toLowerCase() }, + // include: { + // walletBalances: { + // where: { chain: { in: chains }, poolId: { not: null }, balanceNum: { gt: 0 } }, + // }, + // stakedBalances: { + // where: { chain: { in: chains }, poolId: { not: null }, balanceNum: { gt: 0 } }, + // }, + // }, + // }); + + const userWalletBalances = await prisma.prismaUserWalletBalance.findMany({ + where: { + userAddress: address.toLowerCase(), + chain: { in: chains }, + }, + }); + + const userStakedBalances = await prisma.prismaUserStakedBalance.findMany({ + where: { + userAddress: address.toLowerCase(), + chain: { in: chains }, }, }); - if (!user) { + const nonZeroUserWalletBalances = userWalletBalances.filter((balance) => balance.balanceNum > 0); + const nonZeroUserStakedBalances = userStakedBalances.filter((balance) => balance.balanceNum > 0); + + if (nonZeroUserWalletBalances.length === 0 && nonZeroUserStakedBalances.length === 0) { return []; } const poolIds = _.uniq([ - ...user.stakedBalances.map((balance) => balance.poolId), - ...user.walletBalances.map((balance) => balance.poolId), + ...nonZeroUserWalletBalances.map((balance) => balance.poolId), + ...nonZeroUserStakedBalances.map((balance) => balance.poolId), ]) as string[]; return poolIds.map((poolId) => { - const stakedBalance = user.stakedBalances.find((balance) => balance.poolId === poolId); - const walletBalance = user.walletBalances.find((balance) => balance.poolId === poolId); + const walletBalance = nonZeroUserWalletBalances.find((balance) => balance.poolId === poolId); + const stakedBalance = nonZeroUserStakedBalances.find((balance) => balance.poolId === poolId); const stakedNum = parseUnits(stakedBalance?.balance || '0', 18); const walletNum = parseUnits(walletBalance?.balance || '0', 18); @@ -52,16 +70,25 @@ export class UserBalanceService { public async getUserFbeetsBalance(address: string): Promise> { const fbeetsAddress = networkContext.data.fbeets?.address || ''; - const user = await prisma.prismaUser.findUnique({ - where: { address: address.toLowerCase() }, - include: { - walletBalances: { where: { chain: networkContext.chain, tokenAddress: fbeetsAddress } }, - stakedBalances: { where: { chain: networkContext.chain, tokenAddress: fbeetsAddress } }, - }, + const userWalletBalances = await prisma.prismaUserWalletBalance.findMany({ + where: { userAddress: address.toLowerCase(), chain: networkContext.chain, tokenAddress: fbeetsAddress }, + }); + + const userStakedBalances = await prisma.prismaUserStakedBalance.findMany({ + where: { userAddress: address.toLowerCase(), chain: networkContext.chain, tokenAddress: fbeetsAddress }, }); - const stakedBalance = user?.stakedBalances[0]; - const walletBalance = user?.walletBalances[0]; + // this seems to cause heavy load + // const user = await prisma.prismaUser.findUnique({ + // where: { address: address.toLowerCase() }, + // include: { + // walletBalances: { where: { chain: networkContext.chain, tokenAddress: fbeetsAddress } }, + // stakedBalances: { where: { chain: networkContext.chain, tokenAddress: fbeetsAddress } }, + // }, + // }); + + const stakedBalance = userWalletBalances[0]; + const walletBalance = userStakedBalances[0]; const stakedNum = parseUnits(stakedBalance?.balance || '0', 18); const walletNum = parseUnits(walletBalance?.balance || '0', 18); diff --git a/modules/user/user.prisma b/modules/user/user.prisma index 11cdd6c6e..191cafe18 100644 --- a/modules/user/user.prisma +++ b/modules/user/user.prisma @@ -14,6 +14,7 @@ model PrismaUser { model PrismaUserWalletBalance { @@id([id, chain]) + @@index(userAddress) id String chain Chain @@ -35,6 +36,7 @@ model PrismaUserWalletBalance { model PrismaUserStakedBalance { @@id([id, chain]) + @@index(userAddress) id String chain Chain diff --git a/prisma/migrations/20240119115442_user_address_indexes/migration.sql b/prisma/migrations/20240119115442_user_address_indexes/migration.sql new file mode 100644 index 000000000..df19df672 --- /dev/null +++ b/prisma/migrations/20240119115442_user_address_indexes/migration.sql @@ -0,0 +1,5 @@ +-- CreateIndex +CREATE INDEX "PrismaUserStakedBalance_userAddress_idx" ON "PrismaUserStakedBalance"("userAddress"); + +-- CreateIndex +CREATE INDEX "PrismaUserWalletBalance_userAddress_idx" ON "PrismaUserWalletBalance"("userAddress"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c3e363422..02648160e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -776,6 +776,7 @@ model PrismaUser { model PrismaUserWalletBalance { @@id([id, chain]) + @@index(userAddress) id String chain Chain @@ -797,6 +798,7 @@ model PrismaUserWalletBalance { model PrismaUserStakedBalance { @@id([id, chain]) + @@index(userAddress) id String chain Chain