Browse Source

Remove duplicate index functionality.

pull/351/head
Sebastian Stehle 7 years ago
parent
commit
d824d04492
  1. 12
      src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs
  2. 8
      src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs
  3. 6
      src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs
  4. 2
      src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs
  5. 64
      src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs
  6. 21
      src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs
  7. 2
      src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs
  8. 2
      src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs
  9. 29
      src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs
  10. 2
      src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs
  11. 18
      tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs
  12. 8
      tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs
  13. 56
      tools/Migrate_01/Migrations/BuildFullTextIndices.cs
  14. 2
      tools/Migrate_01/RebuildOptions.cs
  15. 11
      tools/Migrate_01/RebuildRunner.cs

12
src/Squidex.Domain.Apps.Core.Model/Apps/AppPlan.cs

@ -24,5 +24,17 @@ namespace Squidex.Domain.Apps.Core.Apps
PlanId = planId; PlanId = planId;
} }
public static AppPlan Build(RefToken owner, string planId)
{
if (planId == null)
{
return null;
}
else
{
return new AppPlan(owner, planId);
}
}
} }
} }

8
src/Squidex.Domain.Apps.Core.Model/Apps/LanguagesConfig.cs

@ -95,6 +95,14 @@ namespace Squidex.Domain.Apps.Core.Apps
return new LanguagesConfig(languages, languages[language]); return new LanguagesConfig(languages, languages[language]);
} }
[Pure]
public LanguagesConfig Set(Language language, bool isOptional = false, IEnumerable<Language> fallback = null)
{
Guard.NotNull(language, nameof(language));
return Set(new LanguageConfig(language, isOptional, fallback));
}
[Pure] [Pure]
public LanguagesConfig Set(LanguageConfig config) public LanguagesConfig Set(LanguageConfig config)
{ {

6
src/Squidex.Domain.Apps.Entities/Apps/State/AppState.cs

@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
protected void On(AppPlanChanged @event) protected void On(AppPlanChanged @event)
{ {
Plan = @event.PlanId == null ? null : new AppPlan(@event.Actor, @event.PlanId); Plan = AppPlan.Build(@event.Actor, @event.PlanId);
} }
protected void On(AppContributorAssigned @event) protected void On(AppContributorAssigned @event)
@ -117,7 +117,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
protected void On(AppLanguageAdded @event) protected void On(AppLanguageAdded @event)
{ {
LanguagesConfig = LanguagesConfig.Set(new LanguageConfig(@event.Language)); LanguagesConfig = LanguagesConfig.Set(@event.Language);
} }
protected void On(AppLanguageRemoved @event) protected void On(AppLanguageRemoved @event)
@ -127,7 +127,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
protected void On(AppLanguageUpdated @event) protected void On(AppLanguageUpdated @event)
{ {
LanguagesConfig = LanguagesConfig.Set(new LanguageConfig(@event.Language, @event.IsOptional, @event.Fallback)); LanguagesConfig = LanguagesConfig.Set(@event.Language, @event.IsOptional, @event.Fallback);
if (@event.IsMaster) if (@event.IsMaster)
{ {

2
src/Squidex.Domain.Apps.Entities/Assets/State/AssetState.cs

@ -63,8 +63,6 @@ namespace Squidex.Domain.Apps.Entities.Assets.State
SimpleMapper.Map(@event, this); SimpleMapper.Map(@event, this);
TotalSize += @event.FileSize; TotalSize += @event.FileSize;
AppId = @event.AppId;
} }
protected void On(AssetUpdated @event) protected void On(AssetUpdated @event)

64
src/Squidex.Domain.Apps.Entities/Contents/State/ContentState.cs

@ -47,40 +47,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
{ {
SimpleMapper.Map(@event, this); SimpleMapper.Map(@event, this);
DataDraft = @event.Data; UpdateData(null, @event.Data, false);
}
protected void On(ContentUpdated @event)
{
DataDraft = @event.Data;
if (Data != null)
{
Data = @event.Data;
}
}
protected void On(ContentUpdateProposed @event)
{
DataDraft = @event.Data;
IsPending = true;
}
protected void On(ContentChangesDiscarded @event)
{
DataDraft = Data;
IsPending = false;
} }
protected void On(ContentChangesPublished @event) protected void On(ContentChangesPublished @event)
{ {
ScheduleJob = null; ScheduleJob = null;
Data = DataDraft; UpdateData(DataDraft, null, false);
IsPending = false;
} }
protected void On(ContentStatusChanged @event) protected void On(ContentStatusChanged @event)
@ -91,12 +65,25 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
if (@event.Status == Status.Published) if (@event.Status == Status.Published)
{ {
Data = DataDraft; UpdateData(DataDraft, null, false);
IsPending = false;
} }
} }
protected void On(ContentUpdated @event)
{
UpdateData(@event.Data, @event.Data, false);
}
protected void On(ContentUpdateProposed @event)
{
UpdateData(null, @event.Data, true);
}
protected void On(ContentChangesDiscarded @event)
{
UpdateData(null, Data, false);
}
protected void On(ContentSchedulingCancelled @event) protected void On(ContentSchedulingCancelled @event)
{ {
ScheduleJob = null; ScheduleJob = null;
@ -118,5 +105,20 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
return Clone().Update(payload, @event.Headers, r => r.DispatchAction(payload)); return Clone().Update(payload, @event.Headers, r => r.DispatchAction(payload));
} }
private void UpdateData(NamedContentData data, NamedContentData dataDraft, bool isPending)
{
if (data != null)
{
Data = data;
}
if (dataDraft != null)
{
DataDraft = dataDraft;
}
IsPending = isPending;
}
} }
} }

21
src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs

@ -56,25 +56,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
return Task.CompletedTask; return Task.CompletedTask;
} }
public async Task IndexAsync(Guid schemaId, Guid id, NamedContentData dataDraft, NamedContentData data)
{
var index = grainFactory.GetGrain<ITextIndexerGrain>(schemaId);
using (Profiler.TraceMethod<GrainTextIndexer>())
{
try
{
await index.IndexAsync(id, new IndexData { DataDraft = dataDraft, Data = data }, false);
}
catch (Exception ex)
{
log.LogError(ex, w => w
.WriteProperty("action", "UpdateTextEntry")
.WriteProperty("status", "Failed"));
}
}
}
public async Task On(Envelope<IEvent> @event) public async Task On(Envelope<IEvent> @event)
{ {
try try
@ -126,7 +107,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
private J<IndexData> Data(NamedContentData data) private J<IndexData> Data(NamedContentData data)
{ {
return new IndexData { DataDraft = data }; return new IndexData { Data = data };
} }
public async Task<List<Guid>> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published) public async Task<List<Guid>> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published)

2
src/Squidex.Domain.Apps.Entities/Contents/Text/ITextIndexer.cs

@ -15,8 +15,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{ {
public interface ITextIndexer public interface ITextIndexer
{ {
Task IndexAsync(Guid schemaId, Guid contentId, NamedContentData draftData, NamedContentData data);
Task<List<Guid>> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published); Task<List<Guid>> SearchAsync(string queryText, IAppEntity app, Guid schemaId, Scope scope = Scope.Published);
} }
} }

2
src/Squidex.Domain.Apps.Entities/Contents/Text/IndexData.cs

@ -12,7 +12,5 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
public sealed class IndexData public sealed class IndexData
{ {
public NamedContentData Data { get; set; } public NamedContentData Data { get; set; }
public NamedContentData DataDraft { get; set; }
} }
} }

29
src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexContent.cs

@ -74,34 +74,27 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
return true; return true;
} }
public void Index(NamedContentData dataDraft, NamedContentData data, bool onlyDraft) public void Index(NamedContentData data, bool onlyDraft)
{ {
var converted = CreateDocument(dataDraft); var converted = CreateDocument(data);
Upsert(converted, 1, 1, 0); Upsert(converted, 1, 1, 0);
var docId = GetPublishedDocument(); var docId = GetPublishedDocument();
if (data != null) var isPublished = IsForPublished(docId);
if (!onlyDraft && docId > 0 && isPublished)
{
Upsert(converted, 0, 0, 1);
}
else if (!onlyDraft)
{ {
Upsert(CreateDocument(data), 0, 0, 1); Upsert(converted, 0, 0, 0);
} }
else else
{ {
var isPublished = IsForPublished(docId); Update(0, 0, isPublished ? (byte)1 : (byte)0);
if (!onlyDraft && docId > 0 && isPublished)
{
Upsert(converted, 0, 0, 1);
}
else if (!onlyDraft)
{
Upsert(converted, 0, 0, 0);
}
else
{
Update(0, 0, isPublished ? (byte)1 : (byte)0);
}
} }
} }

2
src/Squidex.Domain.Apps.Entities/Contents/Text/TextIndexerGrain.cs

@ -91,7 +91,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{ {
var content = new TextIndexContent(indexWriter, indexSearcher, indexState, id); var content = new TextIndexContent(indexWriter, indexSearcher, indexState, id);
content.Index(data.Value.DataDraft, data.Value.Data, onlyDraft); content.Index(data.Value.Data, onlyDraft);
return TryFlushAsync(); return TryFlushAsync();
} }

18
tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs

@ -38,18 +38,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
sut = new GrainTextIndexer(grainFactory, A.Fake<ISemanticLog>()); sut = new GrainTextIndexer(grainFactory, A.Fake<ISemanticLog>());
} }
[Fact]
public async Task Should_call_grain_when_indexing_data()
{
var data = new NamedContentData();
var dataDraft = new NamedContentData();
await sut.IndexAsync(schemaId, contentId, dataDraft, data);
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.Data == data && x.Value.DataDraft == dataDraft), false))
.MustHaveHappened();
}
[Fact] [Fact]
public async Task Should_call_grain_when_content_deleted() public async Task Should_call_grain_when_content_deleted()
{ {
@ -66,7 +54,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
await sut.On(E(new ContentCreated { Data = data })); await sut.On(E(new ContentCreated { Data = data }));
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.DataDraft == data), true)) A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.Data == data), true))
.MustHaveHappened(); .MustHaveHappened();
} }
@ -77,7 +65,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
await sut.On(E(new ContentUpdated { Data = data })); await sut.On(E(new ContentUpdated { Data = data }));
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.DataDraft == data), false)) A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.Data == data), false))
.MustHaveHappened(); .MustHaveHappened();
} }
@ -88,7 +76,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
await sut.On(E(new ContentUpdateProposed { Data = data })); await sut.On(E(new ContentUpdateProposed { Data = data }));
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.DataDraft == data), true)) A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.That.Matches(x => x.Value.Data == data), true))
.MustHaveHappened(); .MustHaveHappened();
} }

8
tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/TextIndexerGrainTests.cs

@ -211,8 +211,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
new ContentFieldData() new ContentFieldData()
.AddValue("en", "City and Surroundings und sonstiges")); .AddValue("en", "City and Surroundings und sonstiges"));
await sut.IndexAsync(ids1[0], new IndexData { DataDraft = germanData }, true); await sut.IndexAsync(ids1[0], new IndexData { Data = germanData }, true);
await sut.IndexAsync(ids2[0], new IndexData { DataDraft = englishData }, true); await sut.IndexAsync(ids2[0], new IndexData { Data = englishData }, true);
} }
private async Task AddInvariantContent(string text1, string text2, bool onlyDraft = false) private async Task AddInvariantContent(string text1, string text2, bool onlyDraft = false)
@ -229,8 +229,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
new ContentFieldData() new ContentFieldData()
.AddValue("iv", text2)); .AddValue("iv", text2));
await sut.IndexAsync(ids1[0], new IndexData { DataDraft = data1 }, onlyDraft); await sut.IndexAsync(ids1[0], new IndexData { Data = data1 }, onlyDraft);
await sut.IndexAsync(ids2[0], new IndexData { DataDraft = data2 }, onlyDraft); await sut.IndexAsync(ids2[0], new IndexData { Data = data2 }, onlyDraft);
} }
private async Task DeleteAsync(Guid id) private async Task DeleteAsync(Guid id)

56
tools/Migrate_01/Migrations/BuildFullTextIndices.cs

@ -1,56 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Threading.Tasks.Dataflow;
using Squidex.Domain.Apps.Entities.Contents.State;
using Squidex.Domain.Apps.Entities.Contents.Text;
using Squidex.Infrastructure.Migrations;
using Squidex.Infrastructure.States;
namespace Migrate_01.Migrations
{
public sealed class BuildFullTextIndices : IMigration
{
private readonly ITextIndexer textIndexer;
private readonly IStore<Guid> store;
public BuildFullTextIndices(ITextIndexer textIndexer, IStore<Guid> store)
{
this.textIndexer = textIndexer;
this.store = store;
}
public Task UpdateAsync()
{
return UpdateAsync(CancellationToken.None);
}
public async Task UpdateAsync(CancellationToken ct)
{
var snapshotStore = store.GetSnapshotStore<ContentState>();
var worker = new ActionBlock<ContentState>(state =>
{
return textIndexer.IndexAsync(state.SchemaId.Id, state.Id, state.DataDraft, state.Data);
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount * 2
});
await snapshotStore.ReadAllAsync((state, version) => worker.SendAsync(state), ct);
worker.Complete();
await worker.Completion;
}
}
}

2
tools/Migrate_01/RebuildOptions.cs

@ -15,8 +15,6 @@ namespace Migrate_01
public bool Contents { get; set; } public bool Contents { get; set; }
public bool Indices { get; set; }
public bool Rules { get; set; } public bool Rules { get; set; }
public bool Schemas { get; set; } public bool Schemas { get; set; }

11
tools/Migrate_01/RebuildRunner.cs

@ -8,7 +8,6 @@
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Migrate_01.Migrations;
using Squidex.Infrastructure; using Squidex.Infrastructure;
namespace Migrate_01 namespace Migrate_01
@ -16,18 +15,15 @@ namespace Migrate_01
public sealed class RebuildRunner public sealed class RebuildRunner
{ {
private readonly Rebuilder rebuilder; private readonly Rebuilder rebuilder;
private readonly BuildFullTextIndices fullTextIndices;
private readonly RebuildOptions rebuildOptions; private readonly RebuildOptions rebuildOptions;
public RebuildRunner(Rebuilder rebuilder, BuildFullTextIndices fullTextIndices, IOptions<RebuildOptions> rebuildOptions) public RebuildRunner(Rebuilder rebuilder, IOptions<RebuildOptions> rebuildOptions)
{ {
Guard.NotNull(rebuilder, nameof(rebuilder)); Guard.NotNull(rebuilder, nameof(rebuilder));
Guard.NotNull(rebuildOptions, nameof(rebuildOptions)); Guard.NotNull(rebuildOptions, nameof(rebuildOptions));
Guard.NotNull(fullTextIndices, nameof(fullTextIndices));
this.rebuilder = rebuilder; this.rebuilder = rebuilder;
this.rebuildOptions = rebuildOptions.Value; this.rebuildOptions = rebuildOptions.Value;
this.fullTextIndices = fullTextIndices;
} }
public async Task RunAsync(CancellationToken ct) public async Task RunAsync(CancellationToken ct)
@ -56,11 +52,6 @@ namespace Migrate_01
{ {
await rebuilder.RebuildContentAsync(ct); await rebuilder.RebuildContentAsync(ct);
} }
if (rebuildOptions.Indices)
{
await fullTextIndices.UpdateAsync(ct);
}
} }
} }
} }

Loading…
Cancel
Save