import { QueryActions } from './actions';
import { MetadataConstraint, MetadataModel, MetadataParameter, Metadata } from '../../sentence/domain';
import { QueryPlan } from '../../query/domain';
export declare class QueryAction {
    protected actions: any;
    protected query: any;
    constructor(actions: QueryActions, query: string);
    execute(data: any): Promise<any>;
    normalize(): string;
    model(): Promise<MetadataModel[]>;
    constraints(): Promise<MetadataConstraint>;
    parameters(): Promise<MetadataParameter[]>;
    sentence(): Promise<QueryPlan>;
    metadata(): Promise<Metadata>;
}
export declare class PageClauses extends QueryAction {
    /**  */
    page(page: number, records: number): QueryAction;
}
export declare class MapClauses<T> extends PageClauses {
    /**  */
    sort(predicate: (value: T, index: number, array: T[]) => unknown): PageClauses;
}
export declare class Map2Clauses<T> extends QueryAction {
    /**  */
    sort(predicate: (value: T, index: number, array: T[]) => unknown): PageClauses;
}
export declare class HavingClauses<T> extends MapClauses<T> {
    /**  */
    map<U>(predicate: (value: T, index: number, array: T[]) => U): MapClauses<U>;
    /**  */
    first<U>(predicate: (value: T, index: number, array: T[]) => U): Map2Clauses<U>;
    /**  */
    last<U>(predicate: (value: T, index: number, array: T[]) => U): Map2Clauses<U>;
    /**  */
    distinct<U>(predicate: (value: T, index: number, array: T[]) => U): MapClauses<U>;
}
export declare class FilterIncludeClauses<T> extends HavingClauses<T> {
    /**  */
    having(predicate: (value: T, index: number, array: T[]) => unknown): HavingClauses<T>;
}
export declare class IncludeClauses<T> extends HavingClauses<T> {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown): FilterIncludeClauses<T>;
    /**  */
    having(predicate: (value: T, index: number, array: T[]) => unknown): HavingClauses<T>;
}
export declare class FilterClauses<T> extends HavingClauses<T> {
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown): IncludeClauses<T>;
    /**  */
    having(predicate: (value: T, index: number, array: T[]) => unknown): HavingClauses<T>;
}
export declare class FilterAction<T> extends QueryAction {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown): QueryAction;
}
export declare class IncludeAction<T> extends QueryAction {
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown): QueryAction;
}
export declare class ModificableClauses<T> extends QueryAction {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown): FilterClauses<T>;
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown): FilterAction<T>;
}
export declare class Queryable<T> extends HavingClauses<T> {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown): FilterClauses<T>;
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown): IncludeClauses<T>;
    /**  */
    having(predicate: (value: T, index: number, array: T[]) => unknown): HavingClauses<T>;
    /**  */
    insert(predicate?: (value: T) => unknown | T): ModificableClauses<T>;
    upsert(predicate?: (value: T) => unknown | T): ModificableClauses<T>;
    /**  */
    bulkInsert(value?: T): ModificableClauses<T>;
    /**  */
    update(predicate?: (value: T, index: number, array: T[]) => unknown): ModificableClauses<T>;
    /**  */
    updateAll(predicate: (value: T, index: number, array: T[]) => unknown): IncludeAction<T>;
    merge(predicate?: (value: T) => unknown | T): ModificableClauses<T>;
    /**  */
    bulkMerge(value?: T): ModificableClauses<T>;
    /**  */
    bulkDelete(value?: T): ModificableClauses<T>;
    /**  */
    delete(predicate?: (value: T) => unknown): ModificableClauses<T>;
    /**  */
    deleteAll(): IncludeAction<T>;
}
export interface ModifyFilterClauses<T> {
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): void;
}
export interface ModifyIncludeClauses<T> {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): ModifyFilterClauses<T>;
}
export interface ModifyClauses<T> {
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): ModifyFilterClauses<T>;
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): ModifyIncludeClauses<T>;
}
export interface ModifyAllClauses<T> {
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): ModifyIncludeClauses<T>;
}
export interface RelationMapClauses<T> {
    /**  */
    sort(predicate: (value: T, index: number, array: T[]) => unknown, ...args: any): void;
    /**  */
    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): FilterClauses<T>;
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): IncludeClauses<T>;
}
export interface RelationIncludeClauses<T> {
    /**  */
    map<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    first<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    last<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    distinct<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
}
export interface IRelation<T> {
    /**  */
    map<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    first<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    last<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    distinct<U>(predicate: (value: T, index: number, array: T[]) => U, thisArg?: any): RelationMapClauses<T>;
    /**  */
    include(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): RelationIncludeClauses<T>;
    /**  */
    update(predicate?: (value: T) => unknown): void;
    /**  */
    insert(predicate?: (value: T) => unknown): void;
    /**  */
    upsert(predicate?: (value: T) => unknown): void;
    filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): FilterClauses<T>;
}
export type OneToMany<T> = IRelation<T>;
export type OneToOne<T> = IRelation<T>;
export type ManyToOne<T> = IRelation<T>;
/**  */
export declare function as(value: any, name: any): any;
/**  */
export declare function desc(value: any): void;
/**  */
export declare function asc(value: any): void;
/**  */
export declare function between(value: any, from: any, to: any): boolean;
/**  */
export declare function includes(value: any, list: any[]): boolean;
/**  */
export declare function distinct(value: any): any;
/** Get the absolute value */
export declare function abs(value: number): number;
/** Get the arc cosine */
export declare function acos(value: number): number;
/** Get the arc sine */
export declare function asin(value: number): number;
/** Get the arc tangent */
export declare function atan(value: number): number;
/** Get the arc tangent of x and y */
export declare function atan2(x: number, y: number): number;
/** Get the smallest following integer */
export declare function ceil(value: number): number;
/** Get the cosine */
export declare function cos(value: number): number;
/** Get hyperbolic cosine */
export declare function cosh(value: number): number;
/** Raise e to the nth power */
export declare function exp(value: number): number;
/** Get the largest preceding integer */
export declare function floor(value: number): number;
/** Get natural logarithm of num */
export declare function ln(value: number): number;
/** Get logarithm, base num1, of num2 */
export declare function log(num1: number, num2: number): number;
/** Get remainder */
export declare function remainder(n1: number, n2: number): number;
/** Get rounded value  */
export declare function round(value: number, decimals: number): number;
/** Get sign of exp */
export declare function sign(value: number): number;
/** Get sine  */
export declare function sin(value: number): number;
/** Get hyperbolic sine  */
export declare function sinh(value: number): number;
/** Get tangent */
export declare function tan(value: number): number;
/** Get hyperbolic tangent */
export declare function tanh(value: number): number;
/** Truncate num  */
export declare function trunc(value: number, decimals: number): number;
/** Get character from ASCII code */
export declare function chr(value: string): string;
/**  Capitalize words */
/** Lowercase string */
export declare function lower(value: string): string;
/** Pad the left-side of string */
export declare function lpad(value: string, len: number, pad: string): string;
/** Remove leading chars */
export declare function ltrim(value: string): string;
/** The replace() method searches a string for a specified value and returns a new string where the specified values are replaced. */
export declare function replace(value: string, source: string, target: string): string;
/** Pad the right-side of string */
export declare function rpad(value: string, len: number, pad: string): string;
/** Remove trailing spaces */
export declare function rtrim(value: string): string;
/** Get a substring of string */
export declare function substr(value: string, from: number, count: number): string;
/** Get a substring of string */
export declare function substring(value: string, from: number, count: number): string;
/** Remove characters */
export declare function trim(value: string): string;
/** Uppercase string */
export declare function upper(value: string): string;
/** String concatenation */
export declare function concat(...values: string[]): string;
/** Get the position of the first occurrence of substring */
export declare function like(field: string, searchString: string): string;
/**
 * Returns true if the sequence of elements of searchString converted to a String is the
 * same as the corresponding elements of this object (converted to a String) starting at
 * position. Otherwise returns false.
 */
export declare function startsWith(field: string, searchString: string): string;
/** Returns true if searchString appears as a substring of the result of converting this */
export declare function includes(field: string, searchString: string): string;
/** Get the current time */
export declare function curTime(): Date;
/** Get the current date */
export declare function today(): Date;
/** Get the current dateTime */
export declare function now(): Date;
/**  */
export declare function time(value: any): Date;
/**  */
export declare function date(value: any): Date;
/**  */
export declare function dateTime(value: any): Date;
/**  */
export declare function year(value: Date): number;
/**  */
export declare function month(value: Date): number;
/**  */
export declare function day(value: Date): number;
/**  */
export declare function weekday(value: Date): number;
/**  */
export declare function hours(value: Date): number;
/**  */
export declare function minutes(value: Date): number;
/**  */
export declare function seconds(value: Date): number;
/**  */
export declare function addYear(date: Date, value: number): Date;
/**  */
export declare function addMonth(date: Date, value: number): Date;
/**  */
export declare function addDay(date: Date, value: number): Date;
/**  */
export declare function addHours(date: Date, value: number): Date;
/**  */
export declare function addMinutes(date: Date, value: number): Date;
/**  */
export declare function addSeconds(date: Date, value: number): Date;
/**  */
export declare function addTime(date: Date, value: number): Date;
/**  */
export declare function dateDiff(date: Date, date2: Date): Date;
/**  */
export declare function timeDiff(time: Date, time2: Date): Date;
/**  */
export declare function toString(value: any): string;
/**  */
export declare function toDate(value: any): Date;
/**  */
export declare function toDateTime(value: any): string;
/**  */
export declare function toTime(value: any): string;
/**  */
export declare function toJson(value: any): any;
/**  */
export declare function toNumber(value: any): number;
/**  */
export declare function user(): string;
/**  */
export declare function source(): string;
/**  */
export declare function nvl(value: any, _default: any): any;
/**  */
export declare function nvl2(value: any, a: any, b: any): any;
/**  */
export declare function isNull(value: any): boolean;
/**  */
export declare function isNotNull(value: any): boolean;
/**  */
export declare function avg(value: any): any;
/**  */
export declare function count(value: any): any;
/**  */
export declare function first(value: any): any;
/**  */
export declare function last(value: any): any;
/**  */
export declare function max(value: any): any;
/**  */
export declare function min(value: any): any;
/**  */
export declare function sum(value: any): any;
