package hep.io.hbook;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
/** Represents a column-wise tuple.
* The children of a RowwiseTuple will be instances of ColumnwiseTupleColumn
* @see ColumnwiseTupleColumn
*/
public class ColumnwiseTuple extends Tuple {
ColumnwiseTuple(CompositeHbookObject parent, String name, int length, int id, int idx) {
super(parent,name,CWTUPLE,length);
this.id = id;
this.idx = idx;
}
int getID() {
return id;
}
/** The id for this tuple */
public int id()
{
return idx;
}
ColumnwiseBlock getBlock(String name) {
ColumnwiseBlock block = (ColumnwiseBlock) blocks.get(name);
if (block != null) return block;
block = new ColumnwiseBlock(id,name,this);
blocks.put(name,block);
return block;
}
public String toString() {
String result = "CW Tuple: " + idx + " " +getName() +" ("+nChildren()+" columns "+getRows()+" rows)";
return result;
}
void close() {
super.close();
Enumeration e = blocks.elements();
while (e.hasMoreElements()) {
ColumnwiseBlock b = (ColumnwiseBlock) e.nextElement();
b.close();
}
Hbook.delete(id);
}
public void setCurrentRow(int row)
{
super.setCurrentRow(row);
if (row == 1) clearMap();
else if (mapCount > 0) Hbook.setCWEvent(id,ievent);
}
private void clearMap()
{
Enumeration e = blocks.elements();
while (e.hasMoreElements()) {
ColumnwiseBlock b = (ColumnwiseBlock) e.nextElement();
b.clearMap();
}
mapCount = 0;
}
private int id;
private int idx;
private Hashtable blocks = new Hashtable();
int mapCount = 0;
}
class ColumnwiseBlock {
ColumnwiseBlock(int id, String name, ColumnwiseTuple owner) {
this.name = name;
this.id = id;
this.owner = owner;
}
int allocSpace(ColumnwiseTupleColumn field, int space) {
children.addElement(field);
int oldSize = size;
size += space;
return oldSize;
}
void clearMap() {
Enumeration e = children.elements();
while (e.hasMoreElements()) {
ColumnwiseTupleColumn field = (ColumnwiseTupleColumn) e.nextElement();
field.isMapped = false;
}
if (buffer != 0) Hbook.CWClearMap(id, name,buffer);
}
void map(ColumnwiseTupleColumn field) {
if (!field.isMapped)
{
if (buffer == 0) getBuffer();
ColumnwiseTupleColumn index = field.index;
if (index != null && !index.isMapped) {
int offset = index.offset;
String setName = "$SET:"+index.getName();
Hbook.CWMap(id,name,buffer,setName,offset,index.type);
index.isMapped = true;
}
int offset = field.offset;
String setName = "$SET:"+field.getName();
Hbook.CWMap(id, name,buffer,setName,offset,field.type);
// Temporary work around for bug (CWMap sets event back to 1!)
// A better fix would be to pass the event # into CWMap
Hbook.setCWEvent(id,owner.ievent);
field.isMapped = true;
owner.mapCount++;
}
}
long getBuffer() {
if (buffer == 0) {
buffer = Hbook.allocBuffer(size);
if (owner.mapCount == 0) Hbook.CWClearMap(id, name,buffer);
}
return buffer;
}
public void close() {
if (buffer != 0) Hbook.freeBuffer(buffer);
}
private Vector children = new Vector();
private int id;
private String name;
private long buffer = 0; // Allocated in native interface
private int size = 0;
private ColumnwiseTuple owner;
}