diff --git a/core/database.js b/core/database.js index dd7cd88e..17bc3844 100644 --- a/core/database.js +++ b/core/database.js @@ -183,6 +183,11 @@ const DB_INIT_TABLE = { );` ); + dbs.user.run( + `CREATE INDEX IF NOT EXISTS user_property_id_and_name_index0 + ON user_property (user_id, prop_name);` + ); + dbs.user.run( `CREATE TABLE IF NOT EXISTS user_group_member ( group_name VARCHAR NOT NULL, diff --git a/core/user.js b/core/user.js index 439d32c8..7c017e2c 100644 --- a/core/user.js +++ b/core/user.js @@ -760,45 +760,30 @@ module.exports = class User { static getUserList(options, cb) { const userList = []; - const orderClause = 'ORDER BY ' + (options.order || 'user_name'); + + options.properties = options.properties || [ UserProps.RealName ]; + + const asList = []; + const joinList = []; + for (let i = 0; i < options.properties.length; ++i) { + const dbProp = options.properties[i]; + const propName = options.propsCamelCase ? _.camelCase(dbProp) : dbProp; + asList.push(`p${i}.prop_value AS ${propName}`); + joinList.push(`LEFT OUTER JOIN user_property p${i} ON p${i}.user_id = u.id AND p${i}.prop_name = '${dbProp}'`); + } userDb.each( - `SELECT id, user_name - FROM user - ${orderClause};`, + `SELECT u.id as userId, u.user_name as userName, ${asList.join(', ')} + FROM user u ${joinList.join(' ')} + ORDER BY u.user_name;`, (err, row) => { - if(row) { - userList.push({ - userId : row.id, - userName : row.user_name, - }); + if (err) { + return cb(err); } + userList.push(row); }, - () => { - options.properties = options.properties || []; - async.map(userList, (user, nextUser) => { - userDb.each( - `SELECT prop_name, prop_value - FROM user_property - WHERE user_id = ? AND prop_name IN ("${options.properties.join('","')}");`, - [ user.userId ], - (err, row) => { - if(row) { - if(options.propsCamelCase) { - user[_.camelCase(row.prop_name)] = row.prop_value; - } else { - user[row.prop_name] = row.prop_value; - } - } - }, - err => { - return nextUser(err, user); - } - ); - }, - (err, transformed) => { - return cb(err, transformed); - }); + err => { + return cb(err, userList); } ); }