use of org.trie4j.util.Range 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;
}
use of org.trie4j.util.Range 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.util.Range 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.util.Range in project trie4j by takawitter.
the class TailLOUDSTrie method getNodeId.
public int getNodeId(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 -1;
it.setOffset(tailArray.getIteratorOffset(nodeId));
while (it.hasNext()) {
i++;
if (i == n)
return -1;
if (text.charAt(i) != it.next())
return -1;
}
}
return nodeId;
}
Aggregations