Skip to content

Commit

Permalink
sum(<BOOLEAN>)
Browse files Browse the repository at this point in the history
  • Loading branch information
romainfrancois committed Apr 24, 2024
1 parent 115cce8 commit f3861e4
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 4 deletions.
14 changes: 11 additions & 3 deletions duckdb-rfuns-r/tests/testthat/_snaps/sum.md
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
# r_base::sum(<?>, na.rm = <VARCHAR>)

Code
rfuns_sum(c(TRUE, FALSE), na.rm = "hello")
Condition
Error:
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(BOOLEAN, VARCHAR)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(BOOLEAN, BOOLEAN) -> INTEGER\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(BOOLEAN, BOOLEAN) -> INTEGER,r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(BOOLEAN, VARCHAR)","error_subtype":"NO_MATCHING_FUNCTION"}

---

Code
rfuns_sum(1:10, na.rm = "hello")
Condition
Error:
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(INTEGER, VARCHAR)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(INTEGER, VARCHAR)","error_subtype":"NO_MATCHING_FUNCTION"}
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(INTEGER, VARCHAR)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(BOOLEAN, BOOLEAN) -> INTEGER\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(BOOLEAN, BOOLEAN) -> INTEGER,r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(INTEGER, VARCHAR)","error_subtype":"NO_MATCHING_FUNCTION"}

---

Code
rfuns_sum(c(1, 2, 3), na.rm = "hello")
Condition
Error:
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(DOUBLE, VARCHAR)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(DOUBLE, VARCHAR)","error_subtype":"NO_MATCHING_FUNCTION"}
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(DOUBLE, VARCHAR)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(BOOLEAN, BOOLEAN) -> INTEGER\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(BOOLEAN, BOOLEAN) -> INTEGER,r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(DOUBLE, VARCHAR)","error_subtype":"NO_MATCHING_FUNCTION"}

# r_base::sum(<VARCHAR>

Code
rfuns_sum("HufflePuff")
Condition
Error:
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(VARCHAR, BOOLEAN)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(VARCHAR, BOOLEAN)","error_subtype":"NO_MATCHING_FUNCTION"}
! {"exception_type":"Binder","exception_message":"No function matches the given name and argument types 'r_base::sum(VARCHAR, BOOLEAN)'. You might need to add explicit type casts.\n\tCandidate functions:\n\tr_base::sum(BOOLEAN, BOOLEAN) -> INTEGER\n\tr_base::sum(INTEGER, BOOLEAN) -> INTEGER\n\tr_base::sum(DOUBLE, BOOLEAN) -> DOUBLE\n","name":"r_base::sum","candidates":"r_base::sum(BOOLEAN, BOOLEAN) -> INTEGER,r_base::sum(INTEGER, BOOLEAN) -> INTEGER,r_base::sum(DOUBLE, BOOLEAN) -> DOUBLE","call":"r_base::sum(VARCHAR, BOOLEAN)","error_subtype":"NO_MATCHING_FUNCTION"}

15 changes: 15 additions & 0 deletions duckdb-rfuns-r/tests/testthat/test-sum.R
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
test_that("r_base::sum(<BOOLEAN>)", {
expect_equal(rfuns_sum(c(TRUE, TRUE, FALSE)), 2L)
expect_equal(rfuns_sum(c(TRUE, TRUE, FALSE, NA)), 2L)

expect_equal(rfuns_sum(c(TRUE, TRUE, FALSE, NA), na.rm = TRUE), 2L)
expect_equal(rfuns_sum(c(TRUE, TRUE, FALSE, NA), na.rm = FALSE), NA_integer_)

expect_equal(rfuns_sum(logical(), na.rm = FALSE), 0L)
expect_equal(rfuns_sum(logical(), na.rm = TRUE), 0L)

expect_equal(rfuns_sum(NA, na.rm = TRUE), 0L)
expect_equal(rfuns_sum(NA, na.rm = FALSE), NA_integer_)
})

test_that("r_base::sum(<INTEGER>)", {
expect_equal(rfuns_sum(1:10), 55)
expect_equal(rfuns_sum(c(1:10, NA)), 55)
Expand Down Expand Up @@ -27,6 +41,7 @@ test_that("r_base::sum(<DOUBLE>)", {
})

test_that("r_base::sum(<?>, na.rm = <VARCHAR>)", {
expect_snapshot(error = TRUE, rfuns_sum(c(TRUE, FALSE), na.rm = "hello"))
expect_snapshot(error = TRUE, rfuns_sum(1:10, na.rm = "hello"))
expect_snapshot(error = TRUE, rfuns_sum(c(1, 2, 3), na.rm = "hello"))
})
Expand Down
7 changes: 6 additions & 1 deletion src/sum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,9 @@ void BindRSum_dispatch(ClientContext &context, AggregateFunction &function, vect
case LogicalTypeId::INTEGER:
function = AggregateFunction::UnaryAggregate<RSumKeepNaState<hugeint_t>, int32_t, hugeint_t, RSumOperation<HugeintAdd, NA_RM>>(type, type);
break;
case LogicalTypeId::BOOLEAN:
function = AggregateFunction::UnaryAggregate<RSumKeepNaState<int32_t>, bool, int32_t, RSumOperation<RegularAdd, NA_RM>>(LogicalType::BOOLEAN, LogicalType::INTEGER);
break;
default:
break;
}
Expand All @@ -96,8 +99,9 @@ unique_ptr<FunctionData> BindRSum(ClientContext &context, AggregateFunction &fun
}

AggregateFunction RSum(const LogicalType& type) {
auto return_type = type == LogicalType::BOOLEAN ? LogicalType::INTEGER : type;
return AggregateFunction(
{type, LogicalType::BOOLEAN}, type,
{type, LogicalType::BOOLEAN}, return_type,
nullptr, nullptr, nullptr, nullptr, nullptr, FunctionNullHandling::DEFAULT_NULL_HANDLING, nullptr,
BindRSum
);
Expand All @@ -106,6 +110,7 @@ AggregateFunction RSum(const LogicalType& type) {
AggregateFunctionSet base_r_sum() {
AggregateFunctionSet set("r_base::sum");

set.AddFunction(RSum(LogicalType::BOOLEAN));
set.AddFunction(RSum(LogicalType::INTEGER));
set.AddFunction(RSum(LogicalType::DOUBLE));

Expand Down

0 comments on commit f3861e4

Please sign in to comment.