package org.yamcs.yarch.rocksdb;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;
import org.rocksdb.ColumnFamilyHandle;
import org.rocksdb.RocksDBException;
import org.yamcs.yarch.ColumnSerializer;
import org.yamcs.yarch.HistogramSegment;
import org.yamcs.yarch.TableDefinition;
import org.yamcs.yarch.TableWriter;
import org.yamcs.yarch.Tuple;
import org.yamcs.yarch.YarchDatabase;
public abstract class AbstractTableWriter extends TableWriter {
static final byte[] zerobytes = new byte[0];
public AbstractTableWriter(YarchDatabase ydb, TableDefinition tableDefinition, InsertMode mode) throws FileNotFoundException {
super(ydb, tableDefinition, mode);
}
protected void addHistogram(YRDB db, Tuple t) throws RocksDBException {
List<String> histoColumns = tableDefinition.getHistogramColumns();
for(String c: histoColumns) {
if(!t.hasColumn(c)) continue;
long time = (Long)t.getColumn(0);
ColumnSerializer cs = tableDefinition.getColumnSerializer(c);
byte[] v = cs.toByteArray(t.getColumn(c));
addHistogramForColumn(db, c, v, time);
}
}
private synchronized void addHistogramForColumn(YRDB db, String columnName, byte[] columnv, long time) throws RocksDBException {
long sstart = time/HistogramSegment.GROUPING_FACTOR;
int dtime = (int)(time%HistogramSegment.GROUPING_FACTOR);
HistogramSegment segment;
String cfHistoName = getHistogramColumnFamilyName(columnName);
ColumnFamilyHandle cfh = db.getColumnFamilyHandle(cfHistoName);
if(cfh==null) {
cfh = db.createColumnFamily(cfHistoName);
//add a record at the end to make sure the cursor doesn't run out
db.put(cfh, HistogramSegment.key(Long.MAX_VALUE, zerobytes), new byte[0]);
}
byte[] val = db.get(cfh, HistogramSegment.key(sstart, columnv));
if(val==null) {
segment = new HistogramSegment(columnv, sstart);
} else {
segment = new HistogramSegment(columnv, sstart, val);
}
segment.merge(dtime);
db.put(cfh, segment.key(), segment.val());
}
static public String getHistogramColumnFamilyName(String tableColumnName) {
return ("histo-"+tableColumnName).intern();
}
public abstract RdbPartition getDbPartition(Tuple tuple) throws IOException ;
}