/** * Performs a wildcard search for the specified token. * * @param token token to look for * @return iterator */ private synchronized IndexIterator wc(final byte[] token) { final FTIndexIterator it = FTIndexIterator.FTEMPTY; final FTWildcard wc = new FTWildcard(token); if (!wc.parse()) return it; final IntList pr = new IntList(); final IntList ps = new IntList(); final byte[] pref = wc.prefix(); final int pl = pref.length, tl = tp.length; final int l = Math.min(tl - 1, wc.max()); for (int ti = pl; ti <= l; ti++) { int i = tp[ti]; if (i == -1) continue; int c = ti + 1; int e = -1; while (c < tl && e == -1) e = tp[c++]; i = find(pref, i, e, ti); while (i < e) { final byte[] t = inY.readBytes(i, ti); if (!startsWith(t, pref)) break; if (wc.match(t)) { inZ.cursor(pointer(i, ti)); final int s = size(i, ti); for (int d = 0; d < s; d++) { pr.add(inZ.readNum()); ps.add(inZ.readNum()); } } i += ti + ENTRY; } } return iter(new FTCache(pr, ps), token); }
/** * Returns an iterator for an index entry. * * @param off offset on entries * @param size number of id/pos entries * @param da data source * @param token index token * @return iterator */ private static FTIndexIterator iter( final long off, final int size, final DataAccess da, final byte[] token) { da.cursor(off); final IntList pr = new IntList(size); final IntList ps = new IntList(size); for (int c = 0; c < size; c++) { pr.add(da.readNum()); ps.add(da.readNum()); } return iter(new FTCache(pr, ps), token); }
@Override public IndexIterator iter(final IndexToken token) { final int id = values.id(token.get()); if (id == 0) return IndexIterator.EMPTY; final int len = lenList.get(id); final int[] ids = idsList.get(id), pres; if (data.meta.updindex) { final IntList tmp = new IntList(); for (int i = 0; i < len; ++i) tmp.add(data.pre(ids[i])); pres = tmp.sort().finish(); } else { pres = ids; } return new IndexIterator() { int p; @Override public boolean more() { return p < len; } @Override public int pre() { return pres[p++]; } @Override public int size() { return len; } }; }
@Override protected final void parseArgs() throws IOException { ops = new IntList(); vals = new StringList(); final MainParser arg = new MainParser(this); while (arg.more()) { final char c; String v = null; if (arg.dash()) { c = arg.next(); if (c == 'd') { // activate debug mode Prop.debug = true; } else if (c == 'b' || c == 'c' || c == 'C' || c == 'i' || c == 'I' || c == 'o' || c == 'q' || c == 'r' || c == 's' || c == 't' && local()) { // options followed by a string v = arg.string(); } else if (c == 'D' && local() || c == 'u' && local() || c == 'R' || c == 'v' || c == 'V' || c == 'w' || c == 'x' || c == 'X' || c == 'z') { // options to be toggled v = ""; } else if (!local()) { // client options: need to be set before other options if (c == 'n') { // set server name context.soptions.set(StaticOptions.HOST, arg.string()); } else if (c == 'p') { // set server port context.soptions.set(StaticOptions.PORT, arg.number()); } else if (c == 'P') { // specify password context.soptions.set(StaticOptions.PASSWORD, arg.string()); } else if (c == 'U') { // specify user name context.soptions.set(StaticOptions.USER, arg.string()); } else { throw arg.usage(); } } else { throw arg.usage(); } } else { v = arg.string().trim(); // interpret as command file if input string ends with command script suffix c = v.endsWith(IO.BXSSUFFIX) ? 'c' : 'Q'; } if (v != null) { ops.add(c); vals.add(v); } } }