@@ -497,14 +497,18 @@ public static class Hash extends AbstractValueType {
497
497
498
498
// NOTE: Keep in sync with `WildcardTrie`/`SimpleRegexTrie` implementation in metafacture-core.
499
499
private static final Pattern ALTERNATION_PATTERN = Pattern .compile (WildcardTrie .OR_STRING , Pattern .LITERAL );
500
- private static final Matcher PATTERN_MATCHER = Pattern .compile ("[*?]|\\ [[^\\ ]]" ).matcher ("" );
500
+ private static final ThreadLocal < Matcher > PATTERN_MATCHER = ThreadLocal . withInitial (() -> Pattern .compile ("[*?]|\\ [[^\\ ]]" ).matcher ("" ) );
501
501
502
- private static final Map <String , String > PREFIX_CACHE = new HashMap <>( );
502
+ private static final ThreadLocal < Map <String , String >> PREFIX_CACHE = ThreadLocal . withInitial ( HashMap :: new );
503
503
504
- private static final Map <String , Map <String , Boolean >> TRIE_CACHE = new HashMap <>( );
505
- private static final SimpleRegexTrie <String > TRIE = new SimpleRegexTrie <>( );
504
+ private static final ThreadLocal < Map <String , Map <String , Boolean >>> TRIE_CACHE = ThreadLocal . withInitial ( HashMap :: new );
505
+ private static final ThreadLocal < SimpleRegexTrie <String >> TRIE = ThreadLocal . withInitial ( SimpleRegexTrie :: new );
506
506
507
+ private final Map <String , Map <String , Boolean >> trieCache = TRIE_CACHE .get ();
508
+ private final Map <String , String > prefixCache = PREFIX_CACHE .get ();
507
509
private final Map <String , Value > map = new LinkedHashMap <>();
510
+ private final Matcher patternMatcher = PATTERN_MATCHER .get ();
511
+ private final SimpleRegexTrie <String > trie = TRIE .get ();
508
512
509
513
/**
510
514
* Creates an empty instance of {@link Hash}.
@@ -782,28 +786,28 @@ private Set<String> findFields(final String pattern) {
782
786
}
783
787
784
788
private void findFields (final String pattern , final Set <String > fieldSet ) {
785
- if (!PREFIX_CACHE .containsKey (pattern )) {
786
- final Matcher patternMatcher = PATTERN_MATCHER .reset (pattern );
789
+ if (!prefixCache .containsKey (pattern )) {
790
+ final Matcher matcher = patternMatcher .reset (pattern );
787
791
788
- if (patternMatcher .find ()) {
789
- TRIE .put (pattern , pattern );
790
- TRIE_CACHE .put (pattern , new HashMap <>());
792
+ if (matcher .find ()) {
793
+ trie .put (pattern , pattern );
794
+ trieCache .put (pattern , new HashMap <>());
791
795
792
- PREFIX_CACHE .put (pattern , pattern .substring (0 , patternMatcher .start ()));
796
+ prefixCache .put (pattern , pattern .substring (0 , matcher .start ()));
793
797
}
794
798
else {
795
- PREFIX_CACHE .put (pattern , null );
799
+ prefixCache .put (pattern , null );
796
800
}
797
801
}
798
802
799
- final String prefix = PREFIX_CACHE .get (pattern );
803
+ final String prefix = prefixCache .get (pattern );
800
804
801
805
if (prefix != null ) {
802
- final Map <String , Boolean > fieldCache = TRIE_CACHE .get (pattern );
806
+ final Map <String , Boolean > fieldCache = trieCache .get (pattern );
803
807
804
808
for (final String field : map .keySet ()) {
805
809
if (!fieldCache .containsKey (field )) {
806
- final boolean matches = field .startsWith (prefix ) && TRIE .get (field ).contains (pattern );
810
+ final boolean matches = field .startsWith (prefix ) && trie .get (field ).contains (pattern );
807
811
fieldCache .put (field , matches );
808
812
809
813
if (matches ) {
0 commit comments