'use strict'; let ImDb = require('../oracle/db/im.db'); let async = require("async"); let ObjectUtil = require("../../util/object.util.js"); let vsprintf = require("sprintf-js").vsprintf; const DB_TABLES = require('../../include/commons').DB_TABLES; class SearchRepo { constructor() { } /** * 查询正常会话及议题已结束的会话(P2P, MUC) * * @param userId * @param handler */ static findTopicEndedSessionIdList(userId, handler) { let sql = "SELECT S.ID " + "FROM sessions s, topics t, participants p " + "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " + " UNION " + "SELECT S.ID " + "FROM SESSIONS S, PARTICIPANTS P " + "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2, 3, 4)"; ImDb.execQuery({ sql: sql, args: [userId, userId], handler: handler }); } /** * 查询正常会话及议题已结束的会话(P2P, MUC) * * @param userId * @param handler */ static findTopicActiveSessionIdList(userId, handler) { let sql = "SELECT S.ID " + "FROM SESSIONS S, TOPICS T, PARTICIPANTS P " + "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.ID = T.SESSION_ID AND T.END_MESSAGE_ID IS NULL AND S.`TYPE` IN (1,2,8) " + " UNION " + "SELECT S.ID " + "FROM SESSIONS S, PARTICIPANTS P " + "WHERE P.PARTICIPANT_ID = ? AND P.SESSION_ID = S.ID AND S.`TYPE` IN (2,3,4) AND S.ID NOT IN(" + " SELECT DISTINCT P1.SESSION_ID FROM PARTICIPANTS P1 ,TOPICS T WHERE P1.PARTICIPANT_ID = ? AND T.SESSION_ID = P1.SESSION_ID " + ") "; ImDb.execQuery({ sql: sql, args: [userId, userId,userId], handler: handler }); } /** * 全部搜索 * * @param sessionIdList * @param keyword * @param userTable * @param handler */ static searchAll(sessionIdList,userId, keyword, userTable, handler) { let data = {}; async.waterfall([ function (callback) { SearchRepo.searchUser(sessionIdList,userId, keyword, userTable, 0, 4, function (err, res) { if (err) return handler(err, null); let buffer = SearchRepo.userForge(res); data.users = buffer; callback(null); }); }, function (callback) { SearchRepo.searchSessions(sessionIdList,userId, keyword, 0, 4, function (err, res) { if (err) return handler(err, null); data.sessions = SearchRepo.sessionForge(res, keyword); callback(null); }) }, function (callback) { SearchRepo.searchMessages(sessionIdList,userId, keyword, 0, 4, function (err, res) { if (err) return handler(err, null); data.messages = SearchRepo.messageForge(res); handler(null, data); }) } ]); } /** * 用户搜索 * * @param sessionIdList * @param keyword * @param userTable * @param page * @param size * @param handler */ static searchUser(sessionIdList,userId, keyword, userTable, page, size, handler) { let sql = "SELECT DISTINCT U.NAME USER_NAME,S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE, U.ID USER_ID,U.SEX, U.BIRTHDATE, U.AVATAR,U.IDCARD %S " + " FROM PARTICIPANTS P, " + userTable + " U,SESSIONS S WHERE S.ID IN (?) AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = U.ID AND P.PARTICIPANT_ID<>? AND (U.NAME LIKE ? OR U.IDCARD LIKE ?) "; if (userTable === DB_TABLES.Doctors) { sql += " AND S.TYPE = 2 AND S.BUSINESS_TYPE = 1 "; }else{ sql += " AND S.TYPE IN (1,2,8) AND S.BUSINESS_TYPE = 2 "; } sql += " LIMIT ?, ? "; sql = vsprintf(sql, [userTable == DB_TABLES.Doctors ? ', HOSPITAL_NAME' : '']); keyword = '%' + keyword + '%'; ImDb.execQuery({ sql: sql, args: [sessionIdList,userId, keyword,keyword, page * size, size], handler: handler }); } /** * 会话搜索。搜索会话名称与会话成员的名称。若有一个符合,就选中。 */ static searchSessions(sessionIdList,userId, keyword, page, size, handler) { if (sessionIdList.length == 0) { return handler(null, []); } let sql = "SELECT * FROM(" + "SELECT S.ID, S.NAME, S.TYPE, S.CREATE_DATE, S.BUSINESS_TYPE,GROUP_CONCAT(U. NAME) AS PARTICIPANT_NAME " + "FROM SESSIONS S, DOCTORS U ,PARTICIPANTS P " + "WHERE S.ID IN (?) AND S.TYPE IN (3,4) AND S.ID = P.SESSION_ID AND P.PARTICIPANT_ID = U.ID AND P.PARTICIPANT_ID<>? AND (U.NAME LIKE ? OR S.NAME LIKE ?) GROUP BY S.ID " + ") X LIMIT ?, ?"; keyword = '%' + keyword + '%'; ImDb.execQuery({ sql: sql, args: [sessionIdList,userId, keyword,keyword, page * size, size], handler: handler }); } /** * 消息搜索 */ static searchMessages(sessionIdList,userId, keyword, page, size, handler) { let sql = "SELECT * FROM(" + "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " + "FROM SESSIONS S, MUC_MESSAGES M " + "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 1 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " + " UNION " + "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " + "FROM SESSIONS S, P2P_MESSAGES M " + "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` = 2 AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? " + " UNION " + "SELECT S.ID SESSION_ID, S.NAME SESSION_NAME, S.TYPE SESSION_TYPE, S.BUSINESS_TYPE SESSION_BUSINESS_TYPE, M.ID MESSAGE_ID, M.SENDER_ID, M.SENDER_NAME, M.TIMESTAMP, M.CONTENT " + "FROM SESSIONS S, GROUP_MESSAGES M " + "WHERE S.ID IN (?) AND S.ID = M.SESSION_ID AND S.`TYPE` IN (3,5) AND M.CONTENT_TYPE = 1 AND M.CONTENT LIKE ? ) X " + "ORDER BY X.SESSION_ID, X.MESSAGE_ID LIMIT ?, ?"; keyword = '%' + keyword + '%'; ImDb.execQuery({ sql: sql, args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size], handler: handler }); } static userForge(res) { res.forEach(function (user) { if (!user.avatar) user.avatar = ""; user.birthdate = user.birthdate ? user.birthdate.getTime():""; }); return res; } static sessionForge(res, keyword) { let result = []; let lastSessionId = null; let tempSession = null; res.forEach(function (session) { if (session.id !== lastSessionId) { lastSessionId = session.id; tempSession = { id: session.id, name: session.name, type: session.type, business_type: session.business_type, /*create_date: ObjectUtil.timestampToLong(session.create_date),*/ members: [] }; result.push(tempSession); } if (session.participant_name.indexOf(keyword) >= 0) tempSession.members.push({name: session.participant_name}); }); return result; } static messageForge(res) { let result = []; let lastSessionId = null; let session = null; res.forEach(function (message) { if (message.session_id !== lastSessionId) { lastSessionId = message.session_id; session = { session_id: message.session_id, session_name: message.session_name, session_type: message.session_type, /*session_business_type: message.session_business_type,*/ messages: [] }; result.push(session); } session.messages.push({ id: message.message_id, sender_id: message.sender_id, sender_name: message.sender_name, timestamp: ObjectUtil.timestampToLong(message.timestamp), content: message.content }); }); return result; } } module.exports = SearchRepo;