Browse Source

Performance improvement.

pull/349/head v2.0-beta1
Sebastian 7 years ago
parent
commit
d56fc32ca6
  1. 11
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs
  2. 28
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs
  3. 6
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs

11
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentCollection.cs

@ -56,7 +56,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
return "State_Contents"; return "State_Contents";
} }
public async Task<IResultList<IContentEntity>> QueryAsync(IAppEntity app, ISchemaEntity schema, Query query, List<Guid> ids, Status[] status = null, bool useDraft = false) public async Task<IResultList<IContentEntity>> QueryAsync(IAppEntity app, ISchemaEntity schema, Query query, List<Guid> ids, Status[] status, bool useDraft)
{ {
try try
{ {
@ -67,6 +67,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
var contentCount = Collection.Find(filter).CountDocumentsAsync(); var contentCount = Collection.Find(filter).CountDocumentsAsync();
var contentItems = var contentItems =
Collection.Find(filter) Collection.Find(filter)
.WithoutDraft(useDraft)
.ContentTake(query) .ContentTake(query)
.ContentSkip(query) .ContentSkip(query)
.ContentSort(query) .ContentSort(query)
@ -94,11 +95,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
} }
} }
public async Task<IResultList<IContentEntity>> QueryAsync(IAppEntity app, ISchemaEntity schema, HashSet<Guid> ids, Status[] status = null) public async Task<IResultList<IContentEntity>> QueryAsync(IAppEntity app, ISchemaEntity schema, HashSet<Guid> ids, Status[] status, bool useDraft)
{ {
var find = Collection.Find(FilterFactory.Build(schema.Id, ids, status)); var find = Collection.Find(FilterFactory.Build(schema.Id, ids, status));
var contentItems = find.ToListAsync(); var contentItems = find.WithoutDraft(useDraft).ToListAsync();
var contentCount = find.CountDocumentsAsync(); var contentCount = find.CountDocumentsAsync();
await Task.WhenAll(contentItems, contentCount); await Task.WhenAll(contentItems, contentCount);
@ -111,11 +112,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
return ResultList.Create<IContentEntity>(contentCount.Result, contentItems.Result); return ResultList.Create<IContentEntity>(contentCount.Result, contentItems.Result);
} }
public async Task<IContentEntity> FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, Status[] status = null) public async Task<IContentEntity> FindContentAsync(IAppEntity app, ISchemaEntity schema, Guid id, Status[] status, bool useDraft)
{ {
var find = Collection.Find(FilterFactory.Build(schema.Id, id, status)); var find = Collection.Find(FilterFactory.Build(schema.Id, id, status));
var contentEntity = await find.FirstOrDefaultAsync(); var contentEntity = await find.WithoutDraft(useDraft).FirstOrDefaultAsync();
contentEntity?.ParseData(schema.SchemaDef, Serializer); contentEntity?.ParseData(schema.SchemaDef, Serializer);

28
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository.cs

@ -55,7 +55,7 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
{ {
using (Profiler.TraceMethod<MongoContentRepository>("QueryAsyncByQuery")) using (Profiler.TraceMethod<MongoContentRepository>("QueryAsyncByQuery"))
{ {
var useDraft = RequiresPublished(status); var useDraft = UseDraft(status);
var fullTextIds = await indexer.SearchAsync(query.FullText, app, schema.Id, useDraft); var fullTextIds = await indexer.SearchAsync(query.FullText, app, schema.Id, useDraft);
@ -72,14 +72,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
{ {
using (Profiler.TraceMethod<MongoContentRepository>("QueryAsyncByIds")) using (Profiler.TraceMethod<MongoContentRepository>("QueryAsyncByIds"))
{ {
if (RequiresPublished(status)) var useDraft = UseDraft(status);
{
return await contents.QueryAsync(app, schema, ids); return await contents.QueryAsync(app, schema, ids, status, useDraft);
}
else
{
return await contents.QueryAsync(app, schema, ids, status);
}
} }
} }
@ -87,14 +82,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
{ {
using (Profiler.TraceMethod<MongoContentRepository>()) using (Profiler.TraceMethod<MongoContentRepository>())
{ {
if (RequiresPublished(status)) var useDraft = UseDraft(status);
{
return await contents.FindContentAsync(app, schema, id); return await contents.FindContentAsync(app, schema, id, status, useDraft);
}
else
{
return await contents.FindContentAsync(app, schema, id, status);
}
} }
} }
@ -132,9 +122,9 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
return database.DropCollectionAsync("States_Contents_Archive"); return database.DropCollectionAsync("States_Contents_Archive");
} }
private static bool RequiresPublished(Status[] status) private static bool UseDraft(Status[] status)
{ {
return status?.Length == 1 && status[0] == Status.Published; return !(status?.Length == 1 && status[0] == Status.Published);
} }
} }
} }

6
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Visitors/FilterFactory.cs

@ -14,6 +14,7 @@ using MongoDB.Driver;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.GenerateEdmSchema; using Squidex.Domain.Apps.Core.GenerateEdmSchema;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure.MongoDb;
using Squidex.Infrastructure.MongoDb.Queries; using Squidex.Infrastructure.MongoDb.Queries;
using Squidex.Infrastructure.Queries; using Squidex.Infrastructure.Queries;
@ -109,6 +110,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents.Visitors
return cursor.Skip(query); return cursor.Skip(query);
} }
public static IFindFluent<MongoContentEntity, MongoContentEntity> WithoutDraft(this IFindFluent<MongoContentEntity, MongoContentEntity> cursor, bool useDraft)
{
return !useDraft ? cursor.Not(x => x.DataDraftByIds, x => x.IsDeleted) : cursor;
}
public static FilterDefinition<MongoContentEntity> Build(Guid schemaId, Guid id, Status[] status) public static FilterDefinition<MongoContentEntity> Build(Guid schemaId, Guid id, Status[] status)
{ {
return CreateFilter(schemaId, new List<Guid> { id }, status, null); return CreateFilter(schemaId, new List<Guid> { id }, status, null);

Loading…
Cancel
Save