{"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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"}