|
33 | 33 | import java.util.function.BiFunction;
|
34 | 34 | import java.util.function.Consumer;
|
35 | 35 | import java.util.function.Predicate;
|
| 36 | +import java.util.regex.Matcher; |
| 37 | +import java.util.regex.Pattern; |
36 | 38 | import java.util.stream.Collectors;
|
37 | 39 | import java.util.stream.Stream;
|
38 | 40 |
|
@@ -460,6 +462,8 @@ public void remove(final int index) {
|
460 | 462 | */
|
461 | 463 | public static class Hash extends AbstractValueType {
|
462 | 464 |
|
| 465 | + private static final Matcher PATTERN_MATCHER = Pattern.compile("[*?|]|\\[[^\\]]").matcher(""); |
| 466 | + |
463 | 467 | private static final Map<String, Map<String, Boolean>> TRIE_CACHE = new HashMap<>();
|
464 | 468 | private static final SimpleRegexTrie<String> TRIE = new SimpleRegexTrie<>();
|
465 | 469 |
|
@@ -697,12 +701,17 @@ private Stream<String> findFields(final String pattern) {
|
697 | 701 | }
|
698 | 702 |
|
699 | 703 | private <T> T matchFields(final String pattern, final BiFunction<Stream<String>, Predicate<String>, T> function) {
|
700 |
| - final Map<String, Boolean> matcher = TRIE_CACHE.computeIfAbsent(pattern, k -> { |
701 |
| - TRIE.put(k, k); |
702 |
| - return new HashMap<>(); |
703 |
| - }); |
| 704 | + if (PATTERN_MATCHER.reset(pattern).find()) { |
| 705 | + final Map<String, Boolean> matcher = TRIE_CACHE.computeIfAbsent(pattern, k -> { |
| 706 | + TRIE.put(k, k); |
| 707 | + return new HashMap<>(); |
| 708 | + }); |
704 | 709 |
|
705 |
| - return function.apply(map.keySet().stream(), f -> matcher.computeIfAbsent(f, k -> TRIE.get(k).contains(pattern))); |
| 710 | + return function.apply(map.keySet().stream(), f -> matcher.computeIfAbsent(f, k -> TRIE.get(k).contains(pattern))); |
| 711 | + } |
| 712 | + else { |
| 713 | + return function.apply(Stream.of(pattern), map::containsKey); |
| 714 | + } |
706 | 715 | }
|
707 | 716 |
|
708 | 717 | }
|
|
0 commit comments