mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-24 04:01:10 -04:00
59 lines
2.2 KiB
TypeScript
59 lines
2.2 KiB
TypeScript
/* oxlint-disable */
|
|
import type * as Effect from "effect/Effect"
|
|
import { applyEffectWrapper, type QueryEffectHKTBase } from "drizzle-orm/effect-core/query-effect"
|
|
import { entityKind } from "drizzle-orm/entity"
|
|
import { SQL, sql, type SQLWrapper } from "drizzle-orm/sql/sql"
|
|
import type { SQLiteTable } from "drizzle-orm/sqlite-core/table"
|
|
import type { SQLiteView } from "drizzle-orm/sqlite-core/view"
|
|
import type { SQLiteEffectSession } from "./session"
|
|
|
|
function buildSQLiteEmbeddedCount(source: SQLiteTable | SQLiteView | SQL | SQLWrapper, filters?: SQL<unknown>) {
|
|
return sql<number>`(select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters})`
|
|
}
|
|
|
|
function buildSQLiteCount(source: SQLiteTable | SQLiteView | SQL | SQLWrapper, filters?: SQL<unknown>) {
|
|
return sql<number>`select count(*) from ${source}${sql.raw(" where ").if(filters)}${filters}`
|
|
}
|
|
|
|
export interface SQLiteEffectCountBuilder<TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase>
|
|
extends SQL<number>,
|
|
SQLWrapper<number>,
|
|
Effect.Effect<number, TEffectHKT["error"], TEffectHKT["context"]> {}
|
|
|
|
export class SQLiteEffectCountBuilder<TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends SQL<number> {
|
|
static override readonly [entityKind]: string = "SQLiteEffectCountBuilder"
|
|
|
|
private sql: SQL<number>
|
|
private session: SQLiteEffectSession<TEffectHKT, any, any>
|
|
|
|
constructor(params: {
|
|
source: SQLiteTable | SQLiteView | SQL | SQLWrapper
|
|
filters?: SQL<unknown>
|
|
session: SQLiteEffectSession<TEffectHKT, any, any>
|
|
}) {
|
|
super(buildSQLiteEmbeddedCount(params.source, params.filters).queryChunks)
|
|
|
|
this.session = params.session
|
|
this.sql = buildSQLiteCount(params.source, params.filters)
|
|
}
|
|
|
|
execute(placeholderValues?: Record<string, unknown>) {
|
|
return this.session
|
|
.prepareQuery<{
|
|
type: "async"
|
|
execute: number
|
|
run: unknown
|
|
all: unknown
|
|
get: unknown
|
|
values: unknown
|
|
}>(this.session.dialect.sqlToQuery(this.sql), undefined, "all", (rows) => {
|
|
const v = rows[0]?.[0]
|
|
if (typeof v === "number") return v
|
|
return v ? Number(v) : 0
|
|
})
|
|
.execute(placeholderValues)
|
|
}
|
|
}
|
|
|
|
applyEffectWrapper(SQLiteEffectCountBuilder)
|