ts-sql-query
Version:
Type-safe SQL query builder like QueryDSL or JOOQ in Java or Linq in .Net for TypeScript with MariaDB, MySql, Oracle, PostgreSql, Sqlite and SqlServer support.
607 lines (606 loc) • 32.1 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.AbstractMySqlMariaDBSqlBuilder = void 0;
const SqlBuilder_1 = require("./SqlBuilder");
const values_1 = require("../expressions/values");
const AbstractSqlBuilder_1 = require("./AbstractSqlBuilder");
const Column_1 = require("../utils/Column");
const ValueSourceImpl_1 = require("../internal/ValueSourceImpl");
class AbstractMySqlMariaDBSqlBuilder extends AbstractSqlBuilder_1.AbstractSqlBuilder {
constructor() {
super();
this._insertSupportWith = false;
this._operationsThatNeedParenthesis._concat = false;
this._operationsThatNeedParenthesis._is = true;
this._operationsThatNeedParenthesis._asDouble = true;
this._operationsThatNeedParenthesis._getDate = true;
this._operationsThatNeedParenthesis._getMonth = true;
}
_forceAsIdentifier(identifier) {
return '`' + identifier + '`';
}
_buildSelectOrderBy(query, params) {
const orderBy = query.__orderBy;
if (!orderBy) {
let orderByColumns = '';
const customization = query.__customization;
if (customization && customization.beforeOrderByItems) {
orderByColumns += this._appendRawFragment(customization.beforeOrderByItems, params);
}
if (customization && customization.afterOrderByItems) {
if (orderByColumns) {
orderByColumns += ', ';
}
orderByColumns += this._appendRawFragment(customization.afterOrderByItems, params);
}
if (!orderByColumns) {
return '';
}
return ' order by ' + orderByColumns;
}
let orderByColumns = '';
const customization = query.__customization;
if (customization && customization.beforeOrderByItems) {
orderByColumns += this._appendRawFragment(customization.beforeOrderByItems, params);
}
for (const entry of orderBy) {
if (orderByColumns) {
orderByColumns += ', ';
}
const order = entry.order;
if (!order) {
orderByColumns += this._appendOrderByColumnAlias(entry, query, params);
}
else
switch (order) {
case 'asc':
case 'asc nulls first':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' asc';
break;
case 'desc':
case 'desc nulls last':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' desc';
break;
case 'asc nulls last':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' is null, ' + this._appendOrderByColumnAlias(entry, query, params) + ' asc';
break;
case 'desc nulls first':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' is not null, ' + this._appendOrderByColumnAlias(entry, query, params) + ' desc';
break;
case 'insensitive':
orderByColumns += this._appendOrderByColumnAliasInsensitive(entry, query, params);
break;
case 'asc insensitive':
case 'asc nulls first insensitive':
orderByColumns += this._appendOrderByColumnAliasInsensitive(entry, query, params) + ' asc';
break;
case 'desc insensitive':
case 'desc nulls last insensitive':
orderByColumns += this._appendOrderByColumnAliasInsensitive(entry, query, params) + ' desc';
break;
case 'asc nulls last insensitive':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' is null, ' + this._appendOrderByColumnAlias(entry, query, params) + ' asc';
break;
case 'desc nulls first insensitive':
orderByColumns += this._appendOrderByColumnAlias(entry, query, params) + ' is not null, ' + this._appendOrderByColumnAlias(entry, query, params) + ' desc';
break;
default:
throw new Error('Invalid order by: ' + order);
}
}
if (customization && customization.afterOrderByItems) {
if (orderByColumns) {
orderByColumns += ', ';
}
orderByColumns += this._appendRawFragment(customization.afterOrderByItems, params);
}
if (!orderByColumns) {
return '';
}
return ' order by ' + orderByColumns;
}
_buildAggregateArrayOrderBy(query, params, addSpace) {
const orderBy = query.__orderBy;
if (!orderBy) {
let orderByColumns = '';
const customization = query.__customization;
if (customization && customization.beforeOrderByItems) {
orderByColumns += this._appendRawFragment(customization.beforeOrderByItems, params);
}
if (customization && customization.afterOrderByItems) {
if (orderByColumns) {
orderByColumns += ', ';
}
orderByColumns += this._appendRawFragment(customization.afterOrderByItems, params);
}
if (!orderByColumns) {
return '';
}
return ' order by ' + orderByColumns;
}
let orderByColumns = '';
const customization = query.__customization;
if (customization && customization.beforeOrderByItems) {
orderByColumns += this._appendRawFragment(customization.beforeOrderByItems, params);
}
for (const entry of orderBy) {
if (orderByColumns) {
orderByColumns += ', ';
}
const order = entry.order;
if (!entry.order) {
orderByColumns += this._appendOrderByColumnExpression(entry, query, params);
}
else
switch (order) {
case 'asc':
case 'asc nulls first':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' asc';
break;
case 'desc':
case 'desc nulls last':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' desc';
break;
case 'asc nulls last':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' is null, ' + this._appendOrderByColumnExpression(entry, query, params) + ' asc';
break;
case 'desc nulls first':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' is not null, ' + this._appendOrderByColumnExpression(entry, query, params) + ' desc';
break;
case 'insensitive':
orderByColumns += this._appendOrderByColumnExpressionInsensitive(entry, query, params);
break;
case 'asc insensitive':
case 'asc nulls first insensitive':
orderByColumns += this._appendOrderByColumnExpressionInsensitive(entry, query, params) + ' asc';
break;
case 'desc insensitive':
case 'desc nulls last insensitive':
orderByColumns += this._appendOrderByColumnExpressionInsensitive(entry, query, params) + ' desc';
break;
case 'asc nulls last insensitive':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' is null, ' + this._appendOrderByColumnExpressionInsensitive(entry, query, params) + ' asc';
break;
case 'desc nulls first insensitive':
orderByColumns += this._appendOrderByColumnExpression(entry, query, params) + ' is not null, ' + this._appendOrderByColumnExpressionInsensitive(entry, query, params) + ' desc';
break;
default:
throw new Error('Invalid order by: ' + order);
}
}
if (customization && customization.afterOrderByItems) {
if (orderByColumns) {
orderByColumns += ', ';
}
orderByColumns += this._appendRawFragment(customization.afterOrderByItems, params);
}
if (!orderByColumns) {
return '';
}
if (addSpace) {
return ' order by ' + orderByColumns;
}
else {
return 'order by ' + orderByColumns;
}
}
_appendOrderByColumnExpressionInsensitive(entry, query, params) {
const collation = this._connectionConfiguration.insesitiveCollation;
const expression = entry.expression;
const stringColumn = this._isStringOrderByColumn(entry, query);
if (stringColumn && collation) {
if (typeof expression === 'string') {
const column = (0, SqlBuilder_1.getQueryColumn)(query.__columns, expression);
if (!column) {
throw new Error('Column ' + expression + ' included in the order by not found in the select clause');
}
return this._appendSqlParenthesis(column, params) + ' collate ' + collation;
}
else if ((0, values_1.isValueSource)(expression)) {
return this._appendSqlParenthesis(expression, params) + ' collate ' + collation;
}
}
return this._appendOrderByColumnExpression(entry, query, params);
}
_appendOrderByColumnExpression(entry, query, params) {
const expression = entry.expression;
if (typeof expression === 'string') {
const column = (0, SqlBuilder_1.getQueryColumn)(query.__columns, expression);
if (!column) {
throw new Error('Column ' + expression + ' included in the order by not found in the select clause');
}
return this._appendSql(column, params);
}
else if ((0, values_1.isValueSource)(expression)) {
return this._appendSql(expression, params);
}
else {
return this._appendRawFragment(expression, params);
}
}
_buildSelectLimitOffset(query, params) {
let result = '';
const limit = query.__limit;
if (limit !== null && limit !== undefined) {
result += ' limit ' + this._appendValue(limit, params, 'int', 'int', undefined);
}
const offset = query.__offset;
if (offset !== null && offset !== undefined) {
if (!result) {
// MySql/MariaDB doesn't support an offset without a limit, let put the the max value of an int
result += ' limit 2147483647';
}
result += ' offset ' + this._appendValue(offset, params, 'int', 'int', undefined);
}
if (!result && this._isAggregateArrayWrapped(params) && (query.__orderBy || query.__customization?.beforeOrderByItems || query.__customization?.afterOrderByItems)) {
result += ' limit 2147483647'; // Workaround to force mysql/maraiadb to order the result (if not the order by is ignored), the number is the max value of an int
}
return result;
}
_buildInsertDefaultValues(query, params) {
this._ensureRootQuery(query, params);
const customization = query.__customization;
let insertQuery = '';
if (customization && customization.beforeQuery) {
insertQuery += this._appendRawFragment(customization.beforeQuery, params) + ' ';
}
insertQuery += 'insert ';
if (customization && customization.afterInsertKeyword) {
insertQuery += this._appendRawFragment(customization.afterInsertKeyword, params) + ' ';
}
insertQuery += this._buildInsertOnConflictBeforeInto(query, params);
insertQuery += 'into ' + this._appendTableOrViewName(query.__table, params) + ' () values ()';
insertQuery += this._buildInsertOnConflictBeforeReturning(query, params);
insertQuery += this._buildInsertReturning(query, params);
if (customization && customization.afterQuery) {
insertQuery += ' ' + this._appendRawFragment(customization.afterQuery, params);
}
this._resetRootQuery(query, params);
return insertQuery;
}
_buildInsertOutput(_query, _params) {
return '';
}
_buildInsertOnConflictBeforeInto(query, _params) {
if (query.__onConflictDoNothing) {
return 'ignore ';
}
return '';
}
_buildInsertOnConflictBeforeReturning(query, params) {
let columns = '';
const table = query.__table;
const sets = query.__onConflictUpdateSets;
if (sets) {
const properties = Object.getOwnPropertyNames(sets);
for (let i = 0, length = properties.length; i < length; i++) {
const property = properties[i];
const column = (0, Column_1.__getColumnOfObject)(table, property);
if (!column) {
// Additional property provided in the value object
// Skipped because it is not part of the table
// This allows to have more complex objects used in the query
continue;
}
if (columns) {
columns += ', ';
}
const value = sets[property];
columns += this._appendColumnNameForUpdate(column, params);
columns += ' = ';
columns += this._appendValueForColumn(column, value, params);
}
}
if (columns) {
return ' on duplicate key update ' + columns;
}
else {
return '';
}
}
_appendRawColumnNameForValuesForInsert(column, _params) {
const columnPrivate = (0, Column_1.__getColumnPrivate)(column);
return 'values(' + this._escape(columnPrivate.__name, true) + ')';
}
_appendColumnNameForUpdate(column, params) {
return this._appendRawColumnName(column, params);
}
_buildAfterUpdateTable(query, params) {
const result = this._buildFromJoins(query.__froms, query.__joins, undefined, params);
if (!result) {
return '';
}
if (query.__froms && query.__froms.length > 0) {
return ', ' + result;
}
return result;
}
_buildUpdateFrom(_query, _updatePrimaryKey, _requiredTables, _requiredColumns, _params) {
return '';
}
_buidDeleteUsing(query, params) {
const result = this._buildFromJoins(query.__using, query.__joins, undefined, params);
if (result) {
if (query.__using && query.__using.length > 0) {
return ' using ' + this._appendTableOrViewName(query.__table, params) + ', ' + result;
}
return ' using ' + this._appendTableOrViewName(query.__table, params) + result;
}
return '';
}
_is(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
if ((0, Column_1.isColumn)(valueSource) && (0, Column_1.isColumn)(value) && this._hasSameBooleanTypeAdapter(valueSource, value)) {
return this._appendRawColumnName(valueSource, params) + ' <=>' + this._appendRawColumnName(value, params);
}
return this._appendSqlParenthesis(valueSource, params) + ' <=> ' + this._appendValueParenthesis(value, params, columnType, columnTypeName, typeAdapter);
}
_isNot(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
if ((0, Column_1.isColumn)(valueSource) && (0, Column_1.isColumn)(value) && this._hasSameBooleanTypeAdapter(valueSource, value)) {
return 'not (' + this._appendRawColumnName(valueSource, params) + ' <=> ' + this._appendRawColumnName(value, params) + ')';
}
return 'not (' + this._appendSqlParenthesis(valueSource, params) + ' <=> ' + this._appendValueParenthesis(value, params, columnType, columnTypeName, typeAdapter) + ')';
}
_divide(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + ' / ' + this._appendValueParenthesis(value, params, this._getMathArgumentType(columnType, columnTypeName, value), this._getMathArgumentTypeName(columnType, columnTypeName, value), typeAdapter);
}
_asDouble(params, valueSource) {
return this._appendSqlParenthesis(valueSource, params) + ' * 1.0';
}
_valueWhenNull(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return 'ifnull(' + this._appendSql(valueSource, params) + ', ' + this._appendValue(value, params, columnType, columnTypeName, typeAdapter) + ')';
}
_escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) {
if (typeof value === 'string') {
value = value.replace(/\\/g, '\\\\\\\\');
value = value.replace(/%/g, '\\%');
value = value.replace(/_/g, '\\_');
return this._appendValue(value, params, columnType, columnTypeName, typeAdapter);
}
else {
return "replace(replace(replace(" + this._appendValue(value, params, columnType, columnTypeName, typeAdapter) + ", '\\\\', '\\\\\\\\\\\\\\\\'), '%', '\\\\%'), '_', '\\\\_')";
}
}
_startsWith(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + ' like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
_notStartsWith(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + ' not like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
_endsWith(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ')';
}
_notEndsWith(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ')';
}
_startsWithInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + ' like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%') collate " + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + ' like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ') like concat(lower(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + "), '%')";
}
}
_notStartsWithInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + ' not like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%') collate " + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + ' not like concat(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ') not like concat(lower(' + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + "), '%')";
}
}
_endsWithInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ') collate ' + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ')';
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ") like concat('%', lower(" + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + '))';
}
}
_notEndsWithInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + " not like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ') collate ' + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + " not like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ')';
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ") not like concat('%', lower(" + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + '))';
}
}
_contains(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
_notContains(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return this._appendSqlParenthesis(valueSource, params) + " not like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
_containsInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%') collate " + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + " like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ") like concat('%', lower(" + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + "), '%')";
}
}
_notContainsInsensitive(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
const collation = this._connectionConfiguration.insesitiveCollation;
if (collation) {
return this._appendSqlParenthesis(valueSource, params) + " not like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%') collate " + collation;
}
else if (collation === '') {
return this._appendSqlParenthesis(valueSource, params) + " not like concat('%', " + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + ", '%')";
}
else {
return 'lower(' + this._appendSql(valueSource, params) + ") not like concat('%', lower(" + this._escapeLikeWildcard(params, value, columnType, columnTypeName, typeAdapter) + "), '%')";
}
}
_concat(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
let result = 'concat(';
if ((0, values_1.isValueSource)(valueSource)) {
result += this._appendMaybeInnerConcat(valueSource, params);
}
else {
result += this._appendSql(valueSource, params);
}
result += ', ';
if ((0, values_1.isValueSource)(value)) {
result += this._appendMaybeInnerConcat(value, params);
}
else {
result += this._appendValue(value, params, columnType, columnTypeName, typeAdapter);
}
result += ')';
return result;
}
_appendMaybeInnerConcat(valueSource, params) {
if (valueSource instanceof ValueSourceImpl_1.SqlOperation1ValueSource && valueSource.__operation === '_concat') {
let result = this._appendMaybeInnerConcat(valueSource.__valueSource, params);
const value = valueSource.__value;
result += ', ';
if ((0, values_1.isValueSource)(value)) {
result += this._appendMaybeInnerConcat(value, params);
}
else {
result += this._appendValue(value, params, valueSource.__valueType, valueSource.__valueTypeName, valueSource.__typeAdapter);
}
return result;
}
if (valueSource instanceof ValueSourceImpl_1.SqlOperation1ValueSourceIfValueOrIgnore && valueSource.__operation === '_concat') {
let result = this._appendMaybeInnerConcat(valueSource.__valueSource, params);
const value = valueSource.__value;
if (this._isValue(value)) {
result += ', ';
if ((0, values_1.isValueSource)(value)) {
result += this._appendMaybeInnerConcat(value, params);
}
else {
result += this._appendValue(value, params, valueSource.__valueType, valueSource.__valueTypeName, valueSource.__typeAdapter);
}
}
return result;
}
return this._appendSql(valueSource, params);
}
_log10(params, valueSource) {
return 'log10(' + this._appendSql(valueSource, params) + ')';
}
_cbrt(params, valueSource) {
return 'power(' + this._appendSql(valueSource, params) + ', 3)';
}
_logn(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
return 'log(' + this._appendValue(value, params, this._getMathArgumentType(columnType, columnTypeName, value), this._getMathArgumentTypeName(columnType, columnTypeName, value), typeAdapter) + ', ' + this._appendSql(valueSource, params) + ')';
}
_getDate(params, valueSource) {
return 'dayofmonth(' + this._appendSql(valueSource, params) + ')';
}
_getTime(params, valueSource) {
return 'round(unix_timestamp(' + this._appendSql(valueSource, params) + ') * 1000)';
}
_getFullYear(params, valueSource) {
return 'year(' + this._appendSql(valueSource, params) + ')';
}
_getMonth(params, valueSource) {
return 'month(' + this._appendSql(valueSource, params) + ') - 1';
}
_getDay(params, valueSource) {
return 'dayofweek(' + this._appendSql(valueSource, params) + ') - 1';
}
_getHours(params, valueSource) {
return 'hour(' + this._appendSql(valueSource, params) + ')';
}
_getMinutes(params, valueSource) {
return 'minute(' + this._appendSql(valueSource, params) + ')';
}
_getSeconds(params, valueSource) {
return 'second(' + this._appendSql(valueSource, params) + ')';
}
_getMilliseconds(params, valueSource) {
return 'round(microsecond(' + this._appendSql(valueSource, params) + ') / 1000)';
}
_stringConcat(params, separator, value) {
if (separator === undefined || separator === null) {
return 'group_concat(' + this._appendSql(value, params) + ')';
}
else if (separator === '') {
return 'group_concat(' + this._appendSql(value, params) + " separator '')";
}
else {
return 'group_concat(' + this._appendSql(value, params) + ' separator ' + this._appendValue(separator, params, 'string', 'string', undefined) + ')';
}
}
_stringConcatDistinct(params, separator, value) {
if (separator === undefined || separator === null) {
return 'group_concat(distinct ' + this._appendSql(value, params) + ')';
}
else if (separator === '') {
return 'group_concat(' + this._appendSql(value, params) + " separator '')";
}
else {
return 'group_concat(distinct ' + this._appendSql(value, params) + ' separator ' + this._appendValue(separator, params, 'string', 'string', undefined) + ')';
}
}
_in(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
if (Array.isArray(value) && value.length <= 0) {
return this._falseValueForCondition;
}
return super._in(params, valueSource, value, columnType, columnTypeName, typeAdapter);
}
_notIn(params, valueSource, value, columnType, columnTypeName, typeAdapter) {
if (Array.isArray(value) && value.length <= 0) {
return this._trueValueForCondition;
}
return super._notIn(params, valueSource, value, columnType, columnTypeName, typeAdapter);
}
_appendAggragateArrayColumns(aggregatedArrayColumns, aggregatedArrayDistinct, params, _query) {
const distict = aggregatedArrayDistinct ? 'distinct ' : '';
if ((0, values_1.isValueSource)(aggregatedArrayColumns)) {
return 'json_arrayagg(' + distict + this._appendSql(aggregatedArrayColumns, params) + ')';
}
else {
const columns = {};
(0, SqlBuilder_1.flattenQueryColumns)(aggregatedArrayColumns, columns, '');
let result = '';
for (let prop in columns) {
if (result) {
result += ', ';
}
result += "'" + prop + "', " + this._appendSql(columns[prop], params);
}
return 'json_arrayagg(' + distict + 'json_object(' + result + '))';
}
}
_appendAggragateArrayWrappedColumns(aggregatedArrayColumns, _params, aggregateId) {
if ((0, values_1.isValueSource)(aggregatedArrayColumns)) {
return 'json_arrayagg(a_' + aggregateId + '_.result)';
}
else {
const columns = {};
(0, SqlBuilder_1.flattenQueryColumns)(aggregatedArrayColumns, columns, '');
let result = '';
for (let prop in columns) {
if (result) {
result += ', ';
}
result += "'" + prop + "', a_" + aggregateId + "_." + this._escape(prop, true);
}
return 'json_arrayagg(json_object(' + result + '))';
}
}
}
exports.AbstractMySqlMariaDBSqlBuilder = AbstractMySqlMariaDBSqlBuilder;