{"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<string, any>;\n  orderBy?: Record<string, 'asc' | 'desc'>;\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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"}