typeorm-linq-repository
Version:
Wraps TypeORM repository pattern and QueryBuilder using fluent, LINQ-style queries.
176 lines (175 loc) • 9.3 kB
TypeScript
import { EntityBase } from "../../types/EntityBase";
import { JoinedEntityType } from "../../types/JoinedEntityType";
import { Nullable } from "../../types/Nullable";
import { QueryOrderOptions } from "../../types/QueryOrderOptions";
import { IComparableQuery } from "./IComparableQuery";
import { IJoinedQuery } from "./IJoinedQuery";
import { IQuery } from "./IQuery";
/**
* Base set of operations for all Queries that are not in Comparable mode.
*/
export interface IQueryBase<T extends EntityBase, R extends Nullable<T> | T[], P = T> {
/**
* Adds an additional logical AND condition for which to query results.
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to compare.
*/
and<S extends EntityBase>(propertySelector: (obj: P) => S): IComparableQuery<T, R, P>;
/**
* Catches an error thrown during the execution of the underlying QueryBuilder's Promise.
* @param rejected The rejection callback for the error thrown on the underlying QueryBuilder's Promise.
*/
catch(rejected: (error: any) => void | Promise<any> | IQuery<any, any>): Promise<any>;
/**
* Gets the count of results matching the current query conditions.
*/
count(): Promise<number>;
/**
* Joins an unrelated table using a TypeORM entity.
* @type {F} The type of the foreign entity to join.
* @param foreignEntity The TypeORM entity whose table to join.
*/
from<F extends EntityBase>(foreignEntity: {
new (...params: any[]): F;
}): IJoinedQuery<T, R, F>;
/**
* Groups entities on the specified property.
* @param propertySelector Property selection lambda for property by which to group.
*/
groupBy(propertySelector: (obj: P) => any): IQuery<T, R, P>;
/**
* Includes the specified navigation property in the queried results.
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to include, ex. x => x.prop
*/
include<S extends EntityBase>(propertySelector: (obj: T) => JoinedEntityType<S>): IQuery<T, R, S>;
/**
* Isolates a group of conditions into one AND clause.
* @param and The Query representing the AND conditions to group.
*/
isolatedAnd<S extends EntityBase>(and: (query: IQuery<T, R, P>) => IQuery<T, R, S>): IQuery<T, R, P>;
/**
* Isolates a group of conditions into one OR clause.
* @param or The Query representing the OR conditions to group.
*/
isolatedOr<S extends EntityBase>(or: (query: IQuery<T, R, P>) => IQuery<T, R, S>): IQuery<T, R, P>;
/**
* Joins the specified navigation property using an INNER JOIN
* (thus excluding results from the joining entity if its joined relationship fails the next join condition)
* without including it in the results (useful for subsequent join conditions).
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to join, ex. x => x.prop
*/
join<S extends EntityBase>(propertySelector: (obj: T) => JoinedEntityType<S>): IJoinedQuery<T, R, S>;
/**
* Joins the specified navigation property using a LEFT JOIN
* (thus including results from the joining entity even if its joined relationship fails the next join condition)
* without including it in the results (useful for subsequent join conditions).
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to join, ex. x => x.prop
*/
joinAlso<S extends EntityBase>(propertySelector: (obj: T) => JoinedEntityType<S>): IJoinedQuery<T, R, S>;
/**
* Adds an additional logical OR condition for which to query results.
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to compare.
*/
or<S extends EntityBase>(propertySelector: (obj: P) => S): IComparableQuery<T, R, P>;
/**
* Orders the query on the specified property in ascending order.
* @param propertySelector Property selection lambda for property on which to sort.
* @param options Options for ordering results.
*
* NOTE: `nullsFirst` is not supported in MySQL.
*/
orderBy(propertySelector: (obj: P) => any, options?: QueryOrderOptions): IQuery<T, R, P>;
/**
* Orders the query on the specified property in descending order.
* @param propertySelector Property selection lambda for property on which to sort.
* @param options Options for ordering results.
*
* NOTE: `nullsFirst` is not supported in MySQL.
*/
orderByDescending(propertySelector: (obj: P) => any, options?: QueryOrderOptions): IQuery<T, R, P>;
/**
* Returns the query back to its base type while also exiting "join mode",
* thus ending a join chain so that where conditions may be continued on the base type.
*/
reset(): IQuery<T, R, T>;
/**
* Sets the number of results to skip before taking results from the query.
* @param skip The number of results to skip.
*/
skip(skip: number): IQuery<T, R, P>;
/**
* Limits the number of results to take from the query.
* @param limit The number of results to take.
*/
take(limit: number): IQuery<T, R, P>;
/**
* Executes the query by invoking the Promise to get the underlying QueryBuilder's results.
* @param resolved The resolution callback for the underlying QueryBuilder's results Promise.
*/
then(resolved: (results: R) => void | Promise<any>): Promise<any>;
/**
* Adds a subsequent ordering to the query on the specified property in ascending order.
* @param propertySelector Property selection lambda for property on which to sort.
* @param options Options for ordering results.
*
* NOTE: `nullsFirst` is not supported in MySQL.
*/
thenBy(propertySelector: (obj: P) => any, options?: QueryOrderOptions): IQuery<T, R, P>;
/**
* Adds a subsequent ordering to the query on the specified property in descending order.
* @param propertySelector Property selection lambda for property on which to sort.
* @param options Options for ordering results.
*
* NOTE: `nullsFirst` is not supported in MySQL.
*/
thenByDescending(propertySelector: (obj: P) => any, options?: QueryOrderOptions): IQuery<T, R, P>;
/**
* Groups entities on a subsequent specified property.
* @param propertySelector Property selection lambda for property by which to subsequently group.
*/
thenGroupBy(propertySelector: (obj: P) => any): IQuery<T, R, P>;
/**
* Includes a subsequent navigation property in the previously included relationship of type P.
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to include, ex. x => x.prop
*/
thenInclude<S extends EntityBase>(propertySelector: (obj: P) => JoinedEntityType<S>): IQuery<T, R, S>;
/**
* Joins a subsequent navigation property on the previously joined relationship of type P
* (thus excluding results from the joining entity if its joined relationship fails the next join condition)
* without including it in the results (useful for subsequent join conditions).
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to join, ex. x => x.prop
*/
thenJoin<S extends EntityBase>(propertySelector: (obj: P) => JoinedEntityType<S>): IJoinedQuery<T, R, S>;
/**
* Joins a subsequent navigation property on the previously joined relationship of type P using a LEFT JOIN
* (thus including results from the joining entity even if its joined relationship fails the next join condition)
* without including it in the results (useful for subsequent join conditions).
* @type {S} The type of the joined navigation property.
* @param propertySelector Property selection lambda for property to join, ex. x => x.prop
*/
thenJoinAlso<S extends EntityBase>(propertySelector: (obj: P) => JoinedEntityType<S>): IJoinedQuery<T, R, S>;
/**
* Invokes and returns the Promise to get the underlying QueryBuilder's results.
*/
toPromise(): Promise<R>;
/**
* Returns the "current query type" to the base type WITHOUT resetting join chains.
* Therefore, does NOT allow where conditions to be continued on the base type,
* but rather uses the base type in the current join chain.
* @deprecated WARNING: This method was found to be faulty based on its initial intended use,
* but remains nonetheless in case its use is, in fact, desired.
* However, you may be looking for **reset()** instead.
*
* This method will remain deprecated for a while to alert users who used it based on
* the initially intended use that it may result in unexpected behavior.
* The deprecated status will be removed later so that users using it
* based on the results it actually produces are not annoyed by it.
*/
usingBaseType(): IQuery<T, R, T>;
}