Optimize message queries

This commit is contained in:
SL 2023-12-05 23:09:20 +08:00
parent 551d85d276
commit 0253ee0136
10 changed files with 54 additions and 116 deletions

View File

@ -44,3 +44,5 @@
* Update channel info refresh listener and optimize data insertion issues * Update channel info refresh listener and optimize data insertion issues
### 1.2.2 ### 1.2.2
* Modifying the issue of reconnecting disconnected objects without destroying them * Modifying the issue of reconnecting disconnected objects without destroying them
### 1.2.3
* Optimize message queries

View File

@ -9,7 +9,7 @@
#### 安装 #### 安装
``` ```
dependencies: dependencies:
wukongimfluttersdk: ^1.2.2 wukongimfluttersdk: ^1.2.3
``` ```
#### 引入 #### 引入
```dart ```dart

View File

@ -96,21 +96,15 @@ class ChannelDB {
if (channelIDs.isEmpty) { if (channelIDs.isEmpty) {
return []; return [];
} }
StringBuffer sb = StringBuffer(); List<Object> args = [];
for (int i = 0, size = channelIDs.length; i < size; i++) { args.addAll(channelIDs);
if (i != 0) { args.add(channelType);
sb.write(",");
}
sb.write("'");
sb.write(channelIDs[i]);
sb.write("'");
}
String channelIds = sb.toString();
List<WKChannel> list = []; List<WKChannel> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableChannel, WKDBConst.tableChannel,
where: "channel_id in (?) and channel_type=?", where:
whereArgs: [channelIds, channelType]); "channel_id in (${WKDBConst.getPlaceholders(channelIDs.length)}) and channel_type=?",
whereArgs: args);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannel(data)); list.add(WKDBConst.serializeChannel(data));

View File

@ -14,20 +14,16 @@ class ChannelMemberDB {
Future<List<WKChannelMember>> queryMemberWithUIDs( Future<List<WKChannelMember>> queryMemberWithUIDs(
String channelID, int channelType, List<String> uidList) async { String channelID, int channelType, List<String> uidList) async {
StringBuffer sb = StringBuffer(); List<Object> args = [];
for (int i = 0, size = uidList.length; i < size; i++) { args.add(channelID);
if (i != 0) { args.add(channelType);
sb.write(","); args.addAll(uidList);
}
sb.write("'");
sb.write(uidList[i]);
sb.write("'");
}
List<WKChannelMember> list = []; List<WKChannelMember> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableChannelMember, WKDBConst.tableChannelMember,
where: "channel_id=? and channel_type=? and member_uid in (?)", where:
whereArgs: [channelID, channelType, sb.toString()]); "channel_id=? and channel_type=? and member_uid in (${WKDBConst.getPlaceholders(uidList.length)})",
whereArgs: args);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannelMember(data)); list.add(WKDBConst.serializeChannelMember(data));
@ -81,21 +77,17 @@ class ChannelMemberDB {
Future<List<WKChannelMember>> queryWithUIDs( Future<List<WKChannelMember>> queryWithUIDs(
String channelID, int channelType, List<String> uidList) async { String channelID, int channelType, List<String> uidList) async {
StringBuffer sb = StringBuffer(); List<Object> args = [];
for (int i = 0, size = uidList.length; i < size; i++) { args.add(channelID);
if (i != 0) { args.add(channelType);
sb.write(","); args.addAll(uidList);
}
sb.write("'");
sb.write(uidList[i]);
sb.write("'");
}
List<WKChannelMember> list = []; List<WKChannelMember> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableChannelMember, WKDBConst.tableChannelMember,
where: "channel_id=? and channel_type=? and member_uid in (?) ", where:
whereArgs: [channelID, channelType, sb.toString()]); "channel_id=? and channel_type=? and member_uid in (${WKDBConst.getPlaceholders(uidList.length)}) ",
whereArgs: args);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeChannelMember(data)); list.add(WKDBConst.serializeChannelMember(data));

View File

@ -245,4 +245,15 @@ class WKDBConst {
} }
return result.toString(); return result.toString();
} }
static String getPlaceholders(int count) {
StringBuffer placeholders = StringBuffer();
for (int i = 0; i < count; i++) {
if (i != 0) {
placeholders.write(", ");
}
placeholders.write("?");
}
return placeholders.toString();
}
} }

View File

@ -113,20 +113,12 @@ class ConversationDB {
Future<List<WKConversationMsg>> queryWithChannelIds( Future<List<WKConversationMsg>> queryWithChannelIds(
List<String> channelIds) async { List<String> channelIds) async {
StringBuffer sb = StringBuffer();
for (var i = 0; i < channelIds.length; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(channelIds[i]);
sb.write("'");
}
List<WKConversationMsg> list = []; List<WKConversationMsg> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableConversation, WKDBConst.tableConversation,
where: "channel_id in (?)", where:
whereArgs: [sb.toString()]); "channel_id in (${WKDBConst.getPlaceholders(channelIds.length)})",
whereArgs: channelIds);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeCoversation(data)); list.add(WKDBConst.serializeCoversation(data));

View File

@ -103,21 +103,11 @@ class MessageDB {
} }
Future<List<WKMsg>> queryWithMessageIds(List<String> messageIds) async { Future<List<WKMsg>> queryWithMessageIds(List<String> messageIds) async {
StringBuffer sb = StringBuffer();
for (int i = 0, size = messageIds.length; i < size; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(messageIds[i]);
sb.write("'");
}
String sql = String sql =
"select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (?)"; "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (${WKDBConst.getPlaceholders(messageIds.length)}})";
List<WKMsg> list = []; List<WKMsg> list = [];
List<Map<String, Object?>> results = List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB().rawQuery(sql, [sb.toString()]); await WKDBHelper.shared.getDB().rawQuery(sql, messageIds);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeWKMsg(data)); list.add(WKDBConst.serializeWKMsg(data));
@ -582,21 +572,11 @@ class MessageDB {
Future<List<WKMsg>> queryWithClientMsgNos(List<String> clientMsgNos) async { Future<List<WKMsg>> queryWithClientMsgNos(List<String> clientMsgNos) async {
List<WKMsg> msgs = []; List<WKMsg> msgs = [];
StringBuffer sb = StringBuffer();
for (int i = 0, size = clientMsgNos.length; i < size; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(clientMsgNos[i]);
sb.write("'");
}
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableMessage, WKDBConst.tableMessage,
where: "client_msg_no in (?)", where:
whereArgs: [sb.toString()]); "client_msg_no in (${WKDBConst.getPlaceholders(clientMsgNos.length)})",
whereArgs: clientMsgNos);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
msgs.add(WKDBConst.serializeWKMsg(data)); msgs.add(WKDBConst.serializeWKMsg(data));
@ -690,20 +670,11 @@ class MessageDB {
} }
Future<List<WKMsgExtra>> queryMsgExtrasWithMsgIds(List<String> msgIds) async { Future<List<WKMsgExtra>> queryMsgExtrasWithMsgIds(List<String> msgIds) async {
StringBuffer sb = StringBuffer();
for (int i = 0, size = msgIds.length; i < size; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(msgIds[i]);
sb.write("'");
}
List<WKMsgExtra> list = []; List<WKMsgExtra> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableMessageExtra, WKDBConst.tableMessageExtra,
where: "message_id in (?)", where: "message_id in (${WKDBConst.getPlaceholders(msgIds.length)})",
whereArgs: [sb.toString()]); whereArgs: msgIds);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeMsgExtra(data)); list.add(WKDBConst.serializeMsgExtra(data));

View File

@ -42,21 +42,12 @@ class ReactionDB {
Future<List<WKMsgReaction>> queryWithMessageIds( Future<List<WKMsgReaction>> queryWithMessageIds(
List<String> messageIds) async { List<String> messageIds) async {
StringBuffer sb = StringBuffer();
for (int i = 0, size = messageIds.length; i < size; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(messageIds[i]);
sb.write("'");
}
List<WKMsgReaction> list = []; List<WKMsgReaction> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableMessageReaction, WKDBConst.tableMessageReaction,
where: "message_id in (?) and is_deleted=0", where:
whereArgs: [sb.toString()], "message_id in (${WKDBConst.getPlaceholders(messageIds.length)}) and is_deleted=0",
whereArgs: messageIds,
orderBy: "created_at desc"); orderBy: "created_at desc");
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {

View File

@ -118,20 +118,12 @@ class ReminderDB {
} }
Future<List<WKReminder>> queryWithChannelIds(List<String> channelIds) async { Future<List<WKReminder>> queryWithChannelIds(List<String> channelIds) async {
StringBuffer sb = StringBuffer();
for (int i = 0, size = channelIds.length; i < size; i++) {
if (i != 0) {
sb.write(",");
}
sb.write("'");
sb.write(channelIds[i]);
sb.write("'");
}
List<WKReminder> list = []; List<WKReminder> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableReminders, WKDBConst.tableReminders,
where: "channel_id in (?)", where:
whereArgs: [sb.toString()]); "channel_id in (${WKDBConst.getPlaceholders(channelIds.length)})",
whereArgs: channelIds);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeReminder(data)); list.add(WKDBConst.serializeReminder(data));
@ -141,18 +133,11 @@ class ReminderDB {
} }
Future<List<WKReminder>> queryWithIds(List<int> ids) async { Future<List<WKReminder>> queryWithIds(List<int> ids) async {
StringBuffer sb = StringBuffer();
for (int i = 0, size = ids.length; i < size; i++) {
if (sb.length != 0) {
sb.write(',');
}
sb.write(ids[i]);
}
List<WKReminder> list = []; List<WKReminder> list = [];
List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query( List<Map<String, Object?>> results = await WKDBHelper.shared.getDB().query(
WKDBConst.tableReminders, WKDBConst.tableReminders,
where: "reminder_id in (?)", where: "reminder_id in (${WKDBConst.getPlaceholders(ids.length)})",
whereArgs: [sb.toString()]); whereArgs: ids);
if (results.isNotEmpty) { if (results.isNotEmpty) {
for (Map<String, Object?> data in results) { for (Map<String, Object?> data in results) {
list.add(WKDBConst.serializeReminder(data)); list.add(WKDBConst.serializeReminder(data));

View File

@ -15,7 +15,7 @@ description: wukong IM flutter sdk
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.2.2 version: 1.2.3
homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK
environment: environment: