@opra/common
Version:
Opra common package
104 lines (103 loc) • 3.34 kB
JavaScript
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);
};