import { IDatabase, IDataBaseExtender, IQueryResultItem, IId, IBaseModule, IChildLoader, NonFunctionPropertyNames, SQLQuery } from "./expo.sql.wrapper.types"; import QuerySelectorTranslator from "./QuerySelectorTranslator"; import { QValue } from "./UsefullMethods"; export type IColumnSelector = (x: T) => any; export type ArrayIColumnSelector = (x: T) => any[]; export type ArrayAndAliasIColumnSelector = (x: T, as: (column: B, alias: string) => B) => any[]; export type InnerSelect = { getInnerSelectSql: () => string; }; export type IUnionSelectorParameter, D extends string> = { querySelector: >(tabelName: D) => IQuerySelector; }; export type IUnionSelector, D extends string> = (x: IUnionSelectorParameter) => GlobalIQuerySelector; export type R = Record; export type ConcatSeperatorChar = "||" | "+" | "-"; export declare enum Param { StartParameter = "#(", EqualTo = "#=", EndParameter = "#)", OR = "#OR", AND = "#AND", LessThan = "#<", GreaterThan = "#>", IN = "#IN(", Not = "#NOT", NULL = "#IS NULL", NotNULL = "#IS NOT NULL", NotEqualTo = "#!=", Contains = "C#like", StartWith = "S#like", EndWith = "E#like", EqualAndGreaterThen = "#>=", EqualAndLessThen = "#<=", OrderByDesc = "#Order By #C DESC", OrderByAsc = "#Order By #C ASC", Limit = "#Limit #Counter", GroupBy = "#GROUP BY", InnerJoin = "#INNER JOIN", LeftJoin = "#LEFT JOIN", RightJoin = "#RIGHT JOIN", CrossJoin = "#CROSS JOIN", Join = "#JOIN", Max = "#MAX", Min = "#MIN", Count = "#COUNT", Sum = "#SUM", Total = "#Total", GroupConcat = "#GroupConcat", Avg = "#AVG", Between = "#BETWEEN", Value = "#Value", Concat = "#Concat", Union = "#UNION", UnionAll = "#UNION ALL", Case = "#CASE", When = "#WHEN", Then = "#THEN", Else = "#ELSE", EndCase = "#END" } export declare type SingleValue = string | number | boolean | Date | undefined | null; export declare type ArrayValue = any[] | undefined; export declare type NumberValue = number | undefined; export declare type StringValue = string | undefined; export type GlobalIQuerySelector = { /** * get the translated sql */ getSql: (sqlType: "DELETE" | "SELECT") => SQLQuery; getInnerSelectSql: () => string; }; export interface IReturnMethods extends GlobalIQuerySelector { firstOrDefault: () => Promise | undefined>; toList: () => Promise[]>; findOrSave: (item: T & IBaseModule) => Promise>; /** * delete based on Query above. */ delete: () => Promise; } export interface IOrderBy { /** * OrderByDesc COLUMN OR COLUMNS */ OrderByDesc: (columnName: IColumnSelector | ArrayIColumnSelector) => ReturnType; /** * OrderByAsc COLUMN OR COLUMNS */ OrderByAsc: (columnName: IColumnSelector | ArrayIColumnSelector) => ReturnType; /** * Limit the rows */ Limit: (value: number) => ReturnType; /** * GroupBy column or columns */ GroupBy: (columnName: IColumnSelector | ArrayIColumnSelector) => ReturnType; } export interface GenericQuery extends IReturnMethods, IOrderBy { /** * Select based on Column */ Column: (column: IColumnSelector) => ReturnType; /** * Bring togather columns and values, seperated by ConcatSeperatorChar */ Concat: (collectCharacters_type: ConcatSeperatorChar, ...columnOrValues: (IColumnSelector | string)[]) => ReturnType; /** * Add BETWEEN */ Between(value1: SingleValue | IColumnSelector, value2: SingleValue | IColumnSelector): ReturnType; /** * EqualTo based on value or column from a table */ EqualTo: (value: SingleValue | IColumnSelector | InnerSelect) => ReturnType; /** * Contains based on value or column from a table */ Contains: (value: StringValue | IColumnSelector) => ReturnType; /** * StartsWith based on value or column from a table */ StartsWith: (value: StringValue | IColumnSelector) => ReturnType; /** * EndsWith based on value or column from a table */ EndsWith: (value: StringValue | IColumnSelector) => ReturnType; /** * NotEqualTo based on value or column from a table */ NotEqualTo: (value: SingleValue | IColumnSelector | InnerSelect) => ReturnType; /** * EqualAndGreaterThen based on value or column from a table */ EqualAndGreaterThen: (value: NumberValue | StringValue | IColumnSelector | InnerSelect) => ReturnType; /** * EqualAndLessThen based on value or column from a table */ EqualAndLessThen: (value: NumberValue | StringValue | IColumnSelector | InnerSelect) => ReturnType; /** * Add ( */ Start: ReturnType; /** * Add ) */ End: ReturnType; /** * Add OR */ OR: ReturnType; /** * Add AND */ AND: ReturnType; /** * GreaterThan based on value or column from a table */ GreaterThan: (value: NumberValue | StringValue | IColumnSelector | InnerSelect) => ReturnType; /** * LessThan based on value or column from a table */ LessThan: (value: NumberValue | StringValue | IColumnSelector | InnerSelect) => ReturnType; /** * IN based on array Value or column from a table */ IN: (value: ArrayValue | IColumnSelector | InnerSelect) => ReturnType; /** * Add NOT */ Not: ReturnType; /** * Add IS NULL */ Null: ReturnType; /** * Add IS NOT NULL */ NotNull: ReturnType; /** * select columns and aggregators */ Select: IQueryColumnSelector; /** * Add Union Select */ Union: >(...queryselectors: IUnionSelector[]) => ReturnType; /** * Add UnionAll Select */ UnionAll: >(...queryselectors: IUnionSelector[]) => ReturnType; /** * start case */ Case: GenericQueryWithValue & ReturnType; /** * add When, work with case */ When: GenericQueryWithValue & ReturnType; /** * add Then, work with case */ Then: GenericQueryWithValue & ReturnType; /** * add Else, work with case */ Else: GenericQueryWithValue & ReturnType; /** * end case, work with case */ EndCase: GenericQueryWithValue & ReturnType; /** * Load Child or children */ LoadChildren: >(child: D, childColumn: NonFunctionPropertyNames, parentColumn: NonFunctionPropertyNames, assignTo: NonFunctionPropertyNames, isArray?: boolean) => ReturnType; } export type GenericQueryWithValue = { /** * Add simple Value, work best with case and else */ Value: (value: SingleValue) => ReturnType; }; export interface ISelectCase extends Omit>, "EndCase" | "getSql" | "getInnerSelectSql" | "Select" | "OrderByDesc" | "OrderByAsc" | "Limit" | "Union" | "UnionAll" | "GroupBy" | "Select" | "toList" | "firstOrDefault" | "findOrSave" | "delete"> { EndCase: IQueryColumnSelector; } export interface IJoinOn extends Omit>, "GroupBy" | "Select" | "toList" | "firstOrDefault" | "findOrSave" | "delete"> { /** * Inner join a table * eg InnerJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... */ InnerJoin: (tableName: D, alias: S) => IJoinOn, ParentType, D>; /** * left join a table * eg LeftJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... */ LeftJoin: (tableName: D, alias: S) => IJoinOn, ParentType, D>; /** * join a table * eg Join("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by Join method instead */ Join: (tableName: D, alias: S) => IJoinOn, ParentType, D>; /** * CrossJoin a table * eg CrossJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by CrossJoin method instead */ CrossJoin: (tableName: D, alias: S) => IJoinOn, ParentType, D>; /** * right join a table * eg RightJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * sqlite dose not currently support this */ Where: IWhere; } export type IWhere = { /** * incase you join data, then you will need to cast or convert the result to other type */ Cast: (converter?: (x: ParentType | unknown) => B) => IReturnMethods; } & GenericQuery>; export interface IHaving extends Omit>, "Select" | "Column"> { Column: (columnOrAlias: IColumnSelector | string) => IHaving; /** * incase you join data, then you will need to cast or convert the result to other type */ Cast: (converter?: (x: ParentType | unknown) => B) => IReturnMethods; } export interface IQuerySelector extends IReturnMethods, Omit>, "GroupBy"> { /** * Inner join a table * eg InnerJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... */ Where: IWhere; /** * Inner join a table * eg InnerJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by InnerJoin method instead */ InnerJoin: (tableName: D, alias: S) => IJoinOn & R, T, D>; /** * left join a table * eg LeftJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by LeftJoin method instead */ LeftJoin: (tableName: D, alias: S) => IJoinOn & R, T, D>; /** * join a table * eg Join("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by Join method instead */ Join: (tableName: D, alias: S) => IJoinOn & R, T, D>; /** * CrossJoin a table * eg CrossJoin("TableB", "b").Column(x=> x.a.id).EqualTo(x=> x.b.parentId)... * This will overwrite the above where, so use the Where that is returned by CrossJoin method instead */ CrossJoin: (tableName: D, alias: S) => IJoinOn & R, T, D>; /** * Add Union Select */ Union: >(...queryselectors: IUnionSelector[]) => IQuerySelector; /** * Add UnionAll Select */ UnionAll: >(...queryselectors: IUnionSelector[]) => IQuerySelector; /** * Load Child or children */ LoadChildren: >(child: D, childColumn: NonFunctionPropertyNames, parentColumn: NonFunctionPropertyNames, assignTo: NonFunctionPropertyNames, isArray?: boolean) => IQuerySelector; Select: IQueryColumnSelector; } export interface IQueryColumnSelector extends IReturnMethods { /** * start a case, and end it with CaseEnd() */ Case: (alias: string) => ISelectCase; /** * Default is select * from * you can specify the columns here */ Columns: (columns: ArrayAndAliasIColumnSelector) => IQueryColumnSelector; /** * sqlite aggrigator from Max */ Max: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * sqlite aggrigator from Min */ Min: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * sqlite aggrigator from Count */ Count: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * sqlite aggrigator from Sum */ Sum: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * sqlite aggrigator from Total */ Total: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * sqlite concat columns and values eg lastname || ' ' || firstName as FullName; */ Concat: (alias: string, collectCharacters_type: ConcatSeperatorChar, ...columnOrValues: (IColumnSelector | string)[]) => IQueryColumnSelector; /** * sqlite aggrigator from group_concat */ GroupConcat: (columns: IColumnSelector, alias: string, seperator?: string) => IQueryColumnSelector; /** * sqlite aggrigator from Avg */ Avg: (columns: IColumnSelector, alias: string) => IQueryColumnSelector; /** * incase you join data, then you will need to cast or convert the result to other type */ Cast: (converter?: (x: T | unknown) => B) => IReturnMethods; /** * add having search */ Having: IHaving; } declare class ReturnMethods, D extends string> { parent: QuerySelector; constructor(parent: QuerySelector); firstOrDefault(): Promise>; toList(): Promise[]>; findOrSave(item: ParentType & IBaseModule): Promise>; delete(): Promise; /** * get the translated sqlQuery */ getSql(sqlType: "DELETE" | "SELECT"): { sql: string; args: any[]; }; /** * get a simple sql * @returns sql string */ getInnerSelectSql(): string; } declare class QueryColumnSelector, D extends string> extends ReturnMethods { columns: QValue[]; cases: ISelectCase[]; constructor(parent: QuerySelector); Case(alias: string): ISelectCase; Cast(converter: (x: ParentType | unknown) => B): IReturnMethods; Columns(columns: ArrayAndAliasIColumnSelector): this; Concat(alias: string, collectCharacters_type: ConcatSeperatorChar, ...columnOrValues: (IColumnSelector | string)[]): this; Max(columns: IColumnSelector, alias: string): this; Min(columns: IColumnSelector, alias: string): this; Count(columns: IColumnSelector, alias: string): this; Sum(columns: IColumnSelector, alias: string): this; Total(columns: IColumnSelector, alias: string): this; GroupConcat(columns: IColumnSelector, alias: string, seperator?: string): this; Avg(columns: IColumnSelector, alias: string): this; get Having(): IHaving; } export declare class Where, D extends string> extends ReturnMethods { tableName: D; alias?: string; Queries: QValue[]; type: string; constructor(tableName: D, parent: QuerySelector, alias?: string, ...queries: (Param | QValue)[]); LoadChildren>(child: D, childColumn: NonFunctionPropertyNames, parentColumn: NonFunctionPropertyNames, assignTo: NonFunctionPropertyNames, isArray?: boolean): this; get Case(): this; get When(): this; get Then(): this; get EndCase(): this; get Else(): this; Value(value: SingleValue): this; Between(value1: SingleValue | IColumnSelector, value2: SingleValue | IColumnSelector): this; Cast(converter: (x: ParentType | unknown) => B): IReturnMethods; get Select(): QueryColumnSelector; Column(column: IColumnSelector | string): this; Concat(collectCharacters_type: ConcatSeperatorChar, ...columnOrValues: (IColumnSelector | string)[]): this; EqualTo(value: SingleValue | IColumnSelector | InnerSelect): this; NotEqualTo(value: SingleValue | IColumnSelector | InnerSelect): this; EqualAndGreaterThen(value: NumberValue | StringValue | InnerSelect): this; EqualAndLessThen(value: NumberValue | StringValue | IColumnSelector | InnerSelect): this; get Start(): this; get End(): this; get OR(): this; get AND(): this; GreaterThan(value: NumberValue | StringValue | IColumnSelector | InnerSelect): this; LessThan(value: NumberValue | StringValue | IColumnSelector | InnerSelect): this; IN(value: ArrayValue | IColumnSelector | InnerSelect): this; get Not(): this; get Null(): this; get NotNull(): this; Contains(value: StringValue | IColumnSelector): this; StartsWith(value: StringValue | IColumnSelector): this; EndsWith(value: StringValue | IColumnSelector): this; OrderByAsc(columnName: IColumnSelector | ArrayIColumnSelector): this; OrderByDesc(columnName: IColumnSelector | ArrayIColumnSelector): this; Limit(value: number): this; GroupBy(columnName: IColumnSelector | ArrayIColumnSelector): this; InnerJoin(tableName: D, alias: S): IJoinOn, T, D>; CrossJoin(tableName: D, alias: S): IJoinOn, T, D>; LeftJoin(tableName: D, alias: S): IJoinOn, T, D>; Join(tableName: D, alias: S): IJoinOn, T, D>; RightJoin(tableName: D, alias: S): IJoinOn, T, D>; Union>(...queryselectors: IUnionSelector[]): this; UnionAll>(...queryselectors: IUnionSelector[]): this; get Where(): IWhere; } export default class QuerySelector, D extends string> { where?: Where; having?: Where; joins: Where[]; unions: { type: Param.Union | Param.UnionAll; value: GlobalIQuerySelector; }[]; tableName: D; alias: string; queryColumnSelector?: QueryColumnSelector; database: IDataBaseExtender; jsonExpression: any; others: QValue[]; type: string; translator?: QuerySelectorTranslator; children: IChildLoader[]; converter?: (x: any) => any; constructor(tableName: D, database: IDatabase); clear(): void; buildJsonExpression(tableName: D, alias: string, isInit?: boolean): void; get Select(): QueryColumnSelector; Union>(...queryselectors: IUnionSelector[]): this; UnionAll>(...queryselectors: IUnionSelector[]): this; InnerJoin(tableName: D, alias: S): IJoinOn & R, T, D>; CrossJoin(tableName: D, alias: S): IJoinOn & R, T, D>; LeftJoin(tableName: D, alias: S): IJoinOn & R, T, D>; Join(tableName: D, alias: S): IJoinOn & R, T, D>; RightJoin(tableName: D, alias: S): IJoinOn & R, T, D>; LoadChildren>(child: D, childColumn: NonFunctionPropertyNames, parentColumn: NonFunctionPropertyNames, assignTo: NonFunctionPropertyNames, isArray?: boolean): this; delete(): Promise; findOrSave(item: T & IBaseModule): Promise>; firstOrDefault(): Promise>; toList(): Promise[]>; getSql(sqlType: "SELECT" | "DELETE"): { sql: string; args: any[]; }; getInnerSelectSql(): string; OrderByAsc(columnName: IColumnSelector | ArrayIColumnSelector): this; OrderByDesc(columnName: IColumnSelector | ArrayIColumnSelector): this; Limit(value: number): this; GroupBy(columnName: IColumnSelector | ArrayIColumnSelector): void; get Where(): Where; } export {};