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;
}