From 65c6eeca1b61d9015df34c8bccadd36d4984b3cd Mon Sep 17 00:00:00 2001 From: SL Date: Tue, 5 Dec 2023 22:16:56 +0800 Subject: [PATCH] update Optimize message queries --- .idea/deploymentTargetDropDown.xml | 10 ++++++ .idea/gradle.xml | 6 ++-- .idea/migrations.xml | 10 ++++++ .../xinbida/wukongim/db/ChannelDBManager.java | 17 ++------- .../wukongim/db/ChannelMembersDbManager.java | 19 ++++------ .../wukongim/db/ConversationDbManager.java | 19 ++-------- .../com/xinbida/wukongim/db/MsgDbManager.java | 30 ++++------------ .../wukongim/db/MsgReactionDBManager.java | 11 +----- .../wukongim/db/ReminderDBManager.java | 14 ++------ .../xinbida/wukongim/db/RobotDBManager.java | 36 ++++--------------- .../com/xinbida/wukongim/db/WKCursor.java | 15 ++++++++ 11 files changed, 67 insertions(+), 120 deletions(-) create mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 .idea/migrations.xml diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..0c0c338 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8a1c41f..d66840c 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,11 +4,9 @@ + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/ChannelDBManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/ChannelDBManager.java index 999decd..9042211 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/ChannelDBManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/ChannelDBManager.java @@ -37,29 +37,18 @@ public class ChannelDBManager { } public List queryWithChannelIdsAndChannelType(List channelIDs, byte channelType) { - StringBuffer stringBuffer = new StringBuffer(); - for (int i = 0, size = channelIDs.size(); i < size; i++) { - if (stringBuffer.toString().contains(channelIDs.get(i))) - continue; - if (!TextUtils.isEmpty(stringBuffer)) { - stringBuffer.append(","); - } - stringBuffer.append("'").append(channelIDs.get(i)).append("'"); - } - Object[] args = new Object[2]; - args[0] = stringBuffer.toString(); - args[1] = channelType; - String sql = "select * from " + channel + " where " + WKDBColumns.WKChannelColumns.channel_id + " in (?) and " + WKDBColumns.WKChannelColumns.channel_type + "=?"; List list = new ArrayList<>(); if (WKIMApplication .getInstance() .getDbHelper() == null) { return list; } + List args = new ArrayList<>(channelIDs); + args.add(String.valueOf(channelType)); try (Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql, args)) { + .select(channel, "channel_id in (" + WKCursor.getPlaceholders(channelIDs.size()) + ") and channel_type=?", args.toArray(new String[0]), null)) { if (cursor == null) { return list; } diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/ChannelMembersDbManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/ChannelMembersDbManager.java index 5d735e9..6d63bf3 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/ChannelMembersDbManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/ChannelMembersDbManager.java @@ -144,21 +144,14 @@ public class ChannelMembersDbManager { } public List queryWithUIDs(String channelID, byte channelType, List uidList) { - StringBuilder sb = new StringBuilder(); - Object[] args = new Object[3]; - args[0] = channelID; - args[1] = channelType; - String sql = "select * from " + channelMembers + " where channel_id =? and channel_type=? and member_uid in (?)"; - for (int i = 0, size = uidList.size(); i < size; i++) { - if (i != 0) { - sb.append(","); - } - sb.append("'").append(uidList.get(i)).append("'"); - } - args[2] = sb.toString(); + List args = new ArrayList<>(); + args.add(channelID); + args.add(String.valueOf(channelType)); + args.addAll(uidList); + uidList.add(String.valueOf(channelType)); Cursor cursor = WKIMApplication .getInstance() - .getDbHelper().rawQuery(sql, args); + .getDbHelper().select(channelMembers, "channel_id =? and channel_type=? and member_uid in (" + WKCursor.getPlaceholders(uidList.size()) + ")", args.toArray(new String[0]), null); List list = new ArrayList<>(); if (cursor == null) { return list; diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/ConversationDbManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/ConversationDbManager.java index c67b9d0..92c3335 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/ConversationDbManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/ConversationDbManager.java @@ -95,17 +95,12 @@ public class ConversationDbManager { } public List queryWithChannelIds(List channelIds) { - StringBuilder sb = new StringBuilder(); - for (int i = 0, size = channelIds.size(); i < size; i++) { - if (i != 0) sb.append(","); - sb.append("'").append(channelIds.get(i)).append("'"); - } - String sql = "select " + conversation + ".*," + channelCols + "," + extraCols + " from " + conversation + " left join " + channel + " on " + conversation + ".channel_id=" + channel + ".channel_id and " + conversation + ".channel_type=" + channel + ".channel_type left join " + conversationExtra + " on " + conversation + ".channel_id=" + conversationExtra + ".channel_id and " + conversation + ".channel_type=" + conversationExtra + ".channel_type where " + conversation + ".is_deleted=0 and " + conversation + ".channel_id in (?)"; + String sql = "select " + conversation + ".*," + channelCols + "," + extraCols + " from " + conversation + " left join " + channel + " on " + conversation + ".channel_id=" + channel + ".channel_id and " + conversation + ".channel_type=" + channel + ".channel_type left join " + conversationExtra + " on " + conversation + ".channel_id=" + conversationExtra + ".channel_id and " + conversation + ".channel_type=" + conversationExtra + ".channel_type where " + conversation + ".is_deleted=0 and " + conversation + ".channel_id in (" + WKCursor.getPlaceholders(channelIds.size()) + ")"; List list = new ArrayList<>(); try (Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql, new Object[]{sb.toString()})) { + .rawQuery(sql, channelIds.toArray(new String[0]))) { if (cursor == null) { return list; } @@ -368,16 +363,8 @@ public class ConversationDbManager { } private List queryWithExtraChannelIds(List channelIds) { - StringBuilder sb = new StringBuilder(); - String sql = "select * from " + conversationExtra + " where channel_id in (?)"; - for (int i = 0, size = channelIds.size(); i < size; i++) { - if (i != 0) { - sb.append(","); - } - sb.append("'").append(channelIds.get(i)).append("'"); - } List list = new ArrayList<>(); - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{sb.toString()})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().select(conversationExtra, "channel_id in (" + WKCursor.getPlaceholders(channelIds.size()) + ")", channelIds.toArray(new String[0]), null)) { if (cursor == null) { return list; } diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java index a4cd9f9..3e737ac 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/MsgDbManager.java @@ -633,13 +633,7 @@ public class MsgDbManager { public List queryWithClientMsgNos(List clientMsgNos) { List msgs = new ArrayList<>(); - StringBuilder sb = new StringBuilder(); - String sql = "select * from " + message + " where " + WKDBColumns.WKMessageColumns.client_msg_no + " in (?)"; - for (int i = 0, size = clientMsgNos.size(); i < size; i++) { - if (i != 0) sb.append(","); - sb.append("'").append(clientMsgNos.get(i)).append("'"); - } - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{sb.toString()})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().select(message, "client_msg_no in (" + WKCursor.getPlaceholders(clientMsgNos.size()) + ")", clientMsgNos.toArray(new String[0]), null)) { if (cursor == null) { return msgs; } @@ -856,14 +850,8 @@ public class MsgDbManager { } private List queryMsgExtrasWithMsgIds(List msgIds) { - StringBuilder sb = new StringBuilder(); - String sql = "select * from " + messageExtra + " where message_id in (?)"; - for (int i = 0, size = msgIds.size(); i < size; i++) { - if (i != 0) sb.append(","); - sb.append("'").append(msgIds.get(i)).append("'"); - } List list = new ArrayList<>(); - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{sb.toString()})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().select(messageExtra, "message_id in (" + WKCursor.getPlaceholders(msgIds.size()) + ")", msgIds.toArray(new String[0]), null)) { if (cursor == null) { return list; } @@ -1320,14 +1308,8 @@ public class MsgDbManager { } public List queryWithMsgIds(List messageIds) { - StringBuffer sb = new StringBuffer(); - for (int i = 0, size = messageIds.size(); i < size; i++) { - if (!TextUtils.isEmpty(sb)) { - sb.append(","); - } - sb.append("'").append(messageIds.get(i)).append("'"); - } - String sql = "select " + messageCols + "," + extraCols + " from " + message + " left join " + messageExtra + " on " + message + ".message_id=" + messageExtra + ".message_id where " + message + ".message_id in (?)"; + + String sql = "select " + messageCols + "," + extraCols + " from " + message + " left join " + messageExtra + " on " + message + ".message_id=" + messageExtra + ".message_id where " + message + ".message_id in (" + WKCursor.getPlaceholders(messageIds.size()) + ")"; List list = new ArrayList<>(); List gChannelIds = new ArrayList<>(); List pChannelIds = new ArrayList<>(); @@ -1335,7 +1317,7 @@ public class MsgDbManager { try (Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql, new Object[]{sb.toString()})) { + .rawQuery(sql, messageIds.toArray())) { if (cursor == null) { return list; } @@ -1545,7 +1527,7 @@ public class MsgDbManager { Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql,new Object[]{msgID}); + .rawQuery(sql, new Object[]{msgID}); if (cursor != null) { if (cursor.moveToFirst()) { extra = serializeMsgExtra(cursor); diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/MsgReactionDBManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/MsgReactionDBManager.java index 965f51c..f8ec2e5 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/MsgReactionDBManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/MsgReactionDBManager.java @@ -101,20 +101,11 @@ class MsgReactionDBManager { } public List queryWithMessageIds(List messageIds) { - StringBuffer stringBuffer = new StringBuffer(); - for (int i = 0, size = messageIds.size(); i < size; i++) { - if (!TextUtils.isEmpty(stringBuffer)) { - stringBuffer.append(","); - } - stringBuffer.append(messageIds.get(i)); - } - String sql = "select * from " + messageReaction + " where message_id in (?) and is_deleted=0 ORDER BY created_at desc"; List list = new ArrayList<>(); List channelIds = new ArrayList<>(); try (Cursor cursor = WKIMApplication .getInstance() - .getDbHelper() - .rawQuery(sql, new Object[]{stringBuffer.toString()})) { + .getDbHelper().select(messageReaction, "message_id in (" + WKCursor.getPlaceholders(messageIds.size()) + ")", messageIds.toArray(new String[0]), "created_at desc")) { if (cursor == null) { return list; } diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/ReminderDBManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/ReminderDBManager.java index ebd0487..76e9bd9 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/ReminderDBManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/ReminderDBManager.java @@ -85,12 +85,12 @@ public class ReminderDBManager { } stringBuffer.append(ids.get(i)); } - String sql = "select * from " + reminders + " where reminder_id in (?)"; + String sql = "select * from " + reminders + " where reminder_id in (" + stringBuffer + ")"; List list = new ArrayList<>(); try (Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql, new Object[]{stringBuffer.toString()})) { + .rawQuery(sql)) { if (cursor == null) { return list; } @@ -104,19 +104,11 @@ public class ReminderDBManager { } private List queryWithChannelIds(List channelIds) { - StringBuilder stringBuffer = new StringBuilder(); - for (int i = 0, size = channelIds.size(); i < size; i++) { - if (i != 0) { - stringBuffer.append(","); - } - stringBuffer.append("'").append(channelIds.get(i)).append("'"); - } - String sql = "select * from " + reminders + " where channel_id in (?)"; List list = new ArrayList<>(); try (Cursor cursor = WKIMApplication .getInstance() .getDbHelper() - .rawQuery(sql, new Object[]{stringBuffer.toString()})) { + .select(reminders, "channel_id in (" + WKCursor.getPlaceholders(channelIds.size()) + ")", channelIds.toArray(new String[0]), null)) { if (cursor == null) { return list; } diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/RobotDBManager.java b/wkim/src/main/java/com/xinbida/wukongim/db/RobotDBManager.java index 60ad5f7..9ae0963 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/RobotDBManager.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/RobotDBManager.java @@ -38,10 +38,9 @@ public class RobotDBManager { public boolean isExitMenu(String robotID, String cmd) { boolean isExist = false; - String sql = "select * from " + robotMenu + " where robot_id =? and cmd=?"; try (Cursor cursor = WKIMApplication .getInstance() - .getDbHelper().rawQuery(sql, new Object[]{robotID, cmd})) { + .getDbHelper().select(robotMenu, "robot_id =? and cmd=?", new String[]{robotID, cmd}, null)) { if (cursor != null && cursor.moveToLast()) { isExist = true; } @@ -78,10 +77,9 @@ public class RobotDBManager { public boolean isExist(String robotID) { boolean isExist = false; - String sql = "select * from " + robot + " where robot_id =?"; try (Cursor cursor = WKIMApplication .getInstance() - .getDbHelper().rawQuery(sql, new Object[]{robotID})) { + .getDbHelper().select(robot, "robot_id=?", new String[]{robotID}, null)) { if (cursor != null && cursor.moveToLast()) { isExist = true; } @@ -138,10 +136,9 @@ public class RobotDBManager { public WKRobot query(String robotID) { WKRobot wkRobot = null; - String sql = "select * from " + robot + " where robot_id =?"; try (Cursor cursor = WKIMApplication .getInstance() - .getDbHelper().rawQuery(sql, new Object[]{robotID})) { + .getDbHelper().select(robot, "robot_id =?", new String[]{robotID}, null)) { if (cursor == null) { return null; } @@ -154,10 +151,9 @@ public class RobotDBManager { public WKRobot queryWithUsername(String username) { WKRobot wkRobot = null; - String sql = "select * from " + robot + " where username =?"; try (Cursor cursor = WKIMApplication .getInstance() - .getDbHelper().rawQuery(sql, new Object[]{username})) { + .getDbHelper().select(robot, "username=?", new String[]{username}, null)) { if (cursor == null) { return null; } @@ -169,17 +165,8 @@ public class RobotDBManager { } public List queryRobots(List robotIds) { - String sql = "select * from " + robot + " where robot_id in (?)"; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < robotIds.size(); i++) { - if (i != 0) { - sb.append(","); - } - sb.append("'").append(robotIds.get(i)).append("'"); - } List list = new ArrayList<>(); - - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{sb.toString()})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().select(robot, "robot_id in (" + WKCursor.getPlaceholders(robotIds.size()) + ")", robotIds.toArray(new String[0]), null)) { if (cursor == null) { return list; } @@ -192,17 +179,8 @@ public class RobotDBManager { } public List queryRobotMenus(List robotIds) { - String sql = "select * from " + robotMenu + " where robot_id in (?)"; - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < robotIds.size(); i++) { - if (i != 0) { - sb.append(","); - } - sb.append("'").append(robotIds.get(i)).append("'"); - } List list = new ArrayList<>(); - - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{sb.toString()})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().select(robotMenu, "robot_id in (" + WKCursor.getPlaceholders(robotIds.size()) + ")", robotIds.toArray(new String[0]), null)) { if (cursor == null) { return list; } @@ -218,7 +196,7 @@ public class RobotDBManager { List list = new ArrayList<>(); String sql = "select * from " + robotMenu + " where robot_id =?"; - try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql,new Object[]{robotID})) { + try (Cursor cursor = WKIMApplication.getInstance().getDbHelper().rawQuery(sql, new Object[]{robotID})) { if (cursor == null) { return list; } diff --git a/wkim/src/main/java/com/xinbida/wukongim/db/WKCursor.java b/wkim/src/main/java/com/xinbida/wukongim/db/WKCursor.java index bf3b50c..fe271a3 100644 --- a/wkim/src/main/java/com/xinbida/wukongim/db/WKCursor.java +++ b/wkim/src/main/java/com/xinbida/wukongim/db/WKCursor.java @@ -45,4 +45,19 @@ public class WKCursor { return null; } } + + public static String getPlaceholders(int count) { + StringBuilder placeholders = new StringBuilder(); + for (int i = 0; i < count; i++) { + if (i != 0) { + placeholders.append(", "); + } + placeholders.append("?"); + } + return placeholders.toString(); + } + + public static void copyArray(String[] src, String[] dest) { + System.arraycopy(src, 0, dest, 0, src.length); + } }