use super::{B, E, NamedDefault, f, p, pn, set_of};
use super::{Decimal, Float64, FnDescriptor, Int64};
pub(super) fn build() -> Vec<FnDescriptor> {
vec![
f("math", "pi", vec![], Float64, E("pi()")),
f("math", "e", vec![], Float64, E("exp(1.0)")),
f("math", "exp", vec![p("n", Float64)], Float64, B("exp")),
f("math", "ln", vec![p("n", Float64)], Float64, B("ln")),
f("math", "ln", vec![p("n", Decimal)], Decimal, B("ln")),
f("math", "log", vec![p("n", Float64)], Float64, B("log")),
f(
"math",
"log",
vec![p("n", Decimal), pn("base", Decimal, NamedDefault::Required)],
Decimal,
E("log($2, $1)"),
),
f("math", "log2", vec![p("n", Float64)], Float64, E("log(2.0, $1)")),
f("math", "log10", vec![p("n", Float64)], Float64, B("log")),
f("math", "lg", vec![p("n", Int64)], Float64, E("log($1::float8)")),
f("math", "lg", vec![p("n", Float64)], Float64, B("log")),
f("math", "lg", vec![p("n", Decimal)], Decimal, B("log")),
f("math", "sin", vec![p("n", Float64)], Float64, B("sin")),
f("math", "cos", vec![p("n", Float64)], Float64, B("cos")),
f("math", "tan", vec![p("n", Float64)], Float64, B("tan")),
f("math", "cot", vec![p("n", Float64)], Float64, B("cot")),
f("math", "asin", vec![p("n", Float64)], Float64, B("asin")),
f("math", "acos", vec![p("n", Float64)], Float64, B("acos")),
f("math", "atan", vec![p("n", Float64)], Float64, B("atan")),
f(
"math",
"atan2",
vec![p("y", Float64), p("x", Float64)],
Float64,
B("atan2"),
),
f(
"math",
"stddev",
vec![p("s", set_of(Float64))],
Float64,
B("stddev_samp"),
),
f(
"math",
"stddev",
vec![p("s", set_of(Decimal))],
Decimal,
B("stddev_samp"),
),
f(
"math",
"stddev_pop",
vec![p("s", set_of(Float64))],
Float64,
B("stddev_pop"),
),
f(
"math",
"stddev_pop",
vec![p("s", set_of(Decimal))],
Decimal,
B("stddev_pop"),
),
f("math", "var", vec![p("s", set_of(Float64))], Float64, B("var_samp")),
f("math", "var", vec![p("s", set_of(Decimal))], Decimal, B("var_samp")),
f("math", "var_pop", vec![p("s", set_of(Float64))], Float64, B("var_pop")),
f("math", "var_pop", vec![p("s", set_of(Decimal))], Decimal, B("var_pop")),
f("math", "abs", vec![p("x", Int64)], Int64, B("abs")),
f("math", "abs", vec![p("x", Float64)], Float64, B("abs")),
f("math", "abs", vec![p("x", Decimal)], Decimal, B("abs")),
f("math", "ceil", vec![p("x", Int64)], Int64, B("ceil")),
f("math", "ceil", vec![p("x", Float64)], Float64, B("ceil")),
f("math", "ceil", vec![p("x", Decimal)], Decimal, B("ceil")),
f("math", "floor", vec![p("x", Int64)], Int64, B("floor")),
f("math", "floor", vec![p("x", Float64)], Float64, B("floor")),
f("math", "floor", vec![p("x", Decimal)], Decimal, B("floor")),
f("math", "sqrt", vec![p("x", Int64)], Float64, E("sqrt($1::float8)")),
f("math", "sqrt", vec![p("x", Float64)], Float64, B("sqrt")),
f("math", "sqrt", vec![p("x", Decimal)], Decimal, B("sqrt")),
f(
"math",
"mean",
vec![p("vals", set_of(Int64))],
Float64,
E("avg($1)::float8"),
),
f("math", "mean", vec![p("vals", set_of(Float64))], Float64, B("avg")),
f("math", "mean", vec![p("vals", set_of(Decimal))], Decimal, B("avg")),
]
}