From 172e316c31ed75dc305e71ab6c6e331cb563707c Mon Sep 17 00:00:00 2001 From: Jicheng Lu <103353@smsassist.com> Date: Fri, 14 Feb 2025 11:19:39 -0600 Subject: [PATCH] refine conv state key search --- .../Conversations/IConversationService.cs | 2 +- .../Repositories/IBotSharpRepository.cs | 2 +- .../Services/ConversationService.cs | 8 +++---- .../FileRepository.Conversation.cs | 4 ++-- .../Controllers/ConversationController.cs | 4 ++-- .../MongoRepository.Conversation.cs | 24 +++++++++---------- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs index 01aba146..6d84103e 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Conversations/IConversationService.cs @@ -71,5 +71,5 @@ public interface IConversationService /// conversation limit /// if pre-loading, then keys are not filter by the search query /// - Task> GetConversationStateSearhKeys(string query, int convlimit = 100, int keyLimit = 10, bool preLoad = false); + Task> GetConversationStateSearhKeys(string query, int convLimit = 100, int keyLimit = 10, bool preload = false); } diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index a58600e5..06582d45 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -148,7 +148,7 @@ public interface IBotSharpRepository : IHaveServiceProvider => throw new NotImplementedException(); List TruncateConversation(string conversationId, string messageId, bool cleanLog = false) => throw new NotImplementedException(); - List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperlimit = 100) + List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperLimit = 100) => throw new NotImplementedException(); #endregion diff --git a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs index 63a257e5..0cec37d8 100644 --- a/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs +++ b/src/Infrastructure/BotSharp.Core/Conversations/Services/ConversationService.cs @@ -222,17 +222,17 @@ public partial class ConversationService : IConversationService _state.Save(); } - public async Task> GetConversationStateSearhKeys(string query, int convlimit = 100, int keyLimit = 10, bool preLoad = false) + public async Task> GetConversationStateSearhKeys(string query, int convLimit = 100, int keyLimit = 10, bool preload = false) { var keys = new List(); - if (!preLoad && string.IsNullOrWhiteSpace(query)) + if (!preload && string.IsNullOrWhiteSpace(query)) { return keys; } var db = _services.GetRequiredService(); - keys = db.GetConversationStateSearchKeys(convUpperlimit: convlimit); - keys = preLoad ? keys : keys.Where(x => x.Contains(query, StringComparison.OrdinalIgnoreCase)).ToList(); + keys = db.GetConversationStateSearchKeys(convUpperLimit: convLimit); + keys = preload ? keys : keys.Where(x => x.Contains(query, StringComparison.OrdinalIgnoreCase)).ToList(); return keys.OrderBy(x => x).Take(keyLimit).ToList(); } } diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs index 25682662..932bb9ba 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.Conversation.cs @@ -605,7 +605,7 @@ public partial class FileRepository #if !DEBUG [SharpCache(10)] #endif - public List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperlimit = 100) + public List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperLimit = 100) { var dir = Path.Combine(_dbSettings.FileRepository, _conversationSettings.DataDir); if (!Directory.Exists(dir)) return []; @@ -635,7 +635,7 @@ public partial class FileRepository keys.AddRange(stateKeys); count++; - if (count >= convUpperlimit) + if (count >= convUpperLimit) { break; } diff --git a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs index 7461518d..2a7a48f8 100644 --- a/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs +++ b/src/Infrastructure/BotSharp.OpenAPI/Controllers/ConversationController.cs @@ -555,10 +555,10 @@ public class ConversationController : ControllerBase #region Search state keys [HttpGet("/conversation/state/keys")] - public async Task> GetConversationStateKeys([FromQuery] string query, [FromQuery] int keyLimit = 10, [FromQuery] bool preLoad = false) + public async Task> GetConversationStateKeys([FromQuery] string query, [FromQuery] int keyLimit = 10, [FromQuery] int convLimit = 100, [FromQuery] bool preload = false) { var convService = _services.GetRequiredService(); - var keys = await convService.GetConversationStateSearhKeys(query, keyLimit: keyLimit, preLoad: preLoad); + var keys = await convService.GetConversationStateSearhKeys(query, keyLimit: keyLimit, convLimit: convLimit, preload: preload); return keys; } #endregion diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs index cabaecd2..64c8bb53 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.Conversation.cs @@ -614,20 +614,20 @@ public partial class MongoRepository #if !DEBUG [SharpCache(10)] #endif - public List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperlimit = 100) + public List GetConversationStateSearchKeys(int messageLowerLimit = 2, int convUpperLimit = 100) { - var convFilter = Builders.Filter.Gte(x => x.DialogCount, messageLowerLimit); - var conversations = _dc.Conversations.Find(convFilter) - .SortByDescending(x => x.UpdatedTime) - .Limit(convUpperlimit) - .ToList(); + var stateBuilder = Builders.Filter; + var sortDef = Builders.Sort.Descending(x => x.UpdatedTime); + var stateFilters = new List>() + { + stateBuilder.Exists(x => x.States), + stateBuilder.Ne(x => x.States, []) + }; - if (conversations.IsNullOrEmpty()) return []; - - var convIds = conversations.Select(x => x.Id).ToList(); - var stateFilter = Builders.Filter.In(x => x.ConversationId, convIds); - - var states = _dc.ConversationStates.Find(stateFilter).ToList(); + var states = _dc.ConversationStates.Find(stateBuilder.And(stateFilters)) + .Sort(sortDef) + .Limit(convUpperLimit) + .ToList(); var keys = states.SelectMany(x => x.States.Select(x => x.Key)).Distinct().ToList(); return keys; }