diff --git a/broker/src/main/java/io/moquette/imhandler/UserSearchHandler.java b/broker/src/main/java/io/moquette/imhandler/UserSearchHandler.java index 8b08cf0c..35dc81f8 100644 --- a/broker/src/main/java/io/moquette/imhandler/UserSearchHandler.java +++ b/broker/src/main/java/io/moquette/imhandler/UserSearchHandler.java @@ -20,7 +20,7 @@ import java.util.List; public class UserSearchHandler extends IMHandler { @Override public ErrorCode action(ByteBuf ackPayload, String clientID, String fromUser, boolean isAdmin, WFCMessage.SearchUserRequest request, Qos1PublishHandler.IMCallback callback) { - List users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy() > 0, request.getPage()); + List users = m_messagesStore.searchUser(request.getKeyword(), request.getFuzzy(), request.getPage()); WFCMessage.SearchUserResult.Builder builder = WFCMessage.SearchUserResult.newBuilder(); builder.addAllEntry(users); byte[] data = builder.build().toByteArray(); diff --git a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java index b123d7e2..23684bce 100644 --- a/broker/src/main/java/io/moquette/persistence/DatabaseStore.java +++ b/broker/src/main/java/io/moquette/persistence/DatabaseStore.java @@ -35,6 +35,7 @@ import java.util.function.Function; import static cn.wildfirechat.proto.ProtoConstants.PersistFlag.Transparent; import static io.moquette.persistence.MemoryMessagesStore.USER_STATUS; import static io.moquette.server.Constants.MAX_MESSAGE_QUEUE; +import static cn.wildfirechat.proto.ProtoConstants.SearchUserType.*; public class DatabaseStore { private static final Logger LOG = LoggerFactory.getLogger(DatabaseStore.class); @@ -148,8 +149,12 @@ public class DatabaseStore { } return null; } - - List searchUserFromDB(String keyword, boolean buzzy, int page) { + //searchType + // 0 模糊匹配displayName, 精确匹配账户名和电话号码 + // 1 精确匹配账户名和电话号码 + // 2 精确匹配账户名 + // 3 精确匹配电话号码 + List searchUserFromDB(String keyword, int searchType, int page) { Connection connection = null; PreparedStatement statement = null; ResultSet rs = null; @@ -169,18 +174,29 @@ public class DatabaseStore { ", `_social`" + ", `_extra`" + ", `_dt` from t_user"; - if (buzzy) { - sql += " where (`_display_name` like ? or `_name` = ? or `_mobile` = ?) "; - } else { - sql += " where (`_name` = ? or `_mobile` = ?) "; + switch (searchType) { + case SearchUserType_Name_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 - if (buzzy) { - sql += " limit 20"; - } else { + if (searchType == SearchUserType_Name_Mobile || searchType == SearchUserType_Name || searchType == SearchUserType_Mobile) { sql += " limit 1"; + } else { + sql += " limit 20"; } if (page > 0) { @@ -190,12 +206,24 @@ public class DatabaseStore { statement = connection.prepareStatement(sql); 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(); while (rs.next()) { diff --git a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java index 60d9e368..8c3f2a8c 100755 --- a/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java +++ b/broker/src/main/java/io/moquette/persistence/MemoryMessagesStore.java @@ -1496,8 +1496,8 @@ public class MemoryMessagesStore implements IMessagesStore { return getUserInfo(userId); } @Override - public List searchUser(String keyword, boolean buzzy, int page) { - return databaseStore.searchUserFromDB(keyword, buzzy, page); + public List searchUser(String keyword, int searchType, int page) { + return databaseStore.searchUserFromDB(keyword, searchType, page); } @Override diff --git a/broker/src/main/java/io/moquette/spi/IMessagesStore.java b/broker/src/main/java/io/moquette/spi/IMessagesStore.java index 8bbb810e..690535d6 100755 --- a/broker/src/main/java/io/moquette/spi/IMessagesStore.java +++ b/broker/src/main/java/io/moquette/spi/IMessagesStore.java @@ -139,7 +139,7 @@ public interface IMessagesStore { WFCMessage.User getUserInfo(String userId); WFCMessage.User getUserInfoByName(String name); WFCMessage.User getUserInfoByMobile(String mobile); - List searchUser(String keyword, boolean buzzy, int page); + List searchUser(String keyword, int searchType, int page); boolean updateSystemSetting(int id, String value, String desc); SystemSettingPojo getSystemSetting(int id); diff --git a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java index 7af3511b..671e69cf 100644 --- a/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java +++ b/common/src/main/java/cn/wildfirechat/proto/ProtoConstants.java @@ -132,6 +132,12 @@ public class ProtoConstants { 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; + }