feat(tablepanel): added more unit tests for table transforms
This commit is contained in:
@@ -6,7 +6,9 @@ import _ = require('lodash');
|
||||
import moment = require('moment');
|
||||
import PanelMeta = require('app/features/panel/panel_meta');
|
||||
import TimeSeries = require('app/core/time_series');
|
||||
import {TableModel, transformers} from './table_model';
|
||||
|
||||
import {TableModel} from './table_model';
|
||||
import {transformers} from './transformers';
|
||||
|
||||
export class TablePanelCtrl {
|
||||
|
||||
@@ -26,7 +28,9 @@ export class TablePanelCtrl {
|
||||
|
||||
var panelDefaults = {
|
||||
targets: [{}],
|
||||
transform: 'timeseries_to_rows'
|
||||
transform: 'timeseries_to_rows',
|
||||
pageSize: 50,
|
||||
showHeader: true,
|
||||
};
|
||||
|
||||
_.defaults($scope.panel, panelDefaults);
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<div class="editor-row">
|
||||
<div class="tight-form-section">
|
||||
<h5>Data Table</h5>
|
||||
<h5>Data</h5>
|
||||
<div class="tight-form">
|
||||
<ul class="tight-form-list">
|
||||
<li class="tight-form-item" style="width: 170px">
|
||||
Data to Table Transform
|
||||
To Table Transform
|
||||
</li>
|
||||
<li>
|
||||
<select class="input-xlarge tight-form-input"
|
||||
@@ -22,6 +22,13 @@
|
||||
<div class="tight-form-section">
|
||||
<h5>Table Display</h5>
|
||||
</div>
|
||||
<li class="tight-form-item" style="width: 80px">
|
||||
Pagination (Page size)
|
||||
</li>
|
||||
<li>
|
||||
<input type="pageSize" class="input-small tight-form-input" placeholder="50"
|
||||
empty-to-null ng-model="panel.pageSize" ng-change="render()" ng-model-onblur>
|
||||
</li>
|
||||
</div>
|
||||
|
||||
<div class="editor-row">
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
|
||||
|
||||
import {TableModel} from '../table_model';
|
||||
|
||||
describe('when getting tableData', () => {
|
||||
|
||||
describe('timeseries_to_rows', () => {
|
||||
var panel = {
|
||||
transform: 'timeseries_to_rows'
|
||||
};
|
||||
|
||||
it ('should return 2 rows', () => {
|
||||
var data = TableModel.transform([
|
||||
{
|
||||
target: 'series1',
|
||||
datapoints: [[12.12, new Date().getTime()]],
|
||||
},
|
||||
{
|
||||
target: 'series2',
|
||||
datapoints: [[12.12, new Date().getTime()]],
|
||||
}
|
||||
], panel);
|
||||
|
||||
expect(data.columns.length).to.be(3);
|
||||
expect(data.rows.length).to.be(2);
|
||||
|
||||
expect(data.columns[0].text).to.be('Time');
|
||||
expect(data.columns[1].text).to.be('Series');
|
||||
expect(data.columns[2].text).to.be('Value');
|
||||
expect(data.rows[0][1]).to.be('series1');
|
||||
expect(data.rows[0][2]).to.be('12.12');
|
||||
|
||||
expect(data.rows[1][1]).to.be('series2');
|
||||
});
|
||||
});
|
||||
|
||||
describe('timeseries_to_rows', () => {
|
||||
var panel = {
|
||||
transform: 'timeseries_to_columns'
|
||||
};
|
||||
|
||||
it ('should return 3 columns', () => {
|
||||
var data = TableModel.transform([
|
||||
{
|
||||
target: 'series1',
|
||||
datapoints: [[12.12, new Date().getTime()]],
|
||||
},
|
||||
{
|
||||
target: 'series2',
|
||||
datapoints: [[16.12, new Date().getTime()]],
|
||||
}
|
||||
], panel);
|
||||
|
||||
expect(data.columns.length).to.be(3);
|
||||
expect(data.rows.length).to.be(1);
|
||||
|
||||
expect(data.columns[0].text).to.be('Time');
|
||||
expect(data.columns[1].text).to.be('series1');
|
||||
expect(data.columns[2].text).to.be('series2');
|
||||
expect(data.rows[0][1]).to.be('12.12');
|
||||
expect(data.rows[0][2]).to.be('16.12');
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
import {describe, beforeEach, it, sinon, expect} from 'test/lib/common';
|
||||
|
||||
import {TableModel} from '../table_model';
|
||||
|
||||
describe('when transforming time series table', () => {
|
||||
var table;
|
||||
|
||||
describe('given 2 time series', () => {
|
||||
var time = new Date().getTime();
|
||||
var timeSeries = [
|
||||
{
|
||||
target: 'series1',
|
||||
datapoints: [[12.12, time], [14.44, time+1]],
|
||||
},
|
||||
{
|
||||
target: 'series2',
|
||||
datapoints: [[16.12, time]],
|
||||
}
|
||||
];
|
||||
|
||||
describe('timeseries_to_rows', () => {
|
||||
var panel = {transform: 'timeseries_to_rows'};
|
||||
|
||||
beforeEach(() => {
|
||||
table = TableModel.transform(timeSeries, panel);
|
||||
});
|
||||
|
||||
it('should return 3 rows', () => {
|
||||
expect(table.rows.length).to.be(3);
|
||||
expect(table.rows[0][1]).to.be('series1');
|
||||
expect(table.rows[1][1]).to.be('series1');
|
||||
expect(table.rows[2][1]).to.be('series2');
|
||||
expect(table.rows[0][2]).to.be('12.12');
|
||||
});
|
||||
|
||||
it('should return 3 rows', () => {
|
||||
expect(table.columns.length).to.be(3);
|
||||
expect(table.columns[0].text).to.be('Time');
|
||||
expect(table.columns[1].text).to.be('Series');
|
||||
expect(table.columns[2].text).to.be('Value');
|
||||
});
|
||||
});
|
||||
|
||||
describe('timeseries_to_columns', () => {
|
||||
var panel = {
|
||||
transform: 'timeseries_to_columns'
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
table = TableModel.transform(timeSeries, panel);
|
||||
});
|
||||
|
||||
it ('should return 3 columns', () => {
|
||||
expect(table.columns.length).to.be(3);
|
||||
expect(table.columns[0].text).to.be('Time');
|
||||
expect(table.columns[1].text).to.be('series1');
|
||||
expect(table.columns[2].text).to.be('series2');
|
||||
});
|
||||
|
||||
it ('should return 2 rows', () => {
|
||||
expect(table.rows.length).to.be(2);
|
||||
expect(table.rows[0][1]).to.be('12.12');
|
||||
expect(table.rows[0][2]).to.be('16.12');
|
||||
});
|
||||
|
||||
it ('should show - when no value for timestamp', () => {
|
||||
expect(table.rows[1][2]).to.be('-');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,80 +1,4 @@
|
||||
///<reference path="../../headers/common.d.ts" />
|
||||
|
||||
import moment = require('moment');
|
||||
import _ = require('lodash');
|
||||
|
||||
var transformers = {};
|
||||
|
||||
transformers['timeseries_to_rows'] = {
|
||||
description: 'Time series to rows',
|
||||
transform: function(data, panel, model) {
|
||||
model.columns = [
|
||||
{text: 'Time'},
|
||||
{text: 'Series'},
|
||||
{text: 'Value'},
|
||||
];
|
||||
|
||||
model.rows = [];
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var series = data[i];
|
||||
for (var y = 0; y < series.datapoints.length; y++) {
|
||||
var dp = series.datapoints[y];
|
||||
var time = moment(dp[1]).format('LLL');
|
||||
var value = dp[0];
|
||||
if (value === null) {
|
||||
value = 'null';
|
||||
} else if (_.isNumber(value)) {
|
||||
value = value.toFixed(2);
|
||||
}
|
||||
|
||||
model.rows.push([time, series.target, value]);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
transformers['timeseries_to_columns'] = {
|
||||
description: 'Time series to columns',
|
||||
transform: function(data, panel, model) {
|
||||
model.columns = [{text: 'Time'}];
|
||||
model.rows = [];
|
||||
|
||||
var points = {};
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var series = data[i];
|
||||
model.columns.push({text: series.target});
|
||||
|
||||
for (var y = 0; y < series.datapoints.length; y++) {
|
||||
var dp = series.datapoints[y];
|
||||
var time = dp[1];
|
||||
if (!points[time]) {
|
||||
points[time] = {};
|
||||
points[time][i] = [dp[0]];
|
||||
}
|
||||
else {
|
||||
points[time][i] = dp[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var time in points) {
|
||||
var point = points[time];
|
||||
var values = [time];
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
if (point[i] !== undefined) {
|
||||
values.push(point[i]);
|
||||
}
|
||||
}
|
||||
|
||||
model.rows.push(values);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export {transformers}
|
||||
import {transformers} from './transformers';
|
||||
|
||||
export class TableModel {
|
||||
columns: any[];
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
///<reference path="../../headers/common.d.ts" />
|
||||
|
||||
import moment = require('moment');
|
||||
import _ = require('lodash');
|
||||
|
||||
var transformers = {};
|
||||
|
||||
transformers['timeseries_to_rows'] = {
|
||||
description: 'Time series to rows',
|
||||
transform: function(data, panel, model) {
|
||||
model.columns = [
|
||||
{text: 'Time'},
|
||||
{text: 'Series'},
|
||||
{text: 'Value'},
|
||||
];
|
||||
|
||||
model.rows = [];
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var series = data[i];
|
||||
for (var y = 0; y < series.datapoints.length; y++) {
|
||||
var dp = series.datapoints[y];
|
||||
var time = moment(dp[1]).format('LLL');
|
||||
var value = dp[0];
|
||||
if (value === null) {
|
||||
value = 'null';
|
||||
} else if (_.isNumber(value)) {
|
||||
value = value.toFixed(2);
|
||||
}
|
||||
|
||||
model.rows.push([time, series.target, value]);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
transformers['timeseries_to_columns'] = {
|
||||
description: 'Time series to columns',
|
||||
transform: function(data, panel, model) {
|
||||
model.columns = [{text: 'Time'}];
|
||||
model.rows = [];
|
||||
|
||||
// group by time
|
||||
var points = {};
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var series = data[i];
|
||||
model.columns.push({text: series.target});
|
||||
|
||||
for (var y = 0; y < series.datapoints.length; y++) {
|
||||
var dp = series.datapoints[y];
|
||||
var timeKey = dp[1].toString();
|
||||
|
||||
if (!points[timeKey]) {
|
||||
points[timeKey] = {time: dp[1]};
|
||||
points[timeKey][i] = dp[0];
|
||||
}
|
||||
else {
|
||||
points[timeKey][i] = dp[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (var time in points) {
|
||||
var point = points[time];
|
||||
var values = [moment(point.time).format('LLL')];
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
var value = point[i];
|
||||
if (_.isNumber(value)) {
|
||||
values.push(value.toFixed(2));
|
||||
} else {
|
||||
values.push('-');
|
||||
}
|
||||
}
|
||||
|
||||
model.rows.push(values);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export {transformers}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user