import { QueryUnit } from "./QueryUnit"; import { DbContext } from "../../DbContext"; import { Queryable } from "./Queryable"; import { WrappedType } from "@simplysm/sd-core-common"; import { TQueryValue } from "../../types"; import { IJoinQueryDef, ISelectQueryDef, TQueryBuilderValue } from "../query-builder/types"; export type TEntityValue = T | QueryUnit; export type TEntityValueOrQueryable = TEntityValue | Queryable; export type TEntityValueOrQueryableOrArray = TEntityValueOrQueryable | TEntityValueOrQueryableOrArray[]; export type TEntity = { [K in keyof T]-?: T[K] extends TQueryValue ? QueryUnit : T[K] extends (infer A)[] ? TEntity[] : TEntity; }; export type TSelectEntity = { [K in keyof T]: T[K] extends TQueryValue ? QueryUnit : T[K] extends (infer A)[] ? TEntity[] : TEntity; }; export type TEntityUnwrap = { [K in keyof T]: T[K] extends QueryUnit ? A : T[K] extends (infer A)[] ? TEntityUnwrap[] : T[K] extends TQueryValue ? T[K] : TEntityUnwrap | undefined; }; export type TIncludeEntity = { [K in keyof T]-?: T[K] extends TQueryValue ? QueryUnit : T[K] extends (infer A)[] ? TIncludeEntity[] : TIncludeEntity; }; export interface IQueryableDef { from: string | ISelectQueryDef | ISelectQueryDef[]; join?: (IJoinQueryDef & { isSingle: boolean; })[]; distinct?: true; where?: TQueryBuilderValue[]; top?: number; groupBy?: TQueryBuilderValue[]; having?: TQueryBuilderValue[]; orderBy?: [TQueryBuilderValue, "ASC" | "DESC"][]; limit?: [number, number]; pivot?: { valueColumn: TQueryBuilderValue; pivotColumn: TQueryBuilderValue; pivotKeys: string[]; }; unpivot?: { valueColumn: TQueryBuilderValue; pivotColumn: TQueryBuilderValue; pivotKeys: string[]; }; lock?: boolean; sample?: number; } export type TQueryValuePropertyNames = { [K in keyof T]: undefined extends T[K] ? never : T[K] extends TQueryValue ? K : never; }[keyof T]; export type TUndefinedPropertyNames = { [K in keyof T]: undefined extends T[K] ? K : never; }[keyof T]; export type TOnlyQueryValueProperty = Pick> & Partial>>; export type TInsertObject = TOnlyQueryValueProperty; export type TUpdateObject = TOnlyQueryValueProperty<{ [K in keyof T]?: T[K] | QueryUnit | QueryUnit>; }>;