plyql
Version:
A SQL-like interface for Plywood
101 lines (100 loc) • 3.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var readable_stream_1 = require("readable-stream");
var chronoshift_1 = require("chronoshift");
var plywood_1 = require("plywood");
var table_1 = require("table");
function streamFlatten(v) {
return v;
}
function escapeControlChars(str) {
return str.replace(/[\x01-\x1A]/g, function (x) { return '\\x' + ('0' + x.charCodeAt(0).toString(16)).substr(-2); });
}
function formatValue(v, tz) {
if (v == null)
return 'NULL';
if (chronoshift_1.isDate(v))
return chronoshift_1.Timezone.formatDateWithTimezone(v, tz);
if (plywood_1.Set.isSet(v) || plywood_1.TimeRange.isTimeRange(v))
return v.toString(tz);
return escapeControlChars('' + v);
}
function getOutputTransform(output, timezone) {
switch (output) {
case 'table':
return collectOutput(function (dataset) {
var flatDataset = dataset.flatten({ order: 'preorder' });
var columnNames = flatDataset.attributes.map(function (c) { return c.name; });
if (columnNames.length) {
var tableData = [columnNames].concat(flatDataset.data.map(function (flatDatum) {
return columnNames.map(function (cn) { return formatValue(flatDatum[cn], timezone); });
}));
return table_1.table(tableData, {
border: table_1.getBorderCharacters('norc'),
drawHorizontalLine: function (index, size) { return index <= 1 || index === size; }
});
}
else {
return '';
}
});
case 'csv':
return collectOutput(function (v) {
if (v instanceof plywood_1.Dataset) {
return v.toCSV({ finalLineBreak: 'include', timezone: timezone });
}
else {
return String(v);
}
});
case 'tsv':
return collectOutput(function (v) {
if (v instanceof plywood_1.Dataset) {
return v.toTSV({ finalLineBreak: 'include', timezone: timezone });
}
else {
return String(v);
}
});
case 'json':
case 'flat':
return collectOutput(function (v) {
if (v instanceof plywood_1.Dataset) {
return v.flatten().data.map(function (d) { return JSON.stringify(d); }).join('\n') + '\n';
}
else {
return String(v);
}
});
case 'plywood':
return collectOutput(function (v) {
return JSON.stringify(v, null, 2);
});
case 'plywood-stream':
return jsonOutput();
default:
throw new Error('Unknown output type');
}
}
exports.getOutputTransform = getOutputTransform;
function jsonOutput() {
return new readable_stream_1.Transform({
objectMode: true,
transform: function (chunk, encoding, callback) {
callback(null, JSON.stringify(chunk) + '\n');
}
});
}
function collectOutput(onDone) {
var pvb = new plywood_1.PlywoodValueBuilder();
return new readable_stream_1.Transform({
objectMode: true,
transform: function (chunk, encoding, callback) {
pvb.processBit(chunk);
callback(null);
},
flush: function (callback) {
callback(null, onDone(pvb.getValue()));
}
});
}