Skip to content

Commit 3314081

Browse files
authored
Ignore invalid criteria in SearchBuilder server-side processing (#1114)
1 parent bd984f8 commit 3314081

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

R/searchbuilder.R

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
# server-side processing for the SearchBuilder extension
22
# https://datatables.net/extensions/searchbuilder/
33

4+
# returns NULL if none of the search criteria are valid
45
sbEvaluateSearch = function(search, data) {
56
# https://datatables.net/reference/option/searchBuilder.preDefined
67
stopifnot(search$logic %in% c('AND', 'OR'))
78
Reduce(
89
switch(search$logic, AND = `&`, OR = `|`),
9-
lapply(search$criteria, sbEvaluateCriteria, data)
10+
dropNULL(lapply(search$criteria, sbEvaluateCriteria, data))
1011
)
1112
}
1213

@@ -15,18 +16,25 @@ sbEvaluateCriteria = function(criteria, data) {
1516
if ('logic' %in% names(criteria)) {
1617
# this is a sub-group
1718
sbEvaluateSearch(criteria, data)
18-
} else {
19+
} else if (sbHasValidCondition(criteria)) {
1920
# this is a criteria
2021
cond = criteria$condition
2122
type = criteria$type
2223
x = data[[criteria$origData %||% criteria$data]]
2324
v = sbParseValue(sbExtractValue(criteria), type)
2425
sbEvaluateCondition(cond, type, x, v)
26+
} else {
27+
# just return NULL for criteria with an invalid condition
2528
}
2629
}
2730

31+
# check that condition is present and values are non-empty
32+
sbHasValidCondition = function(criteria) {
33+
'condition' %in% names(criteria) && all(sapply(criteria, nzchar))
34+
}
35+
2836
sbExtractValue = function(criteria) {
29-
if (criteria$condition %in% c('between', '!between')) {
37+
if ('value2' %in% names(criteria)) {
3038
# array values are passed in a funny way to R
3139
c(criteria$value1, criteria$value2)
3240
} else {

R/shiny.R

+2-1
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,8 @@ dataTablesFilter = function(data, params) {
651651

652652
# apply SearchBuilder query if present
653653
if (!is.null(s <- q$searchBuilder)) {
654-
i = which(sbEvaluateSearch(s, data))
654+
r = sbEvaluateSearch(s, data)
655+
if (!is.null(r)) i = which(r)
655656
}
656657

657658
# search by columns

tests/testit/test-searchbuilder.R

+4
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,7 @@ assert('SearchBuilder complex queries work', {
4141
)
4242
(setequal(which(res), c(2:4, 7)))
4343
})
44+
45+
assert('SearchBuilder skips evaluating invalid conditions', {
46+
(is.null(sbEvaluateCriteria(list(data = 'Sepal.Length'), iris)))
47+
})

0 commit comments

Comments
 (0)