@@ -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