2
0

🗃️ Optimize usage queries

This commit is contained in:
Baptiste Arnaud
2022-12-06 19:11:11 +01:00
parent 855a2856c8
commit d6f90af126
7 changed files with 56 additions and 23 deletions

View File

@ -3,7 +3,6 @@ import { canReadTypebot } from '@/utils/api/dbRules'
import { authenticatedProcedure } from '@/utils/server/trpc' import { authenticatedProcedure } from '@/utils/server/trpc'
import { TRPCError } from '@trpc/server' import { TRPCError } from '@trpc/server'
import { ResultWithAnswers, resultWithAnswersSchema } from 'models' import { ResultWithAnswers, resultWithAnswersSchema } from 'models'
import { isDefined } from 'utils'
import { z } from 'zod' import { z } from 'zod'
const maxLimit = 200 const maxLimit = 200
@ -44,7 +43,7 @@ export const getResultsProcedure = authenticatedProcedure
cursor: cursor ? { id: cursor } : undefined, cursor: cursor ? { id: cursor } : undefined,
where: { where: {
typebot: canReadTypebot(input.typebotId, user), typebot: canReadTypebot(input.typebotId, user),
answers: { some: {} }, hasStarted: true,
}, },
orderBy: { orderBy: {
createdAt: 'desc', createdAt: 'desc',

View File

@ -12,26 +12,27 @@ const handler = async (req: NextApiRequest, res: NextApiResponse) => {
if (req.method === 'GET') { if (req.method === 'GET') {
const typebotId = req.query.typebotId as string const typebotId = req.query.typebotId as string
const totalViews = await prisma.result.count({ const [totalViews, totalStarts, totalCompleted] = await prisma.$transaction(
where: { [
typebotId, prisma.result.count({
typebot: canReadTypebot(typebotId, user), where: {
}, typebot: canReadTypebot(typebotId, user),
}) },
const totalStarts = await prisma.result.count({ }),
where: { prisma.result.count({
typebotId, where: {
typebot: canReadTypebot(typebotId, user), typebot: canReadTypebot(typebotId, user),
answers: { some: {} }, hasStarted: true,
}, },
}) }),
const totalCompleted = await prisma.result.count({ prisma.result.count({
where: { where: {
typebotId, typebot: canReadTypebot(typebotId, user),
typebot: canReadTypebot(typebotId, user), isCompleted: true,
isCompleted: true, },
}, }),
}) ]
)
const stats: Stats = { const stats: Stats = {
totalViews, totalViews,
totalStarts, totalStarts,

View File

@ -0,0 +1,2 @@
-- CreateIndex
CREATE INDEX CONCURRENTLY "Typebot_workspaceId_idx" ON "Typebot"("workspaceId");

View File

@ -0,0 +1,2 @@
-- CreateIndex
CREATE INDEX CONCURRENTLY "Result_createdAt_idx" ON "Result"("createdAt");

View File

@ -0,0 +1,2 @@
-- CreateIndex
CREATE INDEX CONCURRENTLY "Result_hasStarted_idx" ON "Result"("hasStarted");

View File

@ -0,0 +1,23 @@
-- DropIndex
DROP INDEX IF EXISTS "Result_createdAt_idx";
-- DropIndex
DROP INDEX IF EXISTS "Result_hasStarted_idx";
-- DropIndex
DROP INDEX IF EXISTS "Result_typebotId_idx";
-- CreateIndex
CREATE INDEX IF NOT EXISTS "Answer_storageUsed_idx" ON "Answer"("storageUsed")
WHERE
"storageUsed" IS NOT NULL;
-- CreateIndex
CREATE INDEX IF NOT EXISTS "Result_typebotId_createdAt_idx" ON "Result"("typebotId", "createdAt" DESC NULLS LAST)
WHERE
"hasStarted" = true;
-- CreateIndex
CREATE INDEX IF NOT EXISTS "Result_createdAt_typebotId_idx" ON "Result"("createdAt" DESC NULLS LAST, "typebotId")
WHERE
"hasStarted" = true;

View File

@ -174,6 +174,8 @@ model Typebot {
webhooks Webhook[] webhooks Webhook[]
isArchived Boolean @default(false) isArchived Boolean @default(false)
isClosed Boolean @default(false) isClosed Boolean @default(false)
@@index([workspaceId])
} }
model Invitation { model Invitation {
@ -222,7 +224,8 @@ model Result {
answers Answer[] answers Answer[]
logs Log[] logs Log[]
@@index([typebotId]) @@index([typebotId, createdAt])
@@index([createdAt, typebotId])
} }
model Log { model Log {
@ -249,6 +252,7 @@ model Answer {
@@unique([resultId, blockId, groupId]) @@unique([resultId, blockId, groupId])
@@index([groupId]) @@index([groupId])
@@index([storageUsed])
} }
model Coupon { model Coupon {