core: filter sessions at database level to improve session list loading performance
This commit is contained in:
@@ -53,15 +53,15 @@ export const SessionRoutes = lazy(() =>
|
|||||||
),
|
),
|
||||||
async (c) => {
|
async (c) => {
|
||||||
const query = c.req.valid("query")
|
const query = c.req.valid("query")
|
||||||
const term = query.search?.toLowerCase()
|
|
||||||
const sessions: Session.Info[] = []
|
const sessions: Session.Info[] = []
|
||||||
for await (const session of Session.list()) {
|
for await (const session of Session.list({
|
||||||
if (query.directory !== undefined && session.directory !== query.directory) continue
|
directory: query.directory,
|
||||||
if (query.roots && session.parentID) continue
|
roots: query.roots,
|
||||||
if (query.start !== undefined && session.time.updated < query.start) continue
|
start: query.start,
|
||||||
if (term !== undefined && !session.title.toLowerCase().includes(term)) continue
|
search: query.search,
|
||||||
|
limit: query.limit,
|
||||||
|
})) {
|
||||||
sessions.push(session)
|
sessions.push(session)
|
||||||
if (query.limit !== undefined && sessions.length >= query.limit) break
|
|
||||||
}
|
}
|
||||||
return c.json(sessions)
|
return c.json(sessions)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import { Flag } from "../flag/flag"
|
|||||||
import { Identifier } from "../id/id"
|
import { Identifier } from "../id/id"
|
||||||
import { Installation } from "../installation"
|
import { Installation } from "../installation"
|
||||||
|
|
||||||
import { Database, NotFoundError, eq, and, or, like } from "../storage/db"
|
import { Database, NotFoundError, eq, and, or, gte, isNull, desc, like } from "../storage/db"
|
||||||
import { SessionTable, MessageTable, PartTable } from "./session.sql"
|
import { SessionTable, MessageTable, PartTable } from "./session.sql"
|
||||||
import { Storage } from "@/storage/storage"
|
import { Storage } from "@/storage/storage"
|
||||||
import { Log } from "../util/log"
|
import { Log } from "../util/log"
|
||||||
@@ -505,20 +505,38 @@ export namespace Session {
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
export function* list() {
|
export function* list(input?: {
|
||||||
|
directory?: string
|
||||||
|
roots?: boolean
|
||||||
|
start?: number
|
||||||
|
search?: string
|
||||||
|
limit?: number
|
||||||
|
}) {
|
||||||
const project = Instance.project
|
const project = Instance.project
|
||||||
// const rel = path.relative(Instance.worktree, Instance.directory)
|
const conditions = [eq(SessionTable.project_id, project.id)]
|
||||||
// const suffix = path.sep + rel
|
|
||||||
|
if (input?.directory) {
|
||||||
|
conditions.push(eq(SessionTable.directory, input.directory))
|
||||||
|
}
|
||||||
|
if (input?.roots) {
|
||||||
|
conditions.push(isNull(SessionTable.parent_id))
|
||||||
|
}
|
||||||
|
if (input?.start) {
|
||||||
|
conditions.push(gte(SessionTable.time_updated, input.start))
|
||||||
|
}
|
||||||
|
if (input?.search) {
|
||||||
|
conditions.push(like(SessionTable.title, `%${input.search}%`))
|
||||||
|
}
|
||||||
|
|
||||||
|
const limit = input?.limit ?? 100
|
||||||
|
|
||||||
const rows = Database.use((db) =>
|
const rows = Database.use((db) =>
|
||||||
db
|
db
|
||||||
.select()
|
.select()
|
||||||
.from(SessionTable)
|
.from(SessionTable)
|
||||||
.where(
|
.where(and(...conditions))
|
||||||
and(
|
.orderBy(desc(SessionTable.time_updated))
|
||||||
eq(SessionTable.project_id, project.id),
|
.limit(limit)
|
||||||
// or(eq(SessionTable.directory, Instance.directory), like(SessionTable.directory, `%${suffix}`)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.all(),
|
.all(),
|
||||||
)
|
)
|
||||||
for (const row of rows) {
|
for (const row of rows) {
|
||||||
|
|||||||
Reference in New Issue
Block a user