package org.basex.query.ft;
import static org.basex.query.QueryText.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import org.basex.data.FTMatch;
import org.basex.data.FTStringMatch;
import org.basex.io.serial.Serializer;
import org.basex.query.QueryContext;
import org.basex.util.InputInfo;
import org.basex.util.ft.FTLexer;
import org.basex.util.ft.FTUnit;
import org.basex.util.list.BoolList;
/**
* FTScope expression.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class FTScope extends FTFilter {
/** Same/different flag. */
private final boolean same;
/**
* Constructor.
* @param ii input info
* @param e expression
* @param u unit
* @param s same flag
*/
public FTScope(final InputInfo ii, final FTExpr e, final FTUnit u,
final boolean s) {
super(ii, e);
unit = u;
same = s;
}
@Override
protected boolean filter(final QueryContext ctx, final FTMatch mtc,
final FTLexer lex) {
if(same) {
int s = -1;
for(final FTStringMatch sm : mtc) {
if(sm.ex) continue;
final int p = pos(sm.s, lex);
if(s == -1) s = p;
else if(s != p) return false;
}
return true;
}
int c = 0;
final BoolList bl = new BoolList();
for(final FTStringMatch sm : mtc) {
if(sm.ex) continue;
c++;
final int p = pos(sm.s, lex);
final int s = bl.size();
if(p < s && bl.get(p) && p == pos(sm.e, lex)) return false;
bl.set(p, true);
}
return c > 1;
}
@Override
public void plan(final Serializer ser) throws IOException {
ser.openElement(this, token(same ? SAME : DIFFERENT),
token(unit.toString()));
super.plan(ser);
}
@Override
public String toString() {
return super.toString() + (same ? SAME : DIFFERENT) + ' ' + unit;
}
}