Skip to content

Commit f64cbde

Browse files
committed
Optimize path wildcard matching for literal (non-wildcard) field names. (#97, 90cbde4)
Runs potential risk of diverging from `WildcardTrie`/`SimpleRegexTrie` implementation.
1 parent 1933b59 commit f64cbde

File tree

1 file changed

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

1 file changed

+14
-5
lines changed

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

Lines changed: 14 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,8 @@ public void remove(final int index) {
460462
*/
461463
public static class Hash extends AbstractValueType {
462464

465+
private static final Matcher PATTERN_MATCHER = Pattern.compile("[*?|]|\\[[^\\]]").matcher("");
466+
463467
private static final Map<String, Map<String, Boolean>> TRIE_CACHE = new HashMap<>();
464468
private static final SimpleRegexTrie<String> TRIE = new SimpleRegexTrie<>();
465469

@@ -697,12 +701,17 @@ private Stream<String> findFields(final String pattern) {
697701
}
698702

699703
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+
});
704709

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+
}
706715
}
707716

708717
}

0 commit comments

Comments
 (0)