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;
}
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;
//*/
}
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;
}
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;
}
Aggregations