{"version":3,"file":"indexes.cjs","names":["entityKind","SQL","ExtraConfigColumn","IndexedColumn"],"sources":["../../src/cockroach-core/indexes.ts"],"sourcesContent":["import { entityKind, is } from '~/entity.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport { ExtraConfigColumn } from './columns/index.ts';\nimport type { CockroachColumn } from './columns/index.ts';\nimport { IndexedColumn } from './columns/index.ts';\nimport type { CockroachTable } from './table.ts';\n\ninterface IndexConfig {\n\tname?: string;\n\n\tcolumns: Partial<IndexedColumn | SQL>[];\n\n\t/**\n\t * If true, the index will be created as `create unique index` instead of `create index`.\n\t */\n\tunique: boolean;\n\n\t/**\n\t * If true, the index will be created as `create index ... on only <table>` instead of `create index ... on <table>`.\n\t */\n\tonly: boolean;\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere?: SQL;\n\n\t/**\n\t * The optional USING clause method for the index\n\t */\n\tmethod?: 'btree' | string;\n}\n\nexport type IndexColumn = CockroachColumn;\n\nexport type CockroachIndexMethod =\n\t| 'btree'\n\t| 'hash'\n\t| 'gin'\n\t| 'cspann';\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'CockroachIndexBuilderOn';\n\n\tconstructor(private unique: boolean, private name?: string) {}\n\n\ton(\n\t\t...columns: [\n\t\t\tPartial<ExtraConfigColumn> | SQL | CockroachColumn,\n\t\t\t...Partial<ExtraConfigColumn | SQL | CockroachColumn>[],\n\t\t]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as CockroachColumn;\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\tfalse,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\tonOnly(\n\t\t...columns: [\n\t\t\tPartial<ExtraConfigColumn | SQL | CockroachColumn>,\n\t\t\t...Partial<ExtraConfigColumn | SQL | CockroachColumn>[],\n\t\t]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as CockroachColumn;\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t);\n\t}\n\n\t/**\n\t * Specify what index method to use. Choices are `btree`, `hash`, `gin`, `cspann`. The default method is `btree`.\n\t *\n\t * @param method The name of the index method to be used\n\t * @param columns\n\t * @returns\n\t */\n\tusing(\n\t\tmethod: CockroachIndexMethod,\n\t\t...columns: [\n\t\t\tPartial<ExtraConfigColumn | SQL | CockroachColumn>,\n\t\t\t...Partial<ExtraConfigColumn | SQL | CockroachColumn>[],\n\t\t]\n\t): IndexBuilder {\n\t\treturn new IndexBuilder(\n\t\t\tcolumns.map((it) => {\n\t\t\t\tif (is(it, SQL)) {\n\t\t\t\t\treturn it;\n\t\t\t\t}\n\n\t\t\t\tif (is(it, ExtraConfigColumn)) {\n\t\t\t\t\tconst clonedIndexedColumn = new IndexedColumn(\n\t\t\t\t\t\tit.name,\n\t\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\t\tit.columnType!,\n\t\t\t\t\t\tit.indexConfig!,\n\t\t\t\t\t);\n\t\t\t\t\tit.indexConfig = JSON.parse(JSON.stringify(it.defaultConfig));\n\t\t\t\t\treturn clonedIndexedColumn;\n\t\t\t\t}\n\n\t\t\t\tit = it as CockroachColumn;\n\t\t\t\treturn new IndexedColumn(\n\t\t\t\t\tit.name!,\n\t\t\t\t\t!!it.keyAsName,\n\t\t\t\t\tit.columnType!,\n\t\t\t\t\t{},\n\t\t\t\t);\n\t\t\t}),\n\t\t\tthis.unique,\n\t\t\ttrue,\n\t\t\tthis.name,\n\t\t\tmethod,\n\t\t);\n\t}\n}\n\nexport interface AnyIndexBuilder {\n\tbuild(table: CockroachTable): Index;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface IndexBuilder extends AnyIndexBuilder {}\n\nexport class IndexBuilder implements AnyIndexBuilder {\n\tstatic readonly [entityKind]: string = 'CockroachIndexBuilder';\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(\n\t\tcolumns: Partial<IndexedColumn | SQL>[],\n\t\tunique: boolean,\n\t\tonly: boolean,\n\t\tname?: string,\n\t\tmethod: string = 'btree',\n\t) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\tonly,\n\t\t\tmethod,\n\t\t};\n\t}\n\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: CockroachTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'CockroachIndex';\n\n\treadonly config: IndexConfig & { table: CockroachTable };\n\treadonly isNameExplicit: boolean;\n\n\tconstructor(config: IndexConfig, table: CockroachTable) {\n\t\tthis.config = { ...config, table };\n\t\tthis.isNameExplicit = !!config.name;\n\t}\n}\n\nexport type GetColumnsTableName<TColumns> = TColumns extends CockroachColumn ? TColumns['_']['name']\n\t: TColumns extends CockroachColumn[] ? TColumns[number]['_']['name']\n\t: never;\n\nexport function index(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(false, name);\n}\n\nexport function uniqueIndex(name?: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(true, name);\n}\n"],"mappings":";;;;;;;AAyCA,IAAa,iBAAb,MAA4B;CAC3B,QAAiBA,0BAAsB;CAEvC,YAAY,AAAQ,QAAiB,AAAQ,MAAe;EAAxC;EAAyB;;CAE7C,GACC,GAAG,SAIY;AACf,SAAO,IAAI,aACV,QAAQ,KAAK,OAAO;AACnB,2BAAO,IAAIC,iBAAI,CACd,QAAO;AAGR,2BAAO,IAAIC,wDAAkB,EAAE;IAC9B,MAAM,sBAAsB,IAAIC,oDAC/B,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,GAAG,YACH;AACD,OAAG,cAAc,KAAK,MAAM,KAAK,UAAU,GAAG,cAAc,CAAC;AAC7D,WAAO;;AAGR,QAAK;AACL,UAAO,IAAIA,oDACV,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,EAAE,CACF;IACA,EACF,KAAK,QACL,OACA,KAAK,KACL;;CAGF,OACC,GAAG,SAIY;AACf,SAAO,IAAI,aACV,QAAQ,KAAK,OAAO;AACnB,2BAAO,IAAIF,iBAAI,CACd,QAAO;AAGR,2BAAO,IAAIC,wDAAkB,EAAE;IAC9B,MAAM,sBAAsB,IAAIC,oDAC/B,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,GAAG,YACH;AACD,OAAG,cAAc,KAAK,MAAM,KAAK,UAAU,GAAG,cAAc,CAAC;AAC7D,WAAO;;AAGR,QAAK;AACL,UAAO,IAAIA,oDACV,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,EAAE,CACF;IACA,EACF,KAAK,QACL,MACA,KAAK,KACL;;;;;;;;;CAUF,MACC,QACA,GAAG,SAIY;AACf,SAAO,IAAI,aACV,QAAQ,KAAK,OAAO;AACnB,2BAAO,IAAIF,iBAAI,CACd,QAAO;AAGR,2BAAO,IAAIC,wDAAkB,EAAE;IAC9B,MAAM,sBAAsB,IAAIC,oDAC/B,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,GAAG,YACH;AACD,OAAG,cAAc,KAAK,MAAM,KAAK,UAAU,GAAG,cAAc,CAAC;AAC7D,WAAO;;AAGR,QAAK;AACL,UAAO,IAAIA,oDACV,GAAG,MACH,CAAC,CAAC,GAAG,WACL,GAAG,YACH,EAAE,CACF;IACA,EACF,KAAK,QACL,MACA,KAAK,MACL,OACA;;;AAWH,IAAa,eAAb,MAAqD;CACpD,QAAiBH,0BAAsB;;CAGvC;CAEA,YACC,SACA,QACA,MACA,MACA,SAAiB,SAChB;AACD,OAAK,SAAS;GACb;GACA;GACA;GACA;GACA;GACA;;CAGF,MAAM,WAAsB;AAC3B,OAAK,OAAO,QAAQ;AACpB,SAAO;;;CAIR,MAAM,OAA8B;AACnC,SAAO,IAAI,MAAM,KAAK,QAAQ,MAAM;;;AAItC,IAAa,QAAb,MAAmB;CAClB,QAAiBA,0BAAsB;CAEvC,AAAS;CACT,AAAS;CAET,YAAY,QAAqB,OAAuB;AACvD,OAAK,SAAS;GAAE,GAAG;GAAQ;GAAO;AAClC,OAAK,iBAAiB,CAAC,CAAC,OAAO;;;AAQjC,SAAgB,MAAM,MAA+B;AACpD,QAAO,IAAI,eAAe,OAAO,KAAK;;AAGvC,SAAgB,YAAY,MAA+B;AAC1D,QAAO,IAAI,eAAe,MAAM,KAAK"}