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;
/**
* FTContent expression.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class FTContent extends FTFilter {
/** Start flag. */
private final boolean start;
/** End flag. */
private final boolean end;
/**
* Constructor.
* @param ii input info
* @param ex expression
* @param s start flag
* @param e end flag
*/
public FTContent(final InputInfo ii, final FTExpr ex, final boolean s,
final boolean e) {
super(ii, ex);
start = s;
end = e;
}
@Override
protected boolean filter(final QueryContext ctx, final FTMatch mtc,
final FTLexer lex) {
if(start) {
for(final FTStringMatch sm : mtc) if(sm.s == 0) return true;
} else if(end) {
final int p = lex.count() - 1;
for(final FTStringMatch sm : mtc) if(sm.e == p) return true;
} else {
final int s = lex.count();
final boolean[] bl = new boolean[s];
for(final FTStringMatch sm : mtc) {
if(sm.g) continue;
for(int p = sm.s; p <= sm.e; ++p) bl[p] = true;
}
for(final boolean b : bl) if(!b) return false;
return true;
}
return false;
}
@Override
protected boolean content() {
return end || !start;
}
@Override
public void plan(final Serializer ser) throws IOException {
ser.openElement(this, token(start ? START : end ? END : CONTENT), TRUE);
super.plan(ser);
}
@Override
public String toString() {
return super.toString() + (start || end ? AT + ' ' +
(start ? START : END) : ENTIRE + ' ' + CONTENT);
}
}