package org.basex.index.ft; import org.basex.index.IndexTree; import org.basex.util.Num; import org.basex.util.hash.TokenIntMap; import org.basex.util.list.IntList; import org.basex.util.list.TokenList; /** * This class indexes full-text tokens in a balanced binary tree, including * their pre and pos values. An iterator returns all compressed pre and pos * values in a sorted manner. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen * @author Sebastian Gath */ final class FTIndexTree extends IndexTree { /** Compressed pre values. */ private TokenList poss = new TokenList(FACTOR); /** Tree structure [left, right, parent]. */ private IntList numpre = new IntList(FACTOR); /** Current pointer on token in the index. */ private int lcn; /** Current pointer on ft data in the index. */ private int pft; /** * Checks if the specified token was already indexed. If yes, its pre * value is added to the existing values. Otherwise a new index entry * is created. * @param tok token to be indexed * @param pre pre value for the token * @param pos pos value of the token * @param cf current file id */ void index(final byte[] tok, final int pre, final int pos, final int cf) { final int os = keys.size(); final int n = index(tok, pre, cf == 0); if(os == keys.size()) { final int i = cf > 0 ? maps.value(Num.num(n)) : n; if(poss.size() > i && poss.get(i) != null) { poss.set(i, Num.add(poss.get(i), pos)); numpre.set(i, numpre.get(i) + 1); return; } } poss.add(Num.newNum(pos)); numpre.add(1); } /** * Initializes the tree for adding new full-text data. */ void initFT() { poss = new TokenList(FACTOR); values = new TokenList(FACTOR); numpre = new IntList(FACTOR); maps = new TokenIntMap(); } /** * Checks for more tokens. * @param cf current file * @return boolean more */ boolean more(final int cf) { while(more()) { lcn = cn; pft = cf > 0 ? maps.value(Num.num(lcn)) : lcn; if(pft > -1) return true; next(); } return false; } /** * Returns the next token. * @return byte[] next token */ byte[] nextTok() { return keys.get(lcn); } /** * Returns the next pre values. * @return byte[] compressed pre values */ byte[] nextPres() { return values.get(pft); } /** * Returns the next pos values. * @return byte[] compressed pos values */ byte[] nextPoss() { return poss.get(pft); } /** * Returns the next number of pre values. * @return number of pre values */ int nextNumPre() { return numpre.get(pft); } }