UNPKG

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
"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;