package org.basex.query.expr;
import static org.basex.query.QueryText.*;
import static org.basex.util.Token.*;
import java.io.IOException;
import java.util.Locale;
import org.basex.data.Data;
import org.basex.index.IndexToken.IndexType;
import org.basex.index.IndexIterator;
import org.basex.index.RangeToken;
import org.basex.io.serial.Serializer;
import org.basex.query.QueryContext;
import org.basex.query.item.DBNode;
import org.basex.query.item.Item;
import org.basex.query.item.SeqType;
import org.basex.query.iter.Iter;
import org.basex.query.util.IndexContext;
import org.basex.util.InputInfo;
import org.basex.util.TokenBuilder;
/**
* This index class retrieves range values from the index.
*
* @author BaseX Team 2005-12, BSD License
* @author Christian Gruen
*/
public final class RangeAccess extends Simple {
/** Index type. */
final RangeToken ind;
/** Index context. */
private final IndexContext ictx;
/**
* Constructor.
* @param ii input info
* @param t index reference
* @param ic index context
*/
RangeAccess(final InputInfo ii, final RangeToken t, final IndexContext ic) {
super(ii);
ind = t;
ictx = ic;
type = SeqType.NOD_ZM;
}
@Override
public Iter iter(final QueryContext ctx) {
final Data data = ictx.data;
final byte kind = ind.type() == IndexType.TEXT ? Data.TEXT : Data.ATTR;
return new Iter() {
final IndexIterator it = data.iter(ind);
@Override
public Item next() {
return it.more() ? new DBNode(data, it.next(), kind) : null;
}
};
}
@Override
public boolean iterable() {
return ictx.iterable;
}
@Override
public void plan(final Serializer ser) throws IOException {
ser.emptyElement(this, DATA, token(ictx.data.meta.name),
MIN, token(ind.min), MAX, token(ind.max),
TYP, token(ind.ind.toString()));
}
@Override
public String toString() {
return new TokenBuilder(DB).add(':').
addExt(ind.type().toString().toLowerCase(Locale.ENGLISH)).add("-range(").
addExt(ind.min).add(SEP).addExt(ind.max).add(')').toString();
}
}