/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.common.buffer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Represents a set of indexed tuples. The {@link #getBeginRow beginning row} * is the first row contained in this batch; if it equals "1" then it is the * first row of the tuple source, otherwise this is a batch of intermediate * tuples. The {@link #getEndRow ending row} is the last row contained in * this tuple batch; it is equal to the beginning row plus the * {@link #getRowCount number of rows} contained in this batch, minus one. */ public class TupleBatch { public static final byte NOT_TERMINATED = 0; public static final byte TERMINATED = 1; public static final byte ITERATION_TERMINATED = 2; private long rowOffset; protected List<List<?>> tuples; // Optional state private byte terminationFlag = NOT_TERMINATED; /** Required to honor Externalizable contract */ public TupleBatch() { } /** * Constructor * @param beginRow indicates the row of the tuple source which is the * first row contained in this batch * @param tuples array of List objects, each of which is * a single tuple */ public TupleBatch(long beginRow, List<?>[] tuples) { this.rowOffset = beginRow; this.tuples = Arrays.asList(tuples); } /** * Constructor * @param beginRow indicates the row of the tuple source which is the * first row contained in this batch * @param listOfTupleLists List containing List objects, each of which is * a single tuple */ public TupleBatch(long beginRow, List<? extends List<?>> listOfTupleLists) { this.rowOffset = beginRow; this.tuples = new ArrayList<List<?>>(listOfTupleLists); } /** * Return the number of the first row of the tuple source that is * contained in this batch (one-based). * @return the first row contained in this tuple batch */ public long getBeginRow() { return rowOffset; } /** * Return number of the last row of the tuple source that is contained in * this batch (one-based). * @return the last row contained in this tuple batch */ public long getEndRow() { return rowOffset + tuples.size() - 1; } /** * Return the number of rows contained in this tuple batch * @return the number of rows contained in this tuple batch */ public int getRowCount() { return tuples.size(); } /** * Return the tuple at the given index (one-based). * @return the tuple at the given index */ public List<?> getTuple(long rowIndex) { long base = rowIndex - rowOffset; int intVal = (int)base; if (base != intVal) { throw new AssertionError("rowIndex overflow " + rowIndex); //$NON-NLS-1$ } return tuples.get(intVal); } public List<List<?>> getTuples() { return tuples; } /** * Get all tuples * @return All tuples */ public List<?>[] getAllTuples() { return tuples.toArray(new List[tuples.size()]); } /** * Check whether this batch is the last in a series of batches. * @return True if this batch is last */ public boolean getTerminationFlag() { return this.terminationFlag == TERMINATED; } /** * Set whether this batch is the last in a series of batches. * @param terminationFlag True if last */ public void setTerminationFlag(boolean terminationFlag) { this.terminationFlag = terminationFlag?TERMINATED:NOT_TERMINATED; } public void setTermination(byte val) { this.terminationFlag = val; } public byte getTermination() { return this.terminationFlag; } public boolean containsRow(long row) { return rowOffset <= row && getEndRow() >= row; } /** * Return a String describing this object * @param String representation of this TupleBatch */ public String toString() { StringBuffer s = new StringBuffer(); s.append("TupleBatch; beginning row="); //$NON-NLS-1$ s.append(rowOffset); s.append(", number of rows="); //$NON-NLS-1$ s.append(tuples.size()); s.append(", lastBatch="); //$NON-NLS-1$ s.append(this.terminationFlag); return s.toString(); } public void setRowOffset(long rowOffset) { this.rowOffset = rowOffset; } }