oak-domain/lib/types/Expression.d.ts

167 lines
5.6 KiB
TypeScript

import { RefAttr } from "./Demand";
import { Geo } from "./Geo";
export type RefOrExpression<A> = RefAttr<A> | Expression<A>;
type MathType<A> = RefOrExpression<A> | number;
type StringType<A> = RefOrExpression<A> | string;
interface Add<A> {
$add: (MathType<A>)[];
}
interface Subtract<A> {
$subtract: [MathType<A>, MathType<A>];
}
interface Multiply<A> {
$multiply: (MathType<A>)[];
}
interface Divide<A> {
$divide: [MathType<A>, MathType<A>];
}
interface Abs<A> {
$abs: MathType<A>;
}
interface Round<A> {
$round: [MathType<A>, MathType<A>];
}
interface Floor<A> {
$floor: MathType<A>;
}
interface Ceil<A> {
$ceil: MathType<A>;
}
interface Pow<A> {
$pow: [MathType<A>, MathType<A>];
}
interface Mod<A> {
$mod: [MathType<A>, MathType<A>];
}
type MathExpression<A> = Add<A> | Subtract<A> | Multiply<A> | Divide<A> | Abs<A> | Round<A> | Floor<A> | Ceil<A> | Pow<A> | Mod<A>;
type CmpType<A> = RefOrExpression<A> | string | number;
interface Gt<A> {
$gt: [CmpType<A>, CmpType<A>];
}
interface Lt<A> {
$lt: [CmpType<A>, CmpType<A>];
}
interface Eq<A> {
$eq: [CmpType<A>, CmpType<A>];
}
interface Gte<A> {
$gte: [CmpType<A>, CmpType<A>];
}
interface Lte<A> {
$lte: [CmpType<A>, CmpType<A>];
}
interface Ne<A> {
$ne: [CmpType<A>, CmpType<A>];
}
interface StartsWith<A> {
$startsWith: [RefOrExpression<A> | string, RefOrExpression<A> | string];
}
interface EndsWith<A> {
$endsWith: [RefOrExpression<A> | string, RefOrExpression<A> | string];
}
interface Includes<A> {
$includes: [RefOrExpression<A> | string, RefOrExpression<A> | string];
}
type CompareExpression<A> = Lt<A> | Gt<A> | Lte<A> | Gte<A> | Eq<A> | Ne<A> | StartsWith<A> | EndsWith<A> | Includes<A>;
interface BoolTrue<A> {
$true: Expression<A>;
}
interface BoolFalse<A> {
$false: Expression<A>;
}
type BoolExpression<A> = BoolTrue<A> | BoolFalse<A>;
interface LogicAnd<A> {
$and: Expression<A>[];
}
interface LogicOr<A> {
$or: Expression<A>[];
}
interface LogicNot<A> {
$not: Expression<A>;
}
type LogicExpression<A> = LogicAnd<A> | LogicOr<A> | LogicNot<A>;
interface DateYear<A> {
$year: RefOrExpression<A> | Date | number;
}
interface DateMonth<A> {
$month: RefOrExpression<A> | Date | number;
}
interface DateWeekday<A> {
$weekday: RefOrExpression<A> | Date | number;
}
interface DateWeekOfYear<A> {
$weekOfYear: RefOrExpression<A> | Date | number;
}
interface DateDay<A> {
$day: RefOrExpression<A> | Date | number;
}
interface DateDayOfMonth<A> {
$dayOfMonth: RefOrExpression<A> | Date | number;
}
interface DateDayOfWeek<A> {
$dayOfWeek: RefOrExpression<A> | Date | number;
}
interface DateDayOfYear<A> {
$dayOfYear: RefOrExpression<A> | Date | number;
}
interface DateDiff<A> {
$dateDiff: [RefOrExpression<A> | Date | number, RefOrExpression<A> | Date | number, 'y' | 'M' | 'd' | 'h' | 'm' | 's'];
}
interface DateCeiling<A> {
$dateCeil: [RefOrExpression<A> | Date | number, 'y' | 'M' | 'd' | 'h' | 'm' | 's'];
}
interface DateFloor<A> {
$dateFloor: [RefOrExpression<A> | Date | number, 'y' | 'M' | 'd' | 'h' | 'm' | 's'];
}
type DateExpression<A> = DateYear<A> | DateMonth<A> | DateWeekday<A> | DateWeekOfYear<A> | DateDay<A> | DateDayOfYear<A> | DateDayOfMonth<A> | DateDayOfWeek<A> | DateDiff<A> | DateCeiling<A> | DateFloor<A>;
interface StringConcat<A> {
$concat: StringType<A>[];
}
type StringExpression<A> = StringConcat<A>;
interface GeoContains<A> {
$contains: [RefOrExpression<A> | Geo, RefOrExpression<A> | Geo];
}
interface GeoDistance<A> {
$distance: [RefOrExpression<A> | Geo, RefOrExpression<A> | Geo];
}
type GeoExpression<A> = GeoContains<A> | GeoDistance<A>;
interface AggrCountExpression<A> {
$$count: RefOrExpression<A>;
}
interface AggrSumExpression<A> {
$$sum: RefOrExpression<A>;
}
interface AggrMaxExpression<A> {
$$max: RefOrExpression<A>;
}
interface AggrMinExpression<A> {
$$min: RefOrExpression<A>;
}
interface AggrAvgExpression<A> {
$$avg: RefOrExpression<A>;
}
export type AggrExpression<A> = AggrAvgExpression<A> | AggrCountExpression<A> | AggrSumExpression<A> | AggrMaxExpression<A> | AggrMinExpression<A>;
export type Expression<A> = GeoExpression<A> | DateExpression<A> | LogicExpression<A> | BoolExpression<A> | CompareExpression<A> | MathExpression<A> | StringExpression<A>;
export type ExpressionConstant = Geo | number | Date | string | boolean;
export declare function isGeoExpression<A>(expression: any): expression is GeoExpression<A>;
export declare function isDateExpression<A>(expression: any): expression is DateExpression<A>;
export declare function isLogicExpression<A>(expression: any): expression is LogicExpression<A>;
export declare function isBoolExpression<A>(expression: any): expression is BoolExpression<A>;
export declare function isCompareExpression<A>(expression: any): expression is CompareExpression<A>;
export declare function isMathExpression<A>(expression: any): expression is MathExpression<A>;
export declare function isStringExpression<A>(expression: any): expression is StringExpression<A>;
export declare function isAggrExpression<A>(expression: any): expression is AggrExpression<A>;
export declare function isExpression<A>(expression: any): expression is Expression<A>;
export declare function opMultipleParams(op: string): boolean;
export declare function execOp(op: string, params: any): ExpressionConstant;
/**
* 检查一个表达式,并分析其涉及到的属性
* @param expression
* @returns {
* '#current': [当前结点涉及的属性]
* 'node-1': [node-1结点上涉及的属性]
* }
*/
export declare function getAttrRefInExpression(expression: Expression<any>): Record<string, string[]>;
export {};