plyql
Version:
A SQL-like interface for Plywood
121 lines (120 loc) • 4.26 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var plywood_1 = require("plywood");
var variables_1 = require("./variables");
var mysql_gateway_1 = require("./mysql-gateway");
var plyql_executor_1 = require("./plyql-executor");
function printError(sql, err) {
console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
console.log('Failed to resolve query with Plywood.');
console.log('Query:');
console.log(sql);
console.log('If you believe this query should work please create an issue on PlyQL and include this section');
console.log('Issue url: https://github.com/implydata/plyql/issues');
console.log('Message:');
console.log(err.message);
console.log('Stack:');
console.log(err.stack);
console.log('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~');
}
function datumToMySQLRow(row, timezone) {
var newRow = {};
for (var k in row) {
var v = row[k];
if (v && v.start)
v = v.start;
if (v && v.toISOString) {
v = mysql_gateway_1.dateToSQL(v, timezone);
}
else if (plywood_1.Set.isSet(v) || plywood_1.TimeRange.isTimeRange(v)) {
v = v.toString(timezone);
}
else if (typeof v === 'boolean') {
v = Number(v);
}
newRow[k] = v;
}
return newRow;
}
function plyqlMySQLGateway(port, context, timezone, fallbackURI) {
mysql_gateway_1.createMySQLGateway(port, function (parameters, conn) {
var sql = parameters.sql, connectionId = parameters.connectionId;
var myContext = context;
var match;
if ((/SELECT\s+@@/i).test(sql)) {
sql = sql.replace(/@@(?:global\.|session\.)?/g, '');
myContext = {
data: variables_1.getVariablesFlatDataset()
};
}
if (match = sql.match(/USE\s+`/i)) {
sql = "SET NAMES 'utf8'";
}
if (match = sql.match(/SELECT\s+(CONNECTION_ID\(\s*\))/i)) {
var name = match[1];
var row = {};
row[name] = connectionId;
conn.writeTextResult([row], [
{
catalog: 'def',
schema: '',
name: 'CONNECTION_ID()',
orgName: 'CONNECTION_ID()',
table: '',
orgTable: '',
characterSet: 33,
columnLength: 500,
columnType: 0x8,
flags: 32896,
decimals: 0
}
]);
return;
}
var sqlParse;
try {
sqlParse = plywood_1.Expression.parseSQL(sql);
}
catch (e) {
printError(sql, e);
conn.writeError({
code: 1064,
message: e.message
});
return;
}
if (!sqlParse.verb) {
conn.writeError({
code: 1064,
message: "Must have a verb"
});
return;
}
switch (sqlParse.verb) {
case 'SET':
conn.writeOk();
return;
case 'SELECT':
plyql_executor_1.executeSQLParse(sqlParse, myContext, timezone)
.then(function (dataset) {
if (plywood_1.Dataset.isDataset(dataset)) {
var flatDataset = dataset.flatten();
var plyColumns = flatDataset.attributes.map(function (c) { return mysql_gateway_1.columnToMySQL(c, sqlParse.table); });
var plyRows = flatDataset.data.map(function (d) { return datumToMySQLRow(d, timezone); });
conn.writeTextResult(plyRows, plyColumns);
}
else {
throw new Error('unexpected result from expression');
}
});
return;
default:
conn.writeError({
code: 1337,
message: "Permission to " + sqlParse.verb + " denied"
});
return;
}
});
}
exports.plyqlMySQLGateway = plyqlMySQLGateway;