use of org.jkiss.dbeaver.ui.dashboard.model.data.DashboardDatasetRow in project dbeaver by dbeaver.
the class DashboardRendererTimeseries method updateDashboardData.
@Override
public void updateDashboardData(DashboardContainer container, Date lastUpdateTime, DashboardDataset dataset) {
DashboardChartComposite chartComposite = getChartComposite(container);
if (chartComposite.isDisposed()) {
return;
}
JFreeChart chart = chartComposite.getChart();
XYPlot plot = (XYPlot) chart.getPlot();
TimeSeriesCollection chartDataset = (TimeSeriesCollection) plot.getDataset();
if (container.getDashboardFetchType() == DashboardFetchType.stats) {
// Clean previous data before stats update
chartDataset.removeAllSeries();
}
long currentTime = System.currentTimeMillis();
long secondsPassed = lastUpdateTime == null ? 1 : (currentTime - lastUpdateTime.getTime()) / 1000;
if (secondsPassed <= 0) {
secondsPassed = 1;
}
DashboardDatasetRow lastRow = (DashboardDatasetRow) chartComposite.getData("last_row");
List<DashboardDatasetRow> rows = dataset.getRows();
String[] srcSeries = dataset.getColumnNames();
for (int i = 0; i < srcSeries.length; i++) {
String seriesName = srcSeries[i];
TimeSeries series = chartDataset.getSeries(seriesName);
if (series == null) {
series = new TimeSeries(seriesName);
series.setMaximumItemCount(container.getDashboardMaxItems());
series.setMaximumItemAge(container.getDashboardMaxAge());
chartDataset.addSeries(series);
plot.getRenderer().setSeriesStroke(chartDataset.getSeriesCount() - 1, plot.getRenderer().getBaseStroke());
}
switch(container.getDashboardCalcType()) {
case value:
{
int maxDP = 200;
Date startTime = null;
for (DashboardDatasetRow row : rows) {
if (startTime == null) {
startTime = row.getTimestamp();
} else {
if (container.getDashboardInterval() == DashboardInterval.second || container.getDashboardInterval() == DashboardInterval.millisecond) {
long diffSeconds = (row.getTimestamp().getTime() - startTime.getTime()) / 1000;
if (diffSeconds > maxDP) {
// Too big difference between start and end points. Stop here otherwise we'll flood chart with too many ticks
break;
}
}
}
Object value = row.getValues()[i];
if (value instanceof Number) {
series.addOrUpdate(makeDataItem(container, row), (Number) value);
}
}
break;
}
case delta:
{
if (lastUpdateTime == null) {
return;
}
// System.out.println("LAST=" + lastUpdateTime + "; CUR=" + new Date());
for (DashboardDatasetRow row : rows) {
if (lastRow != null) {
Object prevValue = lastRow.getValues()[i];
Object newValue = row.getValues()[i];
if (newValue instanceof Number && prevValue instanceof Number) {
double deltaValue = ((Number) newValue).doubleValue() - ((Number) prevValue).doubleValue();
deltaValue /= secondsPassed;
if (container.getDashboardValueType() != DashboardValueType.decimal) {
deltaValue = Math.round(deltaValue);
}
series.addOrUpdate(makeDataItem(container, row), deltaValue);
}
}
}
break;
}
}
}
if (!rows.isEmpty()) {
chartComposite.setData("last_row", rows.get(rows.size() - 1));
}
}
use of org.jkiss.dbeaver.ui.dashboard.model.data.DashboardDatasetRow in project dbeaver by dbeaver.
the class DashboardUpdater method fetchDashboardMapData.
private void fetchDashboardMapData(DBRProgressMonitor monitor, DashboardContainer dashboard) {
MapQueryInfo mqi = getMapQueryData(dashboard);
if (mqi == null) {
return;
}
Map<String, Object> mapValue = mqi.mapValue;
if (mapValue != null) {
String[] mapKeys = dashboard.getMapKeys();
String[] mapLabels = dashboard.getMapLabels();
if (!ArrayUtils.isEmpty(mapKeys)) {
if (ArrayUtils.isEmpty(mapLabels)) {
mapLabels = mapKeys;
}
DashboardDataset dataset = new DashboardDataset(mapLabels);
Object[] mapValues = new Object[mapKeys.length];
for (int i = 0; i < mapKeys.length; i++) {
Object value = mapValue.get(mapKeys[i]);
Number numValue;
if (value instanceof Number) {
numValue = (Number) value;
} else {
numValue = CommonUtils.toDouble(value);
}
mapValues[i] = numValue;
}
Date timestamp = mqi.timestamp;
if (timestamp == null) {
timestamp = new Date();
}
dataset.addRow(new DashboardDatasetRow(timestamp, mapValues));
dashboard.updateDashboardData(dataset);
} else if (dashboard.getMapFormula() != null) {
Map<String, Object> ciMap = new HashMap<>(mapValue.size());
for (Map.Entry<String, Object> me : mapValue.entrySet()) {
ciMap.put(me.getKey().toLowerCase(Locale.ENGLISH), me.getValue());
}
JexlContext context = new JexlContext() {
@Override
public Object get(String name) {
if (name.equals("map")) {
return ciMap;
} else if (name.equals("dashboard")) {
return dashboard;
}
return null;
}
@Override
public void set(String name, Object value) {
log.warn("Set is not implemented in DBX model");
}
@Override
public boolean has(String name) {
return name.equals("object") || name.equals("dashboard");
}
};
Object result = dashboard.getMapFormula().evaluate(context);
if (result instanceof Number) {
String columnName = dashboard.getDashboardTitle();
if (!ArrayUtils.isEmpty(mapLabels)) {
columnName = mapLabels[0];
}
DashboardDataset dataset = new DashboardDataset(new String[] { columnName });
dataset.addRow(new DashboardDatasetRow(new Date(), new Object[] { result }));
dashboard.updateDashboardData(dataset);
} else {
log.debug("Wrong expression result: " + result);
}
}
}
}
use of org.jkiss.dbeaver.ui.dashboard.model.data.DashboardDatasetRow in project dbeaver by serge-rider.
the class DashboardUpdater method fetchDashboardData.
private void fetchDashboardData(DashboardContainer dashboard, DBCResultSet dbResults) throws DBCException {
DBCResultSetMetaData meta = dbResults.getMeta();
List<DBCAttributeMetaData> rsAttrs = meta.getAttributes();
List<String> colNames = new ArrayList<>();
String tsColName = null;
for (DBCAttributeMetaData rsAttr : rsAttrs) {
String colName = rsAttr.getLabel();
if (CommonUtils.isEmpty(colName)) {
colName = rsAttr.getName();
}
if (DashboardConstants.RS_COL_TIMESTAMP.equalsIgnoreCase(colName)) {
tsColName = colName;
} else {
colNames.add(colName);
}
}
DashboardDataset dataset = new DashboardDataset(colNames.toArray(new String[0]));
while (dbResults.nextRow()) {
Object[] values = new Object[colNames.size()];
Date timestamp;
if (tsColName != null) {
timestamp = (Date) dbResults.getAttributeValue(tsColName);
} else {
timestamp = new Date();
}
for (int i = 0; i < colNames.size(); i++) {
values[i] = dbResults.getAttributeValue(colNames.get(i));
}
dataset.addRow(new DashboardDatasetRow(timestamp, values));
if (dataset.getRows().size() >= dashboard.getDashboardMaxItems()) {
break;
}
}
switch(dashboard.getDashboardFetchType()) {
case rows:
dataset = transposeDataset(dataset);
break;
}
dashboard.updateDashboardData(dataset);
}
use of org.jkiss.dbeaver.ui.dashboard.model.data.DashboardDatasetRow in project dbeaver by serge-rider.
the class DashboardUpdater method transposeDataset.
private DashboardDataset transposeDataset(DashboardDataset dataset) {
int oldColumnCount = dataset.getColumnNames().length;
if (oldColumnCount < 2) {
// Something went wrong
return dataset;
}
// Column names don't matter. Get everything from rows.
// First column in row is actually column name. The rest are row values (usually 1)
List<String> colNamesFromRows = new ArrayList<>();
List<DashboardDatasetRow> oldRows = dataset.getRows();
Date oldTimestamp = oldRows.get(0).getTimestamp();
DashboardDatasetRow[] newRows = new DashboardDatasetRow[oldColumnCount - 1];
for (int i = 0; i < oldRows.size(); i++) {
DashboardDatasetRow oldRow = oldRows.get(i);
colNamesFromRows.add(CommonUtils.toString(oldRow.getValues()[0], String.valueOf(i + 1)));
for (int colIndex = 1; colIndex < oldColumnCount; colIndex++) {
DashboardDatasetRow newRow = newRows[colIndex - 1];
if (newRow == null) {
newRow = new DashboardDatasetRow(oldTimestamp, new Object[oldRows.size()]);
newRows[colIndex - 1] = newRow;
}
newRow.getValues()[i] = oldRow.getValues()[colIndex];
}
}
DashboardDataset newDataset = new DashboardDataset(colNamesFromRows.toArray(new String[0]));
for (DashboardDatasetRow newRow : newRows) {
newDataset.addRow(newRow);
}
return newDataset;
}
use of org.jkiss.dbeaver.ui.dashboard.model.data.DashboardDatasetRow in project dbeaver by serge-rider.
the class DashboardUpdater method fetchDashboardMapData.
private void fetchDashboardMapData(DBRProgressMonitor monitor, DashboardContainer dashboard) {
MapQueryInfo mqi = getMapQueryData(dashboard);
if (mqi == null) {
return;
}
Map<String, Object> mapValue = mqi.mapValue;
if (mapValue != null) {
String[] mapKeys = dashboard.getMapKeys();
String[] mapLabels = dashboard.getMapLabels();
if (!ArrayUtils.isEmpty(mapKeys)) {
if (ArrayUtils.isEmpty(mapLabels)) {
mapLabels = mapKeys;
}
DashboardDataset dataset = new DashboardDataset(mapLabels);
Object[] mapValues = new Object[mapKeys.length];
for (int i = 0; i < mapKeys.length; i++) {
Object value = mapValue.get(mapKeys[i]);
Number numValue;
if (value instanceof Number) {
numValue = (Number) value;
} else {
numValue = CommonUtils.toDouble(value);
}
mapValues[i] = numValue;
}
Date timestamp = mqi.timestamp;
if (timestamp == null) {
timestamp = new Date();
}
dataset.addRow(new DashboardDatasetRow(timestamp, mapValues));
dashboard.updateDashboardData(dataset);
} else if (dashboard.getMapFormula() != null) {
Map<String, Object> ciMap = new HashMap<>(mapValue.size());
for (Map.Entry<String, Object> me : mapValue.entrySet()) {
ciMap.put(me.getKey().toLowerCase(Locale.ENGLISH), me.getValue());
}
JexlContext context = new JexlContext() {
@Override
public Object get(String name) {
if (name.equals("map")) {
return ciMap;
} else if (name.equals("dashboard")) {
return dashboard;
}
return null;
}
@Override
public void set(String name, Object value) {
log.warn("Set is not implemented in DBX model");
}
@Override
public boolean has(String name) {
return name.equals("object") || name.equals("dashboard");
}
};
Object result = dashboard.getMapFormula().evaluate(context);
if (result instanceof Number) {
String columnName = dashboard.getDashboardTitle();
if (!ArrayUtils.isEmpty(mapLabels)) {
columnName = mapLabels[0];
}
DashboardDataset dataset = new DashboardDataset(new String[] { columnName });
dataset.addRow(new DashboardDatasetRow(new Date(), new Object[] { result }));
dashboard.updateDashboardData(dataset);
} else {
log.debug("Wrong expression result: " + result);
}
}
}
}
Aggregations