import { AtomicTypes, Comparable, Flatten, Row, Values } from './utils.ts'; import { Type } from './type.ts'; import { Field, Relation } from './model.ts'; import { Query } from './query.ts'; export declare function isEvalExpr(value: any): value is Eval.Expr; export declare const isUpdateExpr: (value: any) => boolean; export declare function isAggrExpr(expr: Eval.Expr): boolean; export declare function hasSubquery(value: any): boolean; type UnevalObject = { [K in keyof S]?: (undefined extends S[K] ? null : never) | Uneval, boolean>; }; export type Uneval = U extends Values ? Eval.Term : U extends (infer T extends object)[] ? Relation.Modifier | Eval.Array : U extends object ? Eval.Expr | UnevalObject> | Relation.Modifier : any; export type Eval = U extends Values ? U : U extends Eval.Expr ? T : never; declare const kExpr: unique symbol; declare const kType: unique symbol; declare const kAggr: unique symbol; export declare namespace Eval { interface Expr { [kExpr]: true; [kType]?: T; [kAggr]?: A; [Type.kType]?: Type; } type Any = Comparable | Expr; type Term = T | Expr; type Array = Term[] | Expr; type Unary = (x: Term) => Expr; type Binary = (x: Term, y: Term) => Expr; type Multi = (...args: Term[]) => Expr; interface Aggr { (value: Term): Expr; (value: Array): Expr; } interface Branch { case: Term; then: Term; } interface Static { (key: string, value: any, type: Type): Eval.Expr; ignoreNull(value: Eval.Expr): Eval.Expr; select(...args: Any[]): Expr; query(row: Row, query: Query.Expr, expr?: Term): Expr; if(cond: Any, vThen: Term, vElse: Term): Expr; ifNull(...args: Term[]): Expr; switch(branches: Branch[], vDefault: Term): Expr; add: Multi; mul: Multi; multiply: Multi; sub: Binary; subtract: Binary; div: Binary; divide: Binary; mod: Binary; modulo: Binary; abs: Unary; floor: Unary; ceil: Unary; round: Unary; exp: Unary; log(x: Term, base?: Term): Expr; pow: Binary; power: Binary; random(): Expr; eq: Multi; ne: Binary; gt: Binary; ge: Binary; gte: Binary; lt: Binary; le: Binary; lte: Binary; in(x: Term, array: Array): Expr; in(x: Term[], array: Array): Expr; nin(x: Term, array: Array): Expr; nin(x: Term[], array: Array): Expr; concat: Multi; regex(x: Term, y: RegExp): Expr; regex(x: Term, y: Term, flags?: string): Expr; and: Multi & Multi & Multi; or: Multi & Multi & Multi; not: Unary & Unary & Unary; xor: Multi & Multi & Multi; literal(value: T, type?: Type | Field.Type | Field.NewType | string): Expr; number: Unary; sum: Aggr; avg: Aggr; max: Aggr; min: Aggr; count(value: Any): Expr; length(value: Any): Expr; length(value: any[] | Expr): Expr; object(row: Row.Cell): Expr; object(row: Row): Expr; array(value: Expr): Expr; get(x: Term, key: K): Expr; get(x: Array, index: Term): Expr; } } export declare const Eval: Eval.Static; export { Eval as $ }; export type Update = UnevalObject>; export declare function executeEval(data: any, expr: any): any; export declare function executeUpdate(data: any, update: any, ref: string): any;