Skip to content

Commit 8487675

Browse files
committed
refactor: improve query
1 parent 6a31851 commit 8487675

1 file changed

Lines changed: 74 additions & 77 deletions

File tree

src/server/model/application/event.ts

Lines changed: 74 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -39,88 +39,85 @@ export async function getApplicationEventStats(
3939
throw new Error('Start date and end date are required');
4040
}
4141

42-
// Get current period stats
43-
const currentStats = await prisma.$queryRaw<EventStatsQueryResultItem[]>`
44-
SELECT
45-
${getDateQuery('"ApplicationEvent"."createdAt"', unit, timezone)} date,
46-
COUNT(*) as "eventCount",
47-
COUNT(DISTINCT "sessionId") as "sessionCount",
48-
${getTimestampIntervalQuery('"ApplicationEvent"."createdAt"')} as "totalTime",
49-
ROUND(
50-
CAST(
51-
COUNT(DISTINCT CONCAT("sessionId", ':', "eventName")) AS DECIMAL
52-
) /
53-
NULLIF(COUNT(DISTINCT "sessionId"), 0),
54-
2
55-
) as "avgEventsPerSession",
56-
ROUND(
57-
CAST(
58-
COUNT(DISTINCT CASE WHEN "screenName" IS NOT NULL THEN CONCAT("sessionId", ':', "screenName") ELSE NULL END) AS DECIMAL
59-
) /
60-
NULLIF(COUNT(DISTINCT "sessionId"), 0),
61-
2
62-
) as "avgScreensPerSession"
63-
FROM "ApplicationEvent"
64-
WHERE "applicationId" = ${applicationId}
65-
AND "createdAt" BETWEEN ${startDate.toISOString()}::timestamptz AND ${endDate.toISOString()}::timestamptz
66-
GROUP BY 1
67-
ORDER BY 1
68-
`;
69-
70-
// Get current period total session count
71-
const currentTotalResult = await prisma.$queryRaw<
72-
{ totalSessionCount: bigint }[]
73-
>`
74-
SELECT
75-
COUNT(DISTINCT "sessionId") as "totalSessionCount"
76-
FROM "ApplicationEvent"
77-
WHERE "applicationId" = ${applicationId}
78-
AND "createdAt" BETWEEN ${startDate.toISOString()}::timestamptz AND ${endDate.toISOString()}::timestamptz
79-
`;
80-
8142
// Calculate previous period
8243
const diffInMs = endDate.getTime() - startDate.getTime();
8344
const prevStartDate = new Date(startDate.getTime() - diffInMs);
8445
const prevEndDate = new Date(endDate.getTime() - diffInMs);
8546

86-
// Get previous period stats
87-
const prevStats = await prisma.$queryRaw<EventStatsQueryResultItem[]>`
88-
SELECT
89-
${getDateQuery('"ApplicationEvent"."createdAt"', unit, timezone)} date,
90-
COUNT(*) as "eventCount",
91-
COUNT(DISTINCT "sessionId") as "sessionCount",
92-
${getTimestampIntervalQuery('"ApplicationEvent"."createdAt"')} as "totalTime",
93-
ROUND(
94-
CAST(
95-
COUNT(DISTINCT CONCAT("sessionId", ':', "eventName")) AS DECIMAL
96-
) /
97-
NULLIF(COUNT(DISTINCT "sessionId"), 0),
98-
2
99-
) as "avgEventsPerSession",
100-
ROUND(
101-
CAST(
102-
COUNT(DISTINCT CASE WHEN "screenName" IS NOT NULL THEN CONCAT("sessionId", ':', "screenName") ELSE NULL END) AS DECIMAL
103-
) /
104-
NULLIF(COUNT(DISTINCT "sessionId"), 0),
105-
2
106-
) as "avgScreensPerSession"
107-
FROM "ApplicationEvent"
108-
WHERE "applicationId" = ${applicationId}
109-
AND "createdAt" BETWEEN ${prevStartDate.toISOString()}::timestamptz AND ${prevEndDate.toISOString()}::timestamptz
110-
GROUP BY 1
111-
ORDER BY 1
112-
`;
113-
114-
// Get previous period total session count
115-
const previousTotalResult = await prisma.$queryRaw<
116-
{ totalSessionCount: bigint }[]
117-
>`
118-
SELECT
119-
COUNT(DISTINCT "sessionId") as "totalSessionCount"
120-
FROM "ApplicationEvent"
121-
WHERE "applicationId" = ${applicationId}
122-
AND "createdAt" BETWEEN ${prevStartDate.toISOString()}::timestamptz AND ${prevEndDate.toISOString()}::timestamptz
123-
`;
47+
// Execute all queries in parallel
48+
const [currentStats, currentTotalResult, prevStats, previousTotalResult] =
49+
await Promise.all([
50+
// Get current period stats
51+
prisma.$queryRaw<EventStatsQueryResultItem[]>`
52+
SELECT
53+
${getDateQuery('"ApplicationEvent"."createdAt"', unit, timezone)} date,
54+
COUNT(*) as "eventCount",
55+
COUNT(DISTINCT "sessionId") as "sessionCount",
56+
${getTimestampIntervalQuery('"ApplicationEvent"."createdAt"')} as "totalTime",
57+
ROUND(
58+
CAST(
59+
COUNT(DISTINCT CONCAT("sessionId", ':', "eventName")) AS DECIMAL
60+
) /
61+
NULLIF(COUNT(DISTINCT "sessionId"), 0),
62+
2
63+
) as "avgEventsPerSession",
64+
ROUND(
65+
CAST(
66+
COUNT(DISTINCT CASE WHEN "screenName" IS NOT NULL THEN CONCAT("sessionId", ':', "screenName") ELSE NULL END) AS DECIMAL
67+
) /
68+
NULLIF(COUNT(DISTINCT "sessionId"), 0),
69+
2
70+
) as "avgScreensPerSession"
71+
FROM "ApplicationEvent"
72+
WHERE "applicationId" = ${applicationId}
73+
AND "createdAt" BETWEEN ${startDate.toISOString()}::timestamptz AND ${endDate.toISOString()}::timestamptz
74+
GROUP BY 1
75+
ORDER BY 1
76+
`,
77+
// Get current period total session count
78+
prisma.$queryRaw<{ totalSessionCount: bigint }[]>`
79+
SELECT
80+
COUNT(DISTINCT "sessionId") as "totalSessionCount"
81+
FROM "ApplicationEvent"
82+
WHERE "applicationId" = ${applicationId}
83+
AND "createdAt" BETWEEN ${startDate.toISOString()}::timestamptz AND ${endDate.toISOString()}::timestamptz
84+
`,
85+
// Get previous period stats
86+
prisma.$queryRaw<EventStatsQueryResultItem[]>`
87+
SELECT
88+
${getDateQuery('"ApplicationEvent"."createdAt"', unit, timezone)} date,
89+
COUNT(*) as "eventCount",
90+
COUNT(DISTINCT "sessionId") as "sessionCount",
91+
${getTimestampIntervalQuery('"ApplicationEvent"."createdAt"')} as "totalTime",
92+
ROUND(
93+
CAST(
94+
COUNT(DISTINCT CONCAT("sessionId", ':', "eventName")) AS DECIMAL
95+
) /
96+
NULLIF(COUNT(DISTINCT "sessionId"), 0),
97+
2
98+
) as "avgEventsPerSession",
99+
ROUND(
100+
CAST(
101+
COUNT(DISTINCT CASE WHEN "screenName" IS NOT NULL THEN CONCAT("sessionId", ':', "screenName") ELSE NULL END) AS DECIMAL
102+
) /
103+
NULLIF(COUNT(DISTINCT "sessionId"), 0),
104+
2
105+
) as "avgScreensPerSession"
106+
FROM "ApplicationEvent"
107+
WHERE "applicationId" = ${applicationId}
108+
AND "createdAt" BETWEEN ${prevStartDate.toISOString()}::timestamptz AND ${prevEndDate.toISOString()}::timestamptz
109+
GROUP BY 1
110+
ORDER BY 1
111+
`,
112+
// Get previous period total session count
113+
prisma.$queryRaw<{ totalSessionCount: bigint }[]>`
114+
SELECT
115+
COUNT(DISTINCT "sessionId") as "totalSessionCount"
116+
FROM "ApplicationEvent"
117+
WHERE "applicationId" = ${applicationId}
118+
AND "createdAt" BETWEEN ${prevStartDate.toISOString()}::timestamptz AND ${prevEndDate.toISOString()}::timestamptz
119+
`,
120+
]);
124121

125122
// Format the results
126123
return {

0 commit comments

Comments
 (0)