Fix session timeline query, bump to 0.2.1
CI / Static checks (push) Successful in 1m3s
CI / Build and push image (push) Successful in 1m5s

getSessionTimeline() grouped/ordered by a bare `bucket` identifier,
assuming SQLite would resolve it against the SELECT list's alias -
it doesn't in this generated query, so every /sessions/:id page and
/api/stats/sessions/:id/timeline request failed with "no such column:
bucket". Fixed by reusing the actual bucket expression object in
groupBy/orderBy instead of referencing it by name. Verified against a
seeded session - previously every request, now correct bucketed data.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W8WkFF5ppURBAB918593Eb
This commit is contained in:
2026-08-25 17:41:43 +02:00
co-authored by Claude Sonnet 5
parent 0bd36b08c9
commit f97ed6da04
2 changed files with 10 additions and 4 deletions
+9 -3
View File
@@ -37,9 +37,15 @@ export async function getSessionsSummary() {
}
export async function getSessionTimeline(playSessionId: number, bucketMs = 1000) {
// Reuse the same expression object (not a `sql`bucket`` alias reference)
// in groupBy/orderBy - drizzle doesn't emit a literal `AS bucket` that
// SQLite's GROUP BY/ORDER BY could resolve a bare "bucket" identifier
// against, so referencing it by name causes "no such column: bucket".
const bucket = sql<number>`(${sessionEvents.tsMs} / ${bucketMs}) * ${bucketMs}`;
return db
.select({
bucket: sql<number>`(${sessionEvents.tsMs} / ${bucketMs}) * ${bucketMs}`,
bucket,
sessionDeviceId: sessionEvents.sessionDeviceId,
slotLabel: sessionDevices.slotLabel,
avgValue: sql<number>`avg(${sessionEvents.value})`,
@@ -48,8 +54,8 @@ export async function getSessionTimeline(playSessionId: number, bucketMs = 1000)
.from(sessionEvents)
.innerJoin(sessionDevices, eq(sessionEvents.sessionDeviceId, sessionDevices.id))
.where(and(eq(sessionEvents.playSessionId, playSessionId), ne(sessionEvents.commandType, "stop")))
.groupBy(sql`bucket`, sessionEvents.sessionDeviceId)
.orderBy(sql`bucket`);
.groupBy(bucket, sessionEvents.sessionDeviceId)
.orderBy(bucket);
}
export async function getDeviceUsageStats() {