package org.rrd4j.core.jrrd; import java.util.Map; import org.rrd4j.data.LinearInterpolator; import org.rrd4j.data.Plottable; /** * Models a chunk of result data from an RRDatabase. * * @author <a href="mailto:ciaran@codeloop.com">Ciaran Treanor</a> * @version $Revision: 1.1 $ */ public class DataChunk { private static final String NEWLINE = System.getProperty("line.separator"); /** Start time in seconds since epoch */ private final long startTime; /** Row number offset relative to current row. Can be negative */ final int startOffset; /** Row number offset relative to current row */ final int endOffset; /** Step in seconds */ private final long step; /** Number of datasources must be equal to number of datasources in file */ final int dsCount; final double[][] data; private final int rows; /** Map datasource name to datasource index */ private final Map<String, Integer> nameindex; DataChunk(Map<String, Integer> nameindex, long startTime, int startOffset, int endOffset, long step, int dsCount, int rows) { this.nameindex = nameindex; this.startTime = startTime; this.startOffset = startOffset; this.endOffset = endOffset; this.step = step; this.dsCount = dsCount; this.rows = rows; data = new double[rows][dsCount]; } /** * Returns a summary of the contents of this data chunk. The first column is * the time (RRD format) and the following columns are the data source * values. * * @return a summary of the contents of this data chunk. */ public String toString() { StringBuilder sb = new StringBuilder(); long time = startTime; for (int row = 0; row < rows; row++, time += step) { sb.append(time); sb.append(": "); for (int ds = 0; ds < dsCount; ds++) { sb.append(data[row][ds]); sb.append(" "); } sb.append(NEWLINE); } return sb.toString(); } public int getStart() { return startOffset; } public int getEnd() { return endOffset; } public long getStep() { return step; } public int getDsCount() { return dsCount; } /** * <p>Getter for the field <code>data</code>.</p> * * @return the data */ public double[][] getData() { return data; } /** * <p>Getter for the time stamps values.</p> * * @return array of time stamps in seconds */ public long[] getTimestamps() { long[] date = new long[rows]; long time = startTime; for (int row = 0; row < rows; row++, time += step) { date[row] = time; } return date; } /** * Extract a datasource from the datachunck given is name as a Plottable * * @param name the datasource name * @return a plottable for the datasource */ public Plottable toPlottable(String name) { Integer dsId = nameindex.get(name); if(dsId == null) throw new RuntimeException("datasource not not found: " + name); long[] date = new long[rows]; double[] results = new double[rows]; long time = startTime; for (int row = 0; row < rows; row++, time += step) { date[row] = time; results[row] = data[row][dsId]; } return new LinearInterpolator(date, results); } }