Returns a scan-based index iterator. @param lexer lexer, including the queried value @param ftt full-text tokenizer @param data data reference @return node iterator @throws QueryException query exception
(final FTLexer lexer, final FTTokenizer ftt, final Data data)
| 218 | * @throws QueryException query exception |
| 219 | */ |
| 220 | private FTIndexIterator scan(final FTLexer lexer, final FTTokenizer ftt, final Data data) |
| 221 | throws QueryException { |
| 222 | |
| 223 | final FTLexer input = new FTLexer(ftOpt); |
| 224 | final FTTokens fttokens = ftt.cache(lexer.token()); |
| 225 | return new FTIndexIterator() { |
| 226 | final int sz = data.meta.size; |
| 227 | int pre = -1, ps; |
| 228 | |
| 229 | @Override |
| 230 | public int pre() { |
| 231 | return pre; |
| 232 | } |
| 233 | @Override |
| 234 | public boolean more() { |
| 235 | while(++pre < sz) { |
| 236 | if(data.kind(pre) != Data.TEXT) continue; |
| 237 | input.init(data.text(pre, true)); |
| 238 | ftt.matches.reset(ps); |
| 239 | try { |
| 240 | if(contains(fttokens, input, ftt) != 0) return true; |
| 241 | } catch(final QueryException ex) { |
| 242 | // ignore exceptions |
| 243 | Util.debug(ex); |
| 244 | } |
| 245 | } |
| 246 | return false; |
| 247 | } |
| 248 | @Override |
| 249 | public FTMatches matches() { |
| 250 | return ftt.matches; |
| 251 | } |
| 252 | @Override |
| 253 | public void pos(final int p) { |
| 254 | ps = p; |
| 255 | } |
| 256 | @Override |
| 257 | public int size() { |
| 258 | // worst case |
| 259 | return Math.max(1, sz >>> 1); |
| 260 | } |
| 261 | }; |
| 262 | } |
| 263 | |
| 264 | /** |
| 265 | * Returns all tokens of the query input. |