UNPKG

@cran/gql.jm

Version:

Cran/GraphQL Join Monster Utilities

53 lines (52 loc) 1.81 kB
import { MapperKind, createDirective, getExtension } from "@cran/gql.core"; export function withSqlJoin(name = "sqlJoin") { return createDirective(name, { column: "text!", identity: "bool", references: "text", in: "text", contains: "text", }, { [MapperKind.COMPOSITE_FIELD]([directive,], field) { Object.assign(getExtension(field, "joinMonster", {}), { sqlJoin: makeResolver(directive), }); }, }); } function makeResolver(directive) { switch (false) { case !directive.identity: return makeIdentity(directive.column); case !directive.references: return makeReferences(directive.column, directive.references); case !directive.in: return makeIn(directive.column, directive.in); case !directive.contains: return makeContains(directive.column, directive.contains); default: return makeError(directive); } } function makeIdentity(column) { return function sqlReferences(table, foreign) { return `${table}."${column}" = ${foreign}."${column}"`; }; } function makeReferences(column, references) { return function sqlReferences(table, foreign) { return `${table}."${column}" = ${foreign}."${references}"`; }; } function makeIn(column, references) { return function sqlIn(table, foreign) { return `${table}."${column}" = any(${foreign}."${references}")`; }; } function makeContains(column, references) { return function sqlIn(table, foreign) { return `${foreign}."${references}" = any(${table}."${column}")`; }; } function makeError(directive) { return function sqlError() { throw new Error(`SqlJoin: no join operation selected on ${JSON.stringify(directive)}`); }; }