@simplysm/orm-common 13.0.0-beta.45 → 13.0.0-beta.47
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db-context.js.map +0 -1
- package/dist/errors/db-transaction-error.js.map +0 -1
- package/dist/exec/executable.js.map +0 -1
- package/dist/exec/queryable.js.map +0 -1
- package/dist/exec/search-parser.js.map +0 -1
- package/dist/expr/expr-unit.js.map +0 -1
- package/dist/expr/expr.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/models/system-migration.js.map +0 -1
- package/dist/query-builder/base/expr-renderer-base.js.map +0 -1
- package/dist/query-builder/base/query-builder-base.js.map +0 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +0 -1
- package/dist/query-builder/mssql/mssql-query-builder.js.map +0 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +0 -1
- package/dist/query-builder/mysql/mysql-query-builder.js.map +0 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +0 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +0 -1
- package/dist/query-builder/query-builder.js.map +0 -1
- package/dist/schema/factory/column-builder.js.map +0 -1
- package/dist/schema/factory/index-builder.js.map +0 -1
- package/dist/schema/factory/relation-builder.js.map +0 -1
- package/dist/schema/procedure-builder.js.map +0 -1
- package/dist/schema/table-builder.js.map +0 -1
- package/dist/schema/view-builder.js.map +0 -1
- package/dist/types/column.js.map +0 -1
- package/dist/types/db.js.map +0 -1
- package/dist/types/expr.js.map +0 -1
- package/dist/types/query-def.js.map +0 -1
- package/dist/utils/result-parser.js.map +0 -1
- package/package.json +3 -2
- package/src/db-context.ts +1293 -0
- package/src/errors/db-transaction-error.ts +54 -0
- package/src/exec/executable.ts +111 -0
- package/src/exec/queryable.ts +1923 -0
- package/src/exec/search-parser.ts +188 -0
- package/src/expr/expr-unit.ts +31 -0
- package/src/expr/expr.ts +2095 -0
- package/src/index.ts +235 -0
- package/src/models/system-migration.ts +8 -0
- package/src/query-builder/base/expr-renderer-base.ts +237 -0
- package/src/query-builder/base/query-builder-base.ts +195 -0
- package/src/query-builder/mssql/mssql-expr-renderer.ts +603 -0
- package/src/query-builder/mssql/mssql-query-builder.ts +637 -0
- package/src/query-builder/mysql/mysql-expr-renderer.ts +609 -0
- package/src/query-builder/mysql/mysql-query-builder.ts +743 -0
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +607 -0
- package/src/query-builder/postgresql/postgresql-query-builder.ts +661 -0
- package/src/query-builder/query-builder.ts +19 -0
- package/src/schema/factory/column-builder.ts +406 -0
- package/src/schema/factory/index-builder.ts +164 -0
- package/src/schema/factory/relation-builder.ts +443 -0
- package/src/schema/procedure-builder.ts +229 -0
- package/src/schema/table-builder.ts +308 -0
- package/src/schema/view-builder.ts +217 -0
- package/src/types/column.ts +188 -0
- package/src/types/db.ts +201 -0
- package/src/types/expr.ts +697 -0
- package/src/types/query-def.ts +513 -0
- package/src/utils/result-parser.ts +443 -0
package/dist/db-context.js.map
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/db-context.ts"],
|
|
4
|
-
"sourcesContent": ["import type { DataRecord, DbContextExecutor, IsolationLevel, Migration, ResultMeta } from \"./types/db\";\nimport { DbErrorCode, DbTransactionError } from \"./errors/db-transaction-error\";\nimport {\n DDL_TYPES,\n type AddColumnQueryDef,\n type AddPkQueryDef,\n type ClearSchemaQueryDef,\n type DropColumnQueryDef,\n type DropFkQueryDef,\n type DropIdxQueryDef,\n type DropPkQueryDef,\n type DropProcQueryDef,\n type DropTableQueryDef,\n type DropViewQueryDef,\n type ModifyColumnQueryDef,\n type QueryDef,\n type QueryDefObjectName,\n type RenameColumnQueryDef,\n type RenameTableQueryDef,\n type SchemaExistsQueryDef,\n type SwitchFkQueryDef,\n type TruncateQueryDef,\n} from \"./types/query-def\";\nimport { TableBuilder } from \"./schema/table-builder\";\nimport { ViewBuilder } from \"./schema/view-builder\";\nimport { ProcedureBuilder } from \"./schema/procedure-builder\";\nimport { getMatchedPrimaryKeys, queryable, Queryable } from \"./exec/queryable\";\nimport { ColumnBuilder, type ColumnBuilderRecord } from \"./schema/factory/column-builder\";\nimport {\n ForeignKeyBuilder,\n ForeignKeyTargetBuilder,\n RelationKeyBuilder,\n RelationKeyTargetBuilder,\n} from \"./schema/factory/relation-builder\";\nimport { objClearUndefined } from \"@simplysm/core-common\";\nimport type { IndexBuilder } from \"./schema/factory/index-builder\";\nimport { SystemMigration } from \"./models/system-migration\";\n\n/**\n * DbContext \uC5F0\uACB0 \uC0C1\uD0DC\n *\n * @property ready - \uC5F0\uACB0 \uB300\uAE30 \uC0C1\uD0DC (\uCD08\uAE30 \uC0C1\uD0DC)\n * @property connect - \uC5F0\uACB0\uB428 (\uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC74C)\n * @property transact - \uD2B8\uB79C\uC7AD\uC158 \uC9C4\uD589 \uC911\n */\nexport type DbContextStatus = \"ready\" | \"connect\" | \"transact\";\n\n/**\n * \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uCEE8\uD14D\uC2A4\uD2B8 \uCD94\uC0C1 \uD074\uB798\uC2A4\n *\n * ORM\uC758 \uD575\uC2EC \uC9C4\uC785\uC810\uC73C\uB85C, \uD14C\uC774\uBE14/\uBDF0/\uD504\uB85C\uC2DC\uC800 \uC815\uC758\uC640 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC5F0\uACB0,\n * \uD2B8\uB79C\uC7AD\uC158 \uAD00\uB9AC, DDL/DML \uC2E4\uD589\uC744 \uB2F4\uB2F9\n *\n * @example\n * ```typescript\n * // 1. DbContext \uC0C1\uC18D\uD558\uC5EC \uD14C\uC774\uBE14 \uC815\uC758\n * class MyDb extends DbContext {\n * readonly user = queryable(this, User);\n * readonly post = queryable(this, Post);\n * }\n *\n * // 2. Executor\uC640 \uD568\uAED8 \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131\n * const db = new MyDb(executor, { database: \"mydb\" });\n *\n * // 3. \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uCFFC\uB9AC \uC2E4\uD589\n * await db.connect(async () => {\n * const users = await db.user().result();\n * await db.user().insert([{ name: \"\uD64D\uAE38\uB3D9\" }]);\n * });\n * ```\n *\n * @see {@link queryable} \uD14C\uC774\uBE14 Queryable \uC0DD\uC131\n * @see {@link DbContextExecutor} \uCFFC\uB9AC \uC2E4\uD589\uAE30 \uC778\uD130\uD398\uC774\uC2A4\n */\nexport abstract class DbContext {\n //#region ========== \uAE30\uBCF8 ==========\n\n /**\n * \uD604\uC7AC \uC5F0\uACB0 \uC0C1\uD0DC\n *\n * - `ready`: \uC5F0\uACB0 \uB300\uAE30 (\uCD08\uAE30 \uC0C1\uD0DC)\n * - `connect`: DB \uC5F0\uACB0\uB428 (\uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC74C)\n * - `transact`: \uD2B8\uB79C\uC7AD\uC158 \uC9C4\uD589 \uC911\n */\n status: DbContextStatus = \"ready\";\n\n /**\n * \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uBAA9\uB85D\n *\n * \uC11C\uBE0C\uD074\uB798\uC2A4\uC5D0\uC11C override\uD558\uC5EC \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC815\uC758\n *\n * @example\n * ```typescript\n * class MyDb extends DbContext {\n * readonly migrations: Migration[] = [\n * {\n * name: \"20240101_add_status\",\n * up: async (db) => {\n * await db.addColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * c.varchar(20).nullable(),\n * );\n * },\n * },\n * ];\n * }\n * ```\n */\n readonly migrations: Migration[] = [];\n\n /** alias \uCE74\uC6B4\uD130 (queryable/executable \uD638\uCD9C \uC2DC \uC99D\uAC00) */\n private _aliasCounter = 0;\n\n /**\n * DbContext \uC0DD\uC131\uC790\n *\n * @param _executor - \uCFFC\uB9AC \uC2E4\uD589\uAE30 (NodeDbContextExecutor, ServiceDbContextExecutor \uB4F1)\n * @param _opt - \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC635\uC158\n * @param _opt.database - \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB984\n * @param _opt.schema - \uC2A4\uD0A4\uB9C8 \uC774\uB984 (MSSQL: dbo, PostgreSQL: public)\n */\n constructor(\n private readonly _executor: DbContextExecutor,\n private readonly _opt: {\n database: string;\n schema?: string;\n },\n ) {}\n\n /** \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB984 */\n get database(): string | undefined {\n return this._opt.database;\n }\n\n /** \uC2A4\uD0A4\uB9C8 \uC774\uB984 (MSSQL: dbo, PostgreSQL: public) */\n get schema(): string | undefined {\n return this._opt.schema;\n }\n\n /**\n * \uB2E4\uC74C \uD14C\uC774\uBE14 alias \uBC18\uD658\n *\n * \uC11C\uBE0C\uCFFC\uB9AC/JOIN/\uC7AC\uADC0 CTE\uC5D0\uC11C alias \uCDA9\uB3CC \uBC29\uC9C0\uB97C \uC704\uD574 T1, T2, T3... \uD615\uC2DD\uC73C\uB85C \uC0DD\uC131\n * queryable() \uD568\uC218 \uD638\uCD9C \uC2DC \uB0B4\uBD80\uC801\uC73C\uB85C \uC0AC\uC6A9\n *\n * @returns \uC21C\uCC28 \uC99D\uAC00\uD558\uB294 alias (T1, T2, T3...)\n */\n getNextAlias(): string {\n return `T${++this._aliasCounter}`;\n }\n\n /**\n * alias \uCE74\uC6B4\uD130 \uCD08\uAE30\uD654\n *\n * connect() \uB610\uB294 connectWithoutTransaction() \uC2DC\uC791 \uC2DC \uC790\uB3D9 \uD638\uCD9C\n */\n resetAliasCounter(): void {\n this._aliasCounter = 0;\n }\n\n //#endregion\n\n //#region ========== \uAE30\uBCF8 \uD14C\uC774\uBE14 (MIGRATION) ==========\n\n /**\n * \uC2DC\uC2A4\uD15C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uD14C\uC774\uBE14 Queryable\n *\n * \uC801\uC6A9\uB41C \uB9C8\uC774\uADF8\uB808\uC774\uC158 \uC774\uB825\uC744 \uAD00\uB9AC\uD558\uB294 \uB0B4\uBD80 \uD14C\uC774\uBE14\n */\n get systemMigration() {\n return queryable(this, SystemMigration);\n }\n\n //#endregion\n\n //#region ========== \uC5F0\uACB0 \uAD00\uB9AC ==========\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC774 \uC5F0\uACB0\uD558\uC5EC \uCF5C\uBC31 \uC2E4\uD589 \uD6C4 \uC790\uB3D9 \uC885\uB8CC\n *\n * DDL \uC791\uC5C5\uC774\uB098 \uD2B8\uB79C\uC7AD\uC158\uC774 \uD544\uC694 \uC5C6\uB294 \uC870\uD68C \uC791\uC5C5\uC5D0 \uC0AC\uC6A9\n *\n * @template R - \uCF5C\uBC31 \uBC18\uD658 \uD0C0\uC785\n * @param callback - \uC5F0\uACB0 \uB0B4\uC5D0\uC11C \uC2E4\uD589\uD560 \uCF5C\uBC31\n * @returns \uCF5C\uBC31 \uBC18\uD658\uAC12\n * @throws \uCF5C\uBC31 \uC2E4\uD589 \uC911 \uBC1C\uC0DD\uD55C \uC5D0\uB7EC (\uC5F0\uACB0\uC740 \uC790\uB3D9 \uC885\uB8CC\uB428)\n *\n * @example\n * ```typescript\n * // DDL \uC791\uC5C5 (\uD2B8\uB79C\uC7AD\uC158 \uB0B4 \uC2E4\uD589 \uBD88\uAC00)\n * await db.connectWithoutTransaction(async () => {\n * await db.createTable(User);\n * await db.addColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * c.varchar(20),\n * );\n * });\n * ```\n */\n async connectWithoutTransaction<R>(callback: () => Promise<R>): Promise<R> {\n this._validateRelations();\n this.resetAliasCounter();\n\n await this._executor.connect();\n this.status = \"connect\";\n\n let result: R;\n try {\n result = await callback();\n } catch (err) {\n await this._executor.close();\n this.status = \"ready\";\n throw err;\n }\n\n await this._executor.close();\n this.status = \"ready\";\n return result;\n }\n\n /**\n * \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uCF5C\uBC31 \uC2E4\uD589 (\uC790\uB3D9 \uCEE4\uBC0B/\uB864\uBC31)\n *\n * \uC5F0\uACB0 \u2192 \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791 \u2192 \uCF5C\uBC31 \uC2E4\uD589 \u2192 \uCEE4\uBC0B \u2192 \uC5F0\uACB0 \uC885\uB8CC\n * \uC5D0\uB7EC \uBC1C\uC0DD \uC2DC \uC790\uB3D9 \uB864\uBC31 \uD6C4 \uC5F0\uACB0 \uC885\uB8CC\n *\n * @template R - \uCF5C\uBC31 \uBC18\uD658 \uD0C0\uC785\n * @param fn - \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC2E4\uD589\uD560 \uCF5C\uBC31\n * @param isolationLevel - \uD2B8\uB79C\uC7AD\uC158 \uACA9\uB9AC \uC218\uC900 (\uC120\uD0DD)\n * @returns \uCF5C\uBC31 \uBC18\uD658\uAC12\n * @throws \uCF5C\uBC31 \uC2E4\uD589 \uC911 \uBC1C\uC0DD\uD55C \uC5D0\uB7EC (\uB864\uBC31 \uBC0F \uC5F0\uACB0 \uC885\uB8CC\uB428)\n *\n * @example\n * ```typescript\n * // \uAE30\uBCF8 \uC0AC\uC6A9\n * const result = await db.connect(async () => {\n * const users = await db.user().result();\n * await db.user().insert([{ name: \"\uD64D\uAE38\uB3D9\" }]);\n * return users;\n * });\n *\n * // \uACA9\uB9AC \uC218\uC900 \uC9C0\uC815\n * await db.connect(async () => {\n * await db.user().update({ name: \"\uAE40\uCCA0\uC218\" }, (u) => [\n * expr.eq(u.id, 1),\n * ]);\n * }, \"SERIALIZABLE\");\n * ```\n *\n * @see {@link trans} \uC774\uBBF8 \uC5F0\uACB0\uB41C \uC0C1\uD0DC\uC5D0\uC11C \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791\n */\n async connect<R>(fn: () => Promise<R>, isolationLevel?: IsolationLevel): Promise<R> {\n this._validateRelations();\n this.resetAliasCounter();\n\n await this._executor.connect();\n this.status = \"connect\";\n\n await this._executor.beginTransaction(isolationLevel);\n this.status = \"transact\";\n\n let result: R;\n try {\n result = await fn();\n\n await this._executor.commitTransaction();\n this.status = \"connect\";\n } catch (err) {\n try {\n await this._executor.rollbackTransaction();\n this.status = \"connect\";\n } catch (err1) {\n // DbTransactionError \uCF54\uB4DC \uAE30\uBC18 \uD310\uB2E8\n if (err1 instanceof DbTransactionError) {\n if (err1.code !== DbErrorCode.NO_ACTIVE_TRANSACTION) {\n await this._executor.close();\n this.status = \"ready\";\n throw err1;\n }\n } else {\n // DbTransactionError\uAC00 \uC544\uB2CC \uC5D0\uB7EC\uB294 \uD56D\uC0C1 re-throw\n await this._executor.close();\n this.status = \"ready\";\n throw err1;\n }\n }\n\n await this._executor.close();\n this.status = \"ready\";\n throw err;\n }\n\n await this._executor.close();\n this.status = \"ready\";\n return result;\n }\n\n /**\n * \uC774\uBBF8 \uC5F0\uACB0\uB41C \uC0C1\uD0DC\uC5D0\uC11C \uD2B8\uB79C\uC7AD\uC158 \uC2DC\uC791 (\uC790\uB3D9 \uCEE4\uBC0B/\uB864\uBC31)\n *\n * connectWithoutTransaction \uB0B4\uC5D0\uC11C \uBD80\uBD84\uC801\uC73C\uB85C \uD2B8\uB79C\uC7AD\uC158\uC774 \uD544\uC694\uD560 \uB54C \uC0AC\uC6A9\n * \uC5F0\uACB0 \uAD00\uB9AC\uB294 \uC678\uBD80\uC5D0\uC11C \uB2F4\uB2F9\uD558\uBBC0\uB85C \uC5F0\uACB0 \uC885\uB8CC\uD558\uC9C0 \uC54A\uC74C\n *\n * @template R - \uCF5C\uBC31 \uBC18\uD658 \uD0C0\uC785\n * @param fn - \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC2E4\uD589\uD560 \uCF5C\uBC31\n * @param isolationLevel - \uD2B8\uB79C\uC7AD\uC158 \uACA9\uB9AC \uC218\uC900 (\uC120\uD0DD)\n * @returns \uCF5C\uBC31 \uBC18\uD658\uAC12\n * @throws {Error} \uC774\uBBF8 \uD2B8\uB79C\uC7AD\uC158 \uC0C1\uD0DC\uC77C \uB54C\n * @throws \uCF5C\uBC31 \uC2E4\uD589 \uC911 \uBC1C\uC0DD\uD55C \uC5D0\uB7EC (\uB864\uBC31\uB428)\n *\n * @example\n * ```typescript\n * await db.connectWithoutTransaction(async () => {\n * // DDL \uC791\uC5C5 (\uD2B8\uB79C\uC7AD\uC158 \uC678\uBD80)\n * await db.createTable(User);\n *\n * // DML \uC791\uC5C5 (\uD2B8\uB79C\uC7AD\uC158 \uB0B4\uBD80)\n * await db.trans(async () => {\n * await db.user().insert([{ name: \"\uD64D\uAE38\uB3D9\" }]);\n * });\n * });\n * ```\n *\n * @see {@link connect} \uC5F0\uACB0\uBD80\uD130 \uD2B8\uB79C\uC7AD\uC158\uAE4C\uC9C0 \uD55C\uBC88\uC5D0 \uCC98\uB9AC\n */\n async trans<R>(fn: () => Promise<R>, isolationLevel?: IsolationLevel): Promise<R> {\n if (this.status === \"transact\") {\n throw new Error(\"\uC774\uBBF8 TRANSACTION \uC0C1\uD0DC\uC785\uB2C8\uB2E4.\");\n }\n\n await this._executor.beginTransaction(isolationLevel);\n this.status = \"transact\";\n\n let result: R;\n try {\n result = await fn();\n\n await this._executor.commitTransaction();\n this.status = \"connect\";\n } catch (err) {\n try {\n await this._executor.rollbackTransaction();\n this.status = \"connect\";\n } catch (err1) {\n // \uB864\uBC31 \uC2E4\uD328 \uC2DC - DbTransactionError \uCF54\uB4DC \uAE30\uBC18 \uD310\uB2E8\n // \uC5F0\uACB0\uC740 \uC678\uBD80\uC5D0\uC11C \uAD00\uB9AC\uD558\uBBC0\uB85C close\uD558\uC9C0 \uC54A\uC74C\n if (err1 instanceof DbTransactionError) {\n if (err1.code !== DbErrorCode.NO_ACTIVE_TRANSACTION) {\n throw err1;\n }\n } else {\n // DbTransactionError\uAC00 \uC544\uB2CC \uC5D0\uB7EC\uB294 \uD56D\uC0C1 re-throw\n throw err1;\n }\n // NO_ACTIVE_TRANSACTION \uC5D0\uB7EC\uBA74 \uBB34\uC2DC\uD558\uACE0 \uC6D0\uB798 \uC5D0\uB7EC throw\n this.status = \"connect\";\n }\n throw err;\n }\n\n return result;\n }\n\n //#endregion\n\n //#region ========== \uCFFC\uB9AC \uC2E4\uD589 ==========\n\n /**\n * QueryDef \uBC30\uC5F4 \uC2E4\uD589\n *\n * Queryable/Executable\uC774 \uC0DD\uC131\uD55C QueryDef\uB97C \uC9C1\uC811 \uC2E4\uD589\n * \uD2B8\uB79C\uC7AD\uC158 \uC0C1\uD0DC\uC5D0\uC11C DDL \uC2E4\uD589 \uC2DC \uC5D0\uB7EC \uBC1C\uC0DD\n *\n * @template T - \uACB0\uACFC \uB808\uCF54\uB4DC \uD0C0\uC785\n * @param defs - \uC2E4\uD589\uD560 QueryDef \uBC30\uC5F4\n * @param resultMetas - \uACB0\uACFC \uBA54\uD0C0\uB370\uC774\uD130 (\uD0C0\uC785 \uBCC0\uD658\uC6A9)\n * @returns \uAC01 QueryDef \uC2E4\uD589 \uACB0\uACFC \uBC30\uC5F4\n * @throws {Error} \uD2B8\uB79C\uC7AD\uC158 \uC0C1\uD0DC\uC5D0\uC11C DDL \uC2E4\uD589 \uC2DC\n *\n * @example\n * ```typescript\n * // \uC77C\uBC18\uC801\uC73C\uB85C\uB294 Queryable \uBA54\uC11C\uB4DC \uC0AC\uC6A9\uC744 \uAD8C\uC7A5\n * // \uC9C1\uC811 \uC2E4\uD589\uC774 \uD544\uC694\uD55C \uACBD\uC6B0\uB9CC \uC0AC\uC6A9\n * const selectDef = db.user().getSelectQueryDef();\n * const results = await db.executeDefs([selectDef]);\n * ```\n */\n executeDefs<T = DataRecord>(defs: QueryDef[], resultMetas?: (ResultMeta | undefined)[]): Promise<T[][]> {\n if (this.status === \"transact\" && defs.some((d) => (DDL_TYPES as readonly string[]).includes(d.type))) {\n throw new Error(\"TRANSACTION \uC0C1\uD0DC\uC5D0\uC11C\uB294 DDL\uC744 \uC2E4\uD589\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n\n return this._executor.executeDefs(defs, resultMetas);\n }\n\n //#endregion\n\n //#region ========== \uCD08\uAE30\uD654 ==========\n\n /**\n * Code First \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uCD08\uAE30\uD654\n *\n * DbContext\uC5D0 \uC815\uC758\uB41C \uD14C\uC774\uBE14/\uBDF0/\uD504\uB85C\uC2DC\uC800\uB97C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0 \uC0DD\uC131\uD558\uACE0,\n * \uB9C8\uC774\uADF8\uB808\uC774\uC158\uC744 \uC801\uC6A9\n *\n * @param options - \uCD08\uAE30\uD654 \uC635\uC158\n * @param options.dbs - \uCD08\uAE30\uD654 \uB300\uC0C1 \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uBAA9\uB85D (\uBBF8\uC9C0\uC815 \uC2DC \uD604\uC7AC database)\n * @param options.force - true \uC2DC \uAE30\uC874 \uC2A4\uD0A4\uB9C8 \uC0AD\uC81C \uD6C4 \uC804\uCCB4 \uC7AC\uC0DD\uC131\n * @throws {Error} \uCD08\uAE30\uD654\uD560 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC5C6\uC744 \uB54C\n * @throws {Error} \uC9C0\uC815\uD55C \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC744 \uB54C\n *\n * \uB3D9\uC791 \uBC29\uC2DD:\n * - **force=true**: clearSchema \u2192 \uC804\uCCB4 \uC0DD\uC131 \u2192 \uBAA8\uB4E0 migration \"\uC801\uC6A9\uB428\" \uB4F1\uB85D\n * - **force=false** (\uAE30\uBCF8):\n * - SystemMigration \uD14C\uC774\uBE14 \uC5C6\uC74C: \uC804\uCCB4 \uC0DD\uC131 + \uBAA8\uB4E0 migration \uB4F1\uB85D\n * - SystemMigration \uD14C\uC774\uBE14 \uC788\uC74C: \uBBF8\uC801\uC6A9 migration\uB9CC \uC2E4\uD589\n *\n * @example\n * ```typescript\n * // \uAE30\uBCF8 \uCD08\uAE30\uD654 (\uB9C8\uC774\uADF8\uB808\uC774\uC158 \uAE30\uBC18)\n * await db.connectWithoutTransaction(async () => {\n * await db.initialize();\n * });\n *\n * // \uAC15\uC81C \uCD08\uAE30\uD654 (\uAE30\uC874 \uB370\uC774\uD130 \uC0AD\uC81C)\n * await db.connectWithoutTransaction(async () => {\n * await db.initialize({ force: true });\n * });\n * ```\n */\n async initialize(options?: { dbs?: string[]; force?: boolean }): Promise<void> {\n const dbNames = options?.dbs ?? (this.database !== undefined ? [this.database] : []);\n if (dbNames.length < 1) {\n throw new Error(\"\uCD08\uAE30\uD654\uD560 \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.\");\n }\n\n const force = options?.force ?? false;\n\n // 1. DB \uC874\uC7AC \uD655\uC778\n for (const dbName of dbNames) {\n const schemaExists = await this.schemaExists(dbName);\n if (!schemaExists) {\n throw new Error(`\uB370\uC774\uD130\uBCA0\uC774\uC2A4 '${dbName}'\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.`);\n }\n }\n\n if (force) {\n // 2. force: dbs \uC804\uCCB4 \uCD08\uAE30\uD654\n for (const dbName of dbNames) {\n await this.clearSchema({ database: dbName, schema: this.schema });\n }\n await this._createAllObjects();\n\n // \uBAA8\uB4E0 migration\uC744 \"\uC801\uC6A9\uB428\"\uC73C\uB85C \uB4F1\uB85D\n if (this.migrations.length > 0) {\n await this.systemMigration().insert(this.migrations.map((m) => ({ code: m.name })));\n }\n } else {\n // 3. Migration \uAE30\uBC18 \uCD08\uAE30\uD654\n let appliedMigrations: { code: string }[] | undefined;\n try {\n appliedMigrations = await this.systemMigration().result();\n } catch (err) {\n // \uD14C\uC774\uBE14 \uC5C6\uC74C = \uC2E0\uADDC \uD658\uACBD\n if (!this._isTableNotExistsError(err)) {\n throw err;\n }\n }\n\n if (appliedMigrations == null) {\n // \uC2E0\uADDC \uD658\uACBD: \uC804\uCCB4 \uC0DD\uC131\n await this._createAllObjects();\n\n // \uBAA8\uB4E0 migration\uC744 \"\uC801\uC6A9\uB428\"\uC73C\uB85C \uB4F1\uB85D\n if (this.migrations.length > 0) {\n await this.systemMigration().insert(this.migrations.map((m) => ({ code: m.name })));\n }\n } else {\n // \uAE30\uC874 \uD658\uACBD: \uBBF8\uC801\uC6A9 migration\uB9CC \uC2E4\uD589\n const appliedCodes = new Set(appliedMigrations.map((m) => m.code));\n const pendingMigrations = this.migrations.filter((m) => !appliedCodes.has(m.name));\n\n for (const migration of pendingMigrations) {\n await migration.up(this);\n await this.systemMigration().insert([{ code: migration.name }]);\n }\n }\n }\n }\n\n /**\n * \uC804\uCCB4 \uAC1D\uCCB4 \uC0DD\uC131 (\uD14C\uC774\uBE14/\uBDF0/\uD504\uB85C\uC2DC\uC800/FK/Index)\n */\n private async _createAllObjects(): Promise<void> {\n // 1. \uD14C\uC774\uBE14/\uBDF0/\uD504\uB85C\uC2DC\uC800 \uC0DD\uC131\n const builders = this._getBuilders();\n const createDefs: QueryDef[] = [];\n for (const builder of builders) {\n createDefs.push(this.getCreateObjectQueryDef(builder));\n }\n if (createDefs.length > 0) {\n await this.executeDefs(createDefs);\n }\n\n // 2. FK \uC0DD\uC131 (TableBuilder\uB9CC)\n const tables = builders.filter((b) => b instanceof TableBuilder);\n const addFkDefs: QueryDef[] = [];\n for (const table of tables) {\n const relations = table.meta.relations;\n if (relations == null) continue;\n\n const tableDef = this.getQueryDefObjectName(table);\n for (const [relationName, relationDef] of Object.entries(relations)) {\n if (!(relationDef instanceof ForeignKeyBuilder)) continue;\n\n addFkDefs.push(this.getAddFkQueryDef(tableDef, relationName, relationDef));\n }\n }\n if (addFkDefs.length > 0) {\n await this.executeDefs(addFkDefs);\n }\n\n // 3. Index \uC0DD\uC131 (TableBuilder\uB9CC)\n const createIndexDefs: QueryDef[] = [];\n for (const table of tables) {\n const indexes = table.meta.indexes;\n if (indexes == null || indexes.length === 0) continue;\n\n const indexTableDef = this.getQueryDefObjectName(table);\n for (const indexBuilder of indexes) {\n createIndexDefs.push(this.getAddIdxQueryDef(indexTableDef, indexBuilder));\n }\n }\n if (createIndexDefs.length > 0) {\n await this.executeDefs(createIndexDefs);\n }\n }\n\n /**\n * ForeignKeyTarget/RelationKeyTarget \uAD00\uACC4\uC758 \uC720\uD6A8\uC131 \uAC80\uC99D\n * - targetTableFn()\uC774 \uBC18\uD658\uD558\uB294 \uD14C\uC774\uBE14\uC5D0 relationName\uC5D0 \uD574\uB2F9\uD558\uB294 FK/RelationKey\uAC00 \uC788\uB294\uC9C0 \uD655\uC778\n */\n private _validateRelations(): void {\n const builders = this._getBuilders();\n const tables = builders.filter((b) => b instanceof TableBuilder);\n\n for (const table of tables) {\n const relations = table.meta.relations;\n if (relations == null) continue;\n\n for (const [relName, relDef] of Object.entries(relations)) {\n if (!(relDef instanceof ForeignKeyTargetBuilder) && !(relDef instanceof RelationKeyTargetBuilder)) {\n continue;\n }\n\n const targetTable = relDef.meta.targetTableFn();\n const fkRelName = relDef.meta.relationName;\n const fkRel = targetTable.meta.relations?.[fkRelName];\n\n if (!(fkRel instanceof ForeignKeyBuilder) && !(fkRel instanceof RelationKeyBuilder)) {\n throw new Error(\n `Invalid relation target: ${table.meta.name}.${relName}\uC774 \uCC38\uC870\uD558\uB294 ` +\n `'${fkRelName}'\uC774(\uAC00) ${targetTable.meta.name}\uC758 \uC720\uD6A8\uD55C ForeignKey/RelationKey\uAC00 \uC544\uB2D9\uB2C8\uB2E4.`,\n );\n }\n }\n }\n }\n\n /**\n * DbContext\uC758 \uBAA8\uB4E0 Builder \uC218\uC9D1 (Table/View/Procedure)\n */\n private _getBuilders(): (TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>)[] {\n const builders: (TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>)[] = [];\n\n for (const key of Object.keys(this)) {\n const value = this[key as keyof this];\n\n // Queryable \u2192 Builder \uCD94\uCD9C\n if (value instanceof Queryable) {\n const from = value.meta.from;\n if (from instanceof TableBuilder || from instanceof ViewBuilder || from instanceof ProcedureBuilder) {\n builders.push(from);\n }\n }\n }\n\n return builders;\n }\n\n //#endregion\n\n //#region ========== DDL - Table/View/Procedure \uC0DD\uC131 ==========\n\n /**\n * \uD14C\uC774\uBE14 \uC0DD\uC131\n *\n * @param table - \uC0DD\uC131\uD560 \uD14C\uC774\uBE14 \uBE4C\uB354\n *\n * @example\n * ```typescript\n * await db.createTable(User);\n * ```\n */\n async createTable(table: TableBuilder<any, any>): Promise<void> {\n await this.executeDefs([this.getCreateTableQueryDef(table)]);\n }\n\n /**\n * \uD14C\uC774\uBE14 \uC0AD\uC81C\n *\n * @param table - \uC0AD\uC81C\uD560 \uD14C\uC774\uBE14 \uC815\uBCF4 (database, schema, name)\n *\n * @example\n * ```typescript\n * await db.dropTable({ database: \"mydb\", name: \"User\" });\n * ```\n */\n async dropTable(table: QueryDefObjectName): Promise<void> {\n await this.executeDefs([this.getDropTableQueryDef(table)]);\n }\n\n /**\n * \uD14C\uC774\uBE14 \uC774\uB984 \uBCC0\uACBD\n *\n * @param table - \uBCC0\uACBD\uD560 \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param newName - \uC0C8 \uD14C\uC774\uBE14 \uC774\uB984\n *\n * @example\n * ```typescript\n * await db.renameTable({ database: \"mydb\", name: \"User\" }, \"Member\");\n * ```\n */\n async renameTable(table: QueryDefObjectName, newName: string): Promise<void> {\n await this.executeDefs([this.getRenameTableQueryDef(table, newName)]);\n }\n\n /**\n * \uBDF0 \uC0DD\uC131\n *\n * @param view - \uC0DD\uC131\uD560 \uBDF0 \uBE4C\uB354\n *\n * @example\n * ```typescript\n * await db.createView(UserSummary);\n * ```\n */\n async createView(view: ViewBuilder<any, any, any>): Promise<void> {\n await this.executeDefs([this.getCreateViewQueryDef(view)]);\n }\n\n /**\n * \uBDF0 \uC0AD\uC81C\n *\n * @param view - \uC0AD\uC81C\uD560 \uBDF0 \uC815\uBCF4\n *\n * @example\n * ```typescript\n * await db.dropView({ database: \"mydb\", name: \"UserSummary\" });\n * ```\n */\n async dropView(view: QueryDefObjectName): Promise<void> {\n await this.executeDefs([this.getDropViewQueryDef(view)]);\n }\n\n /**\n * \uC800\uC7A5 \uD504\uB85C\uC2DC\uC800 \uC0DD\uC131\n *\n * @param procedure - \uC0DD\uC131\uD560 \uD504\uB85C\uC2DC\uC800 \uBE4C\uB354\n *\n * @example\n * ```typescript\n * await db.createProc(GetUserById);\n * ```\n */\n async createProc(procedure: ProcedureBuilder<any, any>): Promise<void> {\n await this.executeDefs([this.getCreateProcQueryDef(procedure)]);\n }\n\n /**\n * \uC800\uC7A5 \uD504\uB85C\uC2DC\uC800 \uC0AD\uC81C\n *\n * @param procedure - \uC0AD\uC81C\uD560 \uD504\uB85C\uC2DC\uC800 \uC815\uBCF4\n *\n * @example\n * ```typescript\n * await db.dropProc({ database: \"mydb\", name: \"GetUserById\" });\n * ```\n */\n async dropProc(procedure: QueryDefObjectName): Promise<void> {\n await this.executeDefs([this.getDropProcQueryDef(procedure)]);\n }\n\n /**\n * Builder\uB97C CREATE QueryDef\uB85C \uBCC0\uD658\n *\n * @param builder - Table/View/Procedure \uBE4C\uB354\n * @returns CREATE TABLE/VIEW/PROCEDURE QueryDef\n * @throws {Error} \uC54C \uC218 \uC5C6\uB294 \uBE4C\uB354 \uD0C0\uC785\uC77C \uB54C\n */\n getCreateObjectQueryDef(\n builder: TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>,\n ): QueryDef {\n if (builder instanceof TableBuilder) {\n return this.getCreateTableQueryDef(builder);\n } else if (builder instanceof ViewBuilder) {\n return this.getCreateViewQueryDef(builder);\n } else if (builder instanceof ProcedureBuilder) {\n return this.getCreateProcQueryDef(builder);\n }\n\n throw new Error(`\uC54C \uC218 \uC5C6\uB294 \uBE4C\uB354 \uD0C0\uC785: ${typeof builder}`);\n }\n\n /**\n * CREATE TABLE QueryDef \uC0DD\uC131\n *\n * @param table - \uD14C\uC774\uBE14 \uBE4C\uB354\n * @returns CREATE TABLE QueryDef\n * @throws {Error} \uD14C\uC774\uBE14\uC5D0 \uCEEC\uB7FC\uC774 \uC5C6\uC744 \uB54C\n */\n getCreateTableQueryDef(table: TableBuilder<any, any>): QueryDef {\n const columns = table.meta.columns as ColumnBuilderRecord | undefined;\n if (columns == null) {\n throw new Error(`\uD14C\uC774\uBE14 '${table.meta.name}'\uC5D0 \uCEEC\uB7FC\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n return {\n type: \"createTable\",\n table: this.getQueryDefObjectName(table),\n columns: Object.entries(columns).map(([key, col]) => ({\n name: key,\n dataType: col.meta.dataType,\n autoIncrement: col.meta.autoIncrement,\n nullable: col.meta.nullable,\n default: col.meta.default,\n })),\n primaryKey: table.meta.primaryKey,\n };\n }\n\n /**\n * CREATE VIEW QueryDef \uC0DD\uC131\n *\n * @param view - \uBDF0 \uBE4C\uB354\n * @returns CREATE VIEW QueryDef\n * @throws {Error} \uBDF0\uC5D0 viewFn\uC774 \uC5C6\uC744 \uB54C\n */\n getCreateViewQueryDef(view: ViewBuilder<any, any, any>): QueryDef {\n if (view.meta.viewFn == null) {\n throw new Error(`\uBDF0 '${view.meta.name}'\uC5D0 viewFn\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n const qr = view.meta.viewFn(this);\n const selectDef = qr.getSelectQueryDef();\n\n return {\n type: \"createView\",\n view: {\n database: view.meta.database ?? this.database,\n schema: view.meta.schema ?? this.schema,\n name: view.meta.name,\n },\n queryDef: selectDef,\n };\n }\n\n /**\n * CREATE PROCEDURE QueryDef \uC0DD\uC131\n *\n * @param procedure - \uD504\uB85C\uC2DC\uC800 \uBE4C\uB354\n * @returns CREATE PROCEDURE QueryDef\n * @throws {Error} \uD504\uB85C\uC2DC\uC800\uC5D0 \uBCF8\uBB38\uC774 \uC5C6\uC744 \uB54C\n */\n getCreateProcQueryDef(procedure: ProcedureBuilder<any, any>): QueryDef {\n if (procedure.meta.query == null) {\n throw new Error(`\uD504\uB85C\uC2DC\uC800 '${procedure.meta.name}'\uC5D0 \uBCF8\uBB38\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n const params = procedure.meta.params as ColumnBuilderRecord | undefined;\n const returns = procedure.meta.returns as ColumnBuilderRecord | undefined;\n\n return {\n type: \"createProc\",\n procedure: {\n database: procedure.meta.database ?? this.database,\n schema: procedure.meta.schema ?? this.schema,\n name: procedure.meta.name,\n },\n params: params\n ? Object.entries(params).map(([key, col]) => ({\n name: key,\n dataType: col.meta.dataType,\n nullable: col.meta.nullable,\n default: col.meta.default,\n }))\n : undefined,\n returns: returns\n ? Object.entries(returns).map(([key, col]) => ({\n name: key,\n dataType: col.meta.dataType,\n nullable: col.meta.nullable,\n }))\n : undefined,\n query: procedure.meta.query,\n };\n }\n\n /** DROP TABLE QueryDef \uC0DD\uC131 */\n getDropTableQueryDef(table: QueryDefObjectName): DropTableQueryDef {\n return { type: \"dropTable\", table };\n }\n\n /** RENAME TABLE QueryDef \uC0DD\uC131 */\n getRenameTableQueryDef(table: QueryDefObjectName, newName: string): RenameTableQueryDef {\n return { type: \"renameTable\", table, newName };\n }\n\n /** DROP VIEW QueryDef \uC0DD\uC131 */\n getDropViewQueryDef(view: QueryDefObjectName): DropViewQueryDef {\n return { type: \"dropView\", view };\n }\n\n /** DROP PROCEDURE QueryDef \uC0DD\uC131 */\n getDropProcQueryDef(procedure: QueryDefObjectName): DropProcQueryDef {\n return { type: \"dropProc\", procedure };\n }\n\n //#endregion\n\n //#region ========== DDL - Column ==========\n\n /**\n * \uCEEC\uB7FC \uCD94\uAC00\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param columnName - \uCD94\uAC00\uD560 \uCEEC\uB7FC \uC774\uB984\n * @param column - \uCEEC\uB7FC \uBE4C\uB354 (\uD0C0\uC785, nullable, default \uB4F1)\n *\n * @example\n * ```typescript\n * await db.addColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * c.varchar(20).nullable(),\n * );\n * ```\n */\n async addColumn(table: QueryDefObjectName, columnName: string, column: ColumnBuilder<any, any>): Promise<void> {\n await this.executeDefs([this.getAddColumnQueryDef(table, columnName, column)]);\n }\n\n /**\n * \uCEEC\uB7FC \uC0AD\uC81C\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param column - \uC0AD\uC81C\uD560 \uCEEC\uB7FC \uC774\uB984\n *\n * @example\n * ```typescript\n * await db.dropColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * );\n * ```\n */\n async dropColumn(table: QueryDefObjectName, column: string): Promise<void> {\n await this.executeDefs([this.getDropColumnQueryDef(table, column)]);\n }\n\n /**\n * \uCEEC\uB7FC \uC218\uC815\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param columnName - \uC218\uC815\uD560 \uCEEC\uB7FC \uC774\uB984\n * @param column - \uC0C8 \uCEEC\uB7FC \uC815\uC758\n *\n * @example\n * ```typescript\n * await db.modifyColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * c.varchar(50).nullable(), // \uAE38\uC774 \uBCC0\uACBD\n * );\n * ```\n */\n async modifyColumn(table: QueryDefObjectName, columnName: string, column: ColumnBuilder<any, any>): Promise<void> {\n await this.executeDefs([this.getModifyColumnQueryDef(table, columnName, column)]);\n }\n\n /**\n * \uCEEC\uB7FC \uC774\uB984 \uBCC0\uACBD\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param column - \uD604\uC7AC \uCEEC\uB7FC \uC774\uB984\n * @param newName - \uC0C8 \uCEEC\uB7FC \uC774\uB984\n *\n * @example\n * ```typescript\n * await db.renameColumn(\n * { database: \"mydb\", name: \"User\" },\n * \"status\",\n * \"userStatus\",\n * );\n * ```\n */\n async renameColumn(table: QueryDefObjectName, column: string, newName: string): Promise<void> {\n await this.executeDefs([this.getRenameColumnQueryDef(table, column, newName)]);\n }\n\n /** ADD COLUMN QueryDef \uC0DD\uC131 */\n getAddColumnQueryDef(\n table: QueryDefObjectName,\n columnName: string,\n column: ColumnBuilder<any, any>,\n ): AddColumnQueryDef {\n return {\n type: \"addColumn\",\n table,\n column: {\n name: columnName,\n dataType: column.meta.dataType,\n autoIncrement: column.meta.autoIncrement,\n nullable: column.meta.nullable,\n default: column.meta.default,\n },\n };\n }\n\n /** DROP COLUMN QueryDef \uC0DD\uC131 */\n getDropColumnQueryDef(table: QueryDefObjectName, column: string): DropColumnQueryDef {\n return { type: \"dropColumn\", table, column };\n }\n\n /** MODIFY COLUMN QueryDef \uC0DD\uC131 */\n getModifyColumnQueryDef(\n table: QueryDefObjectName,\n columnName: string,\n column: ColumnBuilder<any, any>,\n ): ModifyColumnQueryDef {\n return {\n type: \"modifyColumn\",\n table,\n column: {\n name: columnName,\n dataType: column.meta.dataType,\n autoIncrement: column.meta.autoIncrement,\n nullable: column.meta.nullable,\n default: column.meta.default,\n },\n };\n }\n\n /** RENAME COLUMN QueryDef \uC0DD\uC131 */\n getRenameColumnQueryDef(table: QueryDefObjectName, column: string, newName: string): RenameColumnQueryDef {\n return { type: \"renameColumn\", table, column, newName };\n }\n\n //#endregion\n\n //#region ========== DDL - PK/FK/Index ==========\n\n /**\n * Primary Key \uCD94\uAC00\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param columns - PK \uAD6C\uC131 \uCEEC\uB7FC \uBC30\uC5F4\n *\n * @example\n * ```typescript\n * await db.addPk(\n * { database: \"mydb\", name: \"User\" },\n * [\"id\"],\n * );\n * ```\n */\n async addPk(table: QueryDefObjectName, columns: string[]): Promise<void> {\n await this.executeDefs([this.getAddPkQueryDef(table, columns)]);\n }\n\n /**\n * Primary Key \uC0AD\uC81C\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n *\n * @example\n * ```typescript\n * await db.dropPk({ database: \"mydb\", name: \"User\" });\n * ```\n */\n async dropPk(table: QueryDefObjectName): Promise<void> {\n await this.executeDefs([this.getDropPkQueryDef(table)]);\n }\n\n /**\n * Foreign Key \uCD94\uAC00\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param relationName - \uAD00\uACC4 \uC774\uB984 (FK_\uD14C\uC774\uBE14\uBA85_\uAD00\uACC4\uC774\uB984 \uD615\uC2DD\uC73C\uB85C FK \uC774\uB984 \uC0DD\uC131)\n * @param relationDef - ForeignKey \uBE4C\uB354\n *\n * @example\n * ```typescript\n * await db.addFk(\n * { database: \"mydb\", name: \"Post\" },\n * \"author\",\n * ForeignKey(User, [\"authorId\"]),\n * );\n * ```\n */\n async addFk(\n table: QueryDefObjectName,\n relationName: string,\n relationDef: ForeignKeyBuilder<any, any>,\n ): Promise<void> {\n await this.executeDefs([this.getAddFkQueryDef(table, relationName, relationDef)]);\n }\n\n /**\n * \uC778\uB371\uC2A4 \uCD94\uAC00\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param indexBuilder - \uC778\uB371\uC2A4 \uBE4C\uB354\n *\n * @example\n * ```typescript\n * await db.addIdx(\n * { database: \"mydb\", name: \"User\" },\n * Index([\"email\"]).unique(),\n * );\n * ```\n */\n async addIdx(table: QueryDefObjectName, indexBuilder: IndexBuilder<string[]>): Promise<void> {\n await this.executeDefs([this.getAddIdxQueryDef(table, indexBuilder)]);\n }\n\n /**\n * Foreign Key \uC0AD\uC81C\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param relationName - \uAD00\uACC4 \uC774\uB984\n *\n * @example\n * ```typescript\n * await db.dropFk({ database: \"mydb\", name: \"Post\" }, \"author\");\n * ```\n */\n async dropFk(table: QueryDefObjectName, relationName: string): Promise<void> {\n await this.executeDefs([this.getDropFkQueryDef(table, relationName)]);\n }\n\n /**\n * \uC778\uB371\uC2A4 \uC0AD\uC81C\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param columns - \uC778\uB371\uC2A4 \uAD6C\uC131 \uCEEC\uB7FC \uBC30\uC5F4 (\uC778\uB371\uC2A4 \uC774\uB984 \uCD94\uB860\uC6A9)\n *\n * @example\n * ```typescript\n * await db.dropIdx({ database: \"mydb\", name: \"User\" }, [\"email\"]);\n * ```\n */\n async dropIdx(table: QueryDefObjectName, columns: string[]): Promise<void> {\n await this.executeDefs([this.getDropIdxQueryDef(table, columns)]);\n }\n\n /** DROP PRIMARY KEY QueryDef \uC0DD\uC131 */\n getDropPkQueryDef(table: QueryDefObjectName): DropPkQueryDef {\n return { type: \"dropPk\", table };\n }\n\n /** ADD PRIMARY KEY QueryDef \uC0DD\uC131 */\n getAddPkQueryDef(table: QueryDefObjectName, columns: string[]): AddPkQueryDef {\n return { type: \"addPk\", table, columns };\n }\n\n /** ADD FOREIGN KEY QueryDef \uC0DD\uC131 */\n getAddFkQueryDef(\n table: QueryDefObjectName,\n relationName: string,\n relationDef: ForeignKeyBuilder<any, any>,\n ): QueryDef {\n const targetTable = relationDef.meta.targetFn();\n const fkColumns = relationDef.meta.columns;\n const pk = getMatchedPrimaryKeys(fkColumns, targetTable);\n\n return {\n type: \"addFk\",\n table,\n foreignKey: {\n name: `FK_${table.name}_${relationName}`,\n fkColumns,\n targetTable: this.getQueryDefObjectName(targetTable),\n targetPkColumns: pk,\n },\n };\n }\n\n /** ADD INDEX QueryDef \uC0DD\uC131 */\n getAddIdxQueryDef(table: QueryDefObjectName, indexBuilder: IndexBuilder<string[]>): QueryDef {\n const indexMeta = indexBuilder.meta;\n\n return {\n type: \"addIdx\",\n table,\n index: {\n name: indexBuilder.meta.name ?? `IDX_${table.name}_${indexMeta.columns.join(\"_\")}`,\n columns: indexMeta.columns.map((col, i) => ({\n name: col,\n orderBy: indexMeta.orderBy?.[i] ?? \"ASC\",\n })),\n unique: indexMeta.unique,\n },\n };\n }\n\n /** DROP FOREIGN KEY QueryDef \uC0DD\uC131 */\n getDropFkQueryDef(table: QueryDefObjectName, relationName: string): DropFkQueryDef {\n return { type: \"dropFk\", table, foreignKey: `FK_${table.name}_${relationName}` };\n }\n\n /** DROP INDEX QueryDef \uC0DD\uC131 */\n getDropIdxQueryDef(table: QueryDefObjectName, columns: string[]): DropIdxQueryDef {\n return { type: \"dropIdx\", table, index: `IDX_${table.name}_${columns.join(\"_\")}` };\n }\n\n //#endregion\n\n //#region ========== DDL - Database ==========\n\n /**\n * \uC2A4\uD0A4\uB9C8 \uB0B4 \uBAA8\uB4E0 \uAC1D\uCCB4 \uC0AD\uC81C\n *\n * \uC9C0\uC815\uD55C database/schema \uB0B4\uC758 \uBAA8\uB4E0 \uD14C\uC774\uBE14, \uBDF0, \uD504\uB85C\uC2DC\uC800 \uB4F1\uC744 \uC0AD\uC81C\n *\n * @param params - \uB300\uC0C1 database/schema\n * @param params.database - \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB984\n * @param params.schema - \uC2A4\uD0A4\uB9C8 \uC774\uB984 (MSSQL/PostgreSQL)\n *\n * @example\n * ```typescript\n * await db.clearSchema({ database: \"mydb\", schema: \"public\" });\n * ```\n */\n async clearSchema(params: { database: string; schema?: string }): Promise<void> {\n const queryDef = this.getClearSchemaQueryDef(params);\n await this.executeDefs([queryDef]);\n }\n\n /**\n * \uC2A4\uD0A4\uB9C8 \uC874\uC7AC \uC5EC\uBD80 \uD655\uC778\n *\n * @param database - \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uC774\uB984\n * @param schema - \uC2A4\uD0A4\uB9C8 \uC774\uB984 (MSSQL/PostgreSQL)\n * @returns \uC2A4\uD0A4\uB9C8 \uC874\uC7AC \uC5EC\uBD80\n *\n * @example\n * ```typescript\n * const exists = await db.schemaExists(\"mydb\");\n * if (!exists) {\n * throw new Error(\"Database not found\");\n * }\n * ```\n */\n async schemaExists(database: string, schema?: string): Promise<boolean> {\n const queryDef = this.getSchemaExistsQueryDef(database, schema);\n const result = await this.executeDefs([queryDef]);\n return result[0].length > 0;\n }\n\n /** CLEAR SCHEMA QueryDef \uC0DD\uC131 */\n getClearSchemaQueryDef(params: { database: string; schema?: string }): ClearSchemaQueryDef {\n return { type: \"clearSchema\", database: params.database, schema: params.schema };\n }\n\n /** SCHEMA EXISTS QueryDef \uC0DD\uC131 */\n getSchemaExistsQueryDef(database: string, schema?: string): SchemaExistsQueryDef {\n return { type: \"schemaExists\", database, schema };\n }\n\n //#endregion\n\n //#region ========== DDL - Utils ==========\n\n /**\n * \uD14C\uC774\uBE14 \uB370\uC774\uD130 \uC804\uCCB4 \uC0AD\uC81C (TRUNCATE)\n *\n * DELETE\uC640 \uB2EC\uB9AC \uB85C\uADF8 \uC5C6\uC774 \uBE60\uB974\uAC8C \uC0AD\uC81C\uD558\uBA70, AUTO_INCREMENT \uCD08\uAE30\uD654\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n *\n * @example\n * ```typescript\n * await db.truncate({ database: \"mydb\", name: \"User\" });\n * ```\n */\n async truncate(table: QueryDefObjectName): Promise<void> {\n await this.executeDefs([this.getTruncateQueryDef(table)]);\n }\n\n /**\n * Foreign Key \uC81C\uC57D \uC870\uAC74 ON/OFF\n *\n * \uB300\uB7C9 \uB370\uC774\uD130 \uC791\uC5C5 \uC2DC FK \uC81C\uC57D \uC784\uC2DC \uD574\uC81C\uC5D0 \uC0AC\uC6A9\n * \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC0AC\uC6A9 \uAC00\uB2A5 (DDL\uC774 \uC544\uB2D8)\n *\n * @param table - \uD14C\uC774\uBE14 \uC815\uBCF4\n * @param switch_ - \"on\" \uB610\uB294 \"off\"\n *\n * @example\n * ```typescript\n * await db.connect(async () => {\n * await db.switchFk({ database: \"mydb\", name: \"Post\" }, \"off\");\n * await db.post().deleteAsync(() => []);\n * await db.switchFk({ database: \"mydb\", name: \"Post\" }, \"on\");\n * });\n * ```\n */\n async switchFk(table: QueryDefObjectName, switch_: \"on\" | \"off\"): Promise<void> {\n await this.executeDefs([this.getSwitchFkQueryDef(table, switch_)]);\n }\n\n /** TRUNCATE TABLE QueryDef \uC0DD\uC131 */\n getTruncateQueryDef(table: QueryDefObjectName): TruncateQueryDef {\n return { type: \"truncate\", table };\n }\n\n /** SWITCH FK QueryDef \uC0DD\uC131 */\n getSwitchFkQueryDef(table: QueryDefObjectName, switch_: \"on\" | \"off\"): SwitchFkQueryDef {\n return { type: \"switchFk\", table, switch: switch_ };\n }\n\n //#endregion\n\n //#region ========== Helpers ==========\n\n /**\n * TableBuilder/ViewBuilder\uB97C QueryDefObjectName\uC73C\uB85C \uBCC0\uD658\n *\n * @param tableOrView - \uD14C\uC774\uBE14 \uB610\uB294 \uBDF0 \uBE4C\uB354\n * @returns QueryDef\uC5D0\uC11C \uC0AC\uC6A9\uD560 \uAC1D\uCCB4 \uC774\uB984 \uC815\uBCF4\n */\n getQueryDefObjectName(tableOrView: TableBuilder<any, any> | ViewBuilder<any, any, any>): QueryDefObjectName {\n return objClearUndefined({\n database: tableOrView.meta.database ?? this.database,\n schema: tableOrView.meta.schema ?? this.schema,\n name: tableOrView.meta.name,\n });\n }\n\n /**\n * \uD14C\uC774\uBE14 \uC5C6\uC74C \uC5D0\uB7EC\uC778\uC9C0 \uD655\uC778\n *\n * DBMS\uBCC4 \uC5D0\uB7EC \uCF54\uB4DC/\uBA54\uC2DC\uC9C0 \uD328\uD134:\n * - MySQL: errno 1146 (ER_NO_SUCH_TABLE), \"Table 'xxx' doesn't exist\"\n * - MSSQL: number 208, \"Invalid object name 'xxx'\"\n * - PostgreSQL: code \"42P01\", \"relation \\\"xxx\\\" does not exist\"\n */\n private _isTableNotExistsError(err: unknown): boolean {\n if (err == null) return false;\n\n // \uC5D0\uB7EC \uCF54\uB4DC\uB85C \uC6B0\uC120 \uD655\uC778 (\uB2E4\uAD6D\uC5B4 \uD658\uACBD\uC5D0\uC11C\uB3C4 \uC548\uC815\uC801)\n const errObj = err as Record<string, unknown>;\n if (errObj[\"errno\"] === 1146) return true; // MySQL ER_NO_SUCH_TABLE\n if (errObj[\"number\"] === 208) return true; // MSSQL\n if (errObj[\"code\"] === \"42P01\") return true; // PostgreSQL\n\n // \uD3F4\uBC31: \uBA54\uC2DC\uC9C0 \uB9E4\uCE6D (\uB2E4\uAD6D\uC5B4 \uD658\uACBD\uC5D0\uC11C \uBD88\uC548\uC815\uD560 \uC218 \uC788\uC74C)\n const message = err instanceof Error ? err.message : String(err);\n const lowerMessage = message.toLowerCase();\n\n // MySQL: Table 'xxx' doesn't exist\n if (lowerMessage.includes(\"doesn't exist\") && lowerMessage.includes(\"table\")) {\n return true;\n }\n\n // MSSQL: Invalid object name 'xxx'\n if (lowerMessage.includes(\"invalid object name\")) {\n return true;\n }\n\n // PostgreSQL: relation \"xxx\" does not exist\n if (lowerMessage.includes(\"does not exist\") && lowerMessage.includes(\"relation\")) {\n return true;\n }\n\n return false;\n }\n\n //#endregion\n}\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/errors/db-transaction-error.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * \uD2B8\uB79C\uC7AD\uC158 \uAD00\uB828 \uC5D0\uB7EC \uCF54\uB4DC\n *\n * DBMS\uBCC4 native \uC5D0\uB7EC \uCF54\uB4DC\uB97C \uCD94\uC0C1\uD654\uD558\uC5EC DBMS \uB3C5\uB9BD\uC801\uC778 \uC5D0\uB7EC \uCC98\uB9AC \uAC00\uB2A5\n */\nexport enum DbErrorCode {\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158\uC774 \uC5C6\uC74C (ROLLBACK \uC2DC \uD2B8\uB79C\uC7AD\uC158 \uC5C6\uC74C) */\n NO_ACTIVE_TRANSACTION = \"NO_ACTIVE_TRANSACTION\",\n\n /** \uD2B8\uB79C\uC7AD\uC158\uC774 \uC774\uBBF8 \uC2DC\uC791\uB428 */\n TRANSACTION_ALREADY_STARTED = \"TRANSACTION_ALREADY_STARTED\",\n\n /** \uB370\uB4DC\uB77D \uBC1C\uC0DD */\n DEADLOCK = \"DEADLOCK\",\n\n /** \uB77D \uD0C0\uC784\uC544\uC6C3 */\n LOCK_TIMEOUT = \"LOCK_TIMEOUT\",\n}\n\n/**\n * \uB370\uC774\uD130\uBCA0\uC774\uC2A4 \uD2B8\uB79C\uC7AD\uC158 \uC5D0\uB7EC\n *\n * DBMS\uBCC4 native \uC5D0\uB7EC\uB97C \uD45C\uC900\uD654\uB41C \uC5D0\uB7EC \uCF54\uB4DC\uB85C \uB798\uD551\uD558\uC5EC\n * DBMS \uB3C5\uB9BD\uC801\uC778 \uC5D0\uB7EC \uCC98\uB9AC \uAC00\uB2A5\n *\n * @example\n * ```typescript\n * try {\n * await db.rollbackTransaction();\n * } catch (err) {\n * if (err instanceof DbTransactionError) {\n * if (err.code === DbErrorCode.NO_ACTIVE_TRANSACTION) {\n * // \uC774\uBBF8 \uB864\uBC31\uB41C \uACBD\uC6B0 \uBB34\uC2DC\n * return;\n * }\n * }\n * throw err;\n * }\n * ```\n */\nexport class DbTransactionError extends Error {\n override readonly name = \"DbTransactionError\";\n\n constructor(\n /** \uD45C\uC900\uD654\uB41C \uC5D0\uB7EC \uCF54\uB4DC */\n public readonly code: DbErrorCode,\n /** \uC5D0\uB7EC \uBA54\uC2DC\uC9C0 */\n message: string,\n /** \uC6D0\uBCF8 DBMS \uC5D0\uB7EC (\uB514\uBC84\uAE45\uC6A9) */\n public readonly originalError?: unknown,\n ) {\n super(message);\n }\n}\n"],
|
|
5
4
|
"mappings": "AAKO,IAAK,cAAL,kBAAKA,iBAAL;AAEL,EAAAA,aAAA,2BAAwB;AAGxB,EAAAA,aAAA,iCAA8B;AAG9B,EAAAA,aAAA,cAAW;AAGX,EAAAA,aAAA,kBAAe;AAXL,SAAAA;AAAA,GAAA;AAmCL,MAAM,2BAA2B,MAAM;AAAA,EAG5C,YAEkB,MAEhB,SAEgB,eAChB;AACA,UAAM,OAAO;AANG;AAIA;AAAA,EAGlB;AAAA,EAXkB,OAAO;AAY3B;",
|
|
6
5
|
"names": ["DbErrorCode"]
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/exec/executable.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ColumnBuilderRecord, InferColumnExprs } from \"../schema/factory/column-builder\";\nimport type { ProcedureBuilder } from \"../schema/procedure-builder\";\nimport type { DbContext } from \"../db-context\";\nimport { ExprUnit } from \"../expr/expr-unit\";\nimport { expr } from \"../expr/expr\";\n\n/**\n * \uC800\uC7A5 \uD504\uB85C\uC2DC\uC800 \uC2E4\uD589 \uB798\uD37C \uD074\uB798\uC2A4\n *\n * ProcedureBuilder\uB85C \uC815\uC758\uB41C \uD504\uB85C\uC2DC\uC800\uB97C \uC2E4\uD589\uD558\uAE30 \uC704\uD55C \uD074\uB798\uC2A4.\n * DbContext\uC5D0\uC11C executable() \uD329\uD1A0\uB9AC \uD568\uC218\uB97C \uD1B5\uD574 \uC0DD\uC131\uD558\uC5EC \uC0AC\uC6A9\uD55C\uB2E4.\n *\n * @template TParams - \uD504\uB85C\uC2DC\uC800 \uD30C\uB77C\uBBF8\uD130 \uD0C0\uC785\n * @template TReturns - \uD504\uB85C\uC2DC\uC800 \uBC18\uD658 \uD0C0\uC785\n *\n * @example\n * ```typescript\n * // \uD504\uB85C\uC2DC\uC800 \uC2E4\uD589\n * const result = await db.getUserById().execute({ userId: 1n });\n * ```\n *\n * @see {@link executable} \uD329\uD1A0\uB9AC \uD568\uC218\n * @see {@link ProcedureBuilder} \uD504\uB85C\uC2DC\uC800 \uC815\uC758\n */\nexport class Executable<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {\n constructor(\n private readonly _db: DbContext,\n private readonly _builder: ProcedureBuilder<TParams, TReturns>,\n ) {}\n\n /**\n * \uD504\uB85C\uC2DC\uC800 \uC2E4\uD589 QueryDef \uC0DD\uC131\n */\n getExecProcQueryDef(params?: InferColumnExprs<TParams>) {\n const meta = this._builder.meta;\n if (params && !meta.params) {\n throw new Error(`\uD504\uB85C\uC2DC\uC800 '${meta.name}'\uC5D0 \uD30C\uB77C\uBBF8\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n return {\n type: \"execProc\" as const,\n procedure: {\n database: meta.database ?? this._db.database,\n schema: meta.schema ?? this._db.schema,\n name: meta.name,\n },\n params:\n params && meta.params\n ? Object.fromEntries(\n Object.keys(params).map((key) => [\n key,\n params[key] instanceof ExprUnit\n ? params[key].expr\n : expr.val(meta.params![key].meta.type, params[key]).expr,\n ]),\n )\n : undefined,\n };\n }\n\n /**\n * \uD504\uB85C\uC2DC\uC800 \uC2E4\uD589\n */\n async execute(params: InferColumnExprs<TParams>): Promise<InferColumnExprs<TReturns>[][]> {\n return this._db.executeDefs<InferColumnExprs<TReturns>>([this.getExecProcQueryDef(params)]);\n }\n}\n\n// ============================================\n// executable \uD568\uC218\n// ============================================\n\n/**\n * Executable \uC0DD\uC131 \uD329\uD1A0\uB9AC \uD568\uC218\n *\n * DbContext\uC5D0\uC11C \uD504\uB85C\uC2DC\uC800\uB97C \uB4F1\uB85D\uD560 \uB54C \uC0AC\uC6A9\uD55C\uB2E4.\n * ProcedureBuilder\uB85C \uC815\uC758\uB41C \uD504\uB85C\uC2DC\uC800\uB97C Executable\uB85C \uB798\uD551\uD558\uC5EC \uBC18\uD658\uD55C\uB2E4.\n *\n * @template TParams - \uD504\uB85C\uC2DC\uC800 \uD30C\uB77C\uBBF8\uD130 \uD0C0\uC785\n * @template TReturns - \uD504\uB85C\uC2DC\uC800 \uBC18\uD658 \uD0C0\uC785\n * @param db - DbContext \uC778\uC2A4\uD134\uC2A4\n * @param builder - ProcedureBuilder \uC778\uC2A4\uD134\uC2A4\n * @returns Executable \uC0DD\uC131 \uD568\uC218\n *\n * @example\n * ```typescript\n * // \uD504\uB85C\uC2DC\uC800 \uC815\uC758\n * const GetUserById = Procedure(\"GetUserById\")\n * .database(\"mydb\")\n * .params((c) => ({ userId: c.bigint() }))\n * .returns((c) => ({ id: c.bigint(), name: c.varchar(100) }))\n * .body(\"SELECT id, name FROM User WHERE id = userId\");\n *\n * // DbContext\uC5D0\uC11C \uB4F1\uB85D\n * class MyDb extends DbContext {\n * getUserById = executable(this, GetUserById);\n * }\n *\n * // \uC0AC\uC6A9\n * const result = await db.getUserById().execute({ userId: 1n });\n * ```\n *\n * @see {@link Executable} \uC2E4\uD589 \uD074\uB798\uC2A4\n * @see {@link ProcedureBuilder} \uD504\uB85C\uC2DC\uC800 \uC815\uC758\n */\nexport function executable<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord>(\n db: DbContext,\n builder: ProcedureBuilder<TParams, TReturns>,\n): () => Executable<TParams, TReturns> {\n return () => new Executable(db, builder);\n}\n"],
|
|
5
4
|
"mappings": "AAGA,SAAS,gBAAgB;AACzB,SAAS,YAAY;AAoBd,MAAM,WAAsF;AAAA,EACjG,YACmB,KACA,UACjB;AAFiB;AACA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKH,oBAAoB,QAAoC;AACtD,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,UAAU,CAAC,KAAK,QAAQ;AAC1B,YAAM,IAAI,MAAM,6BAAS,KAAK,IAAI,kEAAgB;AAAA,IACpD;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAW;AAAA,QACT,UAAU,KAAK,YAAY,KAAK,IAAI;AAAA,QACpC,QAAQ,KAAK,UAAU,KAAK,IAAI;AAAA,QAChC,MAAM,KAAK;AAAA,MACb;AAAA,MACA,QACE,UAAU,KAAK,SACX,OAAO;AAAA,QACL,OAAO,KAAK,MAAM,EAAE,IAAI,CAAC,QAAQ;AAAA,UAC/B;AAAA,UACA,OAAO,GAAG,aAAa,WACnB,OAAO,GAAG,EAAE,OACZ,KAAK,IAAI,KAAK,OAAQ,GAAG,EAAE,KAAK,MAAM,OAAO,GAAG,CAAC,EAAE;AAAA,QACzD,CAAC;AAAA,MACH,IACA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,QAA4E;AACxF,WAAO,KAAK,IAAI,YAAwC,CAAC,KAAK,oBAAoB,MAAM,CAAC,CAAC;AAAA,EAC5F;AACF;AAuCO,SAAS,WACd,IACA,SACqC;AACrC,SAAO,MAAM,IAAI,WAAW,IAAI,OAAO;AACzC;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/exec/queryable.ts"],
|
|
4
|
-
"sourcesContent": ["import { TableBuilder } from \"../schema/table-builder\";\nimport { ViewBuilder } from \"../schema/view-builder\";\n\nimport type { DataRecord, ResultMeta } from \"../types/db\";\nimport type {\n DeleteQueryDef,\n InsertIfNotExistsQueryDef,\n InsertIntoQueryDef,\n InsertQueryDef,\n QueryDefObjectName,\n SelectQueryDef,\n SelectQueryDefJoin,\n UpdateQueryDef,\n UpsertQueryDef,\n} from \"../types/query-def\";\nimport type { DbContext } from \"../db-context\";\nimport { type ColumnBuilderRecord, type DataToColumnBuilderRecord } from \"../schema/factory/column-builder\";\nimport type { ColumnPrimitive, ColumnPrimitiveStr } from \"../types/column\";\nimport type { WhereExprUnit } from \"../expr/expr-unit\";\nimport { ExprUnit } from \"../expr/expr-unit\";\nimport type { Expr } from \"../types/expr\";\nimport { ArgumentError, objClearUndefined } from \"@simplysm/core-common\";\nimport {\n ForeignKeyBuilder,\n ForeignKeyTargetBuilder,\n RelationKeyBuilder,\n RelationKeyTargetBuilder,\n} from \"../schema/factory/relation-builder\";\nimport { parseSearchQuery } from \"./search-parser\";\nimport { expr } from \"../expr/expr\";\n\n/**\n * JOIN \uCFFC\uB9AC \uBE4C\uB354\n *\n * join/joinSingle \uBA54\uC11C\uB4DC \uB0B4\uBD80\uC5D0\uC11C \uC0AC\uC6A9\uB418\uBA70, \uC870\uC778 \uB300\uC0C1 \uD14C\uC774\uBE14\uC744 \uC9C0\uC815\uD558\uB294 \uC5ED\uD560\uC744 \uC218\uD589\n */\nclass JoinQueryable {\n constructor(\n private readonly _db: DbContext,\n private readonly _joinAlias: string,\n ) {}\n\n /**\n * \uC870\uC778\uD560 \uD14C\uC774\uBE14\uC744 \uC9C0\uC815\n *\n * @param table - \uC870\uC778 \uB300\uC0C1 \uD14C\uC774\uBE14\n * @returns \uC870\uC778\uB41C Queryable\n */\n from<T extends TableBuilder<any, any>>(table: T): Queryable<T[\"$infer\"], T> {\n return queryable(this._db, table, this._joinAlias)();\n }\n\n /**\n * \uC870\uC778 \uACB0\uACFC\uC758 \uCEEC\uB7FC\uC744 \uC9C1\uC811 \uC9C0\uC815\n *\n * @param columns - \uCEE4\uC2A4\uD140 \uCEEC\uB7FC \uC815\uC758\n * @returns \uCEE4\uC2A4\uD140 \uCEEC\uB7FC\uC774 \uC801\uC6A9\uB41C Queryable\n */\n select<R extends DataRecord>(columns: QueryableRecord<R>): Queryable<R, never> {\n return new Queryable({\n db: this._db,\n as: this._joinAlias,\n columns,\n isCustomColumns: true,\n });\n }\n\n /**\n * \uC5EC\uB7EC Queryable\uC744 UNION\uC73C\uB85C \uACB0\uD569\n *\n * @param queries - UNION\uD560 Queryable \uBC30\uC5F4 (\uCD5C\uC18C 2\uAC1C)\n * @returns UNION\uB41C Queryable\n * @throws 2\uAC1C \uBBF8\uB9CC\uC758 queryable\uC774 \uC804\uB2EC\uB41C \uACBD\uC6B0\n */\n union<TData extends DataRecord>(...queries: Queryable<TData, any>[]): Queryable<TData, never> {\n if (queries.length < 2) {\n throw new ArgumentError(\"union\uC740 \uCD5C\uC18C 2\uAC1C\uC758 queryable\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.\", {\n provided: queries.length,\n minimum: 2,\n });\n }\n\n const first = queries[0];\n\n return new Queryable({\n db: first.meta.db,\n from: queries, // Queryable[] \uBC30\uC5F4\uB85C \uC800\uC7A5\n as: this._joinAlias,\n columns: transformColumnsAlias(first.meta.columns, this._joinAlias, \"\"),\n });\n }\n}\n\n/**\n * \uC7AC\uADC0 CTE(Common Table Expression) \uBE4C\uB354\n *\n * recursive() \uBA54\uC11C\uB4DC \uB0B4\uBD80\uC5D0\uC11C \uC0AC\uC6A9\uB418\uBA70, \uC7AC\uADC0 \uCFFC\uB9AC\uC758 \uBCF8\uBB38\uC744 \uC815\uC758\uD558\uB294 \uC5ED\uD560\uC744 \uC218\uD589\n *\n * @template TBaseData - \uAE30\uBCF8 \uCFFC\uB9AC\uC758 \uB370\uC774\uD130 \uD0C0\uC785\n */\nclass RecursiveQueryable<TBaseData extends DataRecord> {\n constructor(\n private readonly _baseQr: Queryable<TBaseData, any>,\n private readonly _cteName: string,\n ) {}\n\n /**\n * \uC7AC\uADC0 \uCFFC\uB9AC\uC758 \uB300\uC0C1 \uD14C\uC774\uBE14\uC744 \uC9C0\uC815\n *\n * @param table - \uC7AC\uADC0\uD560 \uB300\uC0C1 \uD14C\uC774\uBE14\n * @returns self \uC18D\uC131\uC774 \uCD94\uAC00\uB41C Queryable (\uC790\uAE30 \uCC38\uC870\uC6A9)\n */\n from<T extends TableBuilder<any, any>>(table: T): Queryable<T[\"$infer\"] & { self?: TBaseData[] }, T> {\n const selfAlias = `${this._cteName}.self`;\n\n return queryable(this._baseQr.meta.db, table, this._cteName)().join(\n \"self\",\n () =>\n new Queryable<TBaseData, never>({\n db: this._baseQr.meta.db,\n from: this._cteName,\n as: selfAlias,\n columns: transformColumnsAlias(this._baseQr.meta.columns, selfAlias, \"\"),\n isCustomColumns: false,\n }),\n );\n }\n\n /**\n * \uC7AC\uADC0 \uCFFC\uB9AC\uC758 \uCEEC\uB7FC\uC744 \uC9C1\uC811 \uC9C0\uC815\n *\n * @param columns - \uCEE4\uC2A4\uD140 \uCEEC\uB7FC \uC815\uC758\n * @returns self \uC18D\uC131\uC774 \uCD94\uAC00\uB41C Queryable\n */\n select<R extends DataRecord>(columns: QueryableRecord<R>): Queryable<R & { self?: TBaseData[] }, never> {\n const selfAlias = `${this._cteName}.self`;\n\n return new Queryable<R, never>({\n db: this._baseQr.meta.db,\n as: this._cteName,\n columns,\n isCustomColumns: true,\n }).join(\n \"self\",\n () =>\n new Queryable<TBaseData, never>({\n db: this._baseQr.meta.db,\n from: this._cteName,\n as: selfAlias,\n columns: transformColumnsAlias(this._baseQr.meta.columns, selfAlias, \"\"),\n isCustomColumns: false,\n }),\n );\n }\n\n /**\n * \uC5EC\uB7EC Queryable\uC744 UNION\uC73C\uB85C \uACB0\uD569 (\uC7AC\uADC0 \uCFFC\uB9AC\uC6A9)\n *\n * @param queries - UNION\uD560 Queryable \uBC30\uC5F4 (\uCD5C\uC18C 2\uAC1C)\n * @returns self \uC18D\uC131\uC774 \uCD94\uAC00\uB41C UNION Queryable\n * @throws 2\uAC1C \uBBF8\uB9CC\uC758 queryable\uC774 \uC804\uB2EC\uB41C \uACBD\uC6B0\n */\n union<TData extends DataRecord>(\n ...queries: Queryable<TData, any>[]\n ): Queryable<TData & { self?: TBaseData[] }, never> {\n if (queries.length < 2) {\n throw new ArgumentError(\"union\uC740 \uCD5C\uC18C 2\uAC1C\uC758 queryable\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.\", {\n provided: queries.length,\n minimum: 2,\n });\n }\n\n const first = queries[0];\n\n const selfAlias = `${this._cteName}.self`;\n\n return new Queryable<any, never>({\n db: first.meta.db,\n from: queries, // Queryable[] \uBC30\uC5F4\uB85C \uC800\uC7A5\n as: this._cteName,\n columns: transformColumnsAlias(first.meta.columns, this._cteName, \"\"),\n }).join(\n \"self\",\n () =>\n new Queryable({\n db: this._baseQr.meta.db,\n from: this._cteName,\n as: selfAlias,\n columns: transformColumnsAlias(this._baseQr.meta.columns, selfAlias, \"\"),\n isCustomColumns: false,\n }),\n ) as any;\n }\n}\n\n/**\n * \uCFFC\uB9AC \uBE4C\uB354 \uD074\uB798\uC2A4\n *\n * \uD14C\uC774\uBE14/\uBDF0\uC5D0 \uB300\uD55C SELECT, INSERT, UPDATE, DELETE \uB4F1\uC758 \uCFFC\uB9AC\uB97C \uCCB4\uC774\uB2DD \uBC29\uC2DD\uC73C\uB85C \uAD6C\uC131\n *\n * @template TData - \uCFFC\uB9AC \uACB0\uACFC\uC758 \uB370\uC774\uD130 \uD0C0\uC785\n * @template TFrom - \uC6D0\uBCF8 \uD14C\uC774\uBE14 (CUD \uC791\uC5C5\uC5D0 \uD544\uC694)\n *\n * @example\n * ```typescript\n * // \uAE30\uBCF8 \uC870\uD68C\n * const users = await db.user()\n * .where((u) => [expr.eq(u.isActive, true)])\n * .orderBy((u) => u.name)\n * .result();\n *\n * // JOIN \uC870\uD68C\n * const posts = await db.post()\n * .include((p) => p.user)\n * .result();\n *\n * // INSERT\n * await db.user().insert([{ name: \"\uD64D\uAE38\uB3D9\", email: \"test@test.com\" }]);\n * ```\n */\nexport class Queryable<\n TData extends DataRecord,\n TFrom extends TableBuilder<any, any> | never, // CUD\uB294 TableBuilder\uB9CC \uC9C0\uC6D0\uD558\uAE30 \uC704\uD568\n> {\n constructor(readonly meta: QueryableMeta<TData>) {}\n\n //#region ========== \uC635\uC158 - SELECT / DISTINCT / LOCK ==========\n\n /**\n * SELECT\uD560 \uCEEC\uB7FC\uC744 \uC9C0\uC815\uD569\uB2C8\uB2E4.\n *\n * @param fn - \uCEEC\uB7FC \uB9E4\uD551 \uD568\uC218. \uC6D0\uBCF8 \uCEEC\uB7FC\uC744 \uBC1B\uC544 \uC0C8 \uCEEC\uB7FC \uAD6C\uC870\uB97C \uBC18\uD658\n * @returns \uC0C8\uB85C\uC6B4 \uCEEC\uB7FC \uAD6C\uC870\uAC00 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user().select((u) => ({\n * userName: u.name,\n * userEmail: u.email,\n * }))\n * ```\n */\n select<R extends DataRecord>(fn: (columns: QueryableRecord<TData>) => QueryableRecord<R>): Queryable<R, never> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.select(fn));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n columns: transformColumnsAlias<R>(newFroms[0].meta.columns, this.meta.as, \"\"),\n });\n }\n\n const newColumns = fn(this.meta.columns);\n\n return new Queryable<any, never>({\n ...this.meta,\n columns: newColumns,\n isCustomColumns: true,\n }) as any;\n }\n\n /**\n * DISTINCT \uC635\uC158\uC744 \uC801\uC6A9\uD558\uC5EC \uC911\uBCF5 \uD589\uC744 \uC81C\uAC70\n *\n * @returns DISTINCT\uAC00 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user()\n * .select((u) => ({ name: u.name }))\n * .distinct()\n * ```\n */\n distinct(): Queryable<TData, never> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.distinct());\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n return new Queryable({\n ...this.meta,\n distinct: true,\n });\n }\n\n /**\n * \uD589 \uC7A0\uAE08(FOR UPDATE)\uC744 \uC801\uC6A9\n *\n * \uD2B8\uB79C\uC7AD\uC158 \uB0B4\uC5D0\uC11C \uC120\uD0DD\uB41C \uD589\uC5D0 \uB300\uD55C \uBC30\uD0C0\uC801 \uC7A0\uAE08\uC744 \uD68D\uB4DD\n *\n * @returns \uC7A0\uAE08\uC774 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * await db.connect(async () => {\n * const user = await db.user()\n * .where((u) => [expr.eq(u.id, 1)])\n * .lock()\n * .single();\n * });\n * ```\n */\n lock(): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.lock());\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n return new Queryable({\n ...this.meta,\n lock: true,\n });\n }\n\n //#endregion\n\n //#region ========== \uC81C\uD55C - TOP / LIMIT ==========\n\n /**\n * \uC0C1\uC704 N\uAC1C\uC758 \uD589\uB9CC \uC870\uD68C (ORDER BY \uC5C6\uC774 \uC0AC\uC6A9 \uAC00\uB2A5)\n *\n * @param count - \uC870\uD68C\uD560 \uD589 \uC218\n * @returns TOP\uC774 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * // \uCD5C\uC2E0 \uC0AC\uC6A9\uC790 10\uBA85\n * db.user()\n * .orderBy((u) => u.createdAt, \"DESC\")\n * .top(10)\n * ```\n */\n top(count: number): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.top(count));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n return new Queryable({\n ...this.meta,\n top: count,\n });\n }\n\n /**\n * \uD398\uC774\uC9C0\uB124\uC774\uC158\uC744 \uC704\uD55C LIMIT/OFFSET\uC744 \uC124\uC815\uD569\uB2C8\uB2E4.\n * \uBC18\uB4DC\uC2DC orderBy()\uB97C \uBA3C\uC800 \uD638\uCD9C\uD574\uC57C \uD569\uB2C8\uB2E4.\n *\n * @param skip - \uAC74\uB108\uB6F8 \uD589 \uC218 (OFFSET)\n * @param take - \uAC00\uC838\uC62C \uD589 \uC218 (LIMIT)\n * @returns \uD398\uC774\uC9C0\uB124\uC774\uC158\uC774 \uC801\uC6A9\uB41C Queryable\n * @throws ORDER BY \uC808\uC774 \uC5C6\uC73C\uBA74 \uC5D0\uB7EC\n *\n * @example\n * ```typescript\n * db.user\n * .orderBy((u) => u.createdAt)\n * .limit(0, 20) // \uCCAB 20\uAC1C\n * ```\n */\n limit(skip: number, take: number): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.limit(skip, take));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n if (!this.meta.orderBy) {\n throw new ArgumentError(\"limit()\uC740 ORDER BY \uC808\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.\", {\n method: \"limit\",\n required: \"orderBy\",\n });\n }\n\n return new Queryable({\n ...this.meta,\n limit: [skip, take],\n });\n }\n\n //#endregion\n\n //#region ========== \uC815\uB82C - ORDER BY ==========\n\n /**\n * \uC815\uB82C \uC870\uAC74\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4. \uC5EC\uB7EC \uBC88 \uD638\uCD9C\uD558\uBA74 \uC21C\uC11C\uB300\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * @param fn - \uC815\uB82C \uAE30\uC900 \uCEEC\uB7FC\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @param orderBy - \uC815\uB82C \uBC29\uD5A5 (ASC/DESC). \uAE30\uBCF8\uAC12: ASC\n * @returns \uC815\uB82C \uC870\uAC74\uC774 \uCD94\uAC00\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user\n * .orderBy((u) => u.name) // \uC774\uB984 ASC\n * .orderBy((u) => u.age, \"DESC\") // \uB098\uC774 DESC\n * ```\n */\n orderBy(\n fn: (columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>,\n orderBy?: \"ASC\" | \"DESC\",\n ): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.orderBy(fn, orderBy));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n const column = fn(this.meta.columns);\n\n return new Queryable({\n ...this.meta,\n orderBy: [...(this.meta.orderBy ?? []), [column, orderBy]],\n });\n }\n\n //#endregion\n\n //#region ========== \uAC80\uC0C9 - WHERE ==========\n\n /**\n * WHERE \uC870\uAC74\uC744 \uCD94\uAC00\uD569\uB2C8\uB2E4. \uC5EC\uB7EC \uBC88 \uD638\uCD9C\uD558\uBA74 AND\uB85C \uACB0\uD569\uB429\uB2C8\uB2E4.\n *\n * @param predicate - \uC870\uAC74 \uBC30\uC5F4\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @returns \uC870\uAC74\uC774 \uCD94\uAC00\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user\n * .where((u) => [expr.eq(u.isActive, true)])\n * .where((u) => [expr.gte(u.age, 18)])\n * ```\n */\n where(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.where(predicate));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n const conditions = predicate(this.meta.columns);\n\n return new Queryable({\n ...this.meta,\n where: [...(this.meta.where ?? []), ...conditions],\n });\n }\n\n /**\n * \uD14D\uC2A4\uD2B8 \uAC80\uC0C9\uC744 \uC218\uD589\n *\n * \uAC80\uC0C9 \uBB38\uBC95\uC740 {@link parseSearchQuery}\uB97C \uCC38\uC870\n * - \uACF5\uBC31\uC73C\uB85C \uAD6C\uBD84\uB41C \uB2E8\uC5B4\uB294 OR \uC870\uAC74\n * - `+`\uB85C \uC2DC\uC791\uD558\uB294 \uB2E8\uC5B4\uB294 \uD544\uC218 \uD3EC\uD568 (AND \uC870\uAC74)\n * - `-`\uB85C \uC2DC\uC791\uD558\uB294 \uB2E8\uC5B4\uB294 \uC81C\uC678 (NOT \uC870\uAC74)\n *\n * @param fn - \uAC80\uC0C9 \uB300\uC0C1 \uCEEC\uB7FC\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @param searchText - \uAC80\uC0C9 \uD14D\uC2A4\uD2B8\n * @returns \uAC80\uC0C9 \uC870\uAC74\uC774 \uCD94\uAC00\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user()\n * .search((u) => [u.name, u.email], \"\uD64D\uAE38\uB3D9 -\uD0C8\uD1F4\")\n * ```\n */\n search(\n fn: (columns: QueryableRecord<TData>) => ExprUnit<string | undefined>[],\n searchText: string,\n ): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.search(fn, searchText));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n if (searchText.trim() === \"\") {\n return this;\n }\n\n const columns = fn(this.meta.columns);\n const parsed = parseSearchQuery(searchText);\n\n const conditions: WhereExprUnit[] = [];\n\n // OR \uC870\uAC74: \uAC01 \uCEEC\uB7FC\uC5D0\uC11C pattern \uD558\uB098\uB77C\uB3C4 \uB9E4\uCE58\uD558\uBA74 OK\n if (parsed.or.length === 1) {\n const pattern = parsed.or[0];\n const columnMatches = columns.map((col) => expr.like(expr.lower(col), pattern.toLowerCase()));\n conditions.push(expr.or(columnMatches));\n } else if (parsed.or.length > 1) {\n const orConditions = parsed.or.map((pattern) => {\n const columnMatches = columns.map((col) => expr.like(expr.lower(col), pattern.toLowerCase()));\n return expr.or(columnMatches);\n });\n conditions.push(expr.or(orConditions));\n }\n\n // MUST \uC870\uAC74: \uAC01 pattern\uC774 \uC5B4\uB5A4 \uCEEC\uB7FC\uC5D0\uC11C\uB4E0 \uB9E4\uCE58\uD574\uC57C \uD568 (AND)\n for (const pattern of parsed.must) {\n const columnMatches = columns.map((col) => expr.like(expr.lower(col), pattern.toLowerCase()));\n conditions.push(expr.or(columnMatches));\n }\n\n // NOT \uC870\uAC74: \uBAA8\uB4E0 \uCEEC\uB7FC\uC5D0\uC11C \uB9E4\uCE58\uD558\uC9C0 \uC54A\uC544\uC57C \uD568 (AND NOT)\n for (const pattern of parsed.not) {\n const columnMatches = columns.map((col) => expr.like(expr.lower(col), pattern.toLowerCase()));\n conditions.push(expr.not(expr.or(columnMatches)));\n }\n\n if (conditions.length === 0) {\n return this;\n }\n\n return this.where(() => [expr.and(conditions)]);\n }\n\n //#endregion\n\n //#region ========== \uADF8\uB8F9 - GROUP BY / HAVING ==========\n\n /**\n * GROUP BY \uC808\uC744 \uCD94\uAC00\n *\n * @param fn - \uADF8\uB8F9\uD654 \uAE30\uC900 \uCEEC\uB7FC\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @returns GROUP BY\uAC00 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.order()\n * .select((o) => ({\n * userId: o.userId,\n * totalAmount: expr.sum(o.amount),\n * }))\n * .groupBy((o) => [o.userId])\n * ```\n */\n groupBy(fn: (columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>[]): Queryable<TData, never> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.groupBy(fn));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n const groupBy = fn(this.meta.columns);\n\n return new Queryable({ ...this.meta, groupBy });\n }\n\n /**\n * HAVING \uC808\uC744 \uCD94\uAC00 (GROUP BY \uD6C4 \uD544\uD130\uB9C1)\n *\n * @param predicate - \uC870\uAC74 \uBC30\uC5F4\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @returns HAVING\uC774 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.order()\n * .select((o) => ({\n * userId: o.userId,\n * totalAmount: expr.sum(o.amount),\n * }))\n * .groupBy((o) => [o.userId])\n * .having((o) => [expr.gte(o.totalAmount, 10000)])\n * ```\n */\n having(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, never> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.having(predicate));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n });\n }\n\n const conditions = predicate(this.meta.columns);\n\n return new Queryable({\n ...this.meta,\n having: [...(this.meta.having ?? []), ...conditions],\n });\n }\n\n //#endregion\n\n //#region ========== \uC870\uC778 - JOIN / JOIN SINGLE ==========\n\n /**\n * 1:N \uAD00\uACC4\uC758 LEFT OUTER JOIN\uC744 \uC218\uD589 (\uBC30\uC5F4\uB85C \uACB0\uACFC \uCD94\uAC00)\n *\n * @param as - \uACB0\uACFC\uC5D0 \uCD94\uAC00\uD560 \uC18D\uC131 \uC774\uB984\n * @param fwd - \uC870\uC778 \uC870\uAC74\uC744 \uC815\uC758\uD558\uB294 \uCF5C\uBC31 \uD568\uC218\n * @returns \uC870\uC778 \uACB0\uACFC\uAC00 \uBC30\uC5F4\uB85C \uCD94\uAC00\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.user()\n * .join(\"posts\", (qr, u) =>\n * qr.from(Post)\n * .where((p) => [expr.eq(p.userId, u.id)])\n * )\n * // \uACB0\uACFC: { id, name, posts: [{ id, title }, ...] }\n * ```\n */\n join<A extends string, R extends DataRecord>(\n as: A,\n fwd: (qr: JoinQueryable, cols: QueryableRecord<TData>) => Queryable<R, any>,\n ): Queryable<TData & { [K in A]?: R[] }, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.join(as, fwd));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n columns: transformColumnsAlias(newFroms[0].meta.columns, this.meta.as, \"\"),\n });\n }\n\n // 1. join alias \uC0DD\uC131\n const joinAlias = `${this.meta.as}.${as}`;\n\n // 2. target \u2192 Queryable \uBCC0\uD658 (alias \uC804\uB2EC)\n const joinQr = new JoinQueryable(this.meta.db, joinAlias);\n\n // 3. fwd \uC2E4\uD589 (where \uB4F1 \uC870\uAC74 \uCD94\uAC00\uB41C Queryable \uBC18\uD658)\n const resultQr = fwd(joinQr, this.meta.columns);\n\n // 4. \uC0C8 columns\uC5D0 join \uACB0\uACFC \uCD94\uAC00\n const joinColumns = transformColumnsAlias(resultQr.meta.columns, joinAlias);\n\n return new Queryable({\n ...this.meta,\n columns: {\n ...this.meta.columns,\n [as]: [joinColumns],\n } as QueryableRecord<any>,\n isCustomColumns: true,\n joins: [...(this.meta.joins ?? []), { queryable: resultQr, isSingle: false }],\n }) as any;\n }\n\n /**\n * N:1 \uB610\uB294 1:1 \uAD00\uACC4\uC758 LEFT OUTER JOIN\uC744 \uC218\uD589 (\uB2E8\uC77C \uAC1D\uCCB4\uB85C \uACB0\uACFC \uCD94\uAC00)\n *\n * @param as - \uACB0\uACFC\uC5D0 \uCD94\uAC00\uD560 \uC18D\uC131 \uC774\uB984\n * @param fwd - \uC870\uC778 \uC870\uAC74\uC744 \uC815\uC758\uD558\uB294 \uCF5C\uBC31 \uD568\uC218\n * @returns \uC870\uC778 \uACB0\uACFC\uAC00 \uB2E8\uC77C \uAC1D\uCCB4\uB85C \uCD94\uAC00\uB41C Queryable\n *\n * @example\n * ```typescript\n * db.post()\n * .joinSingle(\"user\", (qr, p) =>\n * qr.from(User)\n * .where((u) => [expr.eq(u.id, p.userId)])\n * )\n * // \uACB0\uACFC: { id, title, user: { id, name } | undefined }\n * ```\n */\n joinSingle<A extends string, R extends DataRecord>(\n as: A,\n fwd: (qr: JoinQueryable, cols: QueryableRecord<TData>) => Queryable<R, any>,\n ): Queryable<{ [K in keyof TData as K extends A ? never : K]: TData[K] } & { [K in A]?: R }, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.joinSingle(as, fwd));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n columns: transformColumnsAlias(newFroms[0].meta.columns, this.meta.as, \"\"),\n });\n }\n\n // 1. join alias \uC0DD\uC131\n const joinAlias = `${this.meta.as}.${as}`;\n\n // 2. target \u2192 Queryable \uBCC0\uD658 (alias \uC804\uB2EC)\n const joinQr = new JoinQueryable(this.meta.db, joinAlias);\n\n // 3. fwd \uC2E4\uD589 (where \uB4F1 \uC870\uAC74 \uCD94\uAC00\uB41C Queryable \uBC18\uD658)\n const resultQr = fwd(joinQr, this.meta.columns);\n\n // 4. \uC0C8 columns\uC5D0 join \uACB0\uACFC \uCD94\uAC00\n const joinColumns = transformColumnsAlias(resultQr.meta.columns, joinAlias);\n\n return new Queryable({\n ...this.meta,\n columns: {\n ...this.meta.columns,\n [as]: joinColumns,\n } as QueryableRecord<any>,\n isCustomColumns: true,\n joins: [...(this.meta.joins ?? []), { queryable: resultQr, isSingle: true }],\n }) as any;\n }\n\n //#endregion\n\n //#region ========== \uC870\uC778 - INCLUDE ==========\n\n /**\n * \uAD00\uACC4\uB41C \uD14C\uC774\uBE14\uC744 \uC790\uB3D9\uC73C\uB85C JOIN\uD569\uB2C8\uB2E4.\n * TableBuilder\uC5D0 \uC815\uC758\uB41C FK/FKT \uAD00\uACC4\uB97C \uAE30\uBC18\uC73C\uB85C \uB3D9\uC791\uD569\uB2C8\uB2E4.\n *\n * @param fn - \uD3EC\uD568\uD560 \uAD00\uACC4\uB97C \uC120\uD0DD\uD558\uB294 \uD568\uC218 (PathProxy\uB97C \uD1B5\uD574 \uD0C0\uC785 \uCCB4\uD06C\uB428)\n * @returns JOIN\uC774 \uCD94\uAC00\uB41C Queryable\n * @throws \uAD00\uACC4\uAC00 \uC815\uC758\uB418\uC9C0 \uC54A\uC740 \uACBD\uC6B0 \uC5D0\uB7EC\n *\n * @example\n * ```typescript\n * // \uB2E8\uC77C \uAD00\uACC4 \uD3EC\uD568\n * db.post.include((p) => p.user)\n *\n * // \uC911\uCCA9 \uAD00\uACC4 \uD3EC\uD568\n * db.post.include((p) => p.user.company)\n *\n * // \uB2E4\uC911 \uAD00\uACC4 \uD3EC\uD568\n * db.user\n * .include((u) => u.company)\n * .include((u) => u.posts)\n * ```\n */\n include(fn: (item: PathProxy<TData>) => PathProxy<any>): Queryable<TData, TFrom> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.include(fn));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n columns: transformColumnsAlias(newFroms[0].meta.columns, this.meta.as, \"\"),\n });\n }\n\n const proxy = createPathProxy<TData>();\n const result = fn(proxy);\n const relationChain = result[PATH_SYMBOL].join(\".\");\n\n return this._include(relationChain);\n }\n\n private _include(relationChain: string): Queryable<TData, TFrom> {\n const relationNames = relationChain.split(\".\");\n\n let result: Queryable<any, any> = this;\n let currentTable = this.meta.from;\n const chainParts: string[] = [];\n\n for (const relationName of relationNames) {\n if (!(currentTable instanceof TableBuilder)) {\n throw new Error(\"include()\uB294 TableBuilder \uAE30\uBC18 queryable\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n\n const parentChain = chainParts.join(\".\");\n chainParts.push(relationName);\n\n // \uC774\uBBF8 JOIN\uB41C \uACBD\uC6B0 \uC911\uBCF5 \uCD94\uAC00 \uBC29\uC9C0\n const targetAlias = `${result.meta.as}.${chainParts.join(\".\")}`;\n const existingJoin = result.meta.joins?.find((j) => j.queryable.meta.as === targetAlias);\n if (existingJoin) {\n // \uAE30\uC874 JOIN\uC758 \uD14C\uC774\uBE14\uB85C currentTable \uC5C5\uB370\uC774\uD2B8 \uD6C4 continue\n const existingFrom = existingJoin.queryable.meta.from;\n if (existingFrom instanceof TableBuilder) {\n currentTable = existingFrom;\n }\n continue;\n }\n\n const relationDef = currentTable.meta.relations?.[relationName];\n if (relationDef == null) {\n throw new Error(`\uAD00\uACC4 '${relationName}'\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n if (relationDef instanceof ForeignKeyBuilder || relationDef instanceof RelationKeyBuilder) {\n // FK/RelationKey (N:1): Post.user \u2192 User\n // \uC870\uAC74: Post.userId = User.id\n const targetTable = relationDef.meta.targetFn();\n const fkColKeys = relationDef.meta.columns;\n const targetPkColKeys = getMatchedPrimaryKeys(fkColKeys, targetTable);\n\n result = result.joinSingle(chainParts.join(\".\"), (joinQr, parentCols) => {\n const qr = joinQr.from(targetTable);\n\n // FKT join\uC740 \uBC30\uC5F4\uB85C \uC800\uC7A5\uB418\uBBC0\uB85C \uBC30\uC5F4\uC778 \uACBD\uC6B0 \uCCAB \uBC88\uC9F8 \uC694\uC18C \uC0AC\uC6A9\n const srcColsRaw = parentChain ? parentCols[parentChain] : parentCols;\n const srcCols = (Array.isArray(srcColsRaw) ? srcColsRaw[0] : srcColsRaw) as QueryableRecord<any>;\n const conditions: WhereExprUnit[] = [];\n\n for (let i = 0; i < fkColKeys.length; i++) {\n const fkCol = srcCols[fkColKeys[i]];\n const pkCol = qr.meta.columns[targetPkColKeys[i]] as ExprUnit<ColumnPrimitive>;\n\n conditions.push(expr.eq(pkCol, fkCol));\n }\n\n return qr.where(() => conditions);\n });\n\n currentTable = targetTable;\n } else if (relationDef instanceof ForeignKeyTargetBuilder || relationDef instanceof RelationKeyTargetBuilder) {\n // FKT/RelationKeyTarget (1:N \uB610\uB294 1:1): User.posts \u2192 Post[]\n // \uC870\uAC74: Post.userId = User.id\n const targetTable = relationDef.meta.targetTableFn();\n const fkRelName = relationDef.meta.relationName;\n const sourceFk = targetTable.meta.relations?.[fkRelName];\n if (!(sourceFk instanceof ForeignKeyBuilder) && !(sourceFk instanceof RelationKeyBuilder)) {\n throw new Error(\n `'${relationName}'\uC774 \uCC38\uC870\uD558\uB294 '${fkRelName}'\uC774(\uAC00) ` +\n `${targetTable.meta.name} \uD14C\uC774\uBE14\uC758 \uC720\uD6A8\uD55C ForeignKey/RelationKey\uAC00 \uC544\uB2D9\uB2C8\uB2E4.`,\n );\n }\n const sourceTable = targetTable;\n const isSingle: boolean = relationDef.meta.isSingle ?? false;\n\n const fkColKeys = sourceFk.meta.columns;\n const pkColKeys = getMatchedPrimaryKeys(fkColKeys, currentTable);\n\n const buildJoin = (joinQr: JoinQueryable, parentCols: QueryableRecord<DataRecord>) => {\n const qr = joinQr.from(sourceTable);\n\n // FKT join\uC740 \uBC30\uC5F4\uB85C \uC800\uC7A5\uB418\uBBC0\uB85C \uBC30\uC5F4\uC778 \uACBD\uC6B0 \uCCAB \uBC88\uC9F8 \uC694\uC18C \uC0AC\uC6A9\n const srcColsRaw = parentChain ? parentCols[parentChain] : parentCols;\n const srcCols = (Array.isArray(srcColsRaw) ? srcColsRaw[0] : srcColsRaw) as QueryableRecord<any>;\n const conditions: WhereExprUnit[] = [];\n\n for (let i = 0; i < fkColKeys.length; i++) {\n const pkCol = srcCols[pkColKeys[i]] as ExprUnit<ColumnPrimitive>;\n const fkCol = qr.meta.columns[fkColKeys[i]] as ExprUnit<ColumnPrimitive>;\n\n conditions.push(expr.eq(fkCol, pkCol));\n }\n\n return qr.where(() => conditions);\n };\n\n result = isSingle\n ? result.joinSingle(chainParts.join(\".\"), buildJoin)\n : result.join(chainParts.join(\".\"), buildJoin);\n\n currentTable = sourceTable;\n }\n }\n\n return result as Queryable<TData, TFrom>;\n }\n\n //#endregion\n\n //#region ========== \uC11C\uBE0C\uCFFC\uB9AC - WRAP / UNION ==========\n\n /**\n * \uD604\uC7AC Queryable\uC744 \uC11C\uBE0C\uCFFC\uB9AC\uB85C \uAC10\uC2F8\uAE30\n *\n * distinct() \uB610\uB294 groupBy() \uD6C4 count() \uC0AC\uC6A9 \uC2DC \uD544\uC694\n *\n * @returns \uC11C\uBE0C\uCFFC\uB9AC\uB85C \uAC10\uC2F8\uC9C4 Queryable\n *\n * @example\n * ```typescript\n * // DISTINCT \uD6C4 \uCE74\uC6B4\uD2B8\n * const count = await db.user()\n * .select((u) => ({ name: u.name }))\n * .distinct()\n * .wrap()\n * .count();\n * ```\n */\n wrap(): Queryable<TData, never> {\n // \uD604\uC7AC Queryable\uC744 \uC11C\uBE0C\uCFFC\uB9AC\uB85C \uAC10\uC2F8\uAE30\n const wrapAlias = this.meta.db.getNextAlias();\n return new Queryable({\n db: this.meta.db,\n from: this,\n as: wrapAlias,\n columns: transformColumnsAlias<TData>(this.meta.columns, wrapAlias, \"\"),\n });\n }\n\n /**\n * \uC5EC\uB7EC Queryable\uC744 UNION\uC73C\uB85C \uACB0\uD569 (\uC911\uBCF5 \uC81C\uAC70)\n *\n * @param queries - UNION\uD560 Queryable \uBC30\uC5F4 (\uCD5C\uC18C 2\uAC1C)\n * @returns UNION\uB41C Queryable\n * @throws 2\uAC1C \uBBF8\uB9CC\uC758 queryable\uC774 \uC804\uB2EC\uB41C \uACBD\uC6B0\n *\n * @example\n * ```typescript\n * const combined = Queryable.union(\n * db.user().where((u) => [expr.eq(u.type, \"admin\")]),\n * db.user().where((u) => [expr.eq(u.type, \"manager\")]),\n * );\n * ```\n */\n static union<TData extends DataRecord>(...queries: Queryable<TData, any>[]): Queryable<TData, never> {\n if (queries.length < 2) {\n throw new ArgumentError(\"union\uC740 \uCD5C\uC18C 2\uAC1C\uC758 queryable\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.\", {\n provided: queries.length,\n minimum: 2,\n });\n }\n\n const first = queries[0];\n const unionAlias = first.meta.db.getNextAlias();\n return new Queryable({\n db: first.meta.db,\n from: queries, // Queryable[] \uBC30\uC5F4\uB85C \uC800\uC7A5\n as: unionAlias,\n columns: transformColumnsAlias(first.meta.columns, unionAlias, \"\"),\n });\n }\n\n //#endregion\n\n //#region ========== \uC7AC\uADC0 - WITH RECURSIVE ==========\n\n /**\n * \uC7AC\uADC0 CTE(Common Table Expression)\uB97C \uC0DD\uC131\n *\n * \uACC4\uCE35 \uAD6C\uC870 \uB370\uC774\uD130(\uC870\uC9C1\uB3C4, \uCE74\uD14C\uACE0\uB9AC \uD2B8\uB9AC \uB4F1)\uB97C \uC870\uD68C\uD560 \uB54C \uC0AC\uC6A9\n *\n * @param fwd - \uC7AC\uADC0 \uBD80\uBD84\uC744 \uC815\uC758\uD558\uB294 \uCF5C\uBC31 \uD568\uC218\n * @returns \uC7AC\uADC0 CTE\uAC00 \uC801\uC6A9\uB41C Queryable\n *\n * @example\n * ```typescript\n * // \uC870\uC9C1\uB3C4 \uACC4\uCE35 \uC870\uD68C\n * db.employee()\n * .where((e) => [expr.null(e.managerId)]) // \uB8E8\uD2B8 \uB178\uB4DC\n * .recursive((cte) =>\n * cte.from(Employee)\n * .where((e) => [expr.eq(e.managerId, e.self[0].id)])\n * )\n * ```\n */\n recursive(fwd: (qr: RecursiveQueryable<TData>) => Queryable<TData, any>): Queryable<TData, never> {\n if (Array.isArray(this.meta.from)) {\n const newFroms = this.meta.from.map((from) => from.recursive(fwd));\n return new Queryable({\n ...this.meta,\n from: newFroms,\n columns: transformColumnsAlias(newFroms[0].meta.columns, this.meta.as, \"\"),\n });\n }\n // \uB3D9\uC801 CTE \uC774\uB984 \uC0DD\uC131\n const cteName = this.meta.db.getNextAlias();\n\n // 2. target \u2192 Queryable \uBCC0\uD658 (CTE \uC774\uB984 \uC804\uB2EC)\n const cteQr = new RecursiveQueryable(this, cteName);\n\n // 3. fwd \uC2E4\uD589 (where \uB4F1 \uC870\uAC74 \uCD94\uAC00\uB41C Queryable \uBC18\uD658)\n const resultQr = fwd(cteQr);\n\n return new Queryable({\n db: this.meta.db,\n as: this.meta.as,\n from: cteName,\n columns: transformColumnsAlias(this.meta.columns, this.meta.as, \"\"),\n with: {\n name: cteName,\n base: this as any, // \uC21C\uD658 \uCC38\uC870 \uD0C0\uC785 \uCD94\uB860 \uCC28\uB2E8\n recursive: resultQr,\n },\n });\n }\n\n //#endregion\n\n //#region ========== [\uCFFC\uB9AC] \uC870\uD68C - SELECT ==========\n\n /**\n * SELECT \uCFFC\uB9AC\uB97C \uC2E4\uD589\uD558\uACE0 \uACB0\uACFC \uBC30\uC5F4\uC744 \uBC18\uD658\n *\n * @returns \uCFFC\uB9AC \uACB0\uACFC \uBC30\uC5F4\n *\n * @example\n * ```typescript\n * const users = await db.user()\n * .where((u) => [expr.eq(u.isActive, true)])\n * .result();\n * ```\n */\n async result(): Promise<TData[]> {\n const results = await this.meta.db.executeDefs<TData>([this.getSelectQueryDef()], [this.getResultMeta()]);\n return results[0];\n }\n\n /**\n * \uB2E8\uC77C \uACB0\uACFC\uB97C \uBC18\uD658 (2\uAC1C \uC774\uC0C1\uC774\uBA74 \uC5D0\uB7EC)\n *\n * @returns \uB2E8\uC77C \uACB0\uACFC \uB610\uB294 undefined\n * @throws 2\uAC1C \uC774\uC0C1\uC758 \uACB0\uACFC\uAC00 \uBC18\uD658\uB41C \uACBD\uC6B0\n *\n * @example\n * ```typescript\n * const user = await db.user()\n * .where((u) => [expr.eq(u.id, 1)])\n * .single();\n * ```\n */\n async single(): Promise<TData | undefined> {\n const result = await this.top(2).result();\n if (result.length > 1) {\n throw new ArgumentError(\"\uB2E8\uC77C \uACB0\uACFC\uB97C \uAE30\uB300\uD588\uC9C0\uB9CC 2\uAC1C \uC774\uC0C1\uC758 \uACB0\uACFC\uAC00 \uBC18\uD658\uB418\uC5C8\uC2B5\uB2C8\uB2E4.\", {\n table: this._getSourceName(),\n resultCount: result.length,\n });\n }\n return result[0];\n }\n\n /**\n * \uCFFC\uB9AC \uC18C\uC2A4 \uC774\uB984 \uBC18\uD658 (\uC5D0\uB7EC \uBA54\uC2DC\uC9C0\uC6A9)\n */\n private _getSourceName(): string {\n const from = this.meta.from;\n if (from instanceof TableBuilder || from instanceof ViewBuilder) {\n return from.meta.name;\n }\n if (typeof from === \"string\") {\n return from;\n }\n return this.meta.as;\n }\n\n /**\n * \uCCAB \uBC88\uC9F8 \uACB0\uACFC\uB97C \uBC18\uD658 (\uC5EC\uB7EC \uAC1C\uC5EC\uB3C4 \uCCAB \uBC88\uC9F8\uB9CC)\n *\n * @returns \uCCAB \uBC88\uC9F8 \uACB0\uACFC \uB610\uB294 undefined\n *\n * @example\n * ```typescript\n * const latestUser = await db.user()\n * .orderBy((u) => u.createdAt, \"DESC\")\n * .first();\n * ```\n */\n async first(): Promise<TData | undefined> {\n const results = await this.top(1).result();\n return results[0];\n }\n\n /**\n * \uACB0\uACFC \uD589 \uC218\uB97C \uBC18\uD658\n *\n * @param fwd - \uCE74\uC6B4\uD2B8\uD560 \uCEEC\uB7FC\uC744 \uC9C0\uC815\uD558\uB294 \uD568\uC218 (\uC120\uD0DD)\n * @returns \uD589 \uC218\n * @throws distinct() \uB610\uB294 groupBy() \uD6C4 \uC9C1\uC811 \uD638\uCD9C \uC2DC \uC5D0\uB7EC (wrap() \uD544\uC694)\n *\n * @example\n * ```typescript\n * const count = await db.user()\n * .where((u) => [expr.eq(u.isActive, true)])\n * .count();\n * ```\n */\n async count(fwd?: (cols: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>): Promise<number> {\n if (this.meta.distinct) {\n throw new Error(\"distinct() \uD6C4\uC5D0\uB294 count()\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. wrap()\uC744 \uBA3C\uC800 \uC0AC\uC6A9\uD558\uC138\uC694.\");\n }\n if (this.meta.groupBy) {\n throw new Error(\"groupBy() \uD6C4\uC5D0\uB294 count()\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. wrap()\uC744 \uBA3C\uC800 \uC0AC\uC6A9\uD558\uC138\uC694.\");\n }\n\n const countQr = fwd\n ? this.select((c) => ({ cnt: expr.count(fwd(c)) }))\n : this.select(() => ({ cnt: expr.count() }));\n\n const result = await countQr.single();\n\n return result?.cnt ?? 0;\n }\n\n /**\n * \uC870\uAC74\uC5D0 \uB9DE\uB294 \uB370\uC774\uD130 \uC874\uC7AC \uC5EC\uBD80\uB97C \uD655\uC778\n *\n * @returns \uC874\uC7AC\uD558\uBA74 true, \uC5C6\uC73C\uBA74 false\n *\n * @example\n * ```typescript\n * const hasAdmin = await db.user()\n * .where((u) => [expr.eq(u.role, \"admin\")])\n * .exists();\n * ```\n */\n async exists(): Promise<boolean> {\n const count = await this.count();\n return count > 0;\n }\n\n getSelectQueryDef(): SelectQueryDef {\n return objClearUndefined({\n type: \"select\",\n from: this._buildFromDef(),\n as: this.meta.as,\n select: this.meta.isCustomColumns ? this._buildSelectDef(this.meta.columns, \"\") : undefined,\n distinct: this.meta.distinct,\n top: this.meta.top,\n lock: this.meta.lock,\n where: this.meta.where?.map((w) => w.expr),\n joins: this.meta.joins ? this._buildJoinDefs(this.meta.joins) : undefined,\n orderBy: this.meta.orderBy?.map((o) => (o[1] ? [o[0].expr, o[1]] : [o[0].expr])),\n limit: this.meta.limit,\n groupBy: this.meta.groupBy?.map((g) => g.expr),\n having: this.meta.having?.map((w) => w.expr),\n with: this.meta.with\n ? {\n name: this.meta.with.name,\n base: this.meta.with.base.getSelectQueryDef(),\n recursive: this.meta.with.recursive.getSelectQueryDef(),\n }\n : undefined,\n });\n }\n\n private _buildFromDef(): QueryDefObjectName | SelectQueryDef | SelectQueryDef[] | string | undefined {\n const from = this.meta.from;\n\n if (from instanceof TableBuilder || from instanceof ViewBuilder) {\n return this.meta.db.getQueryDefObjectName(from);\n } else if (from instanceof Queryable) {\n return from.getSelectQueryDef();\n } else if (Array.isArray(from)) {\n return from.map((qr) => qr.getSelectQueryDef());\n }\n\n return from;\n }\n\n private _buildSelectDef(columns: QueryableRecord<any>, prefix: string): Record<string, Expr> {\n const result: Record<string, Expr> = {};\n\n for (const [key, val] of Object.entries(columns)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n\n if (val instanceof ExprUnit) {\n result[fullKey] = val.expr;\n } else if (Array.isArray(val)) {\n if (val.length > 0) {\n Object.assign(result, this._buildSelectDef(val[0], fullKey));\n }\n } else if (typeof val === \"object\") {\n Object.assign(result, this._buildSelectDef(val, fullKey));\n }\n }\n\n return result;\n }\n\n private _buildJoinDefs(joins: QueryableMetaJoin[]): SelectQueryDefJoin[] {\n const result: SelectQueryDefJoin[] = [];\n\n for (const join of joins) {\n const joinQr = join.queryable;\n const selectDef = joinQr.getSelectQueryDef();\n\n const joinDef: SelectQueryDefJoin = {\n ...selectDef,\n as: joinQr.meta.as,\n isSingle: join.isSingle,\n };\n\n result.push(joinDef);\n }\n\n return result;\n }\n\n getResultMeta(outputColumns?: string[]): ResultMeta {\n const columns: Record<string, ColumnPrimitiveStr> = {};\n const joins: Record<string, { isSingle: boolean }> = {};\n\n const buildResultMeta = (cols: QueryableRecord<any>, prefix: string) => {\n for (const [key, val] of Object.entries(cols)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (outputColumns && !outputColumns.includes(fullKey)) continue;\n\n if (val instanceof ExprUnit) {\n // primitive \uCEEC\uB7FC\n columns[fullKey] = val.dataType;\n } else if (Array.isArray(val)) {\n // \uBC30\uC5F4 (1:N \uAD00\uACC4)\n if (val.length > 0) {\n joins[fullKey] = { isSingle: false };\n buildResultMeta(val[0], fullKey);\n }\n } else if (typeof val === \"object\") {\n // \uB2E8\uC77C \uAC1D\uCCB4 (N:1, 1:1 \uAD00\uACC4)\n joins[fullKey] = { isSingle: true };\n buildResultMeta(val, fullKey);\n }\n }\n };\n\n buildResultMeta(this.meta.columns, \"\");\n\n return { columns, joins };\n }\n\n //#endregion\n\n //#region ========== [\uCFFC\uB9AC] \uC0BD\uC785 - INSERT ==========\n\n /**\n * INSERT \uCFFC\uB9AC\uB97C \uC2E4\uD589\n *\n * MSSQL\uC758 1000\uAC1C \uC81C\uD55C\uC744 \uC704\uD574 \uC790\uB3D9\uC73C\uB85C 1000\uAC1C\uC529 \uCCAD\uD06C\uB85C \uBD84\uD560\uD558\uC5EC \uC2E4\uD589\n *\n * @param records - \uC0BD\uC785\uD560 \uB808\uCF54\uB4DC \uBC30\uC5F4\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC0BD\uC785\uB41C \uB808\uCF54\uB4DC \uBC30\uC5F4 \uBC18\uD658\n *\n * @example\n * ```typescript\n * // \uB2E8\uC21C \uC0BD\uC785\n * await db.user().insert([\n * { name: \"\uD64D\uAE38\uB3D9\", email: \"hong@test.com\" },\n * ]);\n *\n * // \uC0BD\uC785 \uD6C4 ID \uBC18\uD658\n * const [inserted] = await db.user().insert(\n * [{ name: \"\uD64D\uAE38\uB3D9\" }],\n * [\"id\"],\n * );\n * ```\n */\n async insert(records: TFrom[\"$inferInsert\"][]): Promise<void>;\n async insert<K extends keyof TFrom[\"$inferColumns\"] & string>(\n records: TFrom[\"$inferInsert\"][],\n outputColumns: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>[]>;\n async insert<K extends keyof TFrom[\"$inferColumns\"] & string>(\n records: TFrom[\"$inferInsert\"][],\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>[] | void> {\n if (records.length === 0) {\n return outputColumns ? [] : undefined;\n }\n\n // MSSQL 1000\uAC1C \uC81C\uD55C\uC744 \uC704\uD574 \uCCAD\uD06C \uBD84\uD560\n const CHUNK_SIZE = 1000;\n const allResults: Pick<TFrom[\"$inferColumns\"], K>[] = [];\n\n for (let i = 0; i < records.length; i += CHUNK_SIZE) {\n const chunk = records.slice(i, i + CHUNK_SIZE);\n\n const results = await this.meta.db.executeDefs<Pick<TFrom[\"$inferColumns\"], K>>(\n [this.getInsertQueryDef(chunk, outputColumns)],\n outputColumns ? [this.getResultMeta(outputColumns)] : undefined,\n );\n\n if (outputColumns) {\n allResults.push(...results[0]);\n }\n }\n\n if (outputColumns) {\n return allResults;\n }\n }\n\n /**\n * WHERE \uC870\uAC74\uC5D0 \uB9DE\uB294 \uB370\uC774\uD130\uAC00 \uC5C6\uC73C\uBA74 INSERT\n *\n * @param record - \uC0BD\uC785\uD560 \uB808\uCF54\uB4DC\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC0BD\uC785\uB41C \uB808\uCF54\uB4DC \uBC18\uD658\n *\n * @example\n * ```typescript\n * await db.user()\n * .where((u) => [expr.eq(u.email, \"test@test.com\")])\n * .insertIfNotExists({ name: \"\uD14C\uC2A4\uD2B8\", email: \"test@test.com\" });\n * ```\n */\n async insertIfNotExists(record: TFrom[\"$inferInsert\"]): Promise<void>;\n async insertIfNotExists<K extends keyof TFrom[\"$inferColumns\"] & string>(\n record: TFrom[\"$inferInsert\"],\n outputColumns: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>>;\n async insertIfNotExists<K extends keyof TFrom[\"$inferColumns\"] & string>(\n record: TFrom[\"$inferInsert\"],\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K> | void> {\n const results = await this.meta.db.executeDefs<Pick<TFrom[\"$inferColumns\"], K>>(\n [this.getInsertIfNotExistsQueryDef(record)],\n outputColumns ? [this.getResultMeta(outputColumns)] : undefined,\n );\n\n if (outputColumns) {\n return results[0][0];\n }\n }\n\n /**\n * INSERT INTO ... SELECT (\uD604\uC7AC SELECT \uACB0\uACFC\uB97C \uB2E4\uB978 \uD14C\uC774\uBE14\uC5D0 INSERT)\n *\n * @param targetTable - \uC0BD\uC785 \uB300\uC0C1 \uD14C\uC774\uBE14\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC0BD\uC785\uB41C \uB808\uCF54\uB4DC \uBC30\uC5F4 \uBC18\uD658\n *\n * @example\n * ```typescript\n * await db.user()\n * .select((u) => ({ name: u.name, createdAt: u.createdAt }))\n * .where((u) => [expr.eq(u.isArchived, false)])\n * .insertInto(ArchivedUser);\n * ```\n */\n async insertInto<TTable extends TableBuilder<DataToColumnBuilderRecord<TData>, any>>(\n targetTable: TTable,\n ): Promise<void>;\n async insertInto<\n TTable extends TableBuilder<DataToColumnBuilderRecord<TData>, any>,\n TOut extends keyof TTable[\"$inferColumns\"] & string,\n >(targetTable: TTable, outputColumns: TOut[]): Promise<Pick<TData, TOut>[]>;\n async insertInto<\n TTable extends TableBuilder<DataToColumnBuilderRecord<TData>, any>,\n TOut extends keyof TTable[\"$inferColumns\"] & string,\n >(targetTable: TTable, outputColumns?: TOut[]): Promise<Pick<TData, TOut>[] | void> {\n const results = await this.meta.db.executeDefs<Pick<TData, TOut>>(\n [this.getInsertIntoQueryDef(targetTable)],\n outputColumns ? [this.getResultMeta(outputColumns)] : undefined,\n );\n\n if (outputColumns) {\n return results[0];\n }\n }\n\n getInsertQueryDef(\n records: TFrom[\"$inferInsert\"][],\n outputColumns?: (keyof TFrom[\"$inferColumns\"] & string)[],\n ): InsertQueryDef {\n const from = this.meta.from as TableBuilder<any, any> | ViewBuilder<any, any, any>;\n const outputDef = this._getCudOutputDef();\n\n // AI \uCEEC\uB7FC\uC5D0 \uBA85\uC2DC\uC801 \uAC12\uC774 \uC788\uC73C\uBA74 overrideIdentity \uC124\uC815\n const overrideIdentity =\n outputDef.aiColName != null &&\n records.some((r) => (r as Record<string, unknown>)[outputDef.aiColName!] !== undefined);\n\n return objClearUndefined({\n type: \"insert\",\n table: this.meta.db.getQueryDefObjectName(from),\n records,\n overrideIdentity: overrideIdentity || undefined,\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n getInsertIfNotExistsQueryDef(\n record: TFrom[\"$inferInsert\"],\n outputColumns?: (keyof TFrom[\"$inferColumns\"] & string)[],\n ): InsertIfNotExistsQueryDef {\n const from = this.meta.from as TableBuilder<any, any> | ViewBuilder<any, any, any>;\n const outputDef = this._getCudOutputDef();\n\n const { select: _, ...existsSelectQuery } = this.getSelectQueryDef();\n\n return objClearUndefined({\n type: \"insertIfNotExists\",\n table: this.meta.db.getQueryDefObjectName(from),\n record,\n existsSelectQuery,\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n getInsertIntoQueryDef<TTable extends TableBuilder<DataToColumnBuilderRecord<TData>, any>>(\n targetTable: TTable,\n outputColumns?: (keyof TTable[\"$inferColumns\"] & string)[],\n ): InsertIntoQueryDef {\n const outputDef = this._getCudOutputDef();\n\n return objClearUndefined({\n type: \"insertInto\",\n table: this.meta.db.getQueryDefObjectName(targetTable),\n recordsSelectQuery: this.getSelectQueryDef(),\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n //#endregion\n\n //#region ========== [\uCFFC\uB9AC] \uC218\uC815 - UPDATE / DELETE ==========\n\n /**\n * UPDATE \uCFFC\uB9AC\uB97C \uC2E4\uD589\n *\n * @param recordFwd - \uC5C5\uB370\uC774\uD2B8\uD560 \uCEEC\uB7FC\uACFC \uAC12\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC5C5\uB370\uC774\uD2B8\uB41C \uB808\uCF54\uB4DC \uBC30\uC5F4 \uBC18\uD658\n *\n * @example\n * ```typescript\n * // \uB2E8\uC21C \uC5C5\uB370\uC774\uD2B8\n * await db.user()\n * .where((u) => [expr.eq(u.id, 1)])\n * .update((u) => ({\n * name: expr.val(\"string\", \"\uC0C8\uC774\uB984\"),\n * updatedAt: expr.val(\"DateTime\", DateTime.now()),\n * }));\n *\n * // \uAE30\uC874 \uAC12 \uCC38\uC870\n * await db.product()\n * .update((p) => ({\n * price: expr.mul(p.price, expr.val(\"number\", 1.1)),\n * }));\n * ```\n */\n async update(recordFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferUpdate\"]>): Promise<void>;\n async update<K extends keyof TFrom[\"$columns\"] & string>(\n recordFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferUpdate\"]>,\n outputColumns: K[],\n ): Promise<Pick<TFrom[\"$columns\"], K>[]>;\n async update<K extends keyof TFrom[\"$columns\"] & string>(\n recordFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferUpdate\"]>,\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$columns\"], K>[] | void> {\n const results = await this.meta.db.executeDefs<Pick<TFrom[\"$columns\"], K>>(\n [this.getUpdateQueryDef(recordFwd, outputColumns)],\n outputColumns ? [this.getResultMeta(outputColumns)] : undefined,\n );\n\n if (outputColumns) {\n return results[0];\n }\n }\n\n /**\n * DELETE \uCFFC\uB9AC\uB97C \uC2E4\uD589\n *\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC0AD\uC81C\uB41C \uB808\uCF54\uB4DC \uBC30\uC5F4 \uBC18\uD658\n *\n * @example\n * ```typescript\n * // \uB2E8\uC21C \uC0AD\uC81C\n * await db.user()\n * .where((u) => [expr.eq(u.id, 1)])\n * .delete();\n *\n * // \uC0AD\uC81C\uB41C \uB370\uC774\uD130 \uBC18\uD658\n * const deleted = await db.user()\n * .where((u) => [expr.eq(u.isExpired, true)])\n * .delete([\"id\", \"name\"]);\n * ```\n */\n async delete(): Promise<void>;\n async delete<K extends keyof TFrom[\"$columns\"] & string>(outputColumns: K[]): Promise<Pick<TFrom[\"$columns\"], K>[]>;\n async delete<K extends keyof TFrom[\"$columns\"] & string>(\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$columns\"], K>[] | void> {\n const results = await this.meta.db.executeDefs<Pick<TFrom[\"$columns\"], K>>(\n [this.getDeleteQueryDef(outputColumns)],\n outputColumns ? [this.getResultMeta(outputColumns)] : undefined,\n );\n\n if (outputColumns) {\n return results[0];\n }\n }\n\n getUpdateQueryDef(\n recordFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferUpdate\"]>,\n outputColumns?: (keyof TFrom[\"$inferColumns\"] & string)[],\n ): UpdateQueryDef {\n const from = this.meta.from as TableBuilder<any, any> | ViewBuilder<any, any, any>;\n const outputDef = this._getCudOutputDef();\n\n return objClearUndefined({\n type: \"update\",\n table: this.meta.db.getQueryDefObjectName(from),\n as: this.meta.as,\n record: this._buildSelectDef(recordFwd(this.meta.columns), \"\"),\n top: this.meta.top,\n where: this.meta.where?.map((w) => w.expr),\n joins: this.meta.joins ? this._buildJoinDefs(this.meta.joins) : undefined,\n limit: this.meta.limit,\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n getDeleteQueryDef(outputColumns?: (keyof TFrom[\"$inferColumns\"] & string)[]): DeleteQueryDef {\n const from = this.meta.from as TableBuilder<any, any> | ViewBuilder<any, any, any>;\n const outputDef = this._getCudOutputDef();\n\n return objClearUndefined({\n type: \"delete\",\n table: this.meta.db.getQueryDefObjectName(from),\n as: this.meta.as,\n top: this.meta.top,\n where: this.meta.where?.map((w) => w.expr),\n joins: this.meta.joins ? this._buildJoinDefs(this.meta.joins) : undefined,\n limit: this.meta.limit,\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n //#endregion\n\n //#region ========== [\uCFFC\uB9AC] \uC218\uC815 - UPSERT ==========\n\n /**\n * UPSERT (UPDATE or INSERT) \uCFFC\uB9AC\uB97C \uC2E4\uD589\n *\n * WHERE \uC870\uAC74\uC5D0 \uB9DE\uB294 \uB370\uC774\uD130\uAC00 \uC788\uC73C\uBA74 UPDATE, \uC5C6\uC73C\uBA74 INSERT\n *\n * @param updateFwd - \uC5C5\uB370\uC774\uD2B8\uD560 \uCEEC\uB7FC\uACFC \uAC12\uC744 \uBC18\uD658\uD558\uB294 \uD568\uC218\n * @param insertFwd - \uC0BD\uC785\uD560 \uB808\uCF54\uB4DC\uB97C \uBC18\uD658\uD558\uB294 \uD568\uC218 (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC updateFwd\uC640 \uB3D9\uC77C)\n * @param outputColumns - \uBC18\uD658\uBC1B\uC744 \uCEEC\uB7FC \uC774\uB984 \uBC30\uC5F4 (\uC120\uD0DD)\n * @returns outputColumns \uC9C0\uC815 \uC2DC \uC601\uD5A5\uBC1B\uC740 \uB808\uCF54\uB4DC \uBC30\uC5F4 \uBC18\uD658\n *\n * @example\n * ```typescript\n * // UPDATE/INSERT \uB3D9\uC77C \uB370\uC774\uD130\n * await db.user()\n * .where((u) => [expr.eq(u.email, \"test@test.com\")])\n * .upsert(() => ({\n * name: expr.val(\"string\", \"\uD14C\uC2A4\uD2B8\"),\n * email: expr.val(\"string\", \"test@test.com\"),\n * }));\n *\n * // UPDATE/INSERT \uB2E4\uB978 \uB370\uC774\uD130\n * await db.user()\n * .where((u) => [expr.eq(u.email, \"test@test.com\")])\n * .upsert(\n * () => ({ loginCount: expr.val(\"number\", 1) }),\n * (update) => ({ ...update, email: expr.val(\"string\", \"test@test.com\") }),\n * );\n * ```\n */\n async upsert(updateFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferUpdate\"]>): Promise<void>;\n async upsert<K extends keyof TFrom[\"$inferColumns\"] & string>(\n insertFwd: (cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferInsert\"]>,\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>[]>;\n async upsert<U extends QueryableRecord<TFrom[\"$inferUpdate\"]>>(\n updateFwd: (cols: QueryableRecord<TData>) => U,\n insertFwd: (updateRecord: U) => QueryableRecord<TFrom[\"$inferInsert\"]>,\n ): Promise<void>;\n async upsert<U extends QueryableRecord<TFrom[\"$inferUpdate\"]>, K extends keyof TFrom[\"$inferColumns\"] & string>(\n updateFwd: (cols: QueryableRecord<TData>) => U,\n insertFwd: (updateRecord: U) => QueryableRecord<TFrom[\"$inferInsert\"]>,\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>[]>;\n async upsert<U extends QueryableRecord<TFrom[\"$inferUpdate\"]>, K extends keyof TFrom[\"$inferColumns\"] & string>(\n updateFwdOrInsertFwd:\n | ((cols: QueryableRecord<TData>) => U)\n | ((cols: QueryableRecord<TData>) => QueryableRecord<TFrom[\"$inferInsert\"]>),\n insertFwdOrOutputColumns?: ((updateRecord: U) => QueryableRecord<TFrom[\"$inferInsert\"]>) | K[],\n outputColumns?: K[],\n ): Promise<Pick<TFrom[\"$inferColumns\"], K>[] | void> {\n const updateRecordFwd = updateFwdOrInsertFwd as (cols: QueryableRecord<TData>) => U;\n\n const insertRecordFwd = (\n insertFwdOrOutputColumns instanceof Function ? insertFwdOrOutputColumns : updateFwdOrInsertFwd\n ) as (updateRecord: U) => QueryableRecord<TFrom[\"$inferInsert\"]>;\n\n const realOutputColumns = insertFwdOrOutputColumns instanceof Function ? outputColumns : insertFwdOrOutputColumns;\n\n const results = await this.meta.db.executeDefs<Pick<TFrom[\"$inferColumns\"], K>>(\n [this.getUpsertQueryDef(updateRecordFwd, insertRecordFwd, realOutputColumns)],\n [realOutputColumns ? this.getResultMeta(realOutputColumns) : undefined],\n );\n\n if (realOutputColumns) {\n return results[0];\n }\n }\n\n getUpsertQueryDef<U extends QueryableRecord<TFrom[\"$inferUpdate\"]>>(\n updateRecordFwd: (cols: QueryableRecord<TData>) => U,\n insertRecordFwd: (updateRecord: U) => QueryableRecord<TFrom[\"$inferInsert\"]>,\n outputColumns?: (keyof TFrom[\"$inferColumns\"] & string)[],\n ): UpsertQueryDef {\n const from = this.meta.from as TableBuilder<any, any> | ViewBuilder<any, any, any>;\n const outputDef = this._getCudOutputDef();\n\n const { select: _sel, ...existsSelectQuery } = this.getSelectQueryDef();\n\n // updateRecord \uC0DD\uC131\n const updateQrRecord = updateRecordFwd(this.meta.columns);\n const updateRecord: Record<string, Expr> = {};\n for (const [key, value] of Object.entries(updateQrRecord)) {\n updateRecord[key] = expr.toExpr(value);\n }\n\n // insertRecord \uC0DD\uC131 (updateRecordRaw\uB97C \uB450 \uBC88\uC9F8 \uC778\uC790\uB85C)\n const insertRecordRaw = insertRecordFwd(updateQrRecord);\n const insertRecord = Object.fromEntries(\n Object.entries(insertRecordRaw).map(([key, value]) => [key, expr.toExpr(value)]),\n );\n\n return objClearUndefined({\n type: \"upsert\",\n table: this.meta.db.getQueryDefObjectName(from),\n existsSelectQuery,\n updateRecord,\n insertRecord,\n output: outputColumns\n ? {\n columns: outputColumns,\n pkColNames: outputDef.pkColNames,\n aiColName: outputDef.aiColName,\n }\n : undefined,\n });\n }\n\n //#endregion\n\n //#region ========== DDL Helper ==========\n\n /**\n * FK \uC81C\uC57D\uC870\uAC74 on/off (\uD2B8\uB79C\uC7AD\uC158 \uB0B4 \uC0AC\uC6A9 \uAC00\uB2A5)\n */\n async switchFk(switch_: \"on\" | \"off\"): Promise<void> {\n const from = this.meta.from;\n if (!(from instanceof TableBuilder) && !(from instanceof ViewBuilder)) {\n throw new Error(\"switchFk\uB294 TableBuilder \uB610\uB294 ViewBuilder \uAE30\uBC18 queryable\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n await this.meta.db.switchFk(this.meta.db.getQueryDefObjectName(from), switch_);\n }\n\n //#endregion\n\n //#region ========== CUD \uACF5\uD1B5 ==========\n\n private _getCudOutputDef(): {\n pkColNames: string[];\n aiColName?: string;\n } {\n const from = this.meta.from;\n\n if (from instanceof TableBuilder) {\n if (from.meta.columns == null) {\n throw new Error(`\uD14C\uC774\uBE14 '${from.meta.name}'\uC5D0 \uCEEC\uB7FC \uC815\uC758\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.`);\n }\n\n let aiColName: string | undefined;\n for (const [key, col] of Object.entries(from.meta.columns as ColumnBuilderRecord)) {\n if (col.meta.autoIncrement) {\n aiColName = key;\n }\n }\n\n return {\n pkColNames: from.meta.primaryKey ?? [],\n aiColName,\n };\n }\n\n throw new Error(\"CUD \uC791\uC5C5\uC740 TableBuilder \uAE30\uBC18 queryable\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4.\");\n }\n\n //#endregion\n}\n\n//#region ========== Helper Functions ==========\n\n/**\n * FK \uCEEC\uB7FC \uBC30\uC5F4\uACFC \uB300\uC0C1 \uD14C\uC774\uBE14\uC758 PK\uB97C \uB9E4\uCE6D\uD558\uC5EC PK \uCEEC\uB7FC\uBA85 \uBC30\uC5F4\uC744 \uBC18\uD658\n *\n * @param fkCols - FK \uCEEC\uB7FC\uBA85 \uBC30\uC5F4\n * @param targetTable - \uCC38\uC870 \uB300\uC0C1 \uD14C\uC774\uBE14 \uBE4C\uB354\n * @returns \uB9E4\uCE6D\uB41C PK \uCEEC\uB7FC\uBA85 \uBC30\uC5F4\n * @throws FK/PK \uCEEC\uB7FC \uC218 \uBD88\uC77C\uCE58 \uC2DC\n */\nexport function getMatchedPrimaryKeys(fkCols: string[], targetTable: TableBuilder<any, any>): string[] {\n const pk = targetTable.meta.primaryKey;\n if (pk == null || fkCols.length !== pk.length) {\n throw new Error(\n `FK/PK \uCEEC\uB7FC \uAC1C\uC218\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (\uB300\uC0C1: ${targetTable.meta.name}, FK: ${fkCols.length}\uAC1C, PK: ${pk?.length ?? 0}\uAC1C)`,\n );\n }\n return pk;\n}\n\n/**\n * \uC911\uCCA9 columns \uAD6C\uC870\uB97C \uC0C8 alias\uB85C \uBCC0\uD658\uD558\uB294 \uACF5\uC6A9 \uD5EC\uD37C\n *\n * \uC11C\uBE0C\uCFFC\uB9AC/JOIN \uC2DC \uAE30\uC874 alias\uB97C \uC0C8 alias\uB85C \uBCC0\uD658\uD558\uBA74\uC11C,\n * \uC911\uCCA9 \uD0A4(posts.userId)\uB294 \uD3C9\uBA74\uD654\uB41C \uD0A4\uB85C \uC720\uC9C0\uD55C\uB2E4.\n *\n * \uC608: posts[0].userId \uCEEC\uB7FC\uC758 \uACBD\uB85C\uAC00 [\"T1.posts\", \"userId\"]\uC778 \uACBD\uC6B0,\n * \uC0C8 alias \"T2\"\uB85C \uBCC0\uD658\uD558\uBA74 [\"T2\", \"posts.userId\"]\uAC00 \uB41C\uB2E4.\n *\n * @param columns - \uBCC0\uD658\uD560 \uCEEC\uB7FC \uB808\uCF54\uB4DC\n * @param alias - \uC0C8 \uD14C\uC774\uBE14 alias (\uC608: \"T2\")\n * @param keyPrefix - \uD604\uC7AC \uC911\uCCA9 \uACBD\uB85C (\uC7AC\uADC0 \uD638\uCD9C\uC6A9, \uAE30\uBCF8\uAC12 \"\")\n * @returns \uBCC0\uD658\uB41C \uCEEC\uB7FC \uB808\uCF54\uB4DC\n */\nfunction transformColumnsAlias<T extends DataRecord>(\n columns: QueryableRecord<T>,\n alias: string,\n keyPrefix: string = \"\",\n): QueryableRecord<T> {\n const result: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(columns as Record<string, unknown>)) {\n const fullKey = keyPrefix ? `${keyPrefix}.${key}` : key;\n\n if (value instanceof ExprUnit) {\n result[key] = expr.col(value.dataType, alias, fullKey);\n } else if (Array.isArray(value)) {\n if (value.length > 0) {\n result[key] = [transformColumnsAlias(value[0] as QueryableRecord<DataRecord>, alias, fullKey)];\n }\n } else if (typeof value === \"object\" && value != null) {\n result[key] = transformColumnsAlias(value as QueryableRecord<DataRecord>, alias, fullKey);\n } else {\n result[key] = value;\n }\n }\n\n return result as QueryableRecord<T>;\n}\n\n//#endregion\n\n//#region ========== Types ==========\n\ninterface QueryableMeta<TData extends DataRecord> {\n db: DbContext;\n from?: TableBuilder<any, any> | ViewBuilder<any, any, any> | Queryable<any, any> | Queryable<TData, any>[] | string;\n as: string;\n columns: QueryableRecord<TData>;\n isCustomColumns?: boolean;\n distinct?: boolean;\n top?: number;\n lock?: boolean;\n where?: WhereExprUnit[];\n joins?: QueryableMetaJoin[];\n orderBy?: [ExprUnit<ColumnPrimitive>, (\"ASC\" | \"DESC\")?][];\n limit?: [number, number];\n groupBy?: ExprUnit<ColumnPrimitive>[];\n having?: WhereExprUnit[];\n with?: { name: string; base: Queryable<any, any>; recursive: Queryable<any, any> };\n}\n\ninterface QueryableMetaJoin {\n queryable: Queryable<any, any>;\n isSingle: boolean;\n}\n\nexport type QueryableRecord<TData extends DataRecord> = {\n // 1. Primitive \uCC98\uB9AC\n [K in keyof TData]: TData[K] extends ColumnPrimitive\n ? ExprUnit<TData[K]>\n : // 2. \uBC30\uC5F4 \uCC98\uB9AC (\uC635\uC154\uB110 \uD3EC\uD568)\n TData[K] extends (infer U)[]\n ? U extends DataRecord\n ? QueryableRecord<U>[]\n : never\n : TData[K] extends (infer U)[] | undefined\n ? U extends DataRecord\n ? QueryableRecord<U>[] | undefined\n : never\n : // 3. \uB2E8\uC77C \uAC1D\uCCB4 \uCC98\uB9AC (\uC635\uC154\uB110 \uD3EC\uD568)\n TData[K] extends DataRecord\n ? QueryableRecord<TData[K]>\n : TData[K] extends DataRecord | undefined\n ? QueryableRecord<Exclude<TData[K], undefined>> | undefined\n : never;\n};\n\n//#region ========== PathProxy - include\uC6A9 \uD0C0\uC785 \uC548\uC804 \uACBD\uB85C \uBE4C\uB354 ==========\n\n/**\n * include()\uC5D0\uC11C \uAD00\uACC4 \uACBD\uB85C\uB97C \uD0C0\uC785 \uC548\uC804\uD558\uAC8C \uC9C0\uC815\uD558\uAE30 \uC704\uD55C Proxy \uD0C0\uC785\n * ColumnPrimitive\uAC00 \uC544\uB2CC \uD544\uB4DC(FK, FKT \uAD00\uACC4)\uB9CC \uC811\uADFC \uAC00\uB2A5\n *\n * @example\n * ```typescript\n * // item.user.company \uC811\uADFC \uC2DC \uB0B4\uBD80\uC801\uC73C\uB85C [\"user\", \"company\"] \uACBD\uB85C \uC218\uC9D1\n * db.post.include(item => item.user.company)\n *\n * // item.title\uC740 string(ColumnPrimitive)\uC774\uBBC0\uB85C \uCEF4\uD30C\uC77C \uC5D0\uB7EC\n * db.post.include(item => item.title) // \u274C \uC5D0\uB7EC\n * ```\n */\n/**\n * \uBC30\uC5F4\uC774\uBA74 \uC694\uC18C \uD0C0\uC785 \uCD94\uCD9C\n */\ntype UnwrapArray<T> = T extends (infer U)[] ? U : T;\n\nconst PATH_SYMBOL = Symbol(\"path\");\n\n/**\n * include()\uC6A9 \uD0C0\uC785 \uC548\uC804 \uACBD\uB85C \uD504\uB85D\uC2DC\n */\nexport type PathProxy<T> = {\n [K in keyof T as T[K] extends ColumnPrimitive ? never : K]-?: PathProxy<UnwrapArray<T[K]>>;\n} & { readonly [PATH_SYMBOL]: string[] };\n\n/**\n * PathProxy \uC778\uC2A4\uD134\uC2A4 \uC0DD\uC131\n * Proxy\uB97C \uC0AC\uC6A9\uD558\uC5EC \uD504\uB85C\uD37C\uD2F0 \uC811\uADFC\uC744 \uAC00\uB85C\uCC44\uACE0 \uACBD\uB85C\uB97C \uC218\uC9D1\n */\nfunction createPathProxy<T>(path: string[] = []): PathProxy<T> {\n return new Proxy({} as PathProxy<T>, {\n get(_, prop: string | symbol) {\n if (prop === PATH_SYMBOL) return path;\n if (typeof prop === \"symbol\") return undefined;\n return createPathProxy<unknown>([...path, prop]);\n },\n });\n}\n\n//#endregion\n\n/**\n * \uD14C\uC774\uBE14 \uB610\uB294 \uBDF0\uC5D0 \uB300\uD55C Queryable \uD329\uD1A0\uB9AC \uD568\uC218\uB97C \uC0DD\uC131\n *\n * DbContext\uC5D0\uC11C \uD14C\uC774\uBE14/\uBDF0\uBCC4 getter\uB97C \uC815\uC758\uD560 \uB54C \uC0AC\uC6A9\n *\n * @param db - DbContext \uC778\uC2A4\uD134\uC2A4\n * @param tableOrView - TableBuilder \uB610\uB294 ViewBuilder \uC778\uC2A4\uD134\uC2A4\n * @param as - alias \uC9C0\uC815 (\uC120\uD0DD, \uBBF8\uC9C0\uC815 \uC2DC \uC790\uB3D9 \uC0DD\uC131)\n * @returns Queryable\uC744 \uBC18\uD658\uD558\uB294 \uD329\uD1A0\uB9AC \uD568\uC218\n *\n * @example\n * ```typescript\n * class AppDbContext extends DbContext {\n * // \uD638\uCD9C \uC2DC\uB9C8\uB2E4 \uC0C8\uB85C\uC6B4 alias \uD560\uB2F9\n * user = queryable(this, User);\n *\n * // \uC0AC\uC6A9 \uC608\uC2DC\n * async getActiveUsers() {\n * return this.user()\n * .where((u) => [expr.eq(u.isActive, true)])\n * .result();\n * }\n * }\n * ```\n */\nexport function queryable<T extends TableBuilder<any, any> | ViewBuilder<any, any, any>>(\n db: DbContext,\n tableOrView: T,\n as?: string,\n): () => Queryable<T[\"$infer\"], T extends TableBuilder<any, any> ? T : never> {\n return () => {\n // as\uAC00 \uBA85\uC2DC\uB418\uC9C0 \uC54A\uC73C\uBA74 db.getNextAlias() \uC0AC\uC6A9 (\uCE74\uC6B4\uD130 \uC99D\uAC00)\n // as\uAC00 \uBA85\uC2DC\uB418\uBA74 \uADF8\uB300\uB85C \uC0AC\uC6A9 (\uCE74\uC6B4\uD130 \uC99D\uAC00 \uC548\uD568)\n const finalAs = as ?? db.getNextAlias();\n\n // TableBuilder + columns\n if (tableOrView instanceof TableBuilder && tableOrView.meta.columns != null) {\n const columnDefs = tableOrView.meta.columns as ColumnBuilderRecord;\n\n return new Queryable({\n db,\n from: tableOrView,\n as: finalAs,\n columns: Object.fromEntries(\n Object.entries(columnDefs).map(([key, colDef]) => [key, expr.col(colDef.meta.type, finalAs, key)]),\n ),\n }) as any;\n }\n\n // ViewBuilder + viewFn\n if (tableOrView instanceof ViewBuilder && tableOrView.meta.viewFn != null) {\n const baseQr = tableOrView.meta.viewFn(db);\n\n // TFrom\uC744 ViewBuilder\uB85C \uC124\uC815\uD558\uC5EC \uBC18\uD658\n return new Queryable({\n db,\n from: tableOrView,\n as: finalAs,\n columns: transformColumnsAlias(baseQr.meta.columns, finalAs),\n }) as any;\n }\n\n throw new Error(`\uC798\uBABB\uB41C \uD14C\uC774\uBE14/\uBDF0 \uBA54\uD0C0\uB370\uC774\uD130: ${tableOrView.meta.name}`);\n };\n}\n\n//#endregion\n"],
|
|
5
4
|
"mappings": "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",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/exec/search-parser.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * \uAC80\uC0C9 \uCFFC\uB9AC \uD30C\uC2F1 \uACB0\uACFC (LIKE \uD328\uD134)\n */\nexport interface ParsedSearchQuery {\n /** \uC77C\uBC18 \uAC80\uC0C9\uC5B4 (OR \uC870\uAC74) - LIKE \uD328\uD134 */\n or: string[];\n /** \uD544\uC218 \uAC80\uC0C9\uC5B4 (AND \uC870\uAC74, + \uC811\uB450\uC0AC \uB610\uB294 \uB530\uC634\uD45C) - LIKE \uD328\uD134 */\n must: string[];\n /** \uC81C\uC678 \uAC80\uC0C9\uC5B4 (NOT \uC870\uAC74, - \uC811\uB450\uC0AC) - LIKE \uD328\uD134 */\n not: string[];\n}\n\n// \uC774\uC2A4\uCF00\uC774\uD504 \uC2DC\uD000\uC2A4\uB97C \uD50C\uB808\uC774\uC2A4\uD640\uB354\uB85C \uCE58\uD658\nconst ESC = {\n BACKSLASH: \"\\x00BACKSLASH\\x00\",\n ASTERISK: \"\\x00ASTERISK\\x00\",\n PERCENT: \"\\x00PERCENT\\x00\",\n QUOTE: \"\\x00QUOTE\\x00\",\n PLUS: \"\\x00PLUS\\x00\",\n MINUS: \"\\x00MINUS\\x00\",\n};\n\n/**\n * \uAC80\uC0C9 \uCFFC\uB9AC \uBB38\uC790\uC5F4\uC744 \uD30C\uC2F1\uD558\uC5EC SQL LIKE \uD328\uD134\uC73C\uB85C \uBCC0\uD658\uD55C\uB2E4.\n *\n * ## \uAC80\uC0C9 \uBB38\uBC95\n *\n * | \uBB38\uBC95 | \uC758\uBBF8 | \uC608\uC2DC |\n * |------|------|------|\n * | `term1 term2` | OR (\uB458 \uC911 \uD558\uB098 \uD3EC\uD568) | `\uC0AC\uACFC \uBC14\uB098\uB098` |\n * | `+term` | \uD544\uC218 \uD3EC\uD568 (AND) | `+\uC0AC\uACFC +\uBC14\uB098\uB098` |\n * | `-term` | \uC81C\uC678 (NOT) | `\uC0AC\uACFC -\uBC14\uB098\uB098` |\n * | `\"exact phrase\"` | \uC815\uD655\uD788 \uC77C\uCE58 (\uD544\uC218) | `\"\uB9DB\uC788\uB294 \uACFC\uC77C\"` |\n * | `*` | \uC640\uC77C\uB4DC\uCE74\uB4DC | `app*` \u2192 `app%` |\n *\n * ## \uC774\uC2A4\uCF00\uC774\uD504\n *\n * | \uC785\uB825 | \uC758\uBBF8 |\n * |------|------|\n * | `\\\\` | \uB9AC\uD130\uB7F4 `\\` |\n * | `\\*` | \uB9AC\uD130\uB7F4 `*` |\n * | `\\%` | \uB9AC\uD130\uB7F4 `%` |\n * | `\\\"` | \uB9AC\uD130\uB7F4 `\"` |\n * | `\\+` | \uB9AC\uD130\uB7F4 `+` |\n * | `\\-` | \uB9AC\uD130\uB7F4 `-` |\n *\n * ## \uD2B9\uC218 \uCF00\uC774\uC2A4\n *\n * - \uB2EB\uD788\uC9C0 \uC54A\uC740 \uB530\uC634\uD45C(`\"text`)\uB294 \uB530\uC634\uD45C\uB97C \uD3EC\uD568\uD55C \uC77C\uBC18 \uD14D\uC2A4\uD2B8\uB85C \uCC98\uB9AC\uB41C\uB2E4.\n *\n * ## \uC608\uC2DC\n *\n * ```typescript\n * parseSearchQuery('\uC0AC\uACFC \"\uB9DB\uC788\uB294 \uACFC\uC77C\" -\uBC14\uB098\uB098 +\uB538\uAE30')\n * // \uACB0\uACFC:\n * // {\n * // or: [\"%\uC0AC\uACFC%\"],\n * // must: [\"%\uB9DB\uC788\uB294 \uACFC\uC77C%\", \"%\uB538\uAE30%\"],\n * // not: [\"%\uBC14\uB098\uB098%\"]\n * // }\n *\n * parseSearchQuery('app* test')\n * // \uACB0\uACFC:\n * // {\n * // or: [\"app%\", \"%test%\"], // app*\uB294 \"app\uC73C\uB85C \uC2DC\uC791\", test\uB294 \uD3EC\uD568\uAC80\uC0C9\n * // must: [],\n * // not: []\n * // }\n *\n * parseSearchQuery('app\\\\*test') // \uC774\uC2A4\uCF00\uC774\uD504\uB41C *\n * // \uACB0\uACFC:\n * // {\n * // or: [\"%app*test%\"], // \uB9AC\uD130\uB7F4 *\n * // must: [],\n * // not: []\n * // }\n * ```\n *\n * @param searchText \uAC80\uC0C9 \uCFFC\uB9AC \uBB38\uC790\uC5F4\n * @returns \uD30C\uC2F1\uB41C \uAC80\uC0C9 \uCFFC\uB9AC \uAC1D\uCCB4 (LIKE \uD328\uD134)\n */\nexport function parseSearchQuery(searchText: string): ParsedSearchQuery {\n const result: ParsedSearchQuery = {\n or: [],\n must: [],\n not: [],\n };\n\n if (searchText.trim() === \"\") {\n return result;\n }\n\n let processed = searchText\n .replace(/\\\\\\\\/g, ESC.BACKSLASH)\n .replace(/\\\\\\*/g, ESC.ASTERISK)\n .replace(/\\\\%/g, ESC.PERCENT)\n .replace(/\\\\\"/g, ESC.QUOTE)\n .replace(/\\\\\\+/g, ESC.PLUS)\n .replace(/\\\\-/g, ESC.MINUS);\n\n // \uB530\uC634\uD45C\uB85C \uBB36\uC778 \uBD80\uBD84 \uCD94\uCD9C\n const quotedRegex = /([+-]?)\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n\n while ((match = quotedRegex.exec(processed)) != null) {\n const prefix = match[1];\n let term = match[2];\n\n if (term.trim() === \"\") continue;\n\n const pattern = termToLikePattern(term);\n\n if (prefix === \"+\") {\n result.must.push(pattern);\n } else if (prefix === \"-\") {\n result.not.push(pattern);\n } else {\n // \uB530\uC634\uD45C\uB85C \uBB36\uC778 \uAC74 must\uB85C \uCC98\uB9AC (\uC815\uD655\uD788 \uC77C\uCE58 = \uD544\uC218)\n result.must.push(pattern);\n }\n }\n\n // \uB530\uC634\uD45C \uBD80\uBD84 \uC81C\uAC70\n processed = processed.replace(/[+-]?\"[^\"]*\"/g, \" \");\n\n // \uACF5\uBC31\uC73C\uB85C \uD1A0\uD070 \uBD84\uB9AC\n const tokens = processed.split(/\\s+/).filter((t) => t.length > 0);\n\n for (let token of tokens) {\n let targetArray = result.or;\n\n // + \uB610\uB294 - \uC811\uB450\uC0AC \uCC98\uB9AC\n if (token.startsWith(\"+\")) {\n targetArray = result.must;\n token = token.slice(1);\n } else if (token.startsWith(\"-\")) {\n targetArray = result.not;\n token = token.slice(1);\n }\n\n if (token.trim() === \"\") continue;\n\n const pattern = termToLikePattern(token);\n targetArray.push(pattern);\n }\n\n return result;\n}\n\n/**\n * \uAC80\uC0C9\uC5B4\uB97C SQL LIKE \uD328\uD134\uC73C\uB85C \uBCC0\uD658 (\uB0B4\uBD80 \uD568\uC218)\n *\n * \uC640\uC77C\uB4DC\uCE74\uB4DC \uADDC\uCE59:\n * - `\uC0AC\uACFC` (\uC640\uC77C\uB4DC\uCE74\uB4DC \uC5C6\uC74C) \u2192 `%\uC0AC\uACFC%` (\uD3EC\uD568 \uAC80\uC0C9, \uAE30\uBCF8)\n * - `\uC0AC\uACFC*` \u2192 `\uC0AC\uACFC%` (\uC2DC\uC791)\n * - `*\uC0AC\uACFC` \u2192 `%\uC0AC\uACFC` (\uB05D)\n * - `*\uC0AC\uACFC*` \u2192 `%\uC0AC\uACFC%` (\uBA85\uC2DC\uC801 \uD3EC\uD568)\n * - `\uC0AC*\uACFC` \u2192 `\uC0AC%\uACFC` (\uC911\uAC04)\n */\nfunction termToLikePattern(term: string): string {\n // \uC640\uC77C\uB4DC\uCE74\uB4DC *\uB97C \uC784\uC2DC \uB9C8\uCEE4\uB85C \uBCC0\uD658 (\uC774\uC2A4\uCF00\uC774\uD504\uB41C \uAC83\uC740 ESC.ASTERISK\uB85C \uC774\uBBF8 \uCC98\uB9AC\uB428)\n const WILDCARD = \"\\x01WILDCARD\\x01\";\n const hasWildcard = term.includes(\"*\");\n let pattern = term.replace(/\\*/g, WILDCARD);\n\n // SQL LIKE \uD2B9\uC218\uBB38\uC790 \uC774\uC2A4\uCF00\uC774\uD504 (\\ \u2192 \\\\, % \u2192 \\%, _ \u2192 \\_, [ \u2192 \\[)\n pattern = pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/%/g, \"\\\\%\").replace(/_/g, \"\\\\_\").replace(/\\[/g, \"\\\\[\");\n\n // \uC640\uC77C\uB4DC\uCE74\uB4DC \uB9C8\uCEE4 \u2192 % (SQL \uC640\uC77C\uB4DC\uCE74\uB4DC)\n pattern = pattern.replaceAll(WILDCARD, \"%\");\n\n // \uC774\uC2A4\uCF00\uC774\uD504 \uD50C\uB808\uC774\uC2A4\uD640\uB354 \uBCF5\uC6D0\n pattern = pattern\n .replaceAll(ESC.BACKSLASH, \"\\\\\\\\\") // \\\\ \u2192 SQL \\\\\n .replaceAll(ESC.ASTERISK, \"*\") // \\* \u2192 \uB9AC\uD130\uB7F4 * (SQL\uC5D0\uC11C \uD2B9\uC218\uBB38\uC790 \uC544\uB2D8)\n .replaceAll(ESC.PERCENT, \"\\\\%\") // \\% \u2192 SQL \\%\n .replaceAll(ESC.QUOTE, '\"')\n .replaceAll(ESC.PLUS, \"+\")\n .replaceAll(ESC.MINUS, \"-\");\n\n // \uC640\uC77C\uB4DC\uCE74\uB4DC\uAC00 \uC5C6\uC73C\uBA74 \uC591\uCABD\uC5D0 % \uCD94\uAC00 (\uAE30\uBCF8 \uD3EC\uD568 \uAC80\uC0C9)\n // \uC640\uC77C\uB4DC\uCE74\uB4DC\uAC00 \uC788\uC73C\uBA74 \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C \uD328\uD134 \uADF8\uB300\uB85C \uC0AC\uC6A9\n if (hasWildcard) {\n return pattern;\n }\n\n return `%${pattern}%`;\n}\n"],
|
|
5
4
|
"mappings": "AAaA,MAAM,MAAM;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AACT;AA6DO,SAAS,iBAAiB,YAAuC;AACtE,QAAM,SAA4B;AAAA,IAChC,IAAI,CAAC;AAAA,IACL,MAAM,CAAC;AAAA,IACP,KAAK,CAAC;AAAA,EACR;AAEA,MAAI,WAAW,KAAK,MAAM,IAAI;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,WACb,QAAQ,SAAS,IAAI,SAAS,EAC9B,QAAQ,SAAS,IAAI,QAAQ,EAC7B,QAAQ,QAAQ,IAAI,OAAO,EAC3B,QAAQ,QAAQ,IAAI,KAAK,EACzB,QAAQ,SAAS,IAAI,IAAI,EACzB,QAAQ,QAAQ,IAAI,KAAK;AAG5B,QAAM,cAAc;AACpB,MAAI;AAEJ,UAAQ,QAAQ,YAAY,KAAK,SAAS,MAAM,MAAM;AACpD,UAAM,SAAS,MAAM,CAAC;AACtB,QAAI,OAAO,MAAM,CAAC;AAElB,QAAI,KAAK,KAAK,MAAM,GAAI;AAExB,UAAM,UAAU,kBAAkB,IAAI;AAEtC,QAAI,WAAW,KAAK;AAClB,aAAO,KAAK,KAAK,OAAO;AAAA,IAC1B,WAAW,WAAW,KAAK;AACzB,aAAO,IAAI,KAAK,OAAO;AAAA,IACzB,OAAO;AAEL,aAAO,KAAK,KAAK,OAAO;AAAA,IAC1B;AAAA,EACF;AAGA,cAAY,UAAU,QAAQ,iBAAiB,GAAG;AAGlD,QAAM,SAAS,UAAU,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAEhE,WAAS,SAAS,QAAQ;AACxB,QAAI,cAAc,OAAO;AAGzB,QAAI,MAAM,WAAW,GAAG,GAAG;AACzB,oBAAc,OAAO;AACrB,cAAQ,MAAM,MAAM,CAAC;AAAA,IACvB,WAAW,MAAM,WAAW,GAAG,GAAG;AAChC,oBAAc,OAAO;AACrB,cAAQ,MAAM,MAAM,CAAC;AAAA,IACvB;AAEA,QAAI,MAAM,KAAK,MAAM,GAAI;AAEzB,UAAM,UAAU,kBAAkB,KAAK;AACvC,gBAAY,KAAK,OAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAYA,SAAS,kBAAkB,MAAsB;AAE/C,QAAM,WAAW;AACjB,QAAM,cAAc,KAAK,SAAS,GAAG;AACrC,MAAI,UAAU,KAAK,QAAQ,OAAO,QAAQ;AAG1C,YAAU,QAAQ,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,EAAE,QAAQ,OAAO,KAAK;AAGvG,YAAU,QAAQ,WAAW,UAAU,GAAG;AAG1C,YAAU,QACP,WAAW,IAAI,WAAW,MAAM,EAChC,WAAW,IAAI,UAAU,GAAG,EAC5B,WAAW,IAAI,SAAS,KAAK,EAC7B,WAAW,IAAI,OAAO,GAAG,EACzB,WAAW,IAAI,MAAM,GAAG,EACxB,WAAW,IAAI,OAAO,GAAG;AAI5B,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,OAAO;AACpB;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/expr/expr-unit.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ColumnPrimitive, ColumnPrimitiveStr } from \"../types/column\";\nimport type { Expr, WhereExpr } from \"../types/expr\";\n\n/**\n * \uD0C0\uC785 \uC548\uC804\uD55C \uD45C\uD604\uC2DD \uB798\uD37C\n * TypeScript \uC81C\uB124\uB9AD\uC73C\uB85C \uD45C\uD604\uC2DD\uC758 \uBC18\uD658 \uD0C0\uC785\uC744 \uCD94\uC801\n */\nexport class ExprUnit<T extends ColumnPrimitive> {\n readonly $infer!: T;\n\n get n(): ExprUnit<NonNullable<T>> {\n return this as unknown as ExprUnit<NonNullable<T>>;\n }\n\n constructor(\n readonly dataType: ColumnPrimitiveStr,\n readonly expr: Expr,\n ) {}\n}\n\n/**\n * WHERE \uC808\uC6A9 \uD45C\uD604\uC2DD \uB798\uD37C\n */\nexport class WhereExprUnit {\n constructor(readonly expr: WhereExpr) {}\n}\n\n/**\n * ExprUnit \uB610\uB294 \uB9AC\uD130\uB7F4 \uAC12\uC744 \uBC1B\uC744 \uC218 \uC788\uB294 \uC785\uB825 \uD0C0\uC785\n */\nexport type ExprInput<T extends ColumnPrimitive> = ExprUnit<T> | T;\n"],
|
|
5
4
|
"mappings": "AAOO,MAAM,SAAoC;AAAA,EAO/C,YACW,UACA,MACT;AAFS;AACA;AAAA,EACR;AAAA,EATM;AAAA,EAET,IAAI,IAA8B;AAChC,WAAO;AAAA,EACT;AAMF;AAKO,MAAM,cAAc;AAAA,EACzB,YAAqB,MAAiB;AAAjB;AAAA,EAAkB;AACzC;",
|
|
6
5
|
"names": []
|
|
7
6
|
}
|