Skip to content

Commit 5737e97

Browse files
author
Sebastian Lang
committed
#1 Allow regex chars in non-regex search
1 parent e6dac45 commit 5737e97

File tree

2 files changed

+34
-3
lines changed

2 files changed

+34
-3
lines changed

src/main/java/org/springframework/data/mongodb/datatables/DataTablesCriteria.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Optional;
27+
import java.util.regex.Pattern;
2728

2829
import static java.util.stream.Collectors.toList;
2930
import static org.springframework.data.domain.Sort.by;
@@ -286,7 +287,8 @@ private List<Criteria> createCriteria(DataTablesInput.Column column, DataTablesI
286287
} else {
287288
return searchConfig.getReferenceColumns().stream()
288289
.map(data -> search.isRegex() ?
289-
where(resolvedColumn.get(column.getData()) + "." + data).regex(searchValue) : where(resolvedColumn.get(column.getData()) + "." + data).regex(searchValue.trim(), "i"))
290+
where(resolvedColumn.get(column.getData()) + "." + data).regex(searchValue) :
291+
where(resolvedColumn.get(column.getData()) + "." + data).regex(Pattern.quote(searchValue.trim()), "i"))
290292
.collect(toList());
291293
}
292294
} else {
@@ -311,14 +313,14 @@ private List<Criteria> createCriteria(DataTablesInput.Column column, DataTablesI
311313
if (search.isRegex()) {
312314
criteria.add(where(columnName).regex(searchValue));
313315
} else {
314-
criteria.add(where(columnName).regex(searchValue.trim(), "i"));
316+
criteria.add(where(columnName).regex(Pattern.quote(searchValue.trim()), "i"));
315317
}
316318
break;
317319
default:
318320
if (search.isRegex()) {
319321
criteria.add(where(column.getData()).regex(searchValue));
320322
} else {
321-
criteria.add(where(column.getData()).regex(searchValue.trim(), "i"));
323+
criteria.add(where(column.getData()).regex(Pattern.quote(searchValue.trim()), "i"));
322324
}
323325
break;
324326
}

src/test/java/org/springframework/data/mongodb/datatables/OrderRepositoryTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,35 @@ public void globalFilter() {
244244
assertThat(output.getError()).isNull();
245245
}
246246

247+
@Test
248+
public void globalFilter_plus() {
249+
DataTablesInput input = getDefaultInput();
250+
input.setSearch(new DataTablesInput.Search("+49", false));
251+
252+
DataTablesOutput<Order> output = orderRepository.findAll(input);
253+
assertThat(output.getError()).isNull();
254+
}
255+
256+
@Test
257+
public void globalFilter_plus_regex() {
258+
DataTablesInput input = getDefaultInput();
259+
input.setSearch(new DataTablesInput.Search("ab+49", true));
260+
261+
DataTablesOutput<Order> output = orderRepository.findAll(input);
262+
assertThat(output.getError()).isNull();
263+
}
264+
265+
@Test
266+
public void globalFilter_plus_regex_invalid() {
267+
DataTablesInput input = getDefaultInput();
268+
269+
// Invalid Regex expression. Cannot start with '+'.
270+
input.setSearch(new DataTablesInput.Search("+49", true));
271+
272+
DataTablesOutput<Order> output = orderRepository.findAll(input);
273+
assertThat(output.getError().contains("PatternSyntaxException")).isTrue();
274+
}
275+
247276
@Test
248277
public void globalFilter_int() {
249278
DataTablesInput input = getDefaultInput();

0 commit comments

Comments
 (0)