1// Code generated by sqlc. DO NOT EDIT.
2// versions:
3// sqlc v1.30.0
4// source: stats.sql
5
6package db
7
8import (
9 "context"
10 "database/sql"
11)
12
13const getAverageResponseTime = `-- name: GetAverageResponseTime :one
14SELECT
15 CAST(COALESCE(AVG(finished_at - created_at), 0) AS INTEGER) as avg_response_seconds
16FROM messages
17WHERE role = 'assistant'
18 AND finished_at IS NOT NULL
19 AND finished_at > created_at
20`
21
22func (q *Queries) GetAverageResponseTime(ctx context.Context) (int64, error) {
23 row := q.queryRow(ctx, q.getAverageResponseTimeStmt, getAverageResponseTime)
24 var avg_response_seconds int64
25 err := row.Scan(&avg_response_seconds)
26 return avg_response_seconds, err
27}
28
29const getHourDayHeatmap = `-- name: GetHourDayHeatmap :many
30SELECT
31 CAST(strftime('%w', created_at, 'unixepoch') AS INTEGER) as day_of_week,
32 CAST(strftime('%H', created_at, 'unixepoch') AS INTEGER) as hour,
33 COUNT(*) as session_count
34FROM sessions
35WHERE parent_session_id IS NULL
36GROUP BY day_of_week, hour
37ORDER BY day_of_week, hour
38`
39
40type GetHourDayHeatmapRow struct {
41 DayOfWeek int64 `json:"day_of_week"`
42 Hour int64 `json:"hour"`
43 SessionCount int64 `json:"session_count"`
44}
45
46func (q *Queries) GetHourDayHeatmap(ctx context.Context) ([]GetHourDayHeatmapRow, error) {
47 rows, err := q.query(ctx, q.getHourDayHeatmapStmt, getHourDayHeatmap)
48 if err != nil {
49 return nil, err
50 }
51 defer rows.Close()
52 items := []GetHourDayHeatmapRow{}
53 for rows.Next() {
54 var i GetHourDayHeatmapRow
55 if err := rows.Scan(&i.DayOfWeek, &i.Hour, &i.SessionCount); err != nil {
56 return nil, err
57 }
58 items = append(items, i)
59 }
60 if err := rows.Close(); err != nil {
61 return nil, err
62 }
63 if err := rows.Err(); err != nil {
64 return nil, err
65 }
66 return items, nil
67}
68
69const getRecentActivity = `-- name: GetRecentActivity :many
70SELECT
71 date(created_at, 'unixepoch') as day,
72 COUNT(*) as session_count,
73 SUM(prompt_tokens + completion_tokens) as total_tokens,
74 SUM(cost) as cost
75FROM sessions
76WHERE parent_session_id IS NULL
77 AND created_at >= strftime('%s', 'now', '-30 days')
78GROUP BY date(created_at, 'unixepoch')
79ORDER BY day ASC
80`
81
82type GetRecentActivityRow struct {
83 Day interface{} `json:"day"`
84 SessionCount int64 `json:"session_count"`
85 TotalTokens sql.NullFloat64 `json:"total_tokens"`
86 Cost sql.NullFloat64 `json:"cost"`
87}
88
89func (q *Queries) GetRecentActivity(ctx context.Context) ([]GetRecentActivityRow, error) {
90 rows, err := q.query(ctx, q.getRecentActivityStmt, getRecentActivity)
91 if err != nil {
92 return nil, err
93 }
94 defer rows.Close()
95 items := []GetRecentActivityRow{}
96 for rows.Next() {
97 var i GetRecentActivityRow
98 if err := rows.Scan(
99 &i.Day,
100 &i.SessionCount,
101 &i.TotalTokens,
102 &i.Cost,
103 ); err != nil {
104 return nil, err
105 }
106 items = append(items, i)
107 }
108 if err := rows.Close(); err != nil {
109 return nil, err
110 }
111 if err := rows.Err(); err != nil {
112 return nil, err
113 }
114 return items, nil
115}
116
117const getToolUsage = `-- name: GetToolUsage :many
118SELECT
119 json_extract(value, '$.data.name') as tool_name,
120 COUNT(*) as call_count
121FROM messages, json_each(parts)
122WHERE json_extract(value, '$.type') = 'tool_call'
123 AND json_extract(value, '$.data.name') IS NOT NULL
124GROUP BY tool_name
125ORDER BY call_count DESC
126`
127
128type GetToolUsageRow struct {
129 ToolName interface{} `json:"tool_name"`
130 CallCount int64 `json:"call_count"`
131}
132
133func (q *Queries) GetToolUsage(ctx context.Context) ([]GetToolUsageRow, error) {
134 rows, err := q.query(ctx, q.getToolUsageStmt, getToolUsage)
135 if err != nil {
136 return nil, err
137 }
138 defer rows.Close()
139 items := []GetToolUsageRow{}
140 for rows.Next() {
141 var i GetToolUsageRow
142 if err := rows.Scan(&i.ToolName, &i.CallCount); err != nil {
143 return nil, err
144 }
145 items = append(items, i)
146 }
147 if err := rows.Close(); err != nil {
148 return nil, err
149 }
150 if err := rows.Err(); err != nil {
151 return nil, err
152 }
153 return items, nil
154}
155
156const getTotalStats = `-- name: GetTotalStats :one
157SELECT
158 COUNT(*) as total_sessions,
159 COALESCE(SUM(prompt_tokens), 0) as total_prompt_tokens,
160 COALESCE(SUM(completion_tokens), 0) as total_completion_tokens,
161 COALESCE(SUM(cost), 0) as total_cost,
162 COALESCE(SUM(message_count), 0) as total_messages,
163 COALESCE(AVG(prompt_tokens + completion_tokens), 0) as avg_tokens_per_session,
164 COALESCE(AVG(message_count), 0) as avg_messages_per_session
165FROM sessions
166WHERE parent_session_id IS NULL
167`
168
169type GetTotalStatsRow struct {
170 TotalSessions int64 `json:"total_sessions"`
171 TotalPromptTokens interface{} `json:"total_prompt_tokens"`
172 TotalCompletionTokens interface{} `json:"total_completion_tokens"`
173 TotalCost interface{} `json:"total_cost"`
174 TotalMessages interface{} `json:"total_messages"`
175 AvgTokensPerSession interface{} `json:"avg_tokens_per_session"`
176 AvgMessagesPerSession interface{} `json:"avg_messages_per_session"`
177}
178
179func (q *Queries) GetTotalStats(ctx context.Context) (GetTotalStatsRow, error) {
180 row := q.queryRow(ctx, q.getTotalStatsStmt, getTotalStats)
181 var i GetTotalStatsRow
182 err := row.Scan(
183 &i.TotalSessions,
184 &i.TotalPromptTokens,
185 &i.TotalCompletionTokens,
186 &i.TotalCost,
187 &i.TotalMessages,
188 &i.AvgTokensPerSession,
189 &i.AvgMessagesPerSession,
190 )
191 return i, err
192}
193
194const getUsageByDay = `-- name: GetUsageByDay :many
195SELECT
196 date(created_at, 'unixepoch') as day,
197 SUM(prompt_tokens) as prompt_tokens,
198 SUM(completion_tokens) as completion_tokens,
199 SUM(cost) as cost,
200 COUNT(*) as session_count
201FROM sessions
202WHERE parent_session_id IS NULL
203GROUP BY date(created_at, 'unixepoch')
204ORDER BY day DESC
205`
206
207type GetUsageByDayRow struct {
208 Day interface{} `json:"day"`
209 PromptTokens sql.NullFloat64 `json:"prompt_tokens"`
210 CompletionTokens sql.NullFloat64 `json:"completion_tokens"`
211 Cost sql.NullFloat64 `json:"cost"`
212 SessionCount int64 `json:"session_count"`
213}
214
215func (q *Queries) GetUsageByDay(ctx context.Context) ([]GetUsageByDayRow, error) {
216 rows, err := q.query(ctx, q.getUsageByDayStmt, getUsageByDay)
217 if err != nil {
218 return nil, err
219 }
220 defer rows.Close()
221 items := []GetUsageByDayRow{}
222 for rows.Next() {
223 var i GetUsageByDayRow
224 if err := rows.Scan(
225 &i.Day,
226 &i.PromptTokens,
227 &i.CompletionTokens,
228 &i.Cost,
229 &i.SessionCount,
230 ); err != nil {
231 return nil, err
232 }
233 items = append(items, i)
234 }
235 if err := rows.Close(); err != nil {
236 return nil, err
237 }
238 if err := rows.Err(); err != nil {
239 return nil, err
240 }
241 return items, nil
242}
243
244const getUsageByDayOfWeek = `-- name: GetUsageByDayOfWeek :many
245SELECT
246 CAST(strftime('%w', created_at, 'unixepoch') AS INTEGER) as day_of_week,
247 COUNT(*) as session_count,
248 SUM(prompt_tokens) as prompt_tokens,
249 SUM(completion_tokens) as completion_tokens
250FROM sessions
251WHERE parent_session_id IS NULL
252GROUP BY day_of_week
253ORDER BY day_of_week
254`
255
256type GetUsageByDayOfWeekRow struct {
257 DayOfWeek int64 `json:"day_of_week"`
258 SessionCount int64 `json:"session_count"`
259 PromptTokens sql.NullFloat64 `json:"prompt_tokens"`
260 CompletionTokens sql.NullFloat64 `json:"completion_tokens"`
261}
262
263func (q *Queries) GetUsageByDayOfWeek(ctx context.Context) ([]GetUsageByDayOfWeekRow, error) {
264 rows, err := q.query(ctx, q.getUsageByDayOfWeekStmt, getUsageByDayOfWeek)
265 if err != nil {
266 return nil, err
267 }
268 defer rows.Close()
269 items := []GetUsageByDayOfWeekRow{}
270 for rows.Next() {
271 var i GetUsageByDayOfWeekRow
272 if err := rows.Scan(
273 &i.DayOfWeek,
274 &i.SessionCount,
275 &i.PromptTokens,
276 &i.CompletionTokens,
277 ); err != nil {
278 return nil, err
279 }
280 items = append(items, i)
281 }
282 if err := rows.Close(); err != nil {
283 return nil, err
284 }
285 if err := rows.Err(); err != nil {
286 return nil, err
287 }
288 return items, nil
289}
290
291const getUsageByHour = `-- name: GetUsageByHour :many
292SELECT
293 CAST(strftime('%H', created_at, 'unixepoch') AS INTEGER) as hour,
294 COUNT(*) as session_count
295FROM sessions
296WHERE parent_session_id IS NULL
297GROUP BY hour
298ORDER BY hour
299`
300
301type GetUsageByHourRow struct {
302 Hour int64 `json:"hour"`
303 SessionCount int64 `json:"session_count"`
304}
305
306func (q *Queries) GetUsageByHour(ctx context.Context) ([]GetUsageByHourRow, error) {
307 rows, err := q.query(ctx, q.getUsageByHourStmt, getUsageByHour)
308 if err != nil {
309 return nil, err
310 }
311 defer rows.Close()
312 items := []GetUsageByHourRow{}
313 for rows.Next() {
314 var i GetUsageByHourRow
315 if err := rows.Scan(&i.Hour, &i.SessionCount); err != nil {
316 return nil, err
317 }
318 items = append(items, i)
319 }
320 if err := rows.Close(); err != nil {
321 return nil, err
322 }
323 if err := rows.Err(); err != nil {
324 return nil, err
325 }
326 return items, nil
327}
328
329const getUsageByModel = `-- name: GetUsageByModel :many
330SELECT
331 COALESCE(model, 'unknown') as model,
332 COALESCE(provider, 'unknown') as provider,
333 COUNT(*) as message_count
334FROM messages
335WHERE role = 'assistant'
336GROUP BY model, provider
337ORDER BY message_count DESC
338`
339
340type GetUsageByModelRow struct {
341 Model string `json:"model"`
342 Provider string `json:"provider"`
343 MessageCount int64 `json:"message_count"`
344}
345
346func (q *Queries) GetUsageByModel(ctx context.Context) ([]GetUsageByModelRow, error) {
347 rows, err := q.query(ctx, q.getUsageByModelStmt, getUsageByModel)
348 if err != nil {
349 return nil, err
350 }
351 defer rows.Close()
352 items := []GetUsageByModelRow{}
353 for rows.Next() {
354 var i GetUsageByModelRow
355 if err := rows.Scan(&i.Model, &i.Provider, &i.MessageCount); err != nil {
356 return nil, err
357 }
358 items = append(items, i)
359 }
360 if err := rows.Close(); err != nil {
361 return nil, err
362 }
363 if err := rows.Err(); err != nil {
364 return nil, err
365 }
366 return items, nil
367}