diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs index b94322dde..1f93d890d 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs @@ -5,8 +5,14 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; +using System.Collections.Generic; +using System.Text; using Lucene.Net.Documents; using Lucene.Net.Util; +using Squidex.Domain.Apps.Core.Contents; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Json.Objects; namespace Squidex.Domain.Apps.Entities.Contents.Text { @@ -25,5 +31,72 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text document.AddStringField(name, value, Field.Store.YES); } + + public static Dictionary ToTexts(this NamedContentData data) + { + var result = new Dictionary(); + + if (data != null) + { + var languages = new Dictionary(); + + void AppendText(string language, string text) + { + if (!string.IsNullOrWhiteSpace(text)) + { + var sb = languages.GetOrAddNew(language); + + if (sb.Length > 0) + { + sb.Append(" "); + } + + sb.Append(text); + } + } + + foreach (var field in data) + { + if (field.Value != null) + { + foreach (var fieldValue in field.Value) + { + var appendText = new Action(text => AppendText(fieldValue.Key, text)); + + AppendJsonText(fieldValue.Value, appendText); + } + } + } + + foreach (var kvp in languages) + { + result[kvp.Key] = kvp.Value.ToString(); + } + } + + return result; + } + + private static void AppendJsonText(IJsonValue value, Action appendText) + { + if (value.Type == JsonValueType.String) + { + appendText(value.ToString()); + } + else if (value is JsonArray array) + { + foreach (var item in array) + { + AppendJsonText(item, appendText); + } + } + else if (value is JsonObject obj) + { + foreach (var item in obj.Values) + { + AppendJsonText(item, appendText); + } + } + } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs index 6a17a63da..ad79ad381 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs @@ -88,9 +88,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text private static Update Data(Guid contentId, NamedContentData data, bool onlyDraft) { - var text = new TextContent(data); - - return new Update { Id = contentId, Text = text, OnlyDraft = onlyDraft }; + return new Update { Id = contentId, Text = data.ToTexts(), OnlyDraft = onlyDraft }; } public async Task?> SearchAsync(string? queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published) diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextContent.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextContent.cs deleted file mode 100644 index 7b2d5f5a8..000000000 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextContent.cs +++ /dev/null @@ -1,102 +0,0 @@ -// ========================================================================== -// Squidex Headless CMS -// ========================================================================== -// Copyright (c) Squidex UG (haftungsbeschraenkt) -// All rights reserved. Licensed under the MIT license. -// ========================================================================== - -using System; -using System.Collections.Generic; -using System.Text; -using Squidex.Domain.Apps.Core.Contents; -using Squidex.Infrastructure; -using Squidex.Infrastructure.Json.Objects; - -namespace Squidex.Domain.Apps.Entities.Contents.Text -{ - public sealed class TextContent - { - public Dictionary Texts { get; } = new Dictionary(); - - public string this[string key] - { - get - { - return Texts.GetOrDefault(key) ?? string.Empty; - } - set - { - Texts[key] = value; - } - } - - public TextContent() - { - } - - public TextContent(NamedContentData data) - { - if (data == null) - { - return; - } - - var languages = new Dictionary(); - - void AppendText(string language, string text) - { - if (!string.IsNullOrWhiteSpace(text)) - { - var sb = languages.GetOrAddNew(language); - - if (sb.Length > 0) - { - sb.Append(" "); - } - - sb.Append(text); - } - } - - foreach (var field in data) - { - if (field.Value != null) - { - foreach (var fieldValue in field.Value) - { - var appendText = new Action(text => AppendText(fieldValue.Key, text)); - - AppendJsonText(fieldValue.Value, appendText); - } - } - } - - foreach (var kvp in languages) - { - Texts[kvp.Key] = kvp.Value.ToString(); - } - } - - private static void AppendJsonText(IJsonValue value, Action appendText) - { - if (value.Type == JsonValueType.String) - { - appendText(value.ToString()); - } - else if (value is JsonArray array) - { - foreach (var item in array) - { - AppendJsonText(item, appendText); - } - } - else if (value is JsonObject obj) - { - foreach (var item in obj.Values) - { - AppendJsonText(item, appendText); - } - } - } - } -} diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs index ec1de40f6..71d28db6a 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Collections.Generic; using Lucene.Net.Documents; using Lucene.Net.Index; @@ -63,7 +64,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text return true; } - public void Index(TextContent text, bool onlyDraft) + public void Index(Dictionary text, bool onlyDraft) { var converted = CreateDocument(text); @@ -118,11 +119,11 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text } } - private static Document CreateDocument(TextContent text) + private static Document CreateDocument(Dictionary text) { var document = new Document(); - foreach (var field in text.Texts) + foreach (var field in text) { document.AddTextField(field.Key, field.Value, Field.Store.NO); } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Update.cs b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Update.cs index e9cb850aa..48da5a421 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Update.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Update.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Collections.Generic; using Orleans.Concurrency; namespace Squidex.Domain.Apps.Entities.Contents.Text @@ -15,7 +16,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { public Guid Id { get; set; } - public TextContent Text { get; set; } + public Dictionary Text { get; set; } public bool OnlyDraft { get; set; } } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs index dce53c37b..18d886d09 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs @@ -54,7 +54,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { await sut.On(E(new ContentCreated())); - A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && x.OnlyDraft))) + A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Count == 0 && x.Id == contentId && x.OnlyDraft))) .MustHaveHappened(); } @@ -63,7 +63,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { await sut.On(E(new ContentUpdated())); - A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && !x.OnlyDraft))) + A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Count == 0 && x.Id == contentId && !x.OnlyDraft))) .MustHaveHappened(); } @@ -72,7 +72,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text { await sut.On(E(new ContentUpdateProposed())); - A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && x.OnlyDraft))) + A.CallTo(() => grain.IndexAsync(A.That.Matches(x => x.Text.Count == 0 && x.Id == contentId && x.OnlyDraft))) .MustHaveHappened(); } diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerBenchmark.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerBenchmark.cs index bc6624ecd..77c450fd4 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerBenchmark.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerBenchmark.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.Collections.Generic; using System.Threading.Tasks; using FakeItEasy; using Squidex.Infrastructure; @@ -30,7 +31,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text [Fact(Skip = "Only used for benchmarks")] public async Task Should_index_many_documents() { - var text = new TextContent + var text = new Dictionary { ["iv"] = "Hallo Welt" }; diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTestsBase.cs b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTestsBase.cs index 127dbf74d..6e4c83fe8 100644 --- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTestsBase.cs +++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTestsBase.cs @@ -204,12 +204,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text private async Task AddLocalizedContent() { - var germanText = new TextContent + var germanText = new Dictionary { ["de"] = "Stadt und Umgebung and whatever" }; - var englishText = new TextContent + var englishText = new Dictionary { ["en"] = "City and Surroundings und sonstiges" }; @@ -220,12 +220,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text private async Task AddInvariantContent(string text1, string text2, bool onlyDraft = false) { - var content1 = new TextContent + var content1 = new Dictionary { ["iv"] = text1 }; - var content2 = new TextContent + var content2 = new Dictionary { ["iv"] = text2 };