UNPKG

plyql

Version:

A SQL-like interface for Plywood

101 lines (100 loc) 3.68 kB
"use strict"; 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())); } }); }