Search in sources :

Example 6 with Pair

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

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

the class OptimizedTailDoubleArray method predictiveSearch.

@Override
public Iterable<String> predictiveSearch(String prefix) {
    List<String> ret = new ArrayList<String>();
    StringBuilder current = new StringBuilder();
    char[] chars = prefix.toCharArray();
    int nodeIndex = 0;
    TailCharIterator it = new TailCharIterator(tails, -1);
    for (int i = 0; i < chars.length; i++) {
        int ti = tail[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 < chars.length);
            if (i >= chars.length)
                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 || check.length <= next || (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());
        int ti = tail[ni];
        if (ti != -1) {
            it.setIndex(ti);
            while (it.hasNext()) {
                buff.append(it.next());
            }
        }
        if (term.get(ni))
            ret.add(buff.toString());
        for (Map.Entry<Character, Integer> e : charCodes.entrySet()) {
            int b = base[ni];
            if (b == BASE_EMPTY)
                continue;
            if (b == (BASE_EMPTY - 1))
                continue;
            int next = b + e.getValue();
            if (check.length <= next)
                continue;
            if (next + check[next] == ni) {
                StringBuilder bu = new StringBuilder(buff);
                bu.append(e.getKey());
                q.push(Pair.create(next, bu.toString().toCharArray()));
            }
        }
    }
    return ret;
/*/
		List<String> ret = new ArrayList<String>();
		StringBuilder current = new StringBuilder();
		char[] chars = prefix.toCharArray();
		int nodeIndex = 0;
		for(int i = 0; i < chars.length; i++){
			int ti = tail[nodeIndex];
			if(ti != -1){
				int first = i;
				TailCharIterator it = new TailCharIterator(tails,  ti);
				do{
					if(!it.hasNext()) break;
					if(it.next() != chars[i]) return ret;
					i++;
				} while(i < chars.length);
				if(i >= chars.length) break;
				current.append(chars, i, i - first);
			}
			int cid = findCharId(chars[i]);
			if(cid == -1) return ret;
			int next = base[nodeIndex] + cid;
			if(next < 0 || check.length <= next || check[next] != cid) 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());
			int ti = tail[ni];
			if(ti != -1){
				TailCharIterator it = new TailCharIterator(tails, ti);
				while(it.hasNext()){
					buff.append(it.next());
				}
			}
			if(term.get(ni)) ret.add(buff.toString());
			for(Map.Entry<Character, Integer> e : charCodes.entrySet()){
				int b = base[ni];
				if(b == BASE_EMPTY) continue;
				int next = b + e.getValue();
				if(check.length <= next) continue;
				if(check[next] == e.getValue()){
					StringBuilder bu = new StringBuilder(buff);
					bu.append(e.getKey());
					q.push(Pair.create(next, bu.toString().toCharArray()));
				}
			}
		}
		return ret;
//*/
}
Also used : ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList) TailCharIterator(org.trie4j.tail.TailCharIterator) Map(java.util.Map) TreeMap(java.util.TreeMap) Pair(org.trie4j.util.Pair)

Example 8 with Pair

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

the class TailDoubleArray method commonPrefixSearchWithTermId.

@Override
public Iterable<Pair<String, Integer>> commonPrefixSearchWithTermId(String query) {
    List<Pair<String, Integer>> ret = new ArrayList<Pair<String, Integer>>();
    int charsLen = query.length();
    int ci = 0;
    int ni = 0;
    TailCharIterator it = tailArray.newIterator();
    for (; ci < charsLen; ci++) {
        int cid = findCharId(query.charAt(ci));
        if (cid == -1)
            return ret;
        int b = base[ni];
        if (b == BASE_EMPTY)
            return ret;
        int next = b + cid;
        if (check.length <= next || check[next] != ni)
            return ret;
        ni = next;
        int ti = tailArray.getIteratorOffset(ni);
        if (ti != -1) {
            it.setIndex(ti);
            while (it.hasNext()) {
                char c = it.next();
                ci++;
                if (ci >= charsLen)
                    return ret;
                if (c != query.charAt(ci))
                    return ret;
            }
        }
        if (term.get(ni))
            ret.add(Pair.create(query.substring(0, ci + 1), term.rank1(ni) - 1));
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) TailCharIterator(org.trie4j.tail.TailCharIterator) Pair(org.trie4j.util.Pair)

Example 9 with Pair

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

the class InlinedTailLOUDSTrie 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 = new TailCharIterator(tails, -1);
    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.setIndex(tail[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.setIndex(tail[nid]);
        while (tci.hasNext()) b.append(tci.next());
        String letter = b.toString();
        if (term.get(nid))
            ret.add(letter);
        int s = bv.select0(nid) + 1;
        int e = bv.next0(s);
        int lastNodeId = bv.rank1(s) + e - s - 1;
        for (int i = (e - 1); i >= s; i--) {
            queue.offerFirst(Pair.create(lastNodeId--, letter));
        }
    }
    return ret;
}
Also used : ArrayList(java.util.ArrayList) TailCharIterator(org.trie4j.tail.TailCharIterator) 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