fixed searchExtensionData orm function

This commit is contained in:
Huakun Shen 2025-03-26 11:48:24 -04:00
parent 9c89395d5e
commit 288c9b554a
No known key found for this signature in database
2 changed files with 47 additions and 47 deletions

View File

@ -261,7 +261,16 @@ export async function searchExtensionData(searchParams: {
} }
// Build the query // Build the query
const query = db.select(selectQuery).from(schema.extensionData) let baseQuery = db.select(selectQuery).from(schema.extensionData)
// Add FTS join if needed
if (searchParams.searchMode === SearchModeEnum.FTS && searchParams.searchText) {
// @ts-expect-error - The join type is correct but TypeScript can't infer it properly
baseQuery = baseQuery.innerJoin(
schema.extensionDataFts,
orm.eq(schema.extensionData.dataId, schema.extensionDataFts.dataId)
)
}
// Add conditions // Add conditions
const conditions = [orm.eq(schema.extensionData.extId, searchParams.extId)] const conditions = [orm.eq(schema.extensionData.extId, searchParams.extId)]
@ -283,7 +292,6 @@ export async function searchExtensionData(searchParams: {
conditions.push(orm.like(schema.extensionData.searchText, `%${searchParams.searchText}%`)) conditions.push(orm.like(schema.extensionData.searchText, `%${searchParams.searchText}%`))
break break
case SearchModeEnum.FTS: case SearchModeEnum.FTS:
// For FTS, we need to use a raw SQL query since Drizzle doesn't support MATCH directly
conditions.push(orm.sql`${schema.extensionDataFts.searchText} MATCH ${searchParams.searchText}`) conditions.push(orm.sql`${schema.extensionDataFts.searchText} MATCH ${searchParams.searchText}`)
break break
} }
@ -297,34 +305,25 @@ export async function searchExtensionData(searchParams: {
conditions.push(orm.lt(schema.extensionData.createdAt, searchParams.beforeCreatedAt)) conditions.push(orm.lt(schema.extensionData.createdAt, searchParams.beforeCreatedAt))
} }
// Add ordering // Build the final query with all conditions and modifiers
if (searchParams.orderByCreatedAt) { const query = baseQuery
query.orderBy( .where(orm.and(...conditions))
searchParams.orderByCreatedAt === SQLSortOrderEnum.Asc .orderBy(
searchParams.orderByCreatedAt
? searchParams.orderByCreatedAt === SQLSortOrderEnum.Asc
? orm.asc(schema.extensionData.createdAt) ? orm.asc(schema.extensionData.createdAt)
: orm.desc(schema.extensionData.createdAt) : orm.desc(schema.extensionData.createdAt)
) : searchParams.orderByUpdatedAt
} ? searchParams.orderByUpdatedAt === SQLSortOrderEnum.Asc
if (searchParams.orderByUpdatedAt) {
query.orderBy(
searchParams.orderByUpdatedAt === SQLSortOrderEnum.Asc
? orm.asc(schema.extensionData.updatedAt) ? orm.asc(schema.extensionData.updatedAt)
: orm.desc(schema.extensionData.updatedAt) : orm.desc(schema.extensionData.updatedAt)
: orm.asc(schema.extensionData.createdAt) // Default ordering
) )
} .limit(searchParams.limit ?? 100) // Default limit
.offset(searchParams.offset ?? 0) // Default offset
// Add limit and offset
if (searchParams.limit) {
query.limit(searchParams.limit)
}
if (searchParams.offset) {
query.offset(searchParams.offset)
}
// Execute query and convert results // Execute query and convert results
const results = await query.where(orm.and(...conditions)).all() const results = await query.all()
return results.map((rawData) => { return results.map((rawData) => {
// @ts-expect-error - rawData is unknown, but will be safe parsed with valibot // @ts-expect-error - rawData is unknown, but will be safe parsed with valibot
return convertRawExtDataToExtData(rawData) return convertRawExtDataToExtData(rawData)

View File

@ -11,7 +11,7 @@
import * as schema from "@kksh/drizzle/schema" import * as schema from "@kksh/drizzle/schema"
import { Button, Input } from "@kksh/svelte5" import { Button, Input } from "@kksh/svelte5"
import { CmdTypeEnum, Ext } from "@kunkunapi/src/models/extension" import { CmdTypeEnum, Ext } from "@kunkunapi/src/models/extension"
import { SearchModeEnum } from "@kunkunapi/src/models/sql" import { SearchModeEnum, SQLSortOrderEnum } from "@kunkunapi/src/models/sql"
import { db } from "$lib/orm/database" import { db } from "$lib/orm/database"
import * as orm from "drizzle-orm" import * as orm from "drizzle-orm"
import { Inspect } from "svelte-inspect-value" import { Inspect } from "svelte-inspect-value"
@ -100,24 +100,25 @@
> >
Get Extension Data By ID Get Extension Data By ID
</Button> </Button>
<div class="flex gap-2"> <form
<Input class="" bind:value={searchText} placeholder="Search Text" /> class="flex gap-1"
<Button onsubmit={async (e) => {
class="" e.preventDefault()
onclick={async () => {
const _data = await searchExtensionData({ const _data = await searchExtensionData({
extId: 1, extId: 1,
searchMode: SearchModeEnum.FTS, searchMode: SearchModeEnum.FTS,
searchText: searchText, searchText: searchText,
limit: 10 orderByCreatedAt: SQLSortOrderEnum.Desc,
limit: 10,
fields: ["search_text", "data"]
}) })
console.log(_data) console.log(_data)
data = _data data = _data
inspectTitle = "Search Results" inspectTitle = "Search Results"
}} }}
> >
Search Extension Data <Input class="" bind:value={searchText} placeholder="Search Text" />
</Button> <Button class="" type="submit">Search Extension Data</Button>
</div> </form>
<Inspect name={inspectTitle} value={data} /> <Inspect name={inspectTitle} value={data} expandLevel={2} />
</main> </main>