All Downloads are FREE. Search and download functionalities are using the official Maven repository.

querqy.trie.SuffixTrieMap Maven / Gradle / Ivy

There is a newer version: 3.18.1
Show newest version
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