From 6e716f3984b0b3877787e45a6983946ce7dedd6a Mon Sep 17 00:00:00 2001 From: Marco Minerva Date: Fri, 19 Jul 2024 11:31:54 +0200 Subject: [PATCH] Optimize delete logic --- SqlDatabaseVectorSearch/Program.cs | 1 - .../Services/VectorSearchService.cs | 24 +++++++++---------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/SqlDatabaseVectorSearch/Program.cs b/SqlDatabaseVectorSearch/Program.cs index 3eeb6f8..c3e0ba8 100644 --- a/SqlDatabaseVectorSearch/Program.cs +++ b/SqlDatabaseVectorSearch/Program.cs @@ -19,7 +19,6 @@ var appSettings = builder.Services.ConfigureAndGet(builder.Configur builder.Services.AddSqlServer(builder.Configuration.GetConnectionString("SqlConnection"), options => { - options.EnableRetryOnFailure(3, TimeSpan.FromSeconds(1), null); options.UseVectorSearch(); }); diff --git a/SqlDatabaseVectorSearch/Services/VectorSearchService.cs b/SqlDatabaseVectorSearch/Services/VectorSearchService.cs index 4968c98..5f376ef 100644 --- a/SqlDatabaseVectorSearch/Services/VectorSearchService.cs +++ b/SqlDatabaseVectorSearch/Services/VectorSearchService.cs @@ -21,10 +21,13 @@ public class VectorSearchService(ApplicationDbContext dbContext, ITextEmbeddingG // Extract the contents of the file (current, only PDF are supported). var content = await GetContentAsync(stream); + await dbContext.Database.BeginTransactionAsync(); + if (documentId.HasValue) { // If the user is importing a document that already exists, delete the previous one. - await DeleteDocumentAsync(documentId.Value, saveChanges: false); + await dbContext.DocumentChunks.Where(c => c.DocumentId == documentId).ExecuteDeleteAsync(); + await dbContext.Documents.Where(d => d.Id == documentId).ExecuteDeleteAsync(); } else { @@ -47,6 +50,8 @@ public class VectorSearchService(ApplicationDbContext dbContext, ITextEmbeddingG } await dbContext.SaveChangesAsync(); + await dbContext.Database.CommitTransactionAsync(); + return documentId.Value; } @@ -77,21 +82,14 @@ public class VectorSearchService(ApplicationDbContext dbContext, ITextEmbeddingG return documentChunk; } - public async Task DeleteDocumentAsync(Guid documentId, bool saveChanges = true) + public async Task DeleteDocumentAsync(Guid documentId) { - var document = await dbContext.Documents.Include(d => d.Chunks).FirstOrDefaultAsync(d => d.Id == documentId); - if (document is null) - { - return; - } + await dbContext.Database.BeginTransactionAsync(); - dbContext.DocumentChunks.RemoveRange(document.Chunks); - dbContext.Documents.Remove(document); + await dbContext.DocumentChunks.Where(c => c.DocumentId == documentId).ExecuteDeleteAsync(); + await dbContext.Documents.Where(d => d.Id == documentId).ExecuteDeleteAsync(); - if (saveChanges) - { - await dbContext.SaveChangesAsync(); - } + await dbContext.Database.CommitTransactionAsync(); } public async Task AskQuestionAsync(Question question, bool reformulate = true)