/** * SQL Mode 2 — Aggregate Translator * * GROUP BY → $group * HAVING → $match (after $group) * COUNT/SUM/AVG/MIN/MAX/GROUP_CONCAT/ARRAY_AGG/STDDEV → accumulators * Window functions → $setWindowFields */ import type { AggregateField, WindowSpec } from '../types.js'; /** * Check if a SELECT AST has aggregate functions. */ export declare function hasAggregates(columns: unknown): boolean; /** * Check if a SELECT AST has window functions. */ export declare function hasWindowFunctions(columns: unknown): boolean; /** * Extract aggregate fields from columns. */ export declare function extractAggregateFields(columns: unknown, tableAliases?: Map): AggregateField[]; /** * Extract window function specs from columns. */ export declare function extractWindowSpecs(columns: unknown): WindowSpec[]; export interface GroupStageResult { groupStage: Record; /** Computed fields that need $addFields BEFORE the $group (for complex GROUP BY expressions) */ preComputedFields?: Record; } /** * Build $group stage from GROUP BY + aggregate functions. */ export declare function buildGroupStage(groupBy: unknown, aggregateFields: AggregateField[], columns: unknown, tableAliases: Map): GroupStageResult; /** * Build $match stage for HAVING clause (placed after $group). * HAVING operates on aggregated values, so aggr_func references must be resolved * to their aliases from the $group stage (e.g., AVG(salary) → avg_sal). */ export declare function buildHavingStage(having: unknown, aggregateFields?: AggregateField[]): Record | null; /** * Build $setWindowFields stages for window functions. * Specs with different partitionBy/orderBy signatures get separate stages. */ export declare function buildWindowStages(specs: WindowSpec[]): Record[]; //# sourceMappingURL=aggregates.d.ts.map