
querqy.trie.SuffixTrieMap Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of querqy-core Show documentation
Show all versions of querqy-core Show documentation
Querqy library for query rewriting: Querqy Core
package querqy.trie;
import querqy.ReverseComparableCharSequence;
import querqy.trie.model.SuffixMatch;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import static querqy.trie.LookupUtils.COMPARE_STATE_BY_INDEX_DESC;
public class SuffixTrieMap {
private final TrieMap trieMap;
public SuffixTrieMap() {
this.trieMap = new TrieMap<>();
}
public void putSuffix(final CharSequence seq, final T value) {
this.putSuffix(seq, value, false);
}
public void putSuffix(final CharSequence seq, final T value, final boolean includeExactMatch) {
if (seq.length() == 0) {
throw new IllegalArgumentException("Must not put empty sequence into trie");
}
final ReverseComparableCharSequence revSeq = new ReverseComparableCharSequence(seq);
trieMap.putPrefix(revSeq, value);
if (includeExactMatch) {
trieMap.put(revSeq, value);
}
}
public Optional> getBySuffix(final CharSequence seq) {
if (seq.length() == 0) {
return Optional.empty();
}
final ReverseComparableCharSequence revSeq = new ReverseComparableCharSequence(seq);
final States states = trieMap.get(revSeq);
final State fullMatch = states.getStateForCompleteSequence();
if (fullMatch.isFinal()) {
return Optional.of(new SuffixMatch<>(0, fullMatch.value));
}
final List> suffixMatches = states.getPrefixes();
if (suffixMatches != null && !suffixMatches.isEmpty()) {
final State suffixMaxMatch = Collections.max(states.getPrefixes(), COMPARE_STATE_BY_INDEX_DESC);
final int startSubstring = seq.length() - (suffixMaxMatch.index + 1);
return Optional.of(new SuffixMatch<>(
startSubstring,
seq.subSequence(0, startSubstring),
suffixMaxMatch.value));
}
return Optional.empty();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy