UNPKG

@opra/common

Version:
104 lines (103 loc) 3.34 kB
import { ArithmeticExpression, ArrayExpression, BooleanLiteral, ComparisonExpression, DateLiteral, Expression, LogicalExpression, NullLiteral, NumberLiteral, ParenthesizedExpression, QualifiedIdentifier, StringLiteral, TimeLiteral, } from './ast/index.js'; export function $or(...items) { return new LogicalExpression({ op: 'or', items }); } export function $and(...items) { return new LogicalExpression({ op: 'and', items }); } export function $date(v) { return new DateLiteral(v); } export function $time(v) { return new TimeLiteral(v); } export function $number(v) { return new NumberLiteral(v); } export function $array(...items) { return new ArrayExpression(items.map(wrapEntryValue)); } export function $field(v) { return new QualifiedIdentifier(v); } export function $eq(left, right) { return comparisonExpression('=', left, right); } export function $ne(left, right) { return comparisonExpression('!=', left, right); } export function $gt(left, right) { return comparisonExpression('>', left, right); } export function $gte(left, right) { return comparisonExpression('>=', left, right); } export function $lt(left, right) { return comparisonExpression('<', left, right); } export function $lte(left, right) { return comparisonExpression('<=', left, right); } export function $in(left, right) { return comparisonExpression('in', left, right); } export function $notIn(left, right) { return comparisonExpression('!in', left, right); } export function $like(left, right) { return comparisonExpression('like', left, right); } export function $notLike(left, right) { return comparisonExpression('!like', left, right); } export function $ilike(left, right) { return comparisonExpression('ilike', left, right); } export function $notILike(left, right) { return comparisonExpression('!ilike', left, right); } export function $paren(expression) { return new ParenthesizedExpression(expression); } export function $arithmetic(n) { const exp = new ArithmeticExpression(); exp.add = (expression) => { exp.append('+', _wrapEntryValue(expression)); return exp; }; exp.sub = (expression) => { exp.append('-', _wrapEntryValue(expression)); return exp; }; exp.mul = (expression) => { exp.append('*', _wrapEntryValue(expression)); return exp; }; exp.div = (expression) => { exp.append('/', _wrapEntryValue(expression)); return exp; }; exp.append('+', wrapEntryValue(n)); return exp; } function comparisonExpression(op, left, right) { const lex = typeof left === 'string' ? new QualifiedIdentifier(left) : wrapEntryValue(left); const rex = wrapEntryValue(right); return new ComparisonExpression({ op, left: lex, right: rex }); } const wrapEntryValue = (v) => Array.isArray(v) ? $array(...v.map(_wrapEntryValue)) : _wrapEntryValue(v); const _wrapEntryValue = (v) => { if (v instanceof Expression) return v; if (typeof v === 'boolean') return new BooleanLiteral(v); if (typeof v === 'number' || typeof v === 'bigint') return new NumberLiteral(v); if (v == null) return new NullLiteral(); if (v instanceof Date) return new DateLiteral(v); return new StringLiteral('' + v); };