import Model, { ModelType } from "./Model.js"; import ModelQuery, { ModelFieldData, ModelQueryResult } from "./ModelQuery.js"; export default abstract class ModelRelation { protected readonly _model: S; protected readonly foreignModelType: ModelType; protected readonly dbProperties: RelationDatabaseProperties; protected readonly queryModifiers: QueryModifier[]; protected readonly filters: ModelFilter[]; protected cachedModels?: O[]; protected constructor(model: S, foreignModelType: ModelType, dbProperties: RelationDatabaseProperties); abstract clone(): ModelRelation; constraint(queryModifier: QueryModifier): this; filter(modelFilter: ModelFilter): this; protected makeQuery(): ModelQuery; getModelId(): ModelFieldData; protected applyRegularConstraints(query: ModelQuery): void; get(): Promise; getOrFail(): R; protected abstract collectionToOutput(models: O[]): R; eagerLoad(relations: ModelRelation[], subRelations?: string[]): Promise>; populate(models: ModelQueryResult): Promise; count(): Promise; has(model: O): Promise; } export declare class OneModelRelation extends ModelRelation { constructor(model: S, foreignModelType: ModelType, dbProperties: RelationDatabaseProperties); clone(): OneModelRelation; protected collectionToOutput(models: O[]): O | null; set(model: O): Promise; clear(): Promise; } export declare class ManyModelRelation extends ModelRelation { protected readonly paginatedCache: { [perPage: number]: { [pageNumber: number]: ModelQueryResult | undefined; } | undefined; }; constructor(model: S, foreignModelType: ModelType, dbProperties: RelationDatabaseProperties); clone(): ManyModelRelation; cloneReduceToOne(): OneModelRelation; protected collectionToOutput(models: O[]): O[]; paginate(page: number, perPage: number): Promise>; } export declare class ManyThroughModelRelation extends ManyModelRelation { protected readonly dbProperties: PivotRelationDatabaseProperties; constructor(model: S, foreignModelType: ModelType, dbProperties: PivotRelationDatabaseProperties); clone(): ManyThroughModelRelation; cloneReduceToOne(): OneModelRelation; protected applyRegularConstraints(query: ModelQuery): void; eagerLoad(relations: ModelRelation[], subRelations?: string[]): Promise>; populate(models: ModelQueryResult): Promise; } export declare class RecursiveModelRelation extends ManyModelRelation { private readonly reverse; constructor(model: M, foreignModelType: ModelType, dbProperties: RelationDatabaseProperties, reverse?: boolean); clone(): RecursiveModelRelation; populate(models: ModelQueryResult): Promise; } export declare type QueryModifier = (query: ModelQuery) => ModelQuery; export declare type ModelFilter = (model: O) => boolean | Promise; export declare type RelationDatabaseProperties = { localKey: string; foreignKey: string; }; export declare type PivotRelationDatabaseProperties = RelationDatabaseProperties & { pivotTable: string; localPivotKey: string; foreignPivotKey: string; };