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;
}
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]);
}
[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]
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)
{
Plan = @event.PlanId == null ? null : new AppPlan(@event.Actor, @event.PlanId);
Plan = AppPlan.Build(@event.Actor, @event.PlanId);
}
protected void On(AppContributorAssigned @event)
@ -117,7 +117,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
protected void On(AppLanguageAdded @event)
{
LanguagesConfig = LanguagesConfig.Set(new LanguageConfig(@event.Language));
LanguagesConfig = LanguagesConfig.Set(@event.Language);
}
protected void On(AppLanguageRemoved @event)
@ -127,7 +127,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.State
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)
{

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);
TotalSize += @event.FileSize;
AppId = @event.AppId;
}
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);
DataDraft = @event.Data;
}
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;
UpdateData(null, @event.Data, false);
}
protected void On(ContentChangesPublished @event)
{
ScheduleJob = null;
Data = DataDraft;
IsPending = false;
UpdateData(DataDraft, null, false);
}
protected void On(ContentStatusChanged @event)
@ -91,12 +65,25 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
if (@event.Status == Status.Published)
{
Data = DataDraft;
IsPending = false;
UpdateData(DataDraft, null, 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)
{
ScheduleJob = null;
@ -118,5 +105,20 @@ namespace Squidex.Domain.Apps.Entities.Contents.State
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;
}
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)
{
try
@ -126,7 +107,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
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)

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

@ -15,8 +15,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{
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);
}
}

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 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;
}
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);
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
{
var isPublished = IsForPublished(docId);
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);
}
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);
content.Index(data.Value.DataDraft, data.Value.Data, onlyDraft);
content.Index(data.Value.Data, onlyDraft);
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>());
}
[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]
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 }));
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();
}
@ -77,7 +65,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
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();
}
@ -88,7 +76,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
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();
}

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

@ -211,8 +211,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
new ContentFieldData()
.AddValue("en", "City and Surroundings und sonstiges"));
await sut.IndexAsync(ids1[0], new IndexData { DataDraft = germanData }, true);
await sut.IndexAsync(ids2[0], new IndexData { DataDraft = englishData }, true);
await sut.IndexAsync(ids1[0], new IndexData { Data = germanData }, true);
await sut.IndexAsync(ids2[0], new IndexData { Data = englishData }, true);
}
private async Task AddInvariantContent(string text1, string text2, bool onlyDraft = false)
@ -229,8 +229,8 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
new ContentFieldData()
.AddValue("iv", text2));
await sut.IndexAsync(ids1[0], new IndexData { DataDraft = data1 }, onlyDraft);
await sut.IndexAsync(ids2[0], new IndexData { DataDraft = data2 }, onlyDraft);
await sut.IndexAsync(ids1[0], new IndexData { Data = data1 }, onlyDraft);
await sut.IndexAsync(ids2[0], new IndexData { Data = data2 }, onlyDraft);
}
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 Indices { get; set; }
public bool Rules { get; set; }
public bool Schemas { get; set; }

11
tools/Migrate_01/RebuildRunner.cs

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

Loading…
Cancel
Save