Browse Source

Code simplified.

pull/459/head
Sebastian 6 years ago
parent
commit
80f0ae4c5b
  1. 73
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Extensions.cs
  2. 4
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs
  3. 102
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextContent.cs
  4. 7
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs
  5. 3
      backend/src/Squidex.Domain.Apps.Entities/Contents/Text/Update.cs
  6. 6
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs
  7. 3
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerBenchmark.cs
  8. 8
      backend/tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTestsBase.cs

73
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<string, string> ToTexts(this NamedContentData data)
{
var result = new Dictionary<string, string>();
if (data != null)
{
var languages = new Dictionary<string, StringBuilder>();
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<string>(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<string> 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);
}
}
}
}
}

4
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<List<Guid>?> SearchAsync(string? queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published)

102
backend/src/Squidex.Domain.Apps.Entities/Contents/Text/TextContent.cs

@ -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<string, string> Texts { get; } = new Dictionary<string, string>();
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<string, StringBuilder>();
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<string>(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<string> 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);
}
}
}
}
}

7
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<string, string> 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<string, string> 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);
}

3
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<string, string> Text { get; set; }
public bool OnlyDraft { get; set; }
}

6
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<Update>.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && x.OnlyDraft)))
A.CallTo(() => grain.IndexAsync(A<Update>.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<Update>.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && !x.OnlyDraft)))
A.CallTo(() => grain.IndexAsync(A<Update>.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<Update>.That.Matches(x => x.Text.Texts.Count == 0 && x.Id == contentId && x.OnlyDraft)))
A.CallTo(() => grain.IndexAsync(A<Update>.That.Matches(x => x.Text.Count == 0 && x.Id == contentId && x.OnlyDraft)))
.MustHaveHappened();
}

3
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<string, string>
{
["iv"] = "Hallo Welt"
};

8
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<string, string>
{
["de"] = "Stadt und Umgebung and whatever"
};
var englishText = new TextContent
var englishText = new Dictionary<string, string>
{
["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<string, string>
{
["iv"] = text1
};
var content2 = new TextContent
var content2 = new Dictionary<string, string>
{
["iv"] = text2
};

Loading…
Cancel
Save