不要怂,就是干,撸起袖子干!

Commit 4827513f by Filip Bonnevier

Change important MySQL query generator functions from using _.template to string…

… concatenation. This has a large performance impact when doing many queries and having big result sets (attributesToSQL function)
1 parent 8ccd34b4
Showing with 52 additions and 56 deletions
......@@ -149,8 +149,8 @@ module.exports = (function() {
},
selectQuery: function(tableName, options) {
var query = "SELECT <%= attributes %> FROM <%= table %>"
, table = null
var table = null,
joinQuery = ""
options = options || {}
options.table = table = Array.isArray(tableName) ? tableName.map(function(tbl){ return QueryGenerator.addQuotes(tbl) }).join(", ") : QueryGenerator.addQuotes(tableName)
......@@ -168,75 +168,74 @@ module.exports = (function() {
options.include.forEach(function(include) {
var attributes = Object.keys(include.daoFactory.attributes).map(function(attr) {
var template = Utils._.template("`<%= as %>`.`<%= attr %>` AS `<%= as %>.<%= attr %>`")
return template({ as: include.as, attr: attr })
return "`" + include.as + "`.`" + attr + "` AS `" + include.as + "." + attr + "`"
})
optAttributes = optAttributes.concat(attributes)
var joinQuery = " LEFT OUTER JOIN `<%= table %>` AS `<%= as %>` ON `<%= tableLeft %>`.`<%= attrLeft %>` = `<%= tableRight %>`.`<%= attrRight %>`"
query += Utils._.template(joinQuery)({
table: include.daoFactory.tableName,
as: include.as,
tableLeft: ((include.association.associationType === 'BelongsTo') ? include.as : tableName),
attrLeft: 'id',
tableRight: ((include.association.associationType === 'BelongsTo') ? tableName : include.as),
attrRight: include.association.identifier
})
var table = include.daoFactory.tableName
var as = include.as
var tableLeft = ((include.association.associationType === 'BelongsTo') ? include.as : tableName)
var attrLeft = 'id'
var tableRight = ((include.association.associationType === 'BelongsTo') ? tableName : include.as)
var attrRight = include.association.identifier
joinQuery += " LEFT OUTER JOIN `" + table + "` AS `" + as + "` ON `" + tableLeft + "`.`" + attrLeft + "` = `" + tableRight + "`.`" + attrRight + "`"
})
options.attributes = optAttributes.join(', ')
}
var query = "SELECT " + options.attributes + " FROM " + options.table
query += joinQuery
if (options.hasOwnProperty('where')) {
options.where = this.getWhereConditions(options.where, tableName)
query += " WHERE <%= where %>"
query += " WHERE " + options.where
}
if (options.group) {
options.group = Array.isArray(options.group) ? options.group.map(function(grp){return QueryGenerator.addQuotes(grp)}).join(', ') : QueryGenerator.addQuotes(options.group)
query += " GROUP BY <%= group %>"
query += " GROUP BY " + options.group
}
if (options.order) {
query += " ORDER BY <%= order %>"
query += " ORDER BY " + options.order
}
if (options.limit && !(options.include && (options.limit === 1))) {
if (options.offset) {
query += " LIMIT <%= offset %>, <%= limit %>"
query += " LIMIT " + options.offset + ", " + options.limit
} else {
query += " LIMIT <%= limit %>"
query += " LIMIT " + options.limit
}
}
query += ";"
// console.log(query)
return Utils._.template(query)(options)
return query
},
insertQuery: function(tableName, attrValueHash) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "INSERT INTO <%= table %> (<%= attributes %>) VALUES (<%= values %>);"
var replacements = {
table: QueryGenerator.addQuotes(tableName),
attributes: Object.keys(attrValueHash).map(function(attr){return QueryGenerator.addQuotes(attr)}).join(","),
values: Utils._.values(attrValueHash).map(function(value){
var table = QueryGenerator.addQuotes(tableName)
var attributes = Object.keys(attrValueHash).map(function(attr){return QueryGenerator.addQuotes(attr)}).join(",")
var values = Utils._.values(attrValueHash).map(function(value){
return Utils.escape((value instanceof Date) ? Utils.toSqlDate(value) : value)
}).join(",")
}
return Utils._.template(query)(replacements)
var query = "INSERT INTO " + table + " (" + attributes + ") VALUES (" + values + ");"
return query
},
updateQuery: function(tableName, attrValueHash, where) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "UPDATE <%= table %> SET <%= values %> WHERE <%= where %>"
, values = []
var values = []
for (var key in attrValueHash) {
var value = attrValueHash[key]
......@@ -245,34 +244,31 @@ module.exports = (function() {
values.push(QueryGenerator.addQuotes(key) + "=" + Utils.escape(_value))
}
var replacements = {
table: QueryGenerator.addQuotes(tableName),
values: values.join(","),
where: QueryGenerator.getWhereConditions(where)
}
var query = "UPDATE " + QueryGenerator.addQuotes(tableName) +
" SET " + values.join(",") +
" WHERE " + QueryGenerator.getWhereConditions(where) +
";"
return Utils._.template(query)(replacements)
return query
},
deleteQuery: function(tableName, where, options) {
options = options || {}
options.limit = options.limit || 1
var query = "DELETE FROM <%= table %> WHERE <%= where %> LIMIT <%= limit %>"
var replacements = {
table: QueryGenerator.addQuotes(tableName),
where: QueryGenerator.getWhereConditions(where),
limit: Utils.escape(options.limit)
}
var table = QueryGenerator.addQuotes(tableName)
var where = QueryGenerator.getWhereConditions(where)
var limit = Utils.escape(options.limit)
var query = "DELETE FROM " + table + " WHERE " + where + " LIMIT " + limit
return Utils._.template(query)(replacements)
return query
},
incrementQuery: function (tableName, attrValueHash, where) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "UPDATE <%= table %> SET <%= values %> WHERE <%= where %> "
, values = []
var values = []
for (var key in attrValueHash) {
var value = attrValueHash[key]
......@@ -280,14 +276,14 @@ module.exports = (function() {
values.push(QueryGenerator.addQuotes(key) + "=" + QueryGenerator.addQuotes(key) + " + " +Utils.escape(_value))
}
var table = QueryGenerator.addQuotes(tableName)
var values = values.join(",")
var where = QueryGenerator.getWhereConditions(where)
var replacements = {
table: QueryGenerator.addQuotes(tableName),
values: values.join(","),
where: QueryGenerator.getWhereConditions(where)
}
var query = "UPDATE " + table + " SET " + values + " WHERE " + where
return Utils._.template(query)(replacements)
return query
},
addIndexQuery: function(tableName, attributes, options) {
......@@ -410,17 +406,18 @@ module.exports = (function() {
var dataType = attributes[name]
if (Utils.isHash(dataType)) {
var template = "<%= type %>"
, replacements = { type: dataType.type }
var template
if (dataType.type.toString() === DataTypes.ENUM.toString()) {
if (Array.isArray(dataType.values) && (dataType.values.length > 0)) {
replacements.type = "ENUM(" + Utils._.map(dataType.values, function(value) {
template = "ENUM(" + Utils._.map(dataType.values, function(value) {
return Utils.escape(value)
}).join(", ") + ")"
} else {
throw new Error('Values for ENUM haven\'t been defined.')
}
} else {
template = dataType.type.toString();
}
if (dataType.hasOwnProperty('allowNull') && (!dataType.allowNull)) {
......@@ -432,8 +429,7 @@ module.exports = (function() {
}
if ((dataType.defaultValue != undefined) && (dataType.defaultValue != DataTypes.NOW)) {
template += " DEFAULT <%= defaultValue %>"
replacements.defaultValue = Utils.escape(dataType.defaultValue)
template += " DEFAULT " + Utils.escape(dataType.defaultValue)
}
if (dataType.unique) {
......@@ -444,7 +440,7 @@ module.exports = (function() {
template += " PRIMARY KEY"
}
result[name] = Utils._.template(template)(replacements)
result[name] = template
} else {
result[name] = dataType
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!