Search in sources :

Example 6 with TailCharIterator

use of org.trie4j.tail.TailCharIterator in project trie4j by takawitter.

the class TailLOUDSTrie method predictiveSearchWithTermId.

@Override
public Iterable<Pair<String, Integer>> predictiveSearchWithTermId(String query) {
    List<Pair<String, Integer>> ret = new ArrayList<Pair<String, Integer>>();
    char[] chars = query.toCharArray();
    int charsLen = chars.length;
    // root
    int nodeId = 0;
    Range r = new Range();
    TailCharIterator tci = tailArray.newIterator();
    String pfx = null;
    int charsIndexBack = 0;
    for (int charsIndex = 0; charsIndex < charsLen; charsIndex++) {
        charsIndexBack = charsIndex;
        int child = getChildNode(nodeId, chars[charsIndex], r);
        if (child == -1)
            return ret;
        tci.setOffset(tailArray.getIteratorOffset(child));
        while (tci.hasNext()) {
            charsIndex++;
            if (charsIndex >= charsLen)
                break;
            if (chars[charsIndex] != tci.next())
                return ret;
        }
        nodeId = child;
    }
    pfx = new String(chars, 0, charsIndexBack);
    Deque<Pair<Integer, String>> queue = new LinkedList<Pair<Integer, String>>();
    queue.offerLast(Pair.create(nodeId, pfx));
    while (queue.size() > 0) {
        Pair<Integer, String> element = queue.pollFirst();
        int nid = element.getFirst();
        StringBuilder b = new StringBuilder(element.getSecond());
        if (nid > 0) {
            b.append(labels[nid]);
        }
        tci.setOffset(tailArray.getIteratorOffset(nid));
        while (tci.hasNext()) b.append(tci.next());
        String letter = b.toString();
        if (term.get(nid)) {
            ret.add(Pair.create(letter, term.rank1(nid) - 1));
        }
        bvtree.getChildNodeIds(nid, r);
        for (int i = (r.getEnd() - 1); i >= r.getStart(); i--) {
            queue.offerFirst(Pair.create(i, letter));
        }
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) Range(org.trie4j.util.Range) LinkedList(java.util.LinkedList) TailCharIterator(org.trie4j.tail.TailCharIterator) Pair(org.trie4j.util.Pair)

Example 7 with TailCharIterator

use of org.trie4j.tail.TailCharIterator in project trie4j by takawitter.

the class TailLOUDSTrie method contains.

@Override
public boolean contains(String text) {
    // root
    int nodeId = 0;
    Range r = new Range();
    TailCharIterator it = tailArray.newIterator();
    int n = text.length();
    for (int i = 0; i < n; i++) {
        nodeId = getChildNode(nodeId, text.charAt(i), r);
        if (nodeId == -1)
            return false;
        it.setOffset(tailArray.getIteratorOffset(nodeId));
        while (it.hasNext()) {
            i++;
            if (i == n)
                return false;
            if (text.charAt(i) != it.next())
                return false;
        }
    }
    return term.get(nodeId);
}
Also used : Range(org.trie4j.util.Range) TailCharIterator(org.trie4j.tail.TailCharIterator)

Example 8 with TailCharIterator

use of org.trie4j.tail.TailCharIterator in project trie4j by takawitter.

the class MapTailPatriciaTrieNode method getLetters.

@Override
public char[] getLetters(CharSequence tails) {
    List<Character> letters = new ArrayList<Character>();
    if (getFirstLetter() != (char) 0xffff) {
        letters.add(getFirstLetter());
    }
    TailCharIterator it = new TailCharIterator(tails, getTailIndex());
    while (it.hasNext()) {
        letters.add(it.next());
    }
    char[] ret = new char[letters.size()];
    for (int i = 0; i < ret.length; i++) {
        ret[i] = letters.get(i);
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) TailCharIterator(org.trie4j.tail.TailCharIterator)

Example 9 with TailCharIterator

use of org.trie4j.tail.TailCharIterator in project trie4j by takawitter.

the class TailDoubleArray method predictiveSearchWithTermId.

@Override
public Iterable<Pair<String, Integer>> predictiveSearchWithTermId(String prefix) {
    Set<Pair<String, Integer>> ret = new TreeSet<Pair<String, Integer>>(new Comparator<Pair<String, Integer>>() {

        @Override
        public int compare(Pair<String, Integer> o1, Pair<String, Integer> o2) {
            return o1.getFirst().compareTo(o2.getFirst());
        }
    });
    StringBuilder current = new StringBuilder();
    char[] chars = prefix.toCharArray();
    int charsLen = chars.length;
    int checkLen = check.length;
    int nodeIndex = 0;
    TailCharIterator it = tailArray.newIterator();
    for (int i = 0; i < chars.length; i++) {
        int ti = tailArray.getIteratorOffset(nodeIndex);
        if (ti != -1) {
            int first = i;
            it.setIndex(ti);
            do {
                if (!it.hasNext())
                    break;
                if (it.next() != chars[i])
                    return ret;
                i++;
            } while (i < charsLen);
            if (i >= charsLen)
                break;
            current.append(chars, first, i - first);
        }
        int cid = findCharId(chars[i]);
        if (cid == -1)
            return ret;
        int next = base[nodeIndex] + cid;
        if (next < 0 || checkLen <= next || check[next] != nodeIndex)
            return ret;
        nodeIndex = next;
        current.append(chars[i]);
    }
    Deque<Pair<Integer, char[]>> q = new LinkedList<Pair<Integer, char[]>>();
    q.add(Pair.create(nodeIndex, current.toString().toCharArray()));
    while (!q.isEmpty()) {
        Pair<Integer, char[]> p = q.pop();
        int ni = p.getFirst();
        StringBuilder buff = new StringBuilder().append(p.getSecond());
        tailArray.getChars(buff, ni);
        if (term.get(ni)) {
            ret.add(Pair.create(buff.toString(), term.rank1(ni) - 1));
        }
        int b = base[ni];
        if (b == BASE_EMPTY)
            continue;
        for (char v : this.chars) {
            int next = b + charToCode[v];
            if (next >= checkLen)
                continue;
            if (check[next] == ni) {
                StringBuilder bu = new StringBuilder(buff);
                bu.append(v);
                q.push(Pair.create(next, bu.toString().toCharArray()));
            }
        }
    }
    return ret;
}
Also used : LinkedList(java.util.LinkedList) TreeSet(java.util.TreeSet) TailCharIterator(org.trie4j.tail.TailCharIterator) Pair(org.trie4j.util.Pair)

Example 10 with TailCharIterator

use of org.trie4j.tail.TailCharIterator in project trie4j by takawitter.

the class TailDoubleArray method getTermId.

@Override
public int getTermId(String text) {
    // root
    int nodeIndex = 0;
    TailCharIterator it = tailArray.newIterator();
    int n = text.length();
    for (int i = 0; i < n; i++) {
        char cid = charToCode[text.charAt(i)];
        if (cid == 0)
            return -1;
        int next = base[nodeIndex] + cid;
        if (next < 0 || check[next] != nodeIndex)
            return -1;
        nodeIndex = next;
        int ti = tailArray.getIteratorOffset(nodeIndex);
        if (ti == -1)
            continue;
        it.setIndex(ti);
        while (it.hasNext()) {
            i++;
            if (i == n)
                return -1;
            if (text.charAt(i) != it.next())
                return -1;
        }
    }
    return term.get(nodeIndex) ? term.rank1(nodeIndex) - 1 : -1;
}
Also used : TailCharIterator(org.trie4j.tail.TailCharIterator)

Aggregations

TailCharIterator (org.trie4j.tail.TailCharIterator)20 ArrayList (java.util.ArrayList)11 Pair (org.trie4j.util.Pair)7 LinkedList (java.util.LinkedList)5 Range (org.trie4j.util.Range)4 FastTailCharIterator (org.trie4j.tail.FastTailCharIterator)2 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 TreeSet (java.util.TreeSet)1