Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions base/src/expressions/parser/static_analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -575,6 +575,16 @@ fn args_signature_xnpv(arg_count: usize) -> Vec<Signature> {
}
}

fn args_signature_rank(arg_count: usize) -> Vec<Signature> {
if arg_count == 2 {
vec![Signature::Scalar, Signature::Vector]
} else if arg_count == 3 {
vec![Signature::Scalar, Signature::Vector, Signature::Scalar]
} else {
vec![Signature::Error; arg_count]
}
}

// FIXME: This is terrible duplications of efforts. We use the signature in at least three different places:
// 1. When computing the function
// 2. Checking the arguments to see if we need to insert the implicit intersection operator
Expand Down Expand Up @@ -785,6 +795,14 @@ fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec<Signatu
Function::Formulatext => args_signature_scalars(arg_count, 1, 0),
Function::Unicode => args_signature_scalars(arg_count, 1, 0),
Function::Geomean => vec![Signature::Vector; arg_count],
Function::Quartile | Function::QuartileExc | Function::QuartileInc => {
if arg_count == 2 {
vec![Signature::Vector, Signature::Scalar]
} else {
vec![Signature::Error; arg_count]
}
}
Function::Rank | Function::RankAvg | Function::RankEq => args_signature_rank(arg_count),
}
}

Expand Down Expand Up @@ -990,5 +1008,7 @@ fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult {
Function::Eomonth => scalar_arguments(args),
Function::Formulatext => not_implemented(args),
Function::Geomean => not_implemented(args),
Function::Quartile | Function::QuartileExc | Function::QuartileInc => not_implemented(args),
Function::Rank | Function::RankAvg | Function::RankEq => scalar_arguments(args),
}
}
32 changes: 31 additions & 1 deletion base/src/functions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@ pub enum Function {
Maxifs,
Minifs,
Geomean,
Quartile,
QuartileExc,
QuartileInc,
Rank,
RankAvg,
RankEq,

// Date and time
Date,
Expand Down Expand Up @@ -253,7 +259,7 @@ pub enum Function {
}

impl Function {
pub fn into_iter() -> IntoIter<Function, 198> {
pub fn into_iter() -> IntoIter<Function, 204> {
[
Function::And,
Function::False,
Expand Down Expand Up @@ -357,6 +363,12 @@ impl Function {
Function::Maxifs,
Function::Minifs,
Function::Geomean,
Function::Quartile,
Function::QuartileExc,
Function::QuartileInc,
Function::Rank,
Function::RankAvg,
Function::RankEq,
Function::Year,
Function::Day,
Function::Month,
Expand Down Expand Up @@ -625,6 +637,12 @@ impl Function {
"MAXIFS" | "_XLFN.MAXIFS" => Some(Function::Maxifs),
"MINIFS" | "_XLFN.MINIFS" => Some(Function::Minifs),
"GEOMEAN" => Some(Function::Geomean),
"QUARTILE" => Some(Function::Quartile),
"QUARTILE.EXC" => Some(Function::QuartileExc),
"QUARTILE.INC" => Some(Function::QuartileInc),
"RANK" => Some(Function::Rank),
"RANK.AVG" => Some(Function::RankAvg),
"RANK.EQ" => Some(Function::RankEq),
// Date and Time
"YEAR" => Some(Function::Year),
"DAY" => Some(Function::Day),
Expand Down Expand Up @@ -836,6 +854,12 @@ impl fmt::Display for Function {
Function::Maxifs => write!(f, "MAXIFS"),
Function::Minifs => write!(f, "MINIFS"),
Function::Geomean => write!(f, "GEOMEAN"),
Function::Quartile => write!(f, "QUARTILE"),
Function::QuartileExc => write!(f, "QUARTILE.EXC"),
Function::QuartileInc => write!(f, "QUARTILE.INC"),
Function::Rank => write!(f, "RANK"),
Function::RankAvg => write!(f, "RANK.AVG"),
Function::RankEq => write!(f, "RANK.EQ"),
Function::Year => write!(f, "YEAR"),
Function::Day => write!(f, "DAY"),
Function::Month => write!(f, "MONTH"),
Expand Down Expand Up @@ -1076,6 +1100,12 @@ impl Model {
Function::Maxifs => self.fn_maxifs(args, cell),
Function::Minifs => self.fn_minifs(args, cell),
Function::Geomean => self.fn_geomean(args, cell),
Function::Quartile => self.fn_quartile(args, cell),
Function::QuartileExc => self.fn_quartile_exc(args, cell),
Function::QuartileInc => self.fn_quartile_inc(args, cell),
Function::Rank => self.fn_rank(args, cell),
Function::RankAvg => self.fn_rank_avg(args, cell),
Function::RankEq => self.fn_rank_eq(args, cell),
// Date and Time
Function::Year => self.fn_year(args, cell),
Function::Day => self.fn_day(args, cell),
Expand Down
Loading