Search in sources :

Example 1 with Pair

use of org.trie4j.util.Pair in project trie4j by takawitter.

the class InlinedTailLOUDSPPTrie method predictiveSearch.

@Override
public Iterable<String> predictiveSearch(String query) {
    List<String> ret = new ArrayList<String>();
    char[] chars = query.toCharArray();
    int charsLen = chars.length;
    // root
    int nodeId = 0;
    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]);
        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());
        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(letter);
        if (r0.isZero(nid)) {
            int s = r1.select0(r0.rank0(nid)) + 1;
            int e = r1.next0(s) + 1;
            for (int i = (e - 1); i >= s; i--) {
                queue.offerFirst(Pair.create(i, letter));
            }
        }
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) TailCharIterator(org.trie4j.tail.TailCharIterator) LinkedList(java.util.LinkedList) Pair(org.trie4j.util.Pair)

Example 2 with Pair

use of org.trie4j.util.Pair in project trie4j by takawitter.

the class TailLOUDSTrie method commonPrefixSearchWithTermId.

@Override
public Iterable<Pair<String, Integer>> commonPrefixSearchWithTermId(String query) {
    List<Pair<String, Integer>> ret = new ArrayList<Pair<String, Integer>>();
    char[] chars = query.toCharArray();
    int charsLen = chars.length;
    // root
    int nodeId = 0;
    TailCharIterator tci = tailArray.newIterator();
    Range r = new Range();
    for (int charsIndex = 0; charsIndex < charsLen; charsIndex++) {
        int child = getChildNode(nodeId, chars[charsIndex], r);
        if (child == -1)
            return ret;
        tci.setOffset(tailArray.getIteratorOffset(child));
        while (tci.hasNext()) {
            charsIndex++;
            if (charsLen <= charsIndex)
                return ret;
            if (chars[charsIndex] != tci.next())
                return ret;
        }
        if (term.get(child)) {
            ret.add(Pair.create(new String(chars, 0, charsIndex + 1), term.rank1(child) - 1));
        }
        nodeId = child;
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) Range(org.trie4j.util.Range) TailCharIterator(org.trie4j.tail.TailCharIterator) Pair(org.trie4j.util.Pair)

Example 3 with Pair

use of org.trie4j.util.Pair 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 4 with Pair

use of org.trie4j.util.Pair in project trie4j by takawitter.

the class Algorithms method traverseByDepth.

public static void traverseByDepth(Node root, NodeVisitor visitor) {
    Deque<Pair<Node, Integer>> nodeAndNests = new LinkedList<Pair<Node, Integer>>();
    nodeAndNests.offer(Pair.create(root, 0));
    Pair<Node, Integer> nodeAndNest = null;
    while ((nodeAndNest = nodeAndNests.poll()) != null) {
        Node node = nodeAndNest.getFirst();
        int nest = nodeAndNest.getSecond();
        if (!visitor.visit(node, nest))
            return;
        nest++;
        Node[] children = node.getChildren();
        int n = children.length;
        for (int i = n - 1; i >= 0; i--) {
            nodeAndNests.offerFirst(Pair.create(children[i], nest));
        }
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Node(org.trie4j.Node) LinkedList(java.util.LinkedList) Pair(org.trie4j.util.Pair)

Example 5 with Pair

use of org.trie4j.util.Pair in project trie4j by takawitter.

the class Algorithms method traverseByBreadth.

public static void traverseByBreadth(Node root, NodeVisitor visitor) {
    Queue<Pair<Node, Integer>> nodeAndNests = new LinkedList<Pair<Node, Integer>>();
    nodeAndNests.offer(Pair.create(root, 0));
    Pair<Node, Integer> nodeAndNest = null;
    while ((nodeAndNest = nodeAndNests.poll()) != null) {
        Node node = nodeAndNest.getFirst();
        int nest = nodeAndNest.getSecond();
        if (!visitor.visit(node, nest))
            return;
        nest++;
        for (Node child : node.getChildren()) {
            nodeAndNests.offer(Pair.create(child, nest));
        }
    }
}
Also used : AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Node(org.trie4j.Node) LinkedList(java.util.LinkedList) Pair(org.trie4j.util.Pair)

Aggregations

Pair (org.trie4j.util.Pair)9 LinkedList (java.util.LinkedList)7 TailCharIterator (org.trie4j.tail.TailCharIterator)7 ArrayList (java.util.ArrayList)6 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 Node (org.trie4j.Node)2 Range (org.trie4j.util.Range)2 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1 TreeSet (java.util.TreeSet)1