plywood
Version:
A query planner and executor
142 lines (141 loc) • 6.3 kB
JavaScript
import { __extends } from "tslib";
import { SQLDialect } from './baseDialect';
var MySQLDialect = (function (_super) {
__extends(MySQLDialect, _super);
function MySQLDialect() {
return _super.call(this) || this;
}
MySQLDialect.prototype.escapeName = function (name) {
name = name.replace(/`/g, '``');
return '`' + name + '`';
};
MySQLDialect.prototype.escapeLiteral = function (name) {
if (name === null)
return this.nullConstant();
return JSON.stringify(name);
};
MySQLDialect.prototype.timeToSQL = function (date) {
if (!date)
return this.nullConstant();
return "TIMESTAMP('".concat(this.dateToSQLDateString(date), "')");
};
MySQLDialect.prototype.stringArrayToSQL = function (_value) {
throw new Error('must implement');
};
MySQLDialect.prototype.concatExpression = function (a, b) {
return "CONCAT(".concat(a, ",").concat(b, ")");
};
MySQLDialect.prototype.containsExpression = function (a, b, insensitive) {
if (insensitive) {
a = "LOWER(".concat(a, ")");
b = "LOWER(".concat(b, ")");
}
return "LOCATE(".concat(b, ",").concat(a, ")>0");
};
MySQLDialect.prototype.isNotDistinctFromExpression = function (a, b) {
return "(".concat(a, "<=>").concat(b, ")");
};
MySQLDialect.prototype.castExpression = function (inputType, operand, targetType) {
var castFunction = MySQLDialect.CAST_TO_FUNCTION[targetType][inputType];
if (!castFunction) {
throw new Error("unsupported cast from ".concat(inputType, " to ").concat(targetType, " in MySQL dialect"));
}
return castFunction.replace(/\$\$/g, operand);
};
MySQLDialect.prototype.utcToWalltime = function (operand, timezone) {
if (timezone.isUTC())
return operand;
return "CONVERT_TZ(".concat(operand, ",'+0:00','").concat(timezone, "')");
};
MySQLDialect.prototype.walltimeToUTC = function (operand, timezone) {
if (timezone.isUTC())
return operand;
return "CONVERT_TZ(".concat(operand, ",'").concat(timezone, "','+0:00')");
};
MySQLDialect.prototype.timeFloorExpression = function (operand, duration, timezone) {
var bucketFormat = MySQLDialect.TIME_BUCKETING[duration.toString()];
if (!bucketFormat)
throw new Error("unsupported duration '".concat(duration, "'"));
return this.walltimeToUTC("DATE_FORMAT(".concat(this.utcToWalltime(operand, timezone), ",'").concat(bucketFormat, "')"), timezone);
};
MySQLDialect.prototype.timeBucketExpression = function (operand, duration, timezone) {
return this.timeFloorExpression(operand, duration, timezone);
};
MySQLDialect.prototype.timePartExpression = function (operand, part, timezone) {
var timePartFunction = MySQLDialect.TIME_PART_TO_FUNCTION[part];
if (!timePartFunction)
throw new Error("unsupported part ".concat(part, " in MySQL dialect"));
return timePartFunction.replace(/\$\$/g, this.utcToWalltime(operand, timezone));
};
MySQLDialect.prototype.timeShiftExpression = function (operand, duration, step, _timezone) {
if (step === 0)
return operand;
var sqlFn = step > 0 ? 'DATE_ADD(' : 'DATE_SUB(';
var spans = duration.multiply(Math.abs(step)).valueOf();
if (spans.week) {
return sqlFn + operand + ', INTERVAL ' + String(spans.week) + ' WEEK)';
}
if (spans.year || spans.month) {
var expr = String(spans.year || 0) + '-' + String(spans.month || 0);
operand = sqlFn + operand + ", INTERVAL '" + expr + "' YEAR_MONTH)";
}
if (spans.day || spans.hour || spans.minute || spans.second) {
var expr = String(spans.day || 0) +
' ' +
[spans.hour || 0, spans.minute || 0, spans.second || 0].join(':');
operand = sqlFn + operand + ", INTERVAL '" + expr + "' DAY_SECOND)";
}
return operand;
};
MySQLDialect.prototype.extractExpression = function (_operand, _regexp) {
throw new Error('MySQL must implement extractExpression (https://github.com/mysqludf/lib_mysqludf_preg)');
};
MySQLDialect.prototype.indexOfExpression = function (str, substr) {
return "LOCATE(".concat(substr, ", ").concat(str, ") - 1");
};
MySQLDialect.TIME_BUCKETING = {
PT1S: '%Y-%m-%d %H:%i:%SZ',
PT1M: '%Y-%m-%d %H:%i:00Z',
PT1H: '%Y-%m-%d %H:00:00Z',
P1D: '%Y-%m-%d 00:00:00Z',
P1M: '%Y-%m-01 00:00:00Z',
P1Y: '%Y-01-01 00:00:00Z',
};
MySQLDialect.TIME_PART_TO_FUNCTION = {
SECOND_OF_MINUTE: 'SECOND($$)',
SECOND_OF_HOUR: '(MINUTE($$)*60+SECOND($$))',
SECOND_OF_DAY: '((HOUR($$)*60+MINUTE($$))*60+SECOND($$))',
SECOND_OF_WEEK: '(((WEEKDAY($$)*24)+HOUR($$)*60+MINUTE($$))*60+SECOND($$))',
SECOND_OF_MONTH: '((((DAYOFMONTH($$)-1)*24)+HOUR($$)*60+MINUTE($$))*60+SECOND($$))',
SECOND_OF_YEAR: '((((DAYOFYEAR($$)-1)*24)+HOUR($$)*60+MINUTE($$))*60+SECOND($$))',
MINUTE_OF_HOUR: 'MINUTE($$)',
MINUTE_OF_DAY: 'HOUR($$)*60+MINUTE($$)',
MINUTE_OF_WEEK: '(WEEKDAY($$)*24)+HOUR($$)*60+MINUTE($$)',
MINUTE_OF_MONTH: '((DAYOFMONTH($$)-1)*24)+HOUR($$)*60+MINUTE($$)',
MINUTE_OF_YEAR: '((DAYOFYEAR($$)-1)*24)+HOUR($$)*60+MINUTE($$)',
HOUR_OF_DAY: 'HOUR($$)',
HOUR_OF_WEEK: '(WEEKDAY($$)*24+HOUR($$))',
HOUR_OF_MONTH: '((DAYOFMONTH($$)-1)*24+HOUR($$))',
HOUR_OF_YEAR: '((DAYOFYEAR($$)-1)*24+HOUR($$))',
DAY_OF_WEEK: '(WEEKDAY($$)+1)',
DAY_OF_MONTH: 'DAYOFMONTH($$)',
DAY_OF_YEAR: 'DAYOFYEAR($$)',
WEEK_OF_YEAR: 'WEEK($$)',
MONTH_OF_YEAR: 'MONTH($$)',
YEAR: 'YEAR($$)',
};
MySQLDialect.CAST_TO_FUNCTION = {
TIME: {
NUMBER: 'FROM_UNIXTIME($$ / 1000)',
},
NUMBER: {
TIME: 'UNIX_TIMESTAMP($$) * 1000',
STRING: 'CAST($$ AS SIGNED)',
},
STRING: {
NUMBER: 'CAST($$ AS CHAR)',
},
};
return MySQLDialect;
}(SQLDialect));
export { MySQLDialect };