{"version":3,"file":"join.mjs","sources":["../../../src/query/helpers/join.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport type { Ctx } from '../types';\n\nexport interface Join {\n method?: 'leftJoin' | 'innerJoin';\n alias: string;\n referencedTable: string;\n referencedColumn: string;\n rootColumn: string;\n rootTable?: string;\n on?: Record;\n orderBy?: Record;\n}\n\ninterface JoinOptions {\n alias: string;\n refAlias?: string;\n attributeName: string;\n attribute: any;\n}\n\ninterface PivotJoinOptions {\n alias: string;\n refAlias?: string;\n joinTable: any;\n targetMeta: any;\n}\n\nconst createPivotJoin = (\n ctx: Ctx,\n { alias, refAlias, joinTable, targetMeta }: PivotJoinOptions\n) => {\n const { qb } = ctx;\n const joinAlias = qb.getAlias();\n qb.join({\n alias: joinAlias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.joinColumn.name,\n rootColumn: joinTable.joinColumn.referencedColumn,\n rootTable: alias,\n on: joinTable.on,\n });\n\n const subAlias = refAlias || qb.getAlias();\n qb.join({\n alias: subAlias,\n referencedTable: targetMeta.tableName,\n referencedColumn: joinTable.inverseJoinColumn.referencedColumn,\n rootColumn: joinTable.inverseJoinColumn.name,\n rootTable: joinAlias,\n });\n\n return subAlias;\n};\n\nconst createJoin = (ctx: Ctx, { alias, refAlias, attributeName, attribute }: JoinOptions) => {\n const { db, qb, uid } = ctx;\n\n if (attribute.type !== 'relation') {\n throw new Error(`Cannot join on non relational field ${attributeName}`);\n }\n\n const targetMeta = db.metadata.get(attribute.target);\n\n if (['morphOne', 'morphMany'].includes(attribute.relation)) {\n const targetAttribute = targetMeta.attributes[attribute.morphBy];\n\n // @ts-expect-error - morphBy is not defined on the attribute\n const { joinTable, morphColumn } = targetAttribute;\n\n if (morphColumn) {\n const subAlias = refAlias || qb.getAlias();\n\n qb.join({\n alias: subAlias,\n referencedTable: targetMeta.tableName,\n referencedColumn: morphColumn.idColumn.name,\n rootColumn: morphColumn.idColumn.referencedColumn,\n rootTable: alias,\n on: {\n [morphColumn.typeColumn.name]: uid,\n ...morphColumn.on,\n },\n });\n\n return subAlias;\n }\n\n if (joinTable) {\n const joinAlias = qb.getAlias();\n\n qb.join({\n alias: joinAlias,\n referencedTable: joinTable.name,\n referencedColumn: joinTable.morphColumn.idColumn.name,\n rootColumn: joinTable.morphColumn.idColumn.referencedColumn,\n rootTable: alias,\n on: {\n [joinTable.morphColumn.typeColumn.name]: uid,\n field: attributeName,\n },\n });\n\n const subAlias = refAlias || qb.getAlias();\n\n qb.join({\n alias: subAlias,\n referencedTable: targetMeta.tableName,\n referencedColumn: joinTable.joinColumn.referencedColumn,\n rootColumn: joinTable.joinColumn.name,\n rootTable: joinAlias,\n });\n\n return subAlias;\n }\n\n return alias;\n }\n\n const { joinColumn } = attribute;\n\n if (joinColumn) {\n const subAlias = refAlias || qb.getAlias();\n qb.join({\n alias: subAlias,\n referencedTable: targetMeta.tableName,\n referencedColumn: joinColumn.referencedColumn,\n rootColumn: joinColumn.name,\n rootTable: alias,\n });\n return subAlias;\n }\n\n const { joinTable } = attribute;\n if (joinTable) {\n return createPivotJoin(ctx, { alias, refAlias, joinTable, targetMeta });\n }\n\n return alias;\n};\n\n// TODO: toColumnName for orderBy & on\nconst applyJoin = (qb: Knex.QueryBuilder, join: Join) => {\n const {\n method = 'leftJoin',\n alias,\n referencedTable,\n referencedColumn,\n rootColumn,\n // FIXME: qb.alias can't exist here\n rootTable, // = qb.alias\n on,\n orderBy,\n } = join;\n\n qb[method](`${referencedTable} as ${alias}`, (inner) => {\n inner.on(`${rootTable}.${rootColumn}`, `${alias}.${referencedColumn}`);\n\n if (on) {\n for (const key of Object.keys(on)) {\n inner.onVal(`${alias}.${key}`, on[key]);\n }\n }\n });\n\n if (orderBy) {\n Object.keys(orderBy).forEach((column) => {\n const direction = orderBy[column];\n qb.orderBy(`${alias}.${column}`, direction);\n });\n }\n};\n\nconst applyJoins = (qb: Knex.QueryBuilder, joins: Join[]) => {\n return joins.forEach((join) => applyJoin(qb, join));\n};\n\nexport { createJoin, createPivotJoin, applyJoins, applyJoin };\n"],"names":["createPivotJoin","ctx","alias","refAlias","joinTable","targetMeta","qb","joinAlias","getAlias","join","referencedTable","name","referencedColumn","joinColumn","rootColumn","rootTable","on","subAlias","tableName","inverseJoinColumn","createJoin","attributeName","attribute","db","uid","type","Error","metadata","get","target","includes","relation","targetAttribute","attributes","morphBy","morphColumn","idColumn","typeColumn","field","applyJoin","method","orderBy","inner","key","Object","keys","onVal","forEach","column","direction","applyJoins","joins"],"mappings":"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"}