mysql.searcher.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * 用户、会话及消息搜索。
  3. *
  4. * 注意:此模型效率堪忧,但为了实现先这样做。更稳妥的方案是使用Solr或Elastic Search
  5. * 为数据提供索引功能,JS使用搜索接口搜索之后再取得对象的ID进行获取,提高效率。
  6. * 后续开发都希望看到这段注释,实现此方案。
  7. *
  8. * author: Sand
  9. * since: 2016.11.20
  10. */
  11. "use strict";
  12. let BaseModel = require('../base.model');
  13. let SearchRepo = require('../../repository/mysql/search.repo');
  14. let ModelUtil = require("../../util/model.util");
  15. let ObjectUtil = require("../../util/object.util.js");
  16. let async = require("async");
  17. class MySqlSearcher extends BaseModel {
  18. constructor() {
  19. super();
  20. }
  21. /**
  22. * 一次性搜索所有对象。
  23. *
  24. * @param userId
  25. * @param keyword
  26. */
  27. searchAll(userId, keyword) {
  28. let self = this;
  29. async.waterfall([
  30. function (callback) {
  31. self.searchDoctors(keyword, 0, 4, function (err, doctors) {
  32. if (err) return callback(err, null);
  33. let data = {};
  34. let buffer = [];
  35. doctors.forEach(function (doctor) {
  36. buffer.push(doctor);
  37. });
  38. data.doctor = buffer;
  39. callback(null, data);
  40. });
  41. },
  42. function (data, callback) {
  43. self.searchSessions(userId, keyword, 0, 4, function (err, sessions) {
  44. if (err) return callback(err, null);
  45. let buffer = [];
  46. sessions.forEach(function (session) {
  47. buffer.push(session);
  48. });
  49. data.groups = buffer;
  50. callback(null, data);
  51. });
  52. },
  53. function (data, callback) {
  54. self.searchMessages(userId, keyword, 0, 4, function (err, sessions) {
  55. if (err) return callback(err, null);
  56. let buffer = [];
  57. sessions.forEach(function (session) {
  58. buffer.push(session);
  59. });
  60. data.content = buffer;
  61. callback(null, data);
  62. });
  63. }
  64. ],
  65. function (err, res) {
  66. if (err) {
  67. ModelUtil.emitError(self.eventEmitter, "Search all object types failed", err);
  68. } else {
  69. ModelUtil.emitOK(self.eventEmitter, res);
  70. }
  71. });
  72. }
  73. /**
  74. * 医生搜索。
  75. *
  76. * @param keyword
  77. * @param page
  78. * @param size
  79. * @param handler
  80. */
  81. searchDoctors(keyword, page, size, handler) {
  82. let self = this;
  83. SearchRepo.searchDoctors(keyword, page, size, function (err, doctors) {
  84. if (handler) {
  85. handler(err, doctors);
  86. } else {
  87. if (err) {
  88. ModelUtil.emitError(self.eventEmitter, "Search doctors failed", err);
  89. } else {
  90. doctors.forEach(function (doctor) {
  91. doctor.avatar = doctor.avatar ? doctor.avatar : "";
  92. doctor.birthdate = doctor.birthdate ? doctor.birthdate : "";
  93. });
  94. ModelUtil.emitOK(self.eventEmitter, doctors);
  95. }
  96. }
  97. });
  98. }
  99. /**
  100. * 会话搜索。
  101. *
  102. * @param userId
  103. * @param keyword
  104. * @param page
  105. * @param size
  106. * @param handler
  107. */
  108. searchSessions(userId, keyword, page, size, handler) {
  109. let self = this;
  110. SearchRepo.searchSessions(userId, keyword, page, size, function (err, sessions) {
  111. if (handler) {
  112. handler(err, sessions);
  113. } else {
  114. if (err) {
  115. ModelUtil.emitError(self.eventEmitter, "Search sessions failed", err);
  116. } else {
  117. sessions.forEach(function (session) {
  118. session.create_date = ObjectUtil.timestampToLong(session.create_date);
  119. });
  120. ModelUtil.emitOK(self.eventEmitter, sessions);
  121. }
  122. }
  123. });
  124. }
  125. /**
  126. * 搜索会话消息。
  127. *
  128. * @param userId
  129. * @param keyword
  130. * @param page
  131. * @param size
  132. * @param handler
  133. */
  134. searchMessages(userId, keyword, page, size, handler) {
  135. let self = this;
  136. SearchRepo.searchMessages(userId, keyword, page, size, function (err, messages) {
  137. if (handler) {
  138. handler(err, messages);
  139. } else {
  140. if (err) {
  141. ModelUtil.emitError(self.eventEmitter, "Search sessions failed", err);
  142. } else {
  143. messages.forEach(function (message) {
  144. message.create_time = ObjectUtil.timestampToLong(message.create_time);
  145. });
  146. ModelUtil.emitOK(self.eventEmitter, messages);
  147. }
  148. }
  149. });
  150. }
  151. }
  152. module.exports = MySqlSearcher;