import { AggregateFunctionNode } from '../operation-node/aggregate-function-node.js'; import { AliasNode } from '../operation-node/alias-node.js'; import { OverBuilder } from './over-builder.js'; import { AliasableExpression, AliasedExpression, Expression } from '../expression/expression.js'; import { ReferenceExpression } from '../parser/reference-parser.js'; import { ComparisonOperatorExpression, OperandValueExpressionOrList } from '../parser/binary-operation-parser.js'; import { SqlBool } from '../util/type-utils.js'; import { ExpressionOrFactory } from '../parser/expression-parser.js'; export declare class AggregateFunctionBuilder implements AliasableExpression { #private; constructor(props: AggregateFunctionBuilderProps); /** @private */ /** * All expressions need to have this getter for complicated type-related reasons. * Simply add this getter for your expression and always return `undefined` from it: * * ```ts * class SomeExpression implements Expression { * get expressionType(): T | undefined { * return undefined * } * } * ``` * * The getter is needed to make the expression assignable to another expression only * if the types `T` are assignable. Without this property (or some other property * that references `T`), you could assing `Expression` to `Expression`. */ get expressionType(): O | undefined; /** * Returns an aliased version of the function. * * In addition to slapping `as "the_alias"` to the end of the SQL, * this method also provides strict typing: * * ```ts * const result = await db * .selectFrom('person') * .select( * (eb) => eb.fn.count('id').as('person_count') * ) * .executeTakeFirstOrThrow() * * // `person_count: number` field exists in the result type. * console.log(result.person_count) * ``` * * The generated SQL (PostgreSQL): * * ```sql * select count("id") as "person_count" * from "person" * ``` */ as(alias: A): AliasedAggregateFunctionBuilder; /** * Adds a `distinct` clause inside the function. * * ### Examples * * ```ts * const result = await db * .selectFrom('person') * .select((eb) => * eb.fn.count('first_name').distinct().as('first_name_count') * ) * .executeTakeFirstOrThrow() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select count(distinct "first_name") as "first_name_count" * from "person" * ``` */ distinct(): AggregateFunctionBuilder; /** * Adds a `filter` clause with a nested `where` clause after the function. * * Similar to {@link WhereInterface}'s `where` method. * * Also see {@link filterWhereRef}. * * ### Examples * * Count by gender: * * ```ts * const result = await db * .selectFrom('person') * .select((eb) => [ * eb.fn * .count('id') * .filterWhere('gender', '=', 'female') * .as('female_count'), * eb.fn * .count('id') * .filterWhere('gender', '=', 'male') * .as('male_count'), * eb.fn * .count('id') * .filterWhere('gender', '=', 'other') * .as('other_count'), * ]) * .executeTakeFirstOrThrow() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * count("id") filter(where "gender" = $1) as "female_count", * count("id") filter(where "gender" = $2) as "male_count", * count("id") filter(where "gender" = $3) as "other_count" * from "person" * ``` */ filterWhere, VE extends OperandValueExpressionOrList>(lhs: RE, op: ComparisonOperatorExpression, rhs: VE): AggregateFunctionBuilder; filterWhere>(expression: E): AggregateFunctionBuilder; /** * Adds a `filter` clause with a nested `where` clause after the function, where * both sides of the operator are references to columns. * * Similar to {@link WhereInterface}'s `whereRef` method. * * ### Examples * * Count people with same first and last names versus general public: * * ```ts * const result = await db * .selectFrom('person') * .select((eb) => [ * eb.fn * .count('id') * .filterWhereRef('first_name', '=', 'last_name') * .as('repeat_name_count'), * eb.fn.count('id').as('total_count'), * ]) * .executeTakeFirstOrThrow() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select * count("id") filter(where "first_name" = "last_name") as "repeat_name_count", * count("id") as "total_count" * from "person" * ``` */ filterWhereRef, RRE extends ReferenceExpression>(lhs: LRE, op: ComparisonOperatorExpression, rhs: RRE): AggregateFunctionBuilder; /** * Adds an `over` clause (window functions) after the function. * * ### Examples * * ```ts * const result = await db * .selectFrom('person') * .select( * (eb) => eb.fn.avg('age').over().as('average_age') * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select avg("age") over() as "average_age" * from "person" * ``` * * Also supports passing a callback that returns an over builder, * allowing to add partition by and sort by clauses inside over. * * ```ts * const result = await db * .selectFrom('person') * .select( * (eb) => eb.fn.avg('age').over( * ob => ob.partitionBy('last_name').orderBy('first_name', 'asc') * ).as('average_age') * ) * .execute() * ``` * * The generated SQL (PostgreSQL): * * ```sql * select avg("age") over(partition by "last_name" order by "first_name" asc) as "average_age" * from "person" * ``` */ over(over?: OverBuilderCallback): AggregateFunctionBuilder; /** * Simply calls the provided function passing `this` as the only argument. `$call` returns * what the provided function returns. */ $call(func: (qb: this) => T): T; /** * Casts the expression to the given type. * * This method call doesn't change the SQL in any way. This methods simply * returns a copy of this `AggregateFunctionBuilder` with a new output type. */ $castTo(): AggregateFunctionBuilder; /** * Omit null from the expression's type. * * This function can be useful in cases where you know an expression can't be * null, but Kysely is unable to infer it. * * This method call doesn't change the SQL in any way. This methods simply * returns a copy of `this` with a new output type. */ $notNull(): AggregateFunctionBuilder>; /** * Creates the OperationNode that describes how to compile this expression into SQL. * * If you are creating a custom expression, it's often easiest to use the {@link sql} * template tag to build the node: * * ```ts * class SomeExpression implements Expression { * toOperationNode(): OperationNode { * return sql`some sql here`.toOperationNode() * } * } * ``` */ toOperationNode(): AggregateFunctionNode; } /** * {@link AggregateFunctionBuilder} with an alias. The result of calling {@link AggregateFunctionBuilder.as}. */ export declare class AliasedAggregateFunctionBuilder implements AliasedExpression { #private; constructor(aggregateFunctionBuilder: AggregateFunctionBuilder, alias: A); /** @private */ /** * Returns the aliased expression. */ get expression(): Expression; /** @private */ /** * Returns the alias. */ get alias(): A; /** * Creates the OperationNode that describes how to compile this expression into SQL. */ toOperationNode(): AliasNode; } export interface AggregateFunctionBuilderProps { aggregateFunctionNode: AggregateFunctionNode; } export type OverBuilderCallback = (builder: OverBuilder) => OverBuilder;