Skip to content

Commit d82e1b8

Browse files
authored
Merge pull request #215 from metafacture/207-optimizeWildcardMatching
Optimize path wildcard matching for literal (non-wildcard) field names.
2 parents 1933b59 + bb221c2 commit d82e1b8

File tree

1 file changed

+15
-5
lines changed
  • metafix/src/main/java/org/metafacture/metafix

1 file changed

+15
-5
lines changed

metafix/src/main/java/org/metafacture/metafix/Value.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import java.util.function.BiFunction;
3434
import java.util.function.Consumer;
3535
import java.util.function.Predicate;
36+
import java.util.regex.Matcher;
37+
import java.util.regex.Pattern;
3638
import java.util.stream.Collectors;
3739
import java.util.stream.Stream;
3840

@@ -460,6 +462,9 @@ public void remove(final int index) {
460462
*/
461463
public static class Hash extends AbstractValueType {
462464

465+
// NOTE: Keep in sync with `WildcardTrie`/`SimpleRegexTrie` implementation in metafacture-core.
466+
private static final Matcher PATTERN_MATCHER = Pattern.compile("[*?|]|\\[[^\\]]").matcher("");
467+
463468
private static final Map<String, Map<String, Boolean>> TRIE_CACHE = new HashMap<>();
464469
private static final SimpleRegexTrie<String> TRIE = new SimpleRegexTrie<>();
465470

@@ -697,12 +702,17 @@ private Stream<String> findFields(final String pattern) {
697702
}
698703

699704
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-
});
705+
if (PATTERN_MATCHER.reset(pattern).find()) {
706+
final Map<String, Boolean> matcher = TRIE_CACHE.computeIfAbsent(pattern, k -> {
707+
TRIE.put(k, k);
708+
return new HashMap<>();
709+
});
704710

705-
return function.apply(map.keySet().stream(), f -> matcher.computeIfAbsent(f, k -> TRIE.get(k).contains(pattern)));
711+
return function.apply(map.keySet().stream(), f -> matcher.computeIfAbsent(f, k -> TRIE.get(k).contains(pattern)));
712+
}
713+
else {
714+
return function.apply(Stream.of(pattern), map::containsKey);
715+
}
706716
}
707717

708718
}

0 commit comments

Comments
 (0)