package org.basex.query.item; import static org.basex.query.QueryText.*; import java.io.IOException; import org.basex.data.Data; import org.basex.io.serial.Serializer; import org.basex.query.QueryContext; import org.basex.query.expr.Expr; import org.basex.util.InputInfo; import org.basex.util.Token; import org.basex.util.Util; import org.basex.util.list.IntList; /** * Sequence, containing at least two ordered database nodes. * * @author BaseX Team 2005-12, BSD License * @author Christian Gruen */ public final class DBNodeSeq extends Seq { /** Data reference. */ private final Data data; /** Pre values. */ public final int[] pres; /** Complete. */ public final boolean complete; /** * Constructor. * @param p pre values * @param d data reference * @param t node type * @param c indicates if pre values represent all document nodes of a database */ private DBNodeSeq(final int[] p, final Data d, final Type t, final boolean c) { super(p.length, t); pres = p; data = d; complete = c; } /** * Creates a node sequence with the given data reference and pre values. * @param v pre values * @param d data reference * @param docs indicates if all values reference document nodes * @param c indicates if values include all document nodes of a database * @return resulting item or sequence */ public static Value get(final IntList v, final Data d, final boolean docs, final boolean c) { final int s = v.size(); return s == 0 ? Empty.SEQ : s == 1 ? new DBNode(d, v.get(0)) : new DBNodeSeq(v.toArray(), d, docs ? NodeType.DOC : NodeType.NOD, c); } @Override public Data data() { return data; } @Override public Object toJava() { final Object[] obj = new Object[(int) size]; for(int s = 0; s != size; ++s) obj[s] = itemAt(s).toJava(); return obj; } @Override public Item ebv(final QueryContext ctx, final InputInfo ii) { return itemAt(0); } @Override public SeqType type() { return SeqType.NOD_OM; } @Override public boolean iterable() { return true; } @Override public boolean sameAs(final Expr cmp) { if(!(cmp instanceof DBNodeSeq)) return false; final DBNodeSeq seq = (DBNodeSeq) cmp; return pres == seq.pres && size == seq.size; } @Override public int writeTo(final Item[] arr, final int start) { for(int i = 0; i < pres.length; i++) arr[i + start] = itemAt(i); return pres.length; } @Override public DBNode itemAt(final long pos) { return new DBNode(data, pres[(int) pos]); } @Override public boolean homogenous() { return false; } @Override public void plan(final Serializer ser) throws IOException { ser.openElement(Token.token(Util.name(this)), SIZE, Token.token(size)); for(int v = 0; v != Math.min(size, 5); ++v) itemAt(v).plan(ser); ser.closeElement(); } }