/
opt
/
canhelp
/
node_modules
/
drizzle-orm
/
mysql-core
/
/opt/canhelp/node_modules/drizzle-orm/mysql-core
mkdir
upload
Name
Size
Mode
Actions
columns/
-
0755
rm
query-builders/
-
0755
rm
alias.cjs
1214
0644
edit
dl
rm
alias.cjs.map
729
0644
edit
dl
rm
alias.d.cts
335
0644
edit
dl
rm
alias.d.ts
332
0644
edit
dl
rm
alias.js
211
0644
edit
dl
rm
alias.js.map
691
0644
edit
dl
rm
checks.cjs
1710
0644
edit
dl
rm
checks.cjs.map
1388
0644
edit
dl
rm
checks.d.cts
616
0644
edit
dl
rm
checks.d.ts
613
0644
edit
dl
rm
checks.js
618
0644
edit
dl
rm
checks.js.map
1338
0644
edit
dl
rm
db.cjs
9371
0644
edit
dl
rm
db.cjs.map
22572
0644
edit
dl
rm
db.d.cts
10379
0644
edit
dl
rm
db.d.ts
10365
0644
edit
dl
rm
db.js
8097
0644
edit
dl
rm
db.js.map
22606
0644
edit
dl
rm
dialect.cjs
36791
0644
edit
dl
rm
dialect.cjs.map
60932
0644
edit
dl
rm
dialect.d.cts
3901
0644
edit
dl
rm
dialect.d.ts
3888
0644
edit
dl
rm
dialect.js
31903
0644
edit
dl
rm
dialect.js.map
60859
0644
edit
dl
rm
expressions.cjs
2033
0644
edit
dl
rm
expressions.cjs.map
1475
0644
edit
dl
rm
expressions.d.cts
466
0644
edit
dl
rm
expressions.d.ts
463
0644
edit
dl
rm
expressions.js
604
0644
edit
dl
rm
expressions.js.map
1420
0644
edit
dl
rm
foreign-keys.cjs
3023
0644
edit
dl
rm
foreign-keys.cjs.map
5036
0644
edit
dl
rm
foreign-keys.d.cts
2084
0644
edit
dl
rm
foreign-keys.d.ts
2081
0644
edit
dl
rm
foreign-keys.js
1836
0644
edit
dl
rm
foreign-keys.js.map
4989
0644
edit
dl
rm
index.cjs
2862
0644
edit
dl
rm
index.cjs.map
975
0644
edit
dl
rm
index.d.cts
555
0644
edit
dl
rm
index.d.ts
538
0644
edit
dl
rm
index.js
571
0644
edit
dl
rm
index.js.map
829
0644
edit
dl
rm
indexes.cjs
2364
0644
edit
dl
rm
indexes.cjs.map
3871
0644
edit
dl
rm
indexes.d.cts
2142
0644
edit
dl
rm
indexes.d.ts
2138
0644
edit
dl
rm
indexes.js
1181
0644
edit
dl
rm
indexes.js.map
3810
0644
edit
dl
rm
primary-keys.cjs
2173
0644
edit
dl
rm
primary-keys.cjs.map
2688
0644
edit
dl
rm
primary-keys.d.cts
1131
0644
edit
dl
rm
primary-keys.d.ts
1128
0644
edit
dl
rm
primary-keys.js
1018
0644
edit
dl
rm
primary-keys.js.map
2642
0644
edit
dl
rm
schema.cjs
1948
0644
edit
dl
rm
schema.cjs.map
1740
0644
edit
dl
rm
schema.d.cts
842
0644
edit
dl
rm
schema.d.ts
839
0644
edit
dl
rm
schema.js
772
0644
edit
dl
rm
schema.js.map
1700
0644
edit
dl
rm
session.cjs
2858
0644
edit
dl
rm
session.cjs.map
6694
0644
edit
dl
rm
session.d.cts
4243
0644
edit
dl
rm
session.d.ts
4236
0644
edit
dl
rm
session.js
1641
0644
edit
dl
rm
session.js.map
6656
0644
edit
dl
rm
subquery.cjs
784
0644
edit
dl
rm
subquery.cjs.map
1665
0644
edit
dl
rm
subquery.d.cts
1477
0644
edit
dl
rm
subquery.d.ts
1472
0644
edit
dl
rm
subquery.js
36
0644
edit
dl
rm
subquery.js.map
71
0644
edit
dl
rm
table.cjs
3169
0644
edit
dl
rm
table.cjs.map
8683
0644
edit
dl
rm
table.d.cts
4970
0644
edit
dl
rm
table.d.ts
4960
0644
edit
dl
rm
table.js
1877
0644
edit
dl
rm
table.js.map
8627
0644
edit
dl
rm
unique-constraint.cjs
2650
0644
edit
dl
rm
unique-constraint.cjs.map
2717
0644
edit
dl
rm
unique-constraint.d.cts
1018
0644
edit
dl
rm
unique-constraint.d.ts
1015
0644
edit
dl
rm
unique-constraint.js
1337
0644
edit
dl
rm
unique-constraint.js.map
2660
0644
edit
dl
rm
utils.cjs
3829
0644
edit
dl
rm
utils.cjs.map
4580
0644
edit
dl
rm
utils.d.cts
1539
0644
edit
dl
rm
utils.d.ts
1531
0644
edit
dl
rm
utils.js
2335
0644
edit
dl
rm
utils.js.map
4506
0644
edit
dl
rm
view-base.cjs
1286
0644
edit
dl
rm
view-base.cjs.map
793
0644
edit
dl
rm
view-base.d.cts
523
0644
edit
dl
rm
view-base.d.ts
520
0644
edit
dl
rm
view-base.js
224
0644
edit
dl
rm
view-base.js.map
756
0644
edit
dl
rm
view-common.cjs
1170
0644
edit
dl
rm
view-common.cjs.map
258
0644
edit
dl
rm
view-common.d.cts
53
0644
edit
dl
rm
view-common.d.ts
53
0644
edit
dl
rm
view-common.js
132
0644
edit
dl
rm
view-common.js.map
215
0644
edit
dl
rm
view.cjs
4770
0644
edit
dl
rm
view.cjs.map
8939
0644
edit
dl
rm
view.d.cts
3530
0644
edit
dl
rm
view.d.ts
3521
0644
edit
dl
rm
view.js
3309
0644
edit
dl
rm
view.js.map
8897
0644
edit
dl
rm
Edit:
/opt/canhelp/node_modules/drizzle-orm/mysql-core/dialect.js
(31903B)
import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from "../alias.js"; import { CasingCache } from "../casing.js"; import { Column } from "../column.js"; import { entityKind, is } from "../entity.js"; import { DrizzleError } from "../errors.js"; import { and, eq } from "../expressions.js"; import { getOperators, getOrderByOperators, Many, normalizeRelation, One } from "../relations.js"; import { Param, SQL, sql, View } from "../sql/sql.js"; import { Subquery } from "../subquery.js"; import { getTableName, getTableUniqueName, Table } from "../table.js"; import { orderSelectedFields } from "../utils.js"; import { ViewBaseConfig } from "../view-common.js"; import { MySqlColumn } from "./columns/common.js"; import { MySqlTable } from "./table.js"; import { MySqlViewBase } from "./view-base.js"; class MySqlDialect { static [entityKind] = "MySqlDialect"; /** @internal */ casing; constructor(config) { this.casing = new CasingCache(config?.casing); } async migrate(migrations, session, config) { const migrationsTable = config.migrationsTable ?? "__drizzle_migrations"; const migrationTableCreate = sql` create table if not exists ${sql.identifier(migrationsTable)} ( id serial primary key, hash text not null, created_at bigint ) `; await session.execute(migrationTableCreate); const dbMigrations = await session.all( sql`select id, hash, created_at from ${sql.identifier(migrationsTable)} order by created_at desc limit 1` ); const lastDbMigration = dbMigrations[0]; await session.transaction(async (tx) => { for (const migration of migrations) { if (!lastDbMigration || Number(lastDbMigration.created_at) < migration.folderMillis) { for (const stmt of migration.sql) { await tx.execute(sql.raw(stmt)); } await tx.execute( sql`insert into ${sql.identifier(migrationsTable)} (\`hash\`, \`created_at\`) values(${migration.hash}, ${migration.folderMillis})` ); } } }); } escapeName(name) { return `\`${name}\``; } escapeParam(_num) { return `?`; } escapeString(str) { return `'${str.replace(/'/g, "''")}'`; } buildWithCTE(queries) { if (!queries?.length) return void 0; const withSqlChunks = [sql`with `]; for (const [i, w] of queries.entries()) { withSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`); if (i < queries.length - 1) { withSqlChunks.push(sql`, `); } } withSqlChunks.push(sql` `); return sql.join(withSqlChunks); } buildDeleteQuery({ table, where, returning, withList, limit, orderBy }) { const withSql = this.buildWithCTE(withList); const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0; const whereSql = where ? sql` where ${where}` : void 0; const orderBySql = this.buildOrderBy(orderBy); const limitSql = this.buildLimit(limit); return sql`${withSql}delete from ${table}${whereSql}${orderBySql}${limitSql}${returningSql}`; } buildUpdateSet(table, set) { const tableColumns = table[Table.Symbol.Columns]; const columnNames = Object.keys(tableColumns).filter( (colName) => set[colName] !== void 0 || tableColumns[colName]?.onUpdateFn !== void 0 ); const setSize = columnNames.length; return sql.join(columnNames.flatMap((colName, i) => { const col = tableColumns[colName]; const value = set[colName] ?? sql.param(col.onUpdateFn(), col); const res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`; if (i < setSize - 1) { return [res, sql.raw(", ")]; } return [res]; })); } buildUpdateQuery({ table, set, where, returning, withList, limit, orderBy }) { const withSql = this.buildWithCTE(withList); const setSql = this.buildUpdateSet(table, set); const returningSql = returning ? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}` : void 0; const whereSql = where ? sql` where ${where}` : void 0; const orderBySql = this.buildOrderBy(orderBy); const limitSql = this.buildLimit(limit); return sql`${withSql}update ${table} set ${setSql}${whereSql}${orderBySql}${limitSql}${returningSql}`; } /** * Builds selection SQL with provided fields/expressions * * Examples: * * `select <selection> from` * * `insert ... returning <selection>` * * If `isSingleTable` is true, then columns won't be prefixed with table name */ buildSelection(fields, { isSingleTable = false } = {}) { const columnsLen = fields.length; const chunks = fields.flatMap(({ field }, i) => { const chunk = []; if (is(field, SQL.Aliased) && field.isSelectionField) { chunk.push(sql.identifier(field.fieldAlias)); } else if (is(field, SQL.Aliased) || is(field, SQL)) { const query = is(field, SQL.Aliased) ? field.sql : field; if (isSingleTable) { chunk.push( new SQL( query.queryChunks.map((c) => { if (is(c, MySqlColumn)) { return sql.identifier(this.casing.getColumnCasing(c)); } return c; }) ) ); } else { chunk.push(query); } if (is(field, SQL.Aliased)) { chunk.push(sql` as ${sql.identifier(field.fieldAlias)}`); } } else if (is(field, Column)) { if (isSingleTable) { chunk.push(sql.identifier(this.casing.getColumnCasing(field))); } else { chunk.push(field); } } if (i < columnsLen - 1) { chunk.push(sql`, `); } return chunk; }); return sql.join(chunks); } buildLimit(limit) { return typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : void 0; } buildOrderBy(orderBy) { return orderBy && orderBy.length > 0 ? sql` order by ${sql.join(orderBy, sql`, `)}` : void 0; } buildIndex({ indexes, indexFor }) { return indexes && indexes.length > 0 ? sql` ${sql.raw(indexFor)} INDEX (${sql.raw(indexes.join(`, `))})` : void 0; } buildSelectQuery({ withList, fields, fieldsFlat, where, having, table, joins, orderBy, groupBy, limit, offset, lockingClause, distinct, setOperators, useIndex, forceIndex, ignoreIndex }) { const fieldsList = fieldsFlat ?? orderSelectedFields(fields); for (const f of fieldsList) { if (is(f.field, Column) && getTableName(f.field.table) !== (is(table, Subquery) ? table._.alias : is(table, MySqlViewBase) ? table[ViewBaseConfig].name : is(table, SQL) ? void 0 : getTableName(table)) && !((table2) => joins?.some( ({ alias }) => alias === (table2[Table.Symbol.IsAlias] ? getTableName(table2) : table2[Table.Symbol.BaseName]) ))(f.field.table)) { const tableName = getTableName(f.field.table); throw new Error( `Your "${f.path.join("->")}" field references a column "${tableName}"."${f.field.name}", but the table "${tableName}" is not part of the query! Did you forget to join it?` ); } } const isSingleTable = !joins || joins.length === 0; const withSql = this.buildWithCTE(withList); const distinctSql = distinct ? sql` distinct` : void 0; const selection = this.buildSelection(fieldsList, { isSingleTable }); const tableSql = (() => { if (is(table, Table) && table[Table.Symbol.IsAlias]) { return sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? "")}.`.if(table[Table.Symbol.Schema])}${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`; } return table; })(); const joinsArray = []; if (joins) { for (const [index, joinMeta] of joins.entries()) { if (index === 0) { joinsArray.push(sql` `); } const table2 = joinMeta.table; const lateralSql = joinMeta.lateral ? sql` lateral` : void 0; if (is(table2, MySqlTable)) { const tableName = table2[MySqlTable.Symbol.Name]; const tableSchema = table2[MySqlTable.Symbol.Schema]; const origTableName = table2[MySqlTable.Symbol.OriginalName]; const alias = tableName === origTableName ? void 0 : joinMeta.alias; const useIndexSql2 = this.buildIndex({ indexes: joinMeta.useIndex, indexFor: "USE" }); const forceIndexSql2 = this.buildIndex({ indexes: joinMeta.forceIndex, indexFor: "FORCE" }); const ignoreIndexSql2 = this.buildIndex({ indexes: joinMeta.ignoreIndex, indexFor: "IGNORE" }); joinsArray.push( sql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : void 0}${sql.identifier(origTableName)}${useIndexSql2}${forceIndexSql2}${ignoreIndexSql2}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}` ); } else if (is(table2, View)) { const viewName = table2[ViewBaseConfig].name; const viewSchema = table2[ViewBaseConfig].schema; const origViewName = table2[ViewBaseConfig].originalName; const alias = viewName === origViewName ? void 0 : joinMeta.alias; joinsArray.push( sql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${viewSchema ? sql`${sql.identifier(viewSchema)}.` : void 0}${sql.identifier(origViewName)}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}` ); } else { joinsArray.push( sql`${sql.raw(joinMeta.joinType)} join${lateralSql} ${table2} on ${joinMeta.on}` ); } if (index < joins.length - 1) { joinsArray.push(sql` `); } } } const joinsSql = sql.join(joinsArray); const whereSql = where ? sql` where ${where}` : void 0; const havingSql = having ? sql` having ${having}` : void 0; const orderBySql = this.buildOrderBy(orderBy); const groupBySql = groupBy && groupBy.length > 0 ? sql` group by ${sql.join(groupBy, sql`, `)}` : void 0; const limitSql = this.buildLimit(limit); const offsetSql = offset ? sql` offset ${offset}` : void 0; const useIndexSql = this.buildIndex({ indexes: useIndex, indexFor: "USE" }); const forceIndexSql = this.buildIndex({ indexes: forceIndex, indexFor: "FORCE" }); const ignoreIndexSql = this.buildIndex({ indexes: ignoreIndex, indexFor: "IGNORE" }); let lockingClausesSql; if (lockingClause) { const { config, strength } = lockingClause; lockingClausesSql = sql` for ${sql.raw(strength)}`; if (config.noWait) { lockingClausesSql.append(sql` no wait`); } else if (config.skipLocked) { lockingClausesSql.append(sql` skip locked`); } } const finalQuery = sql`${withSql}select${distinctSql} ${selection} from ${tableSql}${useIndexSql}${forceIndexSql}${ignoreIndexSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}${lockingClausesSql}`; if (setOperators.length > 0) { return this.buildSetOperations(finalQuery, setOperators); } return finalQuery; } buildSetOperations(leftSelect, setOperators) { const [setOperator, ...rest] = setOperators; if (!setOperator) { throw new Error("Cannot pass undefined values to any set operator"); } if (rest.length === 0) { return this.buildSetOperationQuery({ leftSelect, setOperator }); } return this.buildSetOperations( this.buildSetOperationQuery({ leftSelect, setOperator }), rest ); } buildSetOperationQuery({ leftSelect, setOperator: { type, isAll, rightSelect, limit, orderBy, offset } }) { const leftChunk = sql`(${leftSelect.getSQL()}) `; const rightChunk = sql`(${rightSelect.getSQL()})`; let orderBySql; if (orderBy && orderBy.length > 0) { const orderByValues = []; for (const orderByUnit of orderBy) { if (is(orderByUnit, MySqlColumn)) { orderByValues.push(sql.identifier(this.casing.getColumnCasing(orderByUnit))); } else if (is(orderByUnit, SQL)) { for (let i = 0; i < orderByUnit.queryChunks.length; i++) { const chunk = orderByUnit.queryChunks[i]; if (is(chunk, MySqlColumn)) { orderByUnit.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk)); } } orderByValues.push(sql`${orderByUnit}`); } else { orderByValues.push(sql`${orderByUnit}`); } } orderBySql = sql` order by ${sql.join(orderByValues, sql`, `)} `; } const limitSql = typeof limit === "object" || typeof limit === "number" && limit >= 0 ? sql` limit ${limit}` : void 0; const operatorChunk = sql.raw(`${type} ${isAll ? "all " : ""}`); const offsetSql = offset ? sql` offset ${offset}` : void 0; return sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`; } buildInsertQuery({ table, values: valuesOrSelect, ignore, onConflict, select }) { const valuesSqlList = []; const columns = table[Table.Symbol.Columns]; const colEntries = Object.entries(columns).filter( ([_, col]) => !col.shouldDisableInsert() ); const insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column))); const generatedIdsResponse = []; if (select) { const select2 = valuesOrSelect; if (is(select2, SQL)) { valuesSqlList.push(select2); } else { valuesSqlList.push(select2.getSQL()); } } else { const values = valuesOrSelect; valuesSqlList.push(sql.raw("values ")); for (const [valueIndex, value] of values.entries()) { const generatedIds = {}; const valueList = []; for (const [fieldName, col] of colEntries) { const colValue = value[fieldName]; if (colValue === void 0 || is(colValue, Param) && colValue.value === void 0) { if (col.defaultFn !== void 0) { const defaultFnResult = col.defaultFn(); generatedIds[fieldName] = defaultFnResult; const defaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col); valueList.push(defaultValue); } else if (!col.default && col.onUpdateFn !== void 0) { const onUpdateFnResult = col.onUpdateFn(); const newValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col); valueList.push(newValue); } else { valueList.push(sql`default`); } } else { if (col.defaultFn && is(colValue, Param)) { generatedIds[fieldName] = colValue.value; } valueList.push(colValue); } } generatedIdsResponse.push(generatedIds); valuesSqlList.push(valueList); if (valueIndex < values.length - 1) { valuesSqlList.push(sql`, `); } } } const valuesSql = sql.join(valuesSqlList); const ignoreSql = ignore ? sql` ignore` : void 0; const onConflictSql = onConflict ? sql` on duplicate key ${onConflict}` : void 0; return { sql: sql`insert${ignoreSql} into ${table} ${insertOrder} ${valuesSql}${onConflictSql}`, generatedIds: generatedIdsResponse }; } sqlToQuery(sql2, invokeSource) { return sql2.toQuery({ casing: this.casing, escapeName: this.escapeName, escapeParam: this.escapeParam, escapeString: this.escapeString, invokeSource }); } buildRelationalQuery({ fullSchema, schema, tableNamesMap, table, tableConfig, queryConfig: config, tableAlias, nestedQueryRelation, joinOn }) { let selection = []; let limit, offset, orderBy, where; const joins = []; if (config === true) { const selectionEntries = Object.entries(tableConfig.columns); selection = selectionEntries.map(([key, value]) => ({ dbKey: value.name, tsKey: key, field: aliasedTableColumn(value, tableAlias), relationTableTsKey: void 0, isJson: false, selection: [] })); } else { const aliasedColumns = Object.fromEntries( Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]) ); if (config.where) { const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where; where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias); } const fieldsSelection = []; let selectedColumns = []; if (config.columns) { let isIncludeMode = false; for (const [field, value] of Object.entries(config.columns)) { if (value === void 0) { continue; } if (field in tableConfig.columns) { if (!isIncludeMode && value === true) { isIncludeMode = true; } selectedColumns.push(field); } } if (selectedColumns.length > 0) { selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); } } else { selectedColumns = Object.keys(tableConfig.columns); } for (const field of selectedColumns) { const column = tableConfig.columns[field]; fieldsSelection.push({ tsKey: field, value: column }); } let selectedRelations = []; if (config.with) { selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] })); } let extras; if (config.extras) { extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras; for (const [tsKey, value] of Object.entries(extras)) { fieldsSelection.push({ tsKey, value: mapColumnsInAliasedSQLToAlias(value, tableAlias) }); } } for (const { tsKey, value } of fieldsSelection) { selection.push({ dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name, tsKey, field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value, relationTableTsKey: void 0, isJson: false, selection: [] }); } let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? []; if (!Array.isArray(orderByOrig)) { orderByOrig = [orderByOrig]; } orderBy = orderByOrig.map((orderByValue) => { if (is(orderByValue, Column)) { return aliasedTableColumn(orderByValue, tableAlias); } return mapColumnsInSQLToAlias(orderByValue, tableAlias); }); limit = config.limit; offset = config.offset; for (const { tsKey: selectedRelationTsKey, queryConfig: selectedRelationConfigValue, relation } of selectedRelations) { const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation); const relationTableName = getTableUniqueName(relation.referencedTable); const relationTableTsName = tableNamesMap[relationTableName]; const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`; const joinOn2 = and( ...normalizedRelation.fields.map( (field2, i) => eq( aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias) ) ) ); const builtRelation = this.buildRelationalQuery({ fullSchema, schema, tableNamesMap, table: fullSchema[relationTableTsName], tableConfig: schema[relationTableTsName], queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue, tableAlias: relationTableAlias, joinOn: joinOn2, nestedQueryRelation: relation }); const field = sql`${sql.identifier(relationTableAlias)}.${sql.identifier("data")}`.as(selectedRelationTsKey); joins.push({ on: sql`true`, table: new Subquery(builtRelation.sql, {}, relationTableAlias), alias: relationTableAlias, joinType: "left", lateral: true }); selection.push({ dbKey: selectedRelationTsKey, tsKey: selectedRelationTsKey, field, relationTableTsKey: relationTableTsName, isJson: true, selection: builtRelation.selection }); } } if (selection.length === 0) { throw new DrizzleError({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}")` }); } let result; where = and(joinOn, where); if (nestedQueryRelation) { let field = sql`json_array(${sql.join( selection.map( ({ field: field2, tsKey, isJson }) => isJson ? sql`${sql.identifier(`${tableAlias}_${tsKey}`)}.${sql.identifier("data")}` : is(field2, SQL.Aliased) ? field2.sql : field2 ), sql`, ` )})`; if (is(nestedQueryRelation, Many)) { field = sql`coalesce(json_arrayagg(${field}), json_array())`; } const nestedSelection = [{ dbKey: "data", tsKey: "data", field: field.as("data"), isJson: true, relationTableTsKey: tableConfig.tsName, selection }]; const needsSubquery = limit !== void 0 || offset !== void 0 || (orderBy?.length ?? 0) > 0; if (needsSubquery) { result = this.buildSelectQuery({ table: aliasedTable(table, tableAlias), fields: {}, fieldsFlat: [ { path: [], field: sql.raw("*") }, ...((orderBy?.length ?? 0) > 0 ? [{ path: [], field: sql`row_number() over (order by ${sql.join(orderBy, sql`, `)})` }] : []) ], where, limit, offset, setOperators: [] }); where = void 0; limit = void 0; offset = void 0; orderBy = void 0; } else { result = aliasedTable(table, tableAlias); } result = this.buildSelectQuery({ table: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias), fields: {}, fieldsFlat: nestedSelection.map(({ field: field2 }) => ({ path: [], field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2 })), joins, where, limit, offset, orderBy, setOperators: [] }); } else { result = this.buildSelectQuery({ table: aliasedTable(table, tableAlias), fields: {}, fieldsFlat: selection.map(({ field }) => ({ path: [], field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field })), joins, where, limit, offset, orderBy, setOperators: [] }); } return { tableTsKey: tableConfig.tsName, sql: result, selection }; } buildRelationalQueryWithoutLateralSubqueries({ fullSchema, schema, tableNamesMap, table, tableConfig, queryConfig: config, tableAlias, nestedQueryRelation, joinOn }) { let selection = []; let limit, offset, orderBy = [], where; if (config === true) { const selectionEntries = Object.entries(tableConfig.columns); selection = selectionEntries.map(([key, value]) => ({ dbKey: value.name, tsKey: key, field: aliasedTableColumn(value, tableAlias), relationTableTsKey: void 0, isJson: false, selection: [] })); } else { const aliasedColumns = Object.fromEntries( Object.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]) ); if (config.where) { const whereSql = typeof config.where === "function" ? config.where(aliasedColumns, getOperators()) : config.where; where = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias); } const fieldsSelection = []; let selectedColumns = []; if (config.columns) { let isIncludeMode = false; for (const [field, value] of Object.entries(config.columns)) { if (value === void 0) { continue; } if (field in tableConfig.columns) { if (!isIncludeMode && value === true) { isIncludeMode = true; } selectedColumns.push(field); } } if (selectedColumns.length > 0) { selectedColumns = isIncludeMode ? selectedColumns.filter((c) => config.columns?.[c] === true) : Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key)); } } else { selectedColumns = Object.keys(tableConfig.columns); } for (const field of selectedColumns) { const column = tableConfig.columns[field]; fieldsSelection.push({ tsKey: field, value: column }); } let selectedRelations = []; if (config.with) { selectedRelations = Object.entries(config.with).filter((entry) => !!entry[1]).map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey] })); } let extras; if (config.extras) { extras = typeof config.extras === "function" ? config.extras(aliasedColumns, { sql }) : config.extras; for (const [tsKey, value] of Object.entries(extras)) { fieldsSelection.push({ tsKey, value: mapColumnsInAliasedSQLToAlias(value, tableAlias) }); } } for (const { tsKey, value } of fieldsSelection) { selection.push({ dbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey].name, tsKey, field: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value, relationTableTsKey: void 0, isJson: false, selection: [] }); } let orderByOrig = typeof config.orderBy === "function" ? config.orderBy(aliasedColumns, getOrderByOperators()) : config.orderBy ?? []; if (!Array.isArray(orderByOrig)) { orderByOrig = [orderByOrig]; } orderBy = orderByOrig.map((orderByValue) => { if (is(orderByValue, Column)) { return aliasedTableColumn(orderByValue, tableAlias); } return mapColumnsInSQLToAlias(orderByValue, tableAlias); }); limit = config.limit; offset = config.offset; for (const { tsKey: selectedRelationTsKey, queryConfig: selectedRelationConfigValue, relation } of selectedRelations) { const normalizedRelation = normalizeRelation(schema, tableNamesMap, relation); const relationTableName = getTableUniqueName(relation.referencedTable); const relationTableTsName = tableNamesMap[relationTableName]; const relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`; const joinOn2 = and( ...normalizedRelation.fields.map( (field2, i) => eq( aliasedTableColumn(normalizedRelation.references[i], relationTableAlias), aliasedTableColumn(field2, tableAlias) ) ) ); const builtRelation = this.buildRelationalQueryWithoutLateralSubqueries({ fullSchema, schema, tableNamesMap, table: fullSchema[relationTableTsName], tableConfig: schema[relationTableTsName], queryConfig: is(relation, One) ? selectedRelationConfigValue === true ? { limit: 1 } : { ...selectedRelationConfigValue, limit: 1 } : selectedRelationConfigValue, tableAlias: relationTableAlias, joinOn: joinOn2, nestedQueryRelation: relation }); let fieldSql = sql`(${builtRelation.sql})`; if (is(relation, Many)) { fieldSql = sql`coalesce(${fieldSql}, json_array())`; } const field = fieldSql.as(selectedRelationTsKey); selection.push({ dbKey: selectedRelationTsKey, tsKey: selectedRelationTsKey, field, relationTableTsKey: relationTableTsName, isJson: true, selection: builtRelation.selection }); } } if (selection.length === 0) { throw new DrizzleError({ message: `No fields selected for table "${tableConfig.tsName}" ("${tableAlias}"). You need to have at least one item in "columns", "with" or "extras". If you need to select all columns, omit the "columns" key or set it to undefined.` }); } let result; where = and(joinOn, where); if (nestedQueryRelation) { let field = sql`json_array(${sql.join( selection.map( ({ field: field2 }) => is(field2, MySqlColumn) ? sql.identifier(this.casing.getColumnCasing(field2)) : is(field2, SQL.Aliased) ? field2.sql : field2 ), sql`, ` )})`; if (is(nestedQueryRelation, Many)) { field = sql`json_arrayagg(${field})`; } const nestedSelection = [{ dbKey: "data", tsKey: "data", field, isJson: true, relationTableTsKey: tableConfig.tsName, selection }]; const needsSubquery = limit !== void 0 || offset !== void 0 || orderBy.length > 0; if (needsSubquery) { result = this.buildSelectQuery({ table: aliasedTable(table, tableAlias), fields: {}, fieldsFlat: [ { path: [], field: sql.raw("*") }, ...(orderBy.length > 0 ? [{ path: [], field: sql`row_number() over (order by ${sql.join(orderBy, sql`, `)})` }] : []) ], where, limit, offset, setOperators: [] }); where = void 0; limit = void 0; offset = void 0; orderBy = void 0; } else { result = aliasedTable(table, tableAlias); } result = this.buildSelectQuery({ table: is(result, MySqlTable) ? result : new Subquery(result, {}, tableAlias), fields: {}, fieldsFlat: nestedSelection.map(({ field: field2 }) => ({ path: [], field: is(field2, Column) ? aliasedTableColumn(field2, tableAlias) : field2 })), where, limit, offset, orderBy, setOperators: [] }); } else { result = this.buildSelectQuery({ table: aliasedTable(table, tableAlias), fields: {}, fieldsFlat: selection.map(({ field }) => ({ path: [], field: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field })), where, limit, offset, orderBy, setOperators: [] }); } return { tableTsKey: tableConfig.tsName, sql: result, selection }; } } export { MySqlDialect }; //# sourceMappingURL=dialect.js.map
Save
cmd:
run