diff --git a/src/Serval.Translation/Controllers/TranslationEnginesController.cs b/src/Serval.Translation/Controllers/TranslationEnginesController.cs index 7001b331..015e740e 100644 --- a/src/Serval.Translation/Controllers/TranslationEnginesController.cs +++ b/src/Serval.Translation/Controllers/TranslationEnginesController.cs @@ -1,4 +1,5 @@ using System.Net.Sockets; +using MongoDB.Bson; namespace Serval.Translation.Controllers; @@ -1075,12 +1076,7 @@ private static Build Map(Engine engine, TranslationBuildConfigDto source) } try { - var jsonSerializerOptions = new JsonSerializerOptions(); - jsonSerializerOptions.Converters.Add(new ObjectToInferredTypesConverter()); - build.Options = JsonSerializer.Deserialize>( - source.Options?.ToString() ?? "{}", - jsonSerializerOptions - ); + build.OptionsDocument = BsonDocument.Parse(source.Options?.ToString() ?? "{}"); } catch (Exception e) { @@ -1089,7 +1085,7 @@ private static Build Map(Engine engine, TranslationBuildConfigDto source) return build; } - private QueueDto Map(Queue source) => new() { Size = source.Size, EngineType = source.EngineType }; + private static QueueDto Map(Queue source) => new() { Size = source.Size, EngineType = source.EngineType }; private TranslationEngineDto Map(Engine source) { @@ -1110,6 +1106,11 @@ private TranslationEngineDto Map(Engine source) private TranslationBuildDto Map(Build source) { + string options; + if (source.OptionsDocument is not null) + options = source.OptionsDocument.ToString(); + else + options = JsonSerializer.Serialize(source.Options); return new TranslationBuildDto { Id = source.Id, @@ -1129,7 +1130,7 @@ private TranslationBuildDto Map(Build source) QueueDepth = source.QueueDepth, State = source.State, DateFinished = source.DateFinished, - Options = source.Options + Options = options }; } diff --git a/src/Serval.Translation/Models/Build.cs b/src/Serval.Translation/Models/Build.cs index 0a4f6a8c..ee5af4d6 100644 --- a/src/Serval.Translation/Models/Build.cs +++ b/src/Serval.Translation/Models/Build.cs @@ -15,4 +15,5 @@ public class Build : IEntity public JobState State { get; set; } = JobState.Pending; public DateTime? DateFinished { get; set; } public IDictionary? Options { get; set; } + public BsonDocument? OptionsDocument { get; set; } } diff --git a/src/Serval.Translation/Services/EngineService.cs b/src/Serval.Translation/Services/EngineService.cs index f15e9cda..135b2899 100644 --- a/src/Serval.Translation/Services/EngineService.cs +++ b/src/Serval.Translation/Services/EngineService.cs @@ -185,12 +185,17 @@ public async Task StartBuildAsync(Build build, CancellationToken cancellat Dictionary? pretranslate = build.Pretranslate?.ToDictionary(c => c.CorpusRef); Dictionary? trainOn = build.TrainOn?.ToDictionary(c => c.CorpusRef); var client = _grpcClientFactory.CreateClient(engine.Type); + string options; + if (build.OptionsDocument is not null) + options = build.OptionsDocument.ToString(); + else + options = JsonSerializer.Serialize(build.Options); var request = new StartBuildRequest { EngineType = engine.Type, EngineId = engine.Id, BuildId = build.Id, - Options = JsonSerializer.Serialize(build.Options), + Options = options, Corpora = { engine.Corpora.Select(c => diff --git a/src/Serval.Translation/Usings.cs b/src/Serval.Translation/Usings.cs index 79e2783d..2f18b032 100644 --- a/src/Serval.Translation/Usings.cs +++ b/src/Serval.Translation/Usings.cs @@ -13,6 +13,7 @@ global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Options; +global using MongoDB.Bson; global using NSwag.Annotations; global using Serval.Shared.Configuration; global using Serval.Shared.Contracts; diff --git a/tests/Serval.ApiServer.IntegrationTests/TranslationEngineTests.cs b/tests/Serval.ApiServer.IntegrationTests/TranslationEngineTests.cs index bc0f4cee..29779cd4 100644 --- a/tests/Serval.ApiServer.IntegrationTests/TranslationEngineTests.cs +++ b/tests/Serval.ApiServer.IntegrationTests/TranslationEngineTests.cs @@ -64,7 +64,7 @@ public async Task SetUp() TargetLanguage = "en", Type = "Echo", Owner = "client1", - Corpora = new List() + Corpora = [] }; var e1 = new Engine { @@ -74,7 +74,7 @@ public async Task SetUp() TargetLanguage = "en", Type = "Echo", Owner = "client1", - Corpora = new List() + Corpora = [] }; var e2 = new Engine { @@ -84,7 +84,7 @@ public async Task SetUp() TargetLanguage = "en", Type = "Echo", Owner = "client2", - Corpora = new List() + Corpora = [] }; var be0 = new Engine { @@ -94,7 +94,7 @@ public async Task SetUp() TargetLanguage = "es", Type = "SMTTransfer", Owner = "client1", - Corpora = new List() + Corpora = [] }; var ce0 = new Engine { @@ -104,7 +104,7 @@ public async Task SetUp() TargetLanguage = "es", Type = "Nmt", Owner = "client1", - Corpora = new List() + Corpora = [] }; await _env.Engines.InsertAllAsync(new[] { e0, e1, e2, be0, ce0 }); @@ -740,7 +740,7 @@ public async Task GetAllPretranslationsAsync_Exists() CorpusRef = addedCorpus.Id, TextId = "all", EngineRef = ECHO_ENGINE1_ID, - Refs = new List { "ref1", "ref2" }, + Refs = ["ref1", "ref2"], Translation = "translation", ModelRevision = 1 }; @@ -799,7 +799,7 @@ public async Task GetAllPretranslationsAsync_TextIdExists() CorpusRef = addedCorpus.Id, TextId = "all", EngineRef = ECHO_ENGINE1_ID, - Refs = new List { "ref1", "ref2" }, + Refs = ["ref1", "ref2"], Translation = "translation", ModelRevision = 1 }; @@ -825,7 +825,7 @@ public async Task GetAllPretranslationsAsync_TextIdDoesNotExist() CorpusRef = addedCorpus.Id, TextId = "all", EngineRef = ECHO_ENGINE1_ID, - Refs = new List { "ref1", "ref2" }, + Refs = ["ref1", "ref2"], Translation = "translation", ModelRevision = 1 }; @@ -964,22 +964,21 @@ public async Task StartBuildForEngineByIdAsync(IEnumerable scope, int ex { case 201: TranslationCorpus addedCorpus = await client.AddCorpusAsync(engineId, TestCorpusConfig); - ptcc = new PretranslateCorpusConfig - { - CorpusId = addedCorpus.Id, - TextIds = new List { "all" } - }; - tcc = new() - { - CorpusId = addedCorpus.Id, - TextIds = new List { "all" } - }; + ptcc = new PretranslateCorpusConfig { CorpusId = addedCorpus.Id, TextIds = ["all"] }; + tcc = new() { CorpusId = addedCorpus.Id, TextIds = ["all"] }; tbc = new TranslationBuildConfig { - Pretranslate = new List { ptcc }, - TrainOn = new List { tcc }, - Options = - "{\"max_steps\":10, \"use_key_terms\":false, \"some_double\":10.5, \"some_string\":\"string\"}" + Pretranslate = [ptcc], + TrainOn = [tcc], + Options = """ + {"max_steps":10, + "use_key_terms":false, + "some_double":10.5, + "some_nested":{ + "other_double":10.5 + }, + "some_string":"string"} + """ }; TranslationBuild resultAfterStart; Assert.ThrowsAsync(async () => @@ -996,12 +995,8 @@ public async Task StartBuildForEngineByIdAsync(IEnumerable scope, int ex case 400: case 403: case 404: - ptcc = new PretranslateCorpusConfig - { - CorpusId = "cccccccccccccccccccccccc", - TextIds = new List { "all" } - }; - tbc = new TranslationBuildConfig { Pretranslate = new List { ptcc } }; + ptcc = new PretranslateCorpusConfig { CorpusId = "cccccccccccccccccccccccc", TextIds = ["all"] }; + tbc = new TranslationBuildConfig { Pretranslate = [ptcc] }; var ex = Assert.ThrowsAsync(async () => { await client.StartBuildAsync(engineId, tbc); @@ -1112,12 +1107,8 @@ public async Task TryToQueueMultipleBuildsPerSingleUser() var engineId = NMT_ENGINE1_ID; var expectedStatusCode = 409; TranslationCorpus addedCorpus = await client.AddCorpusAsync(engineId, TestCorpusConfigNonEcho); - var ptcc = new PretranslateCorpusConfig - { - CorpusId = addedCorpus.Id, - TextIds = new List { "all" } - }; - var tbc = new TranslationBuildConfig { Pretranslate = new List { ptcc } }; + var ptcc = new PretranslateCorpusConfig { CorpusId = addedCorpus.Id, TextIds = ["all"] }; + var tbc = new TranslationBuildConfig { Pretranslate = [ptcc] }; TranslationBuild build = await client.StartBuildAsync(engineId, tbc); var ex = Assert.ThrowsAsync(async () => { @@ -1174,7 +1165,7 @@ private static AsyncUnaryCall CreateAsyncUnaryCall(StatusC Task.FromException(new RpcException(status)), Task.FromResult(new Metadata()), () => status, - () => new Metadata(), + () => [], () => { } ); } @@ -1185,7 +1176,7 @@ private static AsyncUnaryCall CreateAsyncUnaryCall(TRespon Task.FromResult(response), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, - () => new Metadata(), + () => [], () => { } ); }