{"version":3,"file":"db.cjs","names":["entityKind","RelationalQueryBuilder","PgEffectRelationalQuery","Effect","QueryBuilder","WithSubquery","SelectionProxyHandler","PgEffectCountBuilder","PgSelectBuilder","PgEffectSelectBase","PgUpdateBuilder","PgEffectUpdateBase","PgInsertBuilder","PgEffectInsertBase","PgEffectDeleteBase","PgEffectRefreshMaterializedView","sql","PgEffectRaw"],"sources":["../../../src/pg-core/effect/db.ts"],"sourcesContent":["import { Effect } from 'effect';\nimport type { SqlError } from 'effect/unstable/sql/SqlError';\nimport type { EffectCacheShape } from '~/cache/core/cache-effect.ts';\nimport type { MutationOption } from '~/cache/core/cache.ts';\nimport type { QueryEffectHKTBase } from '~/effect-core/query-effect.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { PgDialect } from '~/pg-core/dialect.ts';\nimport { PgEffectCountBuilder } from '~/pg-core/effect/count.ts';\nimport { PgEffectInsertBase, type PgEffectInsertHKT } from '~/pg-core/effect/insert.ts';\nimport { PgEffectSelectBase, type PgEffectSelectBuilder } from '~/pg-core/effect/select.ts';\nimport { type NoDuplicateColumns, PgInsertBuilder } from '~/pg-core/query-builders/insert.ts';\nimport { RelationalQueryBuilder } from '~/pg-core/query-builders/query.ts';\nimport { PgSelectBuilder } from '~/pg-core/query-builders/select.ts';\nimport type { PgTable } from '~/pg-core/table.ts';\nimport type { PgViewBase } from '~/pg-core/view-base.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { InferInsertModel, RequiredInsertKeys } from '~/table.ts';\nimport type { DrizzleTypeError, IsNever, JoinUnion } from '~/utils.ts';\nimport type { PgColumn } from '../columns/common.ts';\nimport { QueryBuilder } from '../query-builders/query-builder.ts';\nimport type { SelectedFields } from '../query-builders/select.types.ts';\nimport { PgUpdateBuilder } from '../query-builders/update.ts';\nimport type { PgQueryResultHKT, PgQueryResultKind, PgTransactionConfig, PreparedQueryConfig } from '../session.ts';\nimport type { WithBuilder } from '../subquery.ts';\nimport type { PgMaterializedView } from '../view.ts';\nimport { PgEffectDeleteBase } from './delete.ts';\nimport { PgEffectRelationalQuery, type PgEffectRelationalQueryHKT } from './query.ts';\nimport { PgEffectRaw } from './raw.ts';\nimport { PgEffectRefreshMaterializedView } from './refresh-materialized-view.ts';\nimport type { PgEffectSession, PgEffectTransaction } from './session.ts';\nimport { PgEffectUpdateBase, type PgEffectUpdateHKT } from './update.ts';\n\nexport class PgEffectDatabase<\n\tTEffectHKT extends QueryEffectHKTBase,\n\tTQueryResult extends PgQueryResultHKT,\n\tTRelations extends AnyRelations = EmptyRelations,\n> {\n\tstatic readonly [entityKind]: string = 'EffectPgDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly relations: TRelations;\n\t\treadonly session: PgEffectSession<TEffectHKT, TQueryResult, TRelations>;\n\t};\n\n\t// TO-DO: Figure out how to pass DrizzleTypeError without breaking withReplicas\n\tquery: {\n\t\t[K in keyof TRelations]: RelationalQueryBuilder<\n\t\t\tTRelations,\n\t\t\tTRelations[K],\n\t\t\tPgEffectRelationalQueryHKT<TEffectHKT>\n\t\t>;\n\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: PgDialect,\n\t\t/** @internal */\n\t\treadonly session: PgEffectSession<TEffectHKT, any, any>,\n\t\trelations: TRelations,\n\t\tparseRqbJson: boolean = false,\n\t) {\n\t\tthis._ = {\n\t\t\trelations: relations,\n\t\t\tsession,\n\t\t};\n\n\t\tthis.query = {} as typeof this['query'];\n\t\tfor (const [tableName, relation] of Object.entries(relations)) {\n\t\t\t(this.query as PgEffectDatabase<\n\t\t\t\tTEffectHKT,\n\t\t\t\tTQueryResult,\n\t\t\t\tAnyRelations\n\t\t\t>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\trelations,\n\t\t\t\trelations[relation.name]!.table as PgTable,\n\t\t\t\trelation,\n\t\t\t\tdialect,\n\t\t\t\tsession,\n\t\t\t\tparseRqbJson,\n\t\t\t\tPgEffectRelationalQuery,\n\t\t\t);\n\t\t}\n\n\t\tthis.$cache = {\n\t\t\tinvalidate: (_params: MutationOption) => Effect.void,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = yield* db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t *   name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = yield* db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(this.dialect));\n\t\t\t}\n\n\t\t\tconst sql = ('withoutSelectionCastCodecs' in qb ? qb.withoutSelectionCastCodecs() : qb).getSQL();\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tsql,\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t\tsql.usedTables ?? [],\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$cache: { invalidate: EffectCacheShape['onMutate'] };\n\n\t$count(\n\t\tsource: PgTable | PgViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new PgEffectCountBuilder({ source, filters, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = yield* db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = yield* db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = yield* db.select({\n\t\t *   id: cars.id,\n\t\t *   brand: cars.brand\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = yield* db.select({\n\t\t *   id: cars.id,\n\t\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t *   .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection | undefined, TEffectHKT> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t}, PgEffectSelectBase);\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * yield* db.selectDistinct()\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * yield* db.selectDistinct({ brand: cars.brand })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection | undefined, TEffectHKT> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t}, PgEffectSelectBase);\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct on` expression to the select query.\n\t\t *\n\t\t * Calling this method will specify how the unique rows are determined.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param on The expression defining uniqueness.\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t * ```ts\n\t\t * // Select the first row for each unique brand from the 'cars' table\n\t\t * yield* db.selectDistinctOn([cars.brand])\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand);\n\t\t *\n\t\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t\t * yield* db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t\t *   .from(cars)\n\t\t *   .orderBy(cars.brand, cars.color);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\t\tfunction selectDistinctOn<TSelection extends SelectedFields>(\n\t\t\ton: (PgColumn | SQLWrapper)[],\n\t\t\tfields?: TSelection,\n\t\t): PgEffectSelectBuilder<TSelection | undefined, TEffectHKT> {\n\t\t\treturn new PgSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: { on },\n\t\t\t}, PgEffectSelectBase);\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * yield* db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * yield* db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = yield* db.update(cars)\n\t\t *   .set({ color: 'red' })\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends PgTable>(\n\t\t\ttable: TTable,\n\t\t): PgUpdateBuilder<TTable, TQueryResult, PgEffectUpdateHKT<TEffectHKT>> {\n\t\t\treturn new PgUpdateBuilder(table, self.session, self.dialect, queries, PgEffectUpdateBase);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * yield* db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * yield* db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert only selected columns\n\t\t * yield* db.insert(cars, 'brand', 'productionYear').values([{ brand: 'BMW', productionYear: 1995 }, { brand: 'Porsche', productionYear: 1989 }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = yield* db.insert(cars)\n\t\t *   .values({ brand: 'BMW' })\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<\n\t\t\tTTable extends PgTable,\n\t\t\tTColumnList extends (keyof InferInsertModel<TTable, { override: true }>)[] = [],\n\t\t\tTRequiredKeys extends string = RequiredInsertKeys<TTable>,\n\t\t>(\n\t\t\ttable: TTable,\n\t\t\t...columns: TColumnList extends [] ? []\n\t\t\t\t: IsNever<TRequiredKeys> extends true ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t\t: [TRequiredKeys] extends [TColumnList[number]] ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t\t: DrizzleTypeError<\n\t\t\t\t\t`Column selection is missing following required columns: ${JoinUnion<\n\t\t\t\t\t\t`\"${Exclude<TRequiredKeys, TColumnList[number]>}\"`,\n\t\t\t\t\t\t', '\n\t\t\t\t\t>}`\n\t\t\t\t>[]\n\t\t): PgInsertBuilder<\n\t\t\tTTable,\n\t\t\tTQueryResult,\n\t\t\tTColumnList extends [] ? 'all' : TColumnList,\n\t\t\tfalse,\n\t\t\tPgEffectInsertHKT<TEffectHKT>\n\t\t>;\n\t\tfunction insert<TTable extends PgTable>(\n\t\t\ttable: TTable,\n\t\t\t...columns: string[]\n\t\t): PgInsertBuilder<TTable, TQueryResult, 'all', false, PgEffectInsertHKT<TEffectHKT>> {\n\t\t\treturn new PgInsertBuilder(\n\t\t\t\ttable,\n\t\t\t\tself.session,\n\t\t\t\tself.dialect,\n\t\t\t\tqueries,\n\t\t\t\tundefined,\n\t\t\t\tcolumns.length ? columns : undefined,\n\t\t\t\tPgEffectInsertBase,\n\t\t\t);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * yield* db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * yield* db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = yield* db.delete(cars)\n\t\t *   .where(eq(cars.id, 1))\n\t\t *   .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends PgTable>(\n\t\t\ttable: TTable,\n\t\t): PgEffectDeleteBase<TTable, TQueryResult, undefined, undefined, false, never, TEffectHKT> {\n\t\t\treturn new PgEffectDeleteBase(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, selectDistinctOn, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = yield* db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = yield* db.select({\n\t *   id: cars.id,\n\t *   brand: cars.brand\n\t * })\n\t *   .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = yield* db.select({\n\t *   id: cars.id,\n\t *   lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t *   .from(cars);\n\t * ```\n\t */\n\tselect(): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\tselect<TSelection extends SelectedFields>(fields: TSelection): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\tselect<TSelection extends SelectedFields | undefined>(\n\t\tfields?: TSelection,\n\t): PgEffectSelectBuilder<TSelection, TEffectHKT> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t}, PgEffectSelectBase) as PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * yield* db.selectDistinct()\n\t *   .from(cars)\n\t *   .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * yield* db.selectDistinct({ brand: cars.brand })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\tselectDistinct<TSelection extends SelectedFields>(fields: TSelection): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\tselectDistinct<TSelection extends SelectedFields | undefined>(\n\t\tfields?: TSelection,\n\t): PgEffectSelectBuilder<TSelection | undefined, TEffectHKT> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t}, PgEffectSelectBase);\n\t}\n\n\t/**\n\t * Adds `distinct on` expression to the select query.\n\t *\n\t * Calling this method will specify how the unique rows are determined.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param on The expression defining uniqueness.\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t * ```ts\n\t * // Select the first row for each unique brand from the 'cars' table\n\t * yield* db.selectDistinctOn([cars.brand])\n\t *   .from(cars)\n\t *   .orderBy(cars.brand);\n\t *\n\t * // Selects the first occurrence of each unique car brand along with its color from the 'cars' table\n\t * yield* db.selectDistinctOn([cars.brand], { brand: cars.brand, color: cars.color })\n\t *   .from(cars)\n\t *   .orderBy(cars.brand, cars.color);\n\t * ```\n\t */\n\tselectDistinctOn(on: (PgColumn | SQLWrapper)[]): PgEffectSelectBuilder<undefined, TEffectHKT>;\n\tselectDistinctOn<TSelection extends SelectedFields>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields: TSelection,\n\t): PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\tselectDistinctOn<TSelection extends SelectedFields | undefined>(\n\t\ton: (PgColumn | SQLWrapper)[],\n\t\tfields?: TSelection,\n\t): PgEffectSelectBuilder<TSelection, TEffectHKT> {\n\t\treturn new PgSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: { on },\n\t\t}, PgEffectSelectBase) as PgEffectSelectBuilder<TSelection, TEffectHKT>;\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * yield* db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * yield* db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = yield* db.update(cars)\n\t *   .set({ color: 'red' })\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tupdate<TTable extends PgTable>(table: TTable): PgUpdateBuilder<TTable, TQueryResult, PgEffectUpdateHKT<TEffectHKT>> {\n\t\treturn new PgUpdateBuilder(table, this.session, this.dialect, undefined, PgEffectUpdateBase);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * yield* db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * yield* db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert only selected columns\n\t * yield* db.insert(cars, 'brand', 'productionYear').values([{ brand: 'BMW', productionYear: 1995 }, { brand: 'Porsche', productionYear: 1989 }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = yield* db.insert(cars)\n\t *   .values({ brand: 'BMW' })\n\t *   .returning();\n\t * ```\n\t */\n\tinsert<\n\t\tTTable extends PgTable,\n\t\tTColumnList extends (keyof InferInsertModel<TTable, { override: true }>)[] = [],\n\t\tTRequiredKeys extends string = RequiredInsertKeys<TTable>,\n\t>(\n\t\ttable: TTable,\n\t\t...columns: TColumnList extends [] ? []\n\t\t\t: IsNever<TRequiredKeys> extends true ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t: [TRequiredKeys] extends [TColumnList[number]] ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t: DrizzleTypeError<\n\t\t\t\t`Column selection is missing following required columns: ${JoinUnion<\n\t\t\t\t\t`\"${Exclude<TRequiredKeys, TColumnList[number]>}\"`,\n\t\t\t\t\t', '\n\t\t\t\t>}`\n\t\t\t>[]\n\t): PgInsertBuilder<\n\t\tTTable,\n\t\tTQueryResult,\n\t\tTColumnList extends [] ? 'all' : TColumnList,\n\t\tfalse,\n\t\tPgEffectInsertHKT<TEffectHKT>\n\t>;\n\tinsert<TTable extends PgTable>(\n\t\ttable: TTable,\n\t\t...columns: string[]\n\t): PgInsertBuilder<TTable, TQueryResult, 'all', false, PgEffectInsertHKT<TEffectHKT>> {\n\t\treturn new PgInsertBuilder(\n\t\t\ttable,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tcolumns.length ? columns : undefined,\n\t\t\tPgEffectInsertBase,\n\t\t);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * yield* db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * yield* db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = yield* db.delete(cars)\n\t *   .where(eq(cars.id, 1))\n\t *   .returning();\n\t * ```\n\t */\n\tdelete<TTable extends PgTable>(\n\t\ttable: TTable,\n\t): PgEffectDeleteBase<TTable, TQueryResult, undefined, undefined, false, never, TEffectHKT> {\n\t\treturn new PgEffectDeleteBase(table, this.session, this.dialect);\n\t}\n\n\trefreshMaterializedView<TView extends PgMaterializedView>(\n\t\tview: TView,\n\t): PgEffectRefreshMaterializedView<TQueryResult, TEffectHKT> {\n\t\treturn new PgEffectRefreshMaterializedView(view, this.session, this.dialect);\n\t}\n\n\texecute<TRow extends unknown[] = unknown[]>(\n\t\tquery: SQLWrapper | string,\n\t\tmode: 'arrays',\n\t): PgEffectRaw<TRow[], TEffectHKT>;\n\texecute<TRow extends Record<string, unknown> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t\tmode: 'objects',\n\t): PgEffectRaw<TRow[], TEffectHKT>;\n\texecute<TRow extends Record<string, unknown> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'raw' | undefined,\n\t): PgEffectRaw<PgQueryResultKind<TQueryResult, TRow>, TEffectHKT>;\n\texecute(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'raw' | 'objects' | 'arrays' | undefined,\n\t): unknown {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery<\n\t\t\tPreparedQueryConfig & { execute: unknown }\n\t\t>(\n\t\t\tbuiltQuery,\n\t\t\tmode ?? 'raw',\n\t\t\tfalse,\n\t\t);\n\t\treturn new PgEffectRaw(prepared, sequel, builtQuery);\n\t}\n\n\ttransaction<A, E, R>(\n\t\ttransaction: (\n\t\t\ttx: PgEffectTransaction<TEffectHKT, TQueryResult, TRelations>,\n\t\t) => Effect.Effect<A, E, R>,\n\t\tconfig?: PgTransactionConfig,\n\t): Effect.Effect<A, E | SqlError, R> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type PgEffectWithReplicas<Q> = Q & { $primary: Q; $replicas: Q[] };\n\nexport const withReplicas = <\n\tTEffectHKT extends QueryEffectHKTBase,\n\tHKT extends PgQueryResultHKT,\n\tTRelations extends AnyRelations,\n\tQ extends PgEffectDatabase<TEffectHKT, HKT, TRelations>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): PgEffectWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst selectDistinctOn: Q['selectDistinctOn'] = (...args: [any]) => getReplica(replicas).selectDistinctOn(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst _with: Q['with'] = (...args: any) => getReplica(replicas).with(...args);\n\tconst $with: Q['$with'] = (arg: any) => getReplica(replicas).$with(arg) as any;\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = ((...args: [any]) => primary.insert(...args)) as Q['insert'];\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst execute: Q['execute'] = ((...args: [any]) => primary.execute(...args)) as Q['execute'];\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\tconst refreshMaterializedView: Q['refreshMaterializedView'] = (...args: [any]) =>\n\t\tprimary.refreshMaterializedView(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\texecute,\n\t\ttransaction,\n\t\trefreshMaterializedView,\n\t\t$primary: primary,\n\t\t$replicas: replicas,\n\t\tselect,\n\t\tselectDistinct,\n\t\tselectDistinctOn,\n\t\t$count,\n\t\t$with,\n\t\twith: _with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n"],"mappings":"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"}