Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
33dae39
Add NETWORKDAYS functions
BrianHung Jul 14, 2025
3a51b86
Implement time functions and tests
BrianHung Jul 14, 2025
75bf5c7
Implement DATEDIF and DATEVALUE functions
BrianHung Jul 14, 2025
9171182
Merge branch 'main' into codex/implement-networkdays-and-networkdays.…
BrianHung Jul 14, 2025
52236f0
Merge branch 'main' into codex/implement-datedif-and-datevalue-functi…
BrianHung Jul 14, 2025
bbae88e
Merge branch 'main' into codex/implement-excel-time-functions-and-tests
BrianHung Jul 14, 2025
e8d1536
fmt
BrianHung Jul 14, 2025
37c5902
fix build
BrianHung Jul 14, 2025
12ee251
fix build
BrianHung Jul 14, 2025
f30abdd
fix build
BrianHung Jul 14, 2025
61a0391
Implement quartile and rank functions
BrianHung Jul 14, 2025
3501e2e
fix build
BrianHung Jul 15, 2025
bdbd34d
fix build
BrianHung Jul 15, 2025
62e635c
return #N/A if target number not found
BrianHung Jul 20, 2025
825672e
fix signature args for rank
BrianHung Jul 20, 2025
3e0d3b8
fix docs
BrianHung Jul 20, 2025
26c2825
increase test coverage
BrianHung Jul 21, 2025
17af7c8
docs
BrianHung Jul 21, 2025
013ac48
increase test coverage
BrianHung Jul 21, 2025
73d638d
fmt
BrianHung Jul 21, 2025
51d9430
fix build
BrianHung Jul 21, 2025
96f0820
increase test coverage
BrianHung Jul 21, 2025
769aa1e
fix build
BrianHung Jul 21, 2025
452dedc
test cases
BrianHung Jul 21, 2025
750fc85
fix docs
BrianHung Jul 21, 2025
7e7e92e
increase test coverage
BrianHung Jul 22, 2025
e6449a2
fix docs
BrianHung Jul 22, 2025
ccb72fa
Merge PR #36: implement DATEDIF and DATEVALUE functions
BrianHung Jul 28, 2025
66b3bde
Merge PR #35: implement TIME, TIMEVALUE, HOUR, MINUTE, SECOND functions
BrianHung Jul 28, 2025
a6506a4
Merge PR #41: implement DAYS, DAYS360, WEEKDAY, WEEKNUM, WORKDAY, WOR…
BrianHung Jul 28, 2025
f222787
Add NETWORKDAYS and NETWORKDAYS.INTL functions (manual integration)
BrianHung Jul 28, 2025
20bb9f9
Merge PR #33: implement NETWORKDAYS and NETWORKDAYS.INTL functions
BrianHung Jul 28, 2025
1ccaa08
Fix remaining conflict markers in static_analysis.rs
BrianHung Jul 28, 2025
f8d7036
🔥 Deduplicate helper functions from merged date/time PRs
BrianHung Jul 28, 2025
961b4a7
📐 Consolidate date validation patterns across date/time functions
BrianHung Jul 28, 2025
58a4453
cargo fmt
BrianHung Jul 28, 2025
d160ebc
fix docs
BrianHung Jul 29, 2025
4a48c3c
🧹 Fix inconsistent error handling and eliminate remaining code duplic…
BrianHung Jul 29, 2025
6d4c7d2
🧹 Fix all clippy warnings and build errors
BrianHung Jul 29, 2025
d26f4b0
fmt
BrianHung Jul 29, 2025
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
54 changes: 54 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 @@ -690,10 +700,17 @@ fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec<Signatu
Function::Maxifs => vec![Signature::Vector; arg_count],
Function::Minifs => vec![Signature::Vector; arg_count],
Function::Date => args_signature_scalars(arg_count, 3, 0),
Function::Datedif => args_signature_scalars(arg_count, 3, 0),
Function::Datevalue => args_signature_scalars(arg_count, 1, 0),
Function::Day => args_signature_scalars(arg_count, 1, 0),
Function::Edate => args_signature_scalars(arg_count, 2, 0),
Function::Eomonth => args_signature_scalars(arg_count, 2, 0),
Function::Month => args_signature_scalars(arg_count, 1, 0),
Function::Time => args_signature_scalars(arg_count, 3, 0),
Function::Timevalue => args_signature_scalars(arg_count, 1, 0),
Function::Hour => args_signature_scalars(arg_count, 1, 0),
Function::Minute => args_signature_scalars(arg_count, 1, 0),
Function::Second => args_signature_scalars(arg_count, 1, 0),
Function::Now => args_signature_no_args(arg_count),
Function::Today => args_signature_no_args(arg_count),
Function::Year => args_signature_scalars(arg_count, 1, 0),
Expand Down Expand Up @@ -785,6 +802,24 @@ 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),
Function::Days => args_signature_scalars(arg_count, 2, 0),
Function::Days360 => args_signature_scalars(arg_count, 2, 1),
Function::Weekday => args_signature_scalars(arg_count, 1, 1),
Function::Weeknum => args_signature_scalars(arg_count, 1, 1),
Function::Isoweeknum => args_signature_scalars(arg_count, 1, 0),
Function::Workday => args_signature_scalars(arg_count, 2, 1),
Function::WorkdayIntl => args_signature_scalars(arg_count, 2, 2),
Function::Yearfrac => args_signature_scalars(arg_count, 2, 1),
Function::Networkdays => args_signature_scalars(arg_count, 2, 1),
Function::NetworkdaysIntl => args_signature_scalars(arg_count, 2, 2),
}
}

Expand Down Expand Up @@ -896,9 +931,16 @@ fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult {
Function::Maxifs => not_implemented(args),
Function::Minifs => not_implemented(args),
Function::Date => not_implemented(args),
Function::Datedif => not_implemented(args),
Function::Datevalue => not_implemented(args),
Function::Day => not_implemented(args),
Function::Edate => not_implemented(args),
Function::Month => not_implemented(args),
Function::Time => not_implemented(args),
Function::Timevalue => not_implemented(args),
Function::Hour => not_implemented(args),
Function::Minute => not_implemented(args),
Function::Second => not_implemented(args),
Function::Now => not_implemented(args),
Function::Today => not_implemented(args),
Function::Year => not_implemented(args),
Expand Down Expand Up @@ -990,5 +1032,17 @@ 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),
Function::Days => scalar_arguments(args),
Function::Days360 => scalar_arguments(args),
Function::Weekday => scalar_arguments(args),
Function::Weeknum => scalar_arguments(args),
Function::Isoweeknum => scalar_arguments(args),
Function::Workday => scalar_arguments(args),
Function::WorkdayIntl => scalar_arguments(args),
Function::Yearfrac => scalar_arguments(args),
Function::Networkdays => scalar_arguments(args),
Function::NetworkdaysIntl => scalar_arguments(args),
}
}
Loading
Loading