|  | @ -1,81 +1,149 @@
 | 
	
		
			
				|  |  | /**
 | 
	
		
			
				|  |  |  * 搜索。
 | 
	
		
			
				|  |  |  */
 | 
	
		
			
				|  |  | "use strict";
 | 
	
		
			
				|  |  | 'use strict';
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | let ImDb = require('../mysql/db/im.db');
 | 
	
		
			
				|  |  | let async = require("async");
 | 
	
		
			
				|  |  | var ObjectUtil = require("../../util/object.util.js");
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | const DB_TABLES = require('../../include/commons').DB_TABLES;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  | class SearchRepo {
 | 
	
		
			
				|  |  |     constructor() {
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     static searchDoctors(keyword, page, size, handler) {
 | 
	
		
			
				|  |  |         if(page<=0)page = 1;
 | 
	
		
			
				|  |  |         page = (page-1)*size;
 | 
	
		
			
				|  |  |         let sql = "select d.id, d.name, d.sex, d.birthdate, d.avatar, d.level from doctors d where d.name like ? limit ?, ?";
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 查询正常会话及议题已结束的会话(P2P, MUC)
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param userId
 | 
	
		
			
				|  |  |      * @param handler
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     static findTopicEndedSessionIdList(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 NOT NULL AND s.`type` IN (1) " +
 | 
	
		
			
				|  |  |             " 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)";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         ImDb.execQuery({
 | 
	
		
			
				|  |  |             sql: sql,
 | 
	
		
			
				|  |  |             args: ['%' + keyword + '%',page , size],
 | 
	
		
			
				|  |  |             args: [userId, userId],
 | 
	
		
			
				|  |  |             handler: handler
 | 
	
		
			
				|  |  |         });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 搜索会话。
 | 
	
		
			
				|  |  |      * 全部搜索
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * TODO: 还需要联合搜索包含特定用户的会话。当前只实现了按会话名称搜索。
 | 
	
		
			
				|  |  |      * @param sessionIdList
 | 
	
		
			
				|  |  |      * @param keyword
 | 
	
		
			
				|  |  |      * @param userTable
 | 
	
		
			
				|  |  |      * @param handler
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     static searchAll(sessionIdList, keyword, userTable, handler) {
 | 
	
		
			
				|  |  |         async.waterfall([
 | 
	
		
			
				|  |  |             function (callback) {
 | 
	
		
			
				|  |  |                 SearchRepo.searchUser(sessionIdList, keyword, userTable, 0, 3, function (err, res) {
 | 
	
		
			
				|  |  |                     if (err) return handler(err, null);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     let data = {};
 | 
	
		
			
				|  |  |                     if (userTable == DB_TABLES.Doctors) {
 | 
	
		
			
				|  |  |                         data.doctors = res;
 | 
	
		
			
				|  |  |                     } else {
 | 
	
		
			
				|  |  |                         data.patients = res;
 | 
	
		
			
				|  |  |                     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     callback(null, data);
 | 
	
		
			
				|  |  |                 });
 | 
	
		
			
				|  |  |             },
 | 
	
		
			
				|  |  |             function (data, callback) {
 | 
	
		
			
				|  |  |                 SearchRepo.searchSessions(sessionIdList, keyword, 0, 3, function (err, res) {
 | 
	
		
			
				|  |  |                     if (err) return handler(err, null);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     data.sessions = res;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     callback(null, data);
 | 
	
		
			
				|  |  |                 })
 | 
	
		
			
				|  |  |             },
 | 
	
		
			
				|  |  |             function (data, callback) {
 | 
	
		
			
				|  |  |                 SearchRepo.searchMessages(sessionIdList, keyword, 0, 3, function (err, res) {
 | 
	
		
			
				|  |  |                     if (err) return handler(err, null);
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     res.forEach(function (message) {
 | 
	
		
			
				|  |  |                         message.timestamp = ObjectUtil.timestampToLong(message.timestamp);
 | 
	
		
			
				|  |  |                     });
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     data.messages = res;
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |                     handler(null, data);
 | 
	
		
			
				|  |  |                 })
 | 
	
		
			
				|  |  |             }
 | 
	
		
			
				|  |  |         ]);
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 用户搜索
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param userId
 | 
	
		
			
				|  |  |      * @param sessionIdList
 | 
	
		
			
				|  |  |      * @param keyword
 | 
	
		
			
				|  |  |      * @param userTable
 | 
	
		
			
				|  |  |      * @param page
 | 
	
		
			
				|  |  |      * @param size
 | 
	
		
			
				|  |  |      * @param handler
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     static searchSessions(userId, keyword, page, size, handler) {
 | 
	
		
			
				|  |  |         let sql = "select s.id, s.name, s.type, s.create_date, s.business_type," +
 | 
	
		
			
				|  |  |             "(SELECT group_concat(d.name) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id and d.name like ?) as members," +
 | 
	
		
			
				|  |  |             "(SELECT group_concat(d.avatar) FROM doctors d,participants p1 WHERE p1.participant_id = d.id and p1.session_id = s.id) as images from sessions s" +
 | 
	
		
			
				|  |  |             " where s.id in (select id from sessions s, participants p where s.id = p.session_id and p.participant_id = ?) " +
 | 
	
		
			
				|  |  |             "and s.type <> 0 and s.name like ? limit ?, ?";
 | 
	
		
			
				|  |  |     static searchUser(sessionIdList, keyword, userTable, page, size, handler) {
 | 
	
		
			
				|  |  |         let sql = "SELECT u.id, u.name, u.sex, u.avatar FROM sessions s, participants p, " + userTable +
 | 
	
		
			
				|  |  |             " u WHERE s.id in (?) AND s.id = p.session_id AND p.participant_id = u.id AND u.name like ? limit ?, ?";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         keyword = '%' + keyword + '%';
 | 
	
		
			
				|  |  |         ImDb.execQuery({
 | 
	
		
			
				|  |  |             sql: sql,
 | 
	
		
			
				|  |  |             args: [ '%' + keyword + '%',userId, '%' + keyword + '%', page * size, size],
 | 
	
		
			
				|  |  |             args: [sessionIdList, keyword, page * size, size],
 | 
	
		
			
				|  |  |             handler: handler
 | 
	
		
			
				|  |  |         });
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 搜索会话消息。
 | 
	
		
			
				|  |  |      *
 | 
	
		
			
				|  |  |      * @param userId
 | 
	
		
			
				|  |  |      * @param keyword
 | 
	
		
			
				|  |  |      * @param page
 | 
	
		
			
				|  |  |      * @param size
 | 
	
		
			
				|  |  |      * @param handler
 | 
	
		
			
				|  |  |      * 会话搜索
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     static searchSessions(sessionIdList, keyword, page, size, handler) {
 | 
	
		
			
				|  |  |         if(sessionIdList.length == 0){
 | 
	
		
			
				|  |  |             return handler(null, []);
 | 
	
		
			
				|  |  |         }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         let sql = "SELECT s.id, s.name, s.type, s.create_date, s.business_type FROM sessions s WHERE s.id in (?) AND s.name LIKE ? LIMIT ?, ? ";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         keyword = '%' + keyword + '%';
 | 
	
		
			
				|  |  |         ImDb.execQuery({
 | 
	
		
			
				|  |  |             sql: sql,
 | 
	
		
			
				|  |  |             args: [sessionIdList, keyword, page * size, size],
 | 
	
		
			
				|  |  |             handler: handler
 | 
	
		
			
				|  |  |         });
 | 
	
		
			
				|  |  |     }
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |     /**
 | 
	
		
			
				|  |  |      * 消息搜索
 | 
	
		
			
				|  |  |      */
 | 
	
		
			
				|  |  |     static searchMessages(userId, keyword, page, size, handler) {
 | 
	
		
			
				|  |  |         let sql = "SELECT * FROM( " +
 | 
	
		
			
				|  |  |         "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
 | 
	
		
			
				|  |  |         "FROM sessions s, participants p, muc_messages m " +
 | 
	
		
			
				|  |  |         "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
 | 
	
		
			
				|  |  |         "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
 | 
	
		
			
				|  |  |          "UNION " +
 | 
	
		
			
				|  |  |         "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
 | 
	
		
			
				|  |  |         "FROM sessions s, participants p, group_messages m " +
 | 
	
		
			
				|  |  |         "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
 | 
	
		
			
				|  |  |         "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
 | 
	
		
			
				|  |  |         "UNION " +
 | 
	
		
			
				|  |  |         "SELECT s.id session_id, s.name session_name, s.type session_type, s.create_date, s.business_type, count(m.id) count, max(m.content) message_content " +
 | 
	
		
			
				|  |  |         "FROM sessions s, participants p, p2p_messages m " +
 | 
	
		
			
				|  |  |         "WHERE p.participant_id = ? and p.session_id = s.id and s.id = m.session_id and m.content_type = 1 AND m.content LIKE ? " +
 | 
	
		
			
				|  |  |          "GROUP BY s.id, s.name, s.type, s.create_date, s.business_type "+
 | 
	
		
			
				|  |  |          ") X LIMIT ?, ?";
 | 
	
		
			
				|  |  |     static searchMessages(sessionIdList, 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 ? GROUP BY s.id" +
 | 
	
		
			
				|  |  |             " 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 ? GROUP BY s.id" +
 | 
	
		
			
				|  |  |             " 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` = 3 AND m.content_type = 1 AND m.content LIKE ? GROUP BY s.id) X " +
 | 
	
		
			
				|  |  |             "ORDER BY X.timestamp";
 | 
	
		
			
				|  |  | 
 | 
	
		
			
				|  |  |         keyword = '%' + keyword + '%';
 | 
	
		
			
				|  |  |         ImDb.execQuery({
 | 
	
		
			
				|  |  |             sql: sql,
 | 
	
		
			
				|  |  |             args: [userId, keyword, userId, keyword, userId, keyword, page * size, size],
 | 
	
		
			
				|  |  |             args: [sessionIdList, keyword, sessionIdList, keyword, sessionIdList, keyword, page * size, size],
 | 
	
		
			
				|  |  |             handler: handler
 | 
	
		
			
				|  |  |         });
 | 
	
		
			
				|  |  |     }
 |