lumenize
Version:
Illuminating the forest AND the trees in your data.
246 lines (210 loc) • 7.86 kB
JavaScript
// Generated by CoffeeScript 1.10.0
(function() {
var Time, arrayOfMaps_To_CSVStyleArray, arrayOfMaps_To_HighChartsSeries, csvString_To_CSVStyleArray, csvStyleArray_To_ArrayOfMaps, csvStyleArray_To_CSVString, ref, utils;
ref = require('tztime'), utils = ref.utils, Time = ref.Time;
csvStyleArray_To_ArrayOfMaps = function(csvStyleArray, rowKeys) {
/*
@method csvStyleArray_To_ArrayOfMaps
@param {Array[]} csvStyleArray The first row is usually the list of column headers but if not, you can
provide your own such list in the second parameter
@param {String[]} [rowKeys] specify the column headers like `['column1', 'column2']`. If not provided, it will use
the first row of the csvStyleArray
@return {Object[]}
`csvStyleArry_To_ArryOfMaps` is a convenience function that will convert a csvStyleArray like:
{csvStyleArray_To_ArrayOfMaps} = require('../')
csvStyleArray = [
['column1', 'column2'],
[1 , 2 ],
[3 , 4 ],
[5 , 6 ]
]
to an Array of Maps like this:
console.log(csvStyleArray_To_ArrayOfMaps(csvStyleArray))
* [ { column1: 1, column2: 2 },
* { column1: 3, column2: 4 },
* { column1: 5, column2: 6 } ]
*/
var arrayOfMaps, i, index, inputRow, j, key, len, outputRow, tableLength;
arrayOfMaps = [];
if (rowKeys != null) {
i = 0;
} else {
rowKeys = csvStyleArray[0];
i = 1;
}
tableLength = csvStyleArray.length;
while (i < tableLength) {
inputRow = csvStyleArray[i];
outputRow = {};
for (index = j = 0, len = rowKeys.length; j < len; index = ++j) {
key = rowKeys[index];
outputRow[key] = inputRow[index];
}
arrayOfMaps.push(outputRow);
i++;
}
return arrayOfMaps;
};
arrayOfMaps_To_CSVStyleArray = function(arrayOfMaps, fields) {
/*
@method arrayOfMaps_To_CSVStyleArray
@param {Object[]} arrayOfMaps
@param {String[]} [fields] If not provided, it will use the first row and get all fields
@return {Array[]} The first row will be the column headers
`arrayOfMaps_To_CSVStyleArray` is a convenience function that will convert an array of maps like:
{arrayOfMaps_To_CSVStyleArray} = require('../')
arrayOfMaps = [
{column1: 10000, column2: 20000},
{column1: 30000, column2: 40000},
{column1: 50000, column2: 60000}
]
to a CSV-style array like this:
console.log(arrayOfMaps_To_CSVStyleArray(arrayOfMaps))
* [ [ 'column1', 'column2' ],
* [ 10000, 20000 ],
* [ 30000, 40000 ],
* [ 50000, 60000 ] ]
*/
var csvStyleArray, inRow, j, k, key, len, len1, outRow, ref1, value;
if (arrayOfMaps.length === 0) {
return [];
}
csvStyleArray = [];
outRow = [];
if (fields == null) {
fields = [];
ref1 = arrayOfMaps[0];
for (key in ref1) {
value = ref1[key];
fields.push(key);
}
}
csvStyleArray.push(fields);
for (j = 0, len = arrayOfMaps.length; j < len; j++) {
inRow = arrayOfMaps[j];
outRow = [];
for (k = 0, len1 = fields.length; k < len1; k++) {
key = fields[k];
outRow.push(inRow[key]);
}
csvStyleArray.push(outRow);
}
return csvStyleArray;
};
arrayOfMaps_To_HighChartsSeries = function(arrayOfMaps, config) {
/*
@method arrayOfMaps_To_HighChartsSeries
@param {Array[]} arrayOfMaps
@param {Object} config You can use the same config you used to call TimeSeriesCalculator including your yAxis specifications
@return {Object[]} in HighCharts form
Takes an array of arrays that came from a call to TimeSeriesCalculator and looks like this:
{arrayOfMaps_To_HighChartsSeries} = require('../')
arrayOfMaps = [
{"Series 1": 8, "Series 2": 5, "Series3": 10},
{"Series 1": 2, "Series 2": 3},
{"Series 1": 1, "Series 2": 2, "Series3": 40},
]
and a list of series configurations
config = [
{name: "Series 1", yAxis: 1},
{name: "Series 2"},
{name: "Series3"}
]
and extracts the data into seperate series
console.log(arrayOfMaps_To_HighChartsSeries(arrayOfMaps, config))
* [ { name: 'Series 1', data: [ 8, 2, 1 ], yAxis: 1 },
* { name: 'Series 2', data: [ 5, 3, 2 ] },
* { name: 'Series3', data: [ 10, null, 40 ] } ]
Notice how the extra fields from the series array are included in the output. Also, notice how the missing second
value for Series3 was replaced with a null. HighCharts will skip right over this for category charts as you would
expect.
*/
var a, aggregationRow, idx, j, k, key, l, len, len1, len2, len3, m, output, outputRow, preOutput, s, seriesNames, seriesRow, value;
preOutput = {};
seriesNames = [];
for (j = 0, len = config.length; j < len; j++) {
a = config[j];
seriesNames.push(a.name);
}
for (k = 0, len1 = seriesNames.length; k < len1; k++) {
s = seriesNames[k];
preOutput[s] = [];
for (l = 0, len2 = arrayOfMaps.length; l < len2; l++) {
aggregationRow = arrayOfMaps[l];
value = aggregationRow[s];
if (value == null) {
value = null;
}
preOutput[s].push(value);
}
}
output = [];
for (idx = m = 0, len3 = seriesNames.length; m < len3; idx = ++m) {
s = seriesNames[idx];
outputRow = {
name: s,
data: preOutput[s]
};
seriesRow = config[idx];
for (key in seriesRow) {
value = seriesRow[key];
if (key !== 'name' && key !== 'data') {
outputRow[key] = value;
}
}
output.push(outputRow);
}
return output;
};
csvString_To_CSVStyleArray = function(s, asterixForUndefined) {
var c, cValue, error, error1, headerLength, index, j, k, len, len1, newRow, out, rawRowArray, row, rows;
if (asterixForUndefined == null) {
asterixForUndefined = true;
}
rows = s.split('\n');
headerLength = rows[0].split(',').length;
out = [];
for (index = j = 0, len = rows.length; j < len; index = ++j) {
row = rows[index];
newRow = [];
rawRowArray = row.split(',');
if (rawRowArray.length === headerLength) {
for (k = 0, len1 = rawRowArray.length; k < len1; k++) {
c = rawRowArray[k];
if (asterixForUndefined && c === '*') {
cValue = void 0;
} else {
try {
cValue = JSON.parse(c);
} catch (error1) {
error = error1;
}
}
newRow.push(cValue);
}
out.push(newRow);
} else {
console.log("Warning: Skipping row because length does not match header length in row " + index + ": " + row);
}
}
return out;
};
csvStyleArray_To_CSVString = function(csvStyleArray) {
var j, k, len, len1, row, s, value;
s = '';
for (j = 0, len = csvStyleArray.length; j < len; j++) {
row = csvStyleArray[j];
for (k = 0, len1 = row.length; k < len1; k++) {
value = row[k];
s += JSON.stringify(value) + ', ';
}
s += "\n";
}
return s;
};
exports.arrayOfMaps_To_CSVStyleArray = arrayOfMaps_To_CSVStyleArray;
exports.csvStyleArray_To_ArrayOfMaps = csvStyleArray_To_ArrayOfMaps;
exports.arrayOfMaps_To_HighChartsSeries = arrayOfMaps_To_HighChartsSeries;
exports.csvString_To_CSVStyleArray = csvString_To_CSVStyleArray;
exports.csvStyleArray_To_CSVString = csvStyleArray_To_CSVString;
}).call(this);