import { AnyExpression, condition, expression, Condition, Expression, ToType, ToExpression } from '../expressions' import { Type, IntegerType, ArrayArg, BooleanType } from '../types' import { sql } from '../template' import { Query } from '..' export function NUM_NONNULLS (...args: (any)[]): Expression { return expression`NUM_NONNULLS(${sql.join([...args])})` } export function NUM_NULLS (...args: (any)[]): Expression { return expression`NUM_NULLS(${sql.join([...args])})` } export interface CaseConfig { when: Condition, then: T } export function CASE (cases: T, $else: E): Expression> | Expression> export function CASE (cases: T): Expression> export function CASE (cases: CaseConfig[], $else?: any): AnyExpression { const whenThen = cases.map(({ when, then }) => sql`WHEN ${condition(when)} THEN ${then}`) return expression`CASE ${sql.join(whenThen, ' ')}${$else ? sql` ELSE ${$else}` : sql``} END` } export function COALESCE (...args: T): ToExpression { return expression`COALESCE(${sql.join([...args])})` } export function NULLIF (a: T, b: V): Expression> | Expression> { return expression`NULLIF(${a}, ${b})` } export function GREATEST (...args: T): Expression> { return expression`GREATEST(${sql.join([...args])})` } export function LEAST (...args: T): Expression> { return expression`LEAST(${sql.join([...args])})` } export function ANY (arg: Query): any export function ANY (arg: ArrayArg): Expression export function ANY (arg: ArrayArg | Query): Expression { return expression`ANY(${typeof arg === 'object' && '$' in arg ? arg.$ : arg})` } export function SOME (arg: Query): any export function SOME (arg: ArrayArg): Expression export function SOME (arg: ArrayArg | Query): Expression { return expression`SOME(${typeof arg === 'object' && '$' in arg ? arg.$ : arg})` } export function ALL (arg: Query): any export function ALL (arg: ArrayArg): Expression export function ALL (arg: ArrayArg | Query): Expression { return expression`ALL(${typeof arg === 'object' && '$' in arg ? arg.$ : arg})` } export function EXISTS (subquery: Query): Expression { return expression`EXISTS(${subquery.$})` } export function ROW (...args: any[]): Expression export function ROW (subquery: Query): Expression export function ROW (subquery: Query, ...args: any[]): Expression { return expression`ROW(${sql.join(typeof subquery === 'object' && '$' in subquery ? [subquery.$] : [subquery, ...args])})` }