/**
 * 条件
 */
type FXString = string;
type ConditonOP = 'in' | 'not in' | '=' | '<>' | '<' | '<=' | '>' | '>=' | '@>' | '<@' | '&&' | 'is distinct from' | 'is not distinct from' | 'like' | 'not like' | 'similar to' | 'not similar to' | 'ilike' | 'not ilike' | 'is null' | 'is not null' | 'is true' | 'is not true' | 'is fase' | 'is not fase' | 'between' | 'not exists' | 'exists' | 'regexp' | 'any' | 'some' | 'all' | 'starts with' | 'ends with';
interface Condition {
    /**
     * 条件的连接符
     */
    operator?: 'and' | 'or';
    /**
     * 取否
     */
    not?: boolean;
    /**
     * 比较方法
     */
    op?: ConditonOP;
    /**
     * 比较的左值
     */
    left?: ExpressionOrValue;
    /**
     * 比较的右值
     */
    right?: ExpressionOrValue | JSONQL;
    /**
     * 比较子条件
     */
    children?: Condition[];
    /**
     * 默认值
     */
    default?: string | number | number[] | string[];
}
interface Value {
    /**
     * 常量
     */
    val?: string;
    /**
     * 变量
     */
    var?: string;
}
export interface OrderBy {
    /**
     * 列名
     */
    column?: string | Expression;
    /**
     * 名称，对应前面的 alias
     */
    name?: string | number;
    /**
     * 排序方式
     */
    sort?: 'desc' | 'asc' | FXString;
    /**
     * null 值在前面还是后面
     */
    null?: 'first' | 'last';
}
/**
 * case 语句的内容
 */
interface Case {
    when: Condition;
    then: string | Value;
}
type JoinType = 'left join' | 'right join' | 'join' | 'full join' | 'left outer join' | 'right outer join' | 'full outer join';
/**
 * join 语句
 */
interface Join {
    /**
     * 要 join 的表名
     */
    table: string;
    /**
     * join 类型
     */
    joinType: JoinType;
    /**
     * join 的条件
     */
    on?: Condition;
    /**
     * using 语句，不推荐使用
     */
    using?: Expression[];
}
interface Over {
    /**
     * 窗口函数的 partition by
     */
    partitionBy?: Expression[];
    /**
     * 窗口函数的的 order by
     */
    orderBy?: OrderBy[];
}
interface Column {
    /**
     * 查询列
     */
    column?: string | '*';
    /**
     * 所属表
     */
    table?: string;
    /**
     * 级联名称
     */
    cascadeName?: string;
    /**
     * 级联字段
     */
    cascadeColumn?: string;
}
/**
 * 表达式
 */
interface Expression extends Column {
    /**
     * 表达式字符串写法
  
     */
    exp?: string;
    /**
     * alias 名称
     */
    name?: string;
    /**
     * 常量
     */
    val?: string | number;
    /**
     * 变量
     */
    var?: string | number;
    /**
     * 是否加上 distinct
     */
    distinct?: boolean;
    /**
     * 两位计算
     */
    binary?: string;
    /**
     * 两位计算的左值
     */
    left?: Expression;
    /**
     * 两位计算的右值
     */
    right?: Expression;
    /**
     * 单符号计算
     */
    sign?: '-' | '+' | '~' | '!';
    /**
     * 单符号计算的内容
     */
    body?: Expression;
    /**
     * case 语句
     */
    case?: Case[];
    /**
     * case 语句的 else
     */
    else?: Expression | string;
    /**
     * alias
     *
     */
    as?: string;
    /**
     * 调用函数
     *
     */
    func?: string;
    /**
     * 结果过滤函数
     *
     */
    filter?: string;
    /**
     * 函数参数
     */
    arg?: number | string;
    /**
     * 函数多个参数
     */
    args?: ExpressionOrValue[];
    /**
     * 窗口函数
     */
    over?: Over;
    /**
     * 关系查询
     */
    relation?: string;
    /**
     * 关系查询的 select
     */
    select?: Expression[];
    /**
     * 关系查询的 join 类型
     */
    joinType?: JoinType;
}
type ExpressionOrValue = Expression | string | number | string[] | number[];
/**
 * JSONQL 定义
 */
export interface JSONQL {
    /**
     * sql 字符串写法
     *
     */
    sql?: string;
    /**
     * 语句，不填就是 select
     */
    statement?: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE' | 'select' | 'insert' | 'update' | 'delete';
    /**
     * 是否返回多条结果
     */
    many?: boolean;
    /**
     * 查询哪个表
     *
     */
    from?: string;
    /**
     * 写入或删除哪个表
     */
    table?: string;
    /**
     * 写入的数据
     */
    values?: object | FXString;
    /**
     * 更新数据
     */
    set?: object | FXString;
    /**
     * 更新表达式
     */
    setExp?: {
        [key: string]: Expression;
    };
    /**
     * 查询字段
     */
    select?: Expression[] | String[];
    /**
     * 是否返回所有结果计数，也就是去掉 where 过滤条件的结果
     */
    count?: boolean;
    /**
     * 查询条件
     */
    where?: Condition | object;
    /**
     * 对聚合的过滤
     */
    having?: Condition;
    /**
     * 排序方式
     */
    orderBy?: Array<OrderBy | number>;
    /**
     * groupBy
     */
    groupBy?: Array<ExpressionOrValue>;
    /**
     * 限制返回结果数量
     *
     * @minimum 0
     */
    limit?: number | FXString;
    /**
     * 结果偏移量
     *
     * @minimum 0
     */
    offset?: number | FXString;
    page?: number | FXString;
    perPage?: number | FXString;
    /**
     * 查询结果是否加上 with ties，只有 oracle、sql server 等支持
     */
    withTies?: boolean;
    /**
     * join 其它表
     */
    join?: Join[];
    /**
     * 合并多表
     */
    union?: JSONQL[];
    /**
     *  不去重合并多表
     */
    unionAll?: JSONQL[];
    /**
     * 二次查询
     */
    secondQuery?: JSONQL[];
    /**
     * 是否强制返回主键
     */
    primaryKeyRequired?: boolean;
}
export type JSONQLWhereCondition = Condition;
export type JSONQLWhereConditionOP = ConditonOP;
export {};
