import type { MongoAggExpr } from '@prisma-next/mongo-query-ast/execution'; import { MongoAggAccumulator, MongoAggLiteral } from '@prisma-next/mongo-query-ast/execution'; import type { ArrayField, DocField, NullableNumericField, NumericField, TypedAccumulatorExpr, TypedAggExpr, } from './types'; function namedAccumulatorArgs( args: Readonly | undefined>>, ): Record { const result: Record = {}; for (const [key, val] of Object.entries(args)) { if (val !== undefined) { result[key] = val.node; } } return result; } export const acc = { sum(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.sum(expr.node) }; }, avg(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.avg(expr.node) }; }, min( expr: TypedAggExpr, ): TypedAccumulatorExpr<{ readonly codecId: F['codecId']; readonly nullable: true }> { return { _field: undefined as never, node: MongoAggAccumulator.min(expr.node) }; }, max( expr: TypedAggExpr, ): TypedAccumulatorExpr<{ readonly codecId: F['codecId']; readonly nullable: true }> { return { _field: undefined as never, node: MongoAggAccumulator.max(expr.node) }; }, first( expr: TypedAggExpr, ): TypedAccumulatorExpr<{ readonly codecId: F['codecId']; readonly nullable: true }> { return { _field: undefined as never, node: MongoAggAccumulator.first(expr.node) }; }, last( expr: TypedAggExpr, ): TypedAccumulatorExpr<{ readonly codecId: F['codecId']; readonly nullable: true }> { return { _field: undefined as never, node: MongoAggAccumulator.last(expr.node) }; }, push(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.push(expr.node) }; }, addToSet(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.addToSet(expr.node) }; }, count(): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.count() }; }, stdDevPop(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.stdDevPop(expr.node) }; }, stdDevSamp(expr: TypedAggExpr): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.stdDevSamp(expr.node) }; }, firstN(args: { input: TypedAggExpr; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$firstN', namedAccumulatorArgs(args)), }; }, lastN(args: { input: TypedAggExpr; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$lastN', namedAccumulatorArgs(args)), }; }, maxN(args: { input: TypedAggExpr; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$maxN', namedAccumulatorArgs(args)), }; }, minN(args: { input: TypedAggExpr; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$minN', namedAccumulatorArgs(args)), }; }, top(args: { output: TypedAggExpr; sortBy: Readonly>; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$top', { output: args.output.node, sortBy: MongoAggLiteral.of(args.sortBy), }), }; }, bottom(args: { output: TypedAggExpr; sortBy: Readonly>; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$bottom', { output: args.output.node, sortBy: MongoAggLiteral.of(args.sortBy), }), }; }, topN(args: { output: TypedAggExpr; sortBy: Readonly>; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$topN', { output: args.output.node, sortBy: MongoAggLiteral.of(args.sortBy), n: args.n.node, }), }; }, bottomN(args: { output: TypedAggExpr; sortBy: Readonly>; n: TypedAggExpr; }): TypedAccumulatorExpr { return { _field: undefined as never, node: MongoAggAccumulator.of('$bottomN', { output: args.output.node, sortBy: MongoAggLiteral.of(args.sortBy), n: args.n.node, }), }; }, };