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

Commit a1c06dd7 by Mick Hansen

Merge pull request #573 from alum/mysql-performance-improvements

Performance improvements for MySQL query generator
2 parents b2184b24 efa85a94
Showing with 50 additions and 56 deletions
...@@ -149,8 +149,8 @@ module.exports = (function() { ...@@ -149,8 +149,8 @@ module.exports = (function() {
}, },
selectQuery: function(tableName, options) { selectQuery: function(tableName, options) {
var query = "SELECT <%= attributes %> FROM <%= table %>" var table = null,
, table = null joinQuery = ""
options = options || {} options = options || {}
options.table = table = Array.isArray(tableName) ? tableName.map(function(tbl){ return QueryGenerator.addQuotes(tbl) }).join(", ") : QueryGenerator.addQuotes(tableName) options.table = table = Array.isArray(tableName) ? tableName.map(function(tbl){ return QueryGenerator.addQuotes(tbl) }).join(", ") : QueryGenerator.addQuotes(tableName)
...@@ -168,75 +168,73 @@ module.exports = (function() { ...@@ -168,75 +168,73 @@ module.exports = (function() {
options.include.forEach(function(include) { options.include.forEach(function(include) {
var attributes = Object.keys(include.daoFactory.attributes).map(function(attr) { var attributes = Object.keys(include.daoFactory.attributes).map(function(attr) {
var template = Utils._.template("`<%= as %>`.`<%= attr %>` AS `<%= as %>.<%= attr %>`") return "`" + include.as + "`.`" + attr + "` AS `" + include.as + "." + attr + "`"
return template({ as: include.as, attr: attr })
}) })
optAttributes = optAttributes.concat(attributes) optAttributes = optAttributes.concat(attributes)
var joinQuery = " LEFT OUTER JOIN `<%= table %>` AS `<%= as %>` ON `<%= tableLeft %>`.`<%= attrLeft %>` = `<%= tableRight %>`.`<%= attrRight %>`" var table = include.daoFactory.tableName
query += Utils._.template(joinQuery)({ var as = include.as
table: include.daoFactory.tableName, var tableLeft = ((include.association.associationType === 'BelongsTo') ? include.as : tableName)
as: include.as, var attrLeft = 'id'
tableLeft: ((include.association.associationType === 'BelongsTo') ? include.as : tableName), var tableRight = ((include.association.associationType === 'BelongsTo') ? tableName : include.as)
attrLeft: 'id', var attrRight = include.association.identifier
tableRight: ((include.association.associationType === 'BelongsTo') ? tableName : include.as), joinQuery += " LEFT OUTER JOIN `" + table + "` AS `" + as + "` ON `" + tableLeft + "`.`" + attrLeft + "` = `" + tableRight + "`.`" + attrRight + "`"
attrRight: include.association.identifier
})
}) })
options.attributes = optAttributes.join(', ') options.attributes = optAttributes.join(', ')
} }
var query = "SELECT " + options.attributes + " FROM " + options.table
query += joinQuery
if (options.hasOwnProperty('where')) { if (options.hasOwnProperty('where')) {
options.where = this.getWhereConditions(options.where, tableName) options.where = this.getWhereConditions(options.where, tableName)
query += " WHERE <%= where %>" query += " WHERE " + options.where
} }
if (options.group) { if (options.group) {
options.group = Array.isArray(options.group) ? options.group.map(function(grp){return QueryGenerator.addQuotes(grp)}).join(', ') : QueryGenerator.addQuotes(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) { if (options.order) {
query += " ORDER BY <%= order %>" query += " ORDER BY " + options.order
} }
if (options.limit && !(options.include && (options.limit === 1))) { if (options.limit && !(options.include && (options.limit === 1))) {
if (options.offset) { if (options.offset) {
query += " LIMIT <%= offset %>, <%= limit %>" query += " LIMIT " + options.offset + ", " + options.limit
} else { } else {
query += " LIMIT <%= limit %>" query += " LIMIT " + options.limit
} }
} }
query += ";" query += ";"
return Utils._.template(query)(options) return query
}, },
insertQuery: function(tableName, attrValueHash) { insertQuery: function(tableName, attrValueHash) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull) attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "INSERT INTO <%= table %> (<%= attributes %>) VALUES (<%= values %>);" var table = QueryGenerator.addQuotes(tableName)
var attributes = Object.keys(attrValueHash).map(function(attr){return QueryGenerator.addQuotes(attr)}).join(",")
var replacements = { var values = Utils._.values(attrValueHash).map(function(value){
table: QueryGenerator.addQuotes(tableName),
attributes: Object.keys(attrValueHash).map(function(attr){return QueryGenerator.addQuotes(attr)}).join(","),
values: Utils._.values(attrValueHash).map(function(value){
return Utils.escape((value instanceof Date) ? Utils.toSqlDate(value) : value) return Utils.escape((value instanceof Date) ? Utils.toSqlDate(value) : value)
}).join(",") }).join(",")
}
return Utils._.template(query)(replacements) var query = "INSERT INTO " + table + " (" + attributes + ") VALUES (" + values + ");"
return query
}, },
updateQuery: function(tableName, attrValueHash, where) { updateQuery: function(tableName, attrValueHash, where) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull) attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "UPDATE <%= table %> SET <%= values %> WHERE <%= where %>" var values = []
, values = []
for (var key in attrValueHash) { for (var key in attrValueHash) {
var value = attrValueHash[key] var value = attrValueHash[key]
...@@ -245,34 +243,30 @@ module.exports = (function() { ...@@ -245,34 +243,30 @@ module.exports = (function() {
values.push(QueryGenerator.addQuotes(key) + "=" + Utils.escape(_value)) values.push(QueryGenerator.addQuotes(key) + "=" + Utils.escape(_value))
} }
var replacements = { var query = "UPDATE " + QueryGenerator.addQuotes(tableName) +
table: QueryGenerator.addQuotes(tableName), " SET " + values.join(",") +
values: values.join(","), " WHERE " + QueryGenerator.getWhereConditions(where)
where: QueryGenerator.getWhereConditions(where)
}
return Utils._.template(query)(replacements) return query
}, },
deleteQuery: function(tableName, where, options) { deleteQuery: function(tableName, where, options) {
options = options || {} options = options || {}
options.limit = options.limit || 1 options.limit = options.limit || 1
var query = "DELETE FROM <%= table %> WHERE <%= where %> LIMIT <%= limit %>" var table = QueryGenerator.addQuotes(tableName)
var replacements = { var where = QueryGenerator.getWhereConditions(where)
table: QueryGenerator.addQuotes(tableName), var limit = Utils.escape(options.limit)
where: QueryGenerator.getWhereConditions(where),
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) { incrementQuery: function (tableName, attrValueHash, where) {
attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull) attrValueHash = Utils.removeNullValuesFromHash(attrValueHash, this.options.omitNull)
var query = "UPDATE <%= table %> SET <%= values %> WHERE <%= where %> " var values = []
, values = []
for (var key in attrValueHash) { for (var key in attrValueHash) {
var value = attrValueHash[key] var value = attrValueHash[key]
...@@ -280,14 +274,14 @@ module.exports = (function() { ...@@ -280,14 +274,14 @@ module.exports = (function() {
values.push(QueryGenerator.addQuotes(key) + "=" + QueryGenerator.addQuotes(key) + " + " +Utils.escape(_value)) 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 = { var query = "UPDATE " + table + " SET " + values + " WHERE " + where
table: QueryGenerator.addQuotes(tableName),
values: values.join(","),
where: QueryGenerator.getWhereConditions(where)
}
return Utils._.template(query)(replacements) return query
}, },
addIndexQuery: function(tableName, attributes, options) { addIndexQuery: function(tableName, attributes, options) {
...@@ -410,17 +404,18 @@ module.exports = (function() { ...@@ -410,17 +404,18 @@ module.exports = (function() {
var dataType = attributes[name] var dataType = attributes[name]
if (Utils.isHash(dataType)) { if (Utils.isHash(dataType)) {
var template = "<%= type %>" var template
, replacements = { type: dataType.type }
if (dataType.type.toString() === DataTypes.ENUM.toString()) { if (dataType.type.toString() === DataTypes.ENUM.toString()) {
if (Array.isArray(dataType.values) && (dataType.values.length > 0)) { 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) return Utils.escape(value)
}).join(", ") + ")" }).join(", ") + ")"
} else { } else {
throw new Error('Values for ENUM haven\'t been defined.') throw new Error('Values for ENUM haven\'t been defined.')
} }
} else {
template = dataType.type.toString();
} }
if (dataType.hasOwnProperty('allowNull') && (!dataType.allowNull)) { if (dataType.hasOwnProperty('allowNull') && (!dataType.allowNull)) {
...@@ -432,8 +427,7 @@ module.exports = (function() { ...@@ -432,8 +427,7 @@ module.exports = (function() {
} }
if ((dataType.defaultValue != undefined) && (dataType.defaultValue != DataTypes.NOW)) { if ((dataType.defaultValue != undefined) && (dataType.defaultValue != DataTypes.NOW)) {
template += " DEFAULT <%= defaultValue %>" template += " DEFAULT " + Utils.escape(dataType.defaultValue)
replacements.defaultValue = Utils.escape(dataType.defaultValue)
} }
if (dataType.unique) { if (dataType.unique) {
...@@ -444,7 +438,7 @@ module.exports = (function() { ...@@ -444,7 +438,7 @@ module.exports = (function() {
template += " PRIMARY KEY" template += " PRIMARY KEY"
} }
result[name] = Utils._.template(template)(replacements) result[name] = template
} else { } else {
result[name] = dataType result[name] = dataType
} }
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!