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;
}
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);
}
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;
}
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;
}
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;
}
Aggregations