2
0

stats.sql.go 9.4 KB

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