1
1
# server-side processing for the SearchBuilder extension
2
2
# https://datatables.net/extensions/searchbuilder/
3
3
4
+ # returns NULL if none of the search criteria are valid
4
5
sbEvaluateSearch = function (search , data ) {
5
6
# https://datatables.net/reference/option/searchBuilder.preDefined
6
7
stopifnot(search $ logic %in% c(' AND' , ' OR' ))
7
8
Reduce(
8
9
switch (search $ logic , AND = `&` , OR = `|` ),
9
- lapply(search $ criteria , sbEvaluateCriteria , data )
10
+ dropNULL( lapply(search $ criteria , sbEvaluateCriteria , data ) )
10
11
)
11
12
}
12
13
@@ -15,18 +16,25 @@ sbEvaluateCriteria = function(criteria, data) {
15
16
if (' logic' %in% names(criteria )) {
16
17
# this is a sub-group
17
18
sbEvaluateSearch(criteria , data )
18
- } else {
19
+ } else if (sbHasValidCondition( criteria )) {
19
20
# this is a criteria
20
21
cond = criteria $ condition
21
22
type = criteria $ type
22
23
x = data [[criteria $ origData %|| % criteria $ data ]]
23
24
v = sbParseValue(sbExtractValue(criteria ), type )
24
25
sbEvaluateCondition(cond , type , x , v )
26
+ } else {
27
+ # just return NULL for criteria with an invalid condition
25
28
}
26
29
}
27
30
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
+
28
36
sbExtractValue = function (criteria ) {
29
- if (criteria $ condition %in% c( ' between ' , ' !between ' )) {
37
+ if (' value2 ' %in% names( criteria )) {
30
38
# array values are passed in a funny way to R
31
39
c(criteria $ value1 , criteria $ value2 )
32
40
} else {
0 commit comments