添加搜索类型

This commit is contained in:
imhao183
2019-12-06 10:36:26 +08:00
parent 00f1187200
commit beb403a9f7
5 changed files with 51 additions and 17 deletions
@@ -20,7 +20,7 @@ import java.util.List;
public class UserSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> { public class UserSearchHandler extends IMHandler<WFCMessage.SearchUserRequest> {
@Override @Override
public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) { public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) {
List<WFCMessage.User> users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy() > 0, request.getPage()); List<WFCMessage.User> users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy(), request.getPage());
WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder(); WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder();
builder.addAllEntry(users); builder.addAllEntry(users);
byte[] data = builder.build().toByteArray(); byte[] data = builder.build().toByteArray();
@@ -35,6 +35,7 @@ import java.util.function.Function;
import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent; import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent;
import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS; import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS;
import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE; import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE;
import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*;
public class DatabaseStore { public class DatabaseStore {
private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class); private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class);
@@ -148,8 +149,12 @@ public class DatabaseStore {
} }
return null; return null;
} }
//searchType
List<WFCMessage.User> searchUserFromDB(String keyword, boolean buzzy, int page) { // 0 模糊匹配displayName, 精确匹配账户名和电话号码
// 1 精确匹配账户名和电话号码
// 2 精确匹配账户名
// 3 精确匹配电话号码
List<WFCMessage.User> searchUserFromDB(String keyword, int searchType, int page) {
Connection connection = null; Connection connection = null;
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet rs = null; ResultSet rs = null;
@@ -169,18 +174,29 @@ public class DatabaseStore {
", `_social`" + ", `_social`" +
", `_extra`" + ", `_extra`" +
", `_dt` from t_user"; ", `_dt` from t_user";
if (buzzy) { switch (searchType) {
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) "; case SearchUserType_Name_Mobile:
} else { sql += " where (`_name` = ? or `_mobile` = ?) ";
sql += " where (`_name` = ? or `_mobile` = ?) "; break;
case SearchUserType_Name:
sql += " where `_name` = ? ";
break;
case SearchUserType_Mobile:
sql += " where `_mobile` = ? ";
break;
case SearchUserType_General:
default:
sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) ";
break;
} }
sql += " and _type <> 2"; //can search normal user(0) and robot(1), can not search things sql += " and _type <> 2"; //can search normal user(0) and robot(1), can not search things
if (buzzy) { if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) {
sql += " limit 20";
} else {
sql += " limit 1"; sql += " limit 1";
} else {
sql += " limit 20";
} }
if (page > 0) { if (page > 0) {
@@ -190,12 +206,24 @@ public class DatabaseStore {
statement = connection.prepareStatement(sql); statement = connection.prepareStatement(sql);
int index = 1; int index = 1;
if (buzzy) {
statement.setString(index++, "%" + keyword + "%"); switch (searchType) {
case SearchUserType_Name_Mobile:
statement.setString(index++, keyword);
statement.setString(index++, keyword);
break;
case SearchUserType_Name:
case SearchUserType_Mobile:
statement.setString(index++, keyword);
break;
case SearchUserType_General:
default:
statement.setString(index++, "%" + keyword + "%");
statement.setString(index++, keyword);
statement.setString(index++, keyword);
break;
} }
statement.setString(index++, keyword);
statement.setString(index++, keyword);
rs = statement.executeQuery(); rs = statement.executeQuery();
while (rs.next()) { while (rs.next()) {
@@ -1496,8 +1496,8 @@ public class MemoryMessagesStore implements IMessagesStore {
return getUserInfo(userId); return getUserInfo(userId);
} }
@Override @Override
public List<WFCMessage.User> searchUser(String keyword, boolean buzzy, int page) { public List<WFCMessage.User> searchUser(String keyword, int searchType, int page) {
return databaseStore.searchUserFromDB(keyword, buzzy, page); return databaseStore.searchUserFromDB(keyword, searchType, page);
} }
@Override @Override
@@ -139,7 +139,7 @@ public interface IMessagesStore {
WFCMessage.User getUserInfo(String userId); WFCMessage.User getUserInfo(String userId);
WFCMessage.User getUserInfoByName(String name); WFCMessage.User getUserInfoByName(String name);
WFCMessage.User getUserInfoByMobile(String mobile); WFCMessage.User getUserInfoByMobile(String mobile);
List<WFCMessage.User> searchUser(String keyword, boolean buzzy, int page); List<WFCMessage.User> searchUser(String keyword, int searchType, int page);
boolean updateSystemSetting(int id, String value, String desc); boolean updateSystemSetting(int id, String value, String desc);
SystemSettingPojo getSystemSetting(int id); SystemSettingPojo getSystemSetting(int id);
@@ -132,6 +132,12 @@ public class ProtoConstants {
int Group_Max_Member_Count = 1; int Group_Max_Member_Count = 1;
} }
public interface SearchUserType {
int SearchUserType_General = 0;
int SearchUserType_Name_Mobile = 1;
int SearchUserType_Name = 2;
int SearchUserType_Mobile = 3;
}