import { WhereConditionBase, SqlBuildContext, FieldRef, SqlFragment } from './conditions'; /** * Represents a subquery that can be used in various contexts * TResult: The type of data the subquery returns * TMode: 'scalar' | 'array' | 'table' - determines how the subquery can be used */ export declare class Subquery { /** * The SQL generator function - called with context to build SQL */ private sqlBuilder; /** * Optional alias for the subquery when used as a table source */ private alias?; /** * Selection metadata - preserves SqlFragments with mappers for table subqueries */ private selectionMetadata?; /** * Field refs from outer queries used inside this subquery's WHERE condition. * These need to be propagated to the outer query so it can add necessary JOINs. */ private outerFieldRefs; /** * Phantom type marker for type checking */ private __resultType?; private __mode?; constructor(sqlBuilder: (context: SqlBuildContext & { tableAlias?: string; }) => string, mode?: TMode, selectionMetadata?: Record, outerFieldRefs?: FieldRef[]); /** * Set an alias for this subquery (used when subquery is a table source) */ as(alias: string): Subquery; /** * Build the SQL for this subquery */ buildSql(context: SqlBuildContext & { tableAlias?: string; }): string; /** * Get the alias for this subquery */ getAlias(): string | undefined; /** * Get the selection metadata (preserves SqlFragments with mappers) */ getSelectionMetadata(): Record | undefined; /** * Get field refs from outer queries used inside this subquery. * These need to be propagated to the outer query for JOIN detection. */ getOuterFieldRefs(): FieldRef[]; /** * Check if this is a scalar subquery */ isScalar(): this is Subquery; /** * Check if this is an array subquery */ isArray(): this is Subquery; /** * Check if this is a table subquery */ isTable(): this is Subquery; } /** * Subquery reference - used to reference columns from a subquery in a FROM clause * This is similar to FieldRef but for subquery columns */ export interface SubqueryFieldRef extends FieldRef { readonly __isSubqueryField: true; } /** * Helper to check if something is a Subquery */ export declare function isSubquery(value: any): value is Subquery; /** * Duck-typed interface for collection-like objects (e.g., CollectionQueryBuilder) * that can be used wherever a Subquery is expected. * This enables generic function syntax: exists(collection.where(...)), notExists(collection.where(...)) */ export interface CollectionSubquerySource { exists(): SqlFragment; } /** * Base class for EXISTS / NOT EXISTS conditions. * Accepts either a Subquery or a collection navigation source (CollectionSubquerySource). */ declare abstract class ExistsConditionBase extends SqlFragment { protected resolved: Subquery | SqlFragment; constructor(source: Subquery | CollectionSubquerySource); getFieldRefs(): FieldRef[]; protected buildSubquerySql(context: SqlBuildContext): string; } /** * Condition: EXISTS (subquery) * Extends SqlFragment so it works in both WHERE clauses and SELECT projections. * In SELECT: produces `EXISTS (SELECT ...) as "alias"` with boolean type inference. * In WHERE: works as WhereConditionBase since SqlFragment extends it. */ export declare class ExistsCondition extends ExistsConditionBase { buildSql(context: SqlBuildContext): string; } /** * Condition: NOT EXISTS (subquery) * Extends SqlFragment so it works in both WHERE clauses and SELECT projections. */ export declare class NotExistsCondition extends ExistsConditionBase { buildSql(context: SqlBuildContext): string; } /** * Condition: field IN (subquery) * The subquery must return a single column */ export declare class InSubqueryCondition extends WhereConditionBase { private field; private subquery; constructor(field: FieldRef, subquery: Subquery); getFieldRefs(): FieldRef[]; buildSql(context: SqlBuildContext): string; } /** * Condition: field NOT IN (subquery) */ export declare class NotInSubqueryCondition extends WhereConditionBase { private field; private subquery; constructor(field: FieldRef, subquery: Subquery); getFieldRefs(): FieldRef[]; buildSql(context: SqlBuildContext): string; } /** * Comparison with scalar subquery * Example: field = (SELECT ...) */ export declare class ScalarSubqueryComparison extends WhereConditionBase { private field; private operator; private subquery; constructor(field: FieldRef, operator: '=' | '!=' | '>' | '>=' | '<' | '<=', subquery: Subquery); getFieldRefs(): FieldRef[]; buildSql(context: SqlBuildContext): string; } /** * Helper functions to create subquery conditions */ /** * EXISTS condition */ export declare function exists(source: Subquery | CollectionSubquerySource): ExistsCondition; /** * NOT EXISTS condition */ export declare function notExists(source: Subquery | CollectionSubquerySource): NotExistsCondition; /** * Extract the non-undefined type from a potentially undefined type */ type NonUndefined = T extends undefined ? never : T; /** * IN subquery condition * * Supports both required and optional fields: * - Required field: `inSubquery(p.userId, subquery)` where userId is number * - Optional field: `inSubquery(u.age!, agesSubquery)` where age is number | undefined * * For optional fields, use non-null assertion (!) or check for undefined before calling. */ export declare function inSubquery(field: FieldRef>, subquery: Subquery[], 'array'>): InSubqueryCondition>; /** * NOT IN subquery condition * * Supports both required and optional fields: * - Required field: `notInSubquery(p.userId, subquery)` where userId is number * - Optional field: `notInSubquery(u.age!, agesSubquery)` where age is number | undefined * * For optional fields, use non-null assertion (!) or check for undefined before calling. */ export declare function notInSubquery(field: FieldRef>, subquery: Subquery[], 'array'>): NotInSubqueryCondition>; /** * Scalar subquery comparison helpers */ export declare function eqSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; export declare function neSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; export declare function gtSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; export declare function gteSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; export declare function ltSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; export declare function lteSubquery(field: FieldRef, subquery: Subquery): ScalarSubqueryComparison; /** * Type helper: Extract result type from a subquery */ export type SubqueryResult = T extends Subquery ? R : never; /** * Type helper: Extract mode from a subquery */ export type SubqueryMode = T extends Subquery ? M : never; export {}; //# sourceMappingURL=subquery.d.ts.map