@cran/gql.jm
Version:
Cran/GraphQL Join Monster Utilities
53 lines (52 loc) • 1.81 kB
JavaScript
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)}`);
};
}