V10: fix build warnings infrastructure (#12369)
* Run code cleanup * Run dotnet format * Start manual fixes * Manual fixing of warnings * Fix nullability in columnalias * Fix tests * Fix up after merge * Start updating after review * Update editorconfig to contain new static & const rules * Fix up editorconfig to not contain duplicate rules * Fix up static member names * Fix up according to review * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.DistributedCache.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Repositories.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Repositories.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ContentValueSetValidator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/ExamineUmbracoIndexingHandler.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Examine/PublishedContentIndexPopulator.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Extensions/InstanceIdentifiableExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/HostedServices/RecurringHostedServiceBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/HostedServices/ReportSiteTask.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Logging/Serilog/LoggerConfigExtensions.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Macros/MacroTagParser.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Migrations/Expressions/Alter/Table/IAlterTableColumnOptionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_0_0/AddMemberPropertiesAsColumns.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/ModelsBuilder/Building/TextBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Dtos/ExternalLoginDto.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/AccessMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/AuditEntryMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/MediaMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/MemberMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyGroupMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/PropertyTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Mappers/RelationTypeMapper.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/NPocoMapperCollectionBuilder.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Querying/ExpressionVisitorBase.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Update src/Umbraco.Infrastructure/Persistence/Repositories/Implement/ExternalLoginRepository.cs Co-authored-by: Mole <nikolajlauridsen@protonmail.ch> * Fix [..] to substring * Fix after merge with 10/dev * Fox ContentValueSetValidator.cs * Update LoggerConfigExtensions Co-authored-by: Nikolaj Geisle <niko737@edu.ucl.dk> Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
This commit is contained in:
@@ -1,6 +1,3 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Umbraco.Cms.Core;
|
||||
using Umbraco.Cms.Core.Cache;
|
||||
using Umbraco.Cms.Core.Events;
|
||||
using Umbraco.Cms.Core.Models;
|
||||
@@ -10,151 +7,155 @@ using Umbraco.Cms.Core.Services.Changes;
|
||||
using Umbraco.Cms.Core.Sync;
|
||||
using Umbraco.Extensions;
|
||||
|
||||
namespace Umbraco.Cms.Infrastructure.Search
|
||||
{
|
||||
public sealed class ContentIndexingNotificationHandler : INotificationHandler<ContentCacheRefresherNotification>
|
||||
{
|
||||
private readonly IUmbracoIndexingHandler _umbracoIndexingHandler;
|
||||
private readonly IContentService _contentService;
|
||||
namespace Umbraco.Cms.Infrastructure.Search;
|
||||
|
||||
public ContentIndexingNotificationHandler(IUmbracoIndexingHandler umbracoIndexingHandler, IContentService contentService)
|
||||
public sealed class ContentIndexingNotificationHandler : INotificationHandler<ContentCacheRefresherNotification>
|
||||
{
|
||||
private readonly IContentService _contentService;
|
||||
private readonly IUmbracoIndexingHandler _umbracoIndexingHandler;
|
||||
|
||||
public ContentIndexingNotificationHandler(
|
||||
IUmbracoIndexingHandler umbracoIndexingHandler,
|
||||
IContentService contentService)
|
||||
{
|
||||
_umbracoIndexingHandler =
|
||||
umbracoIndexingHandler ?? throw new ArgumentNullException(nameof(umbracoIndexingHandler));
|
||||
_contentService = contentService ?? throw new ArgumentNullException(nameof(contentService));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates indexes based on content changes
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
public void Handle(ContentCacheRefresherNotification args)
|
||||
{
|
||||
if (!_umbracoIndexingHandler.Enabled)
|
||||
{
|
||||
_umbracoIndexingHandler = umbracoIndexingHandler ?? throw new ArgumentNullException(nameof(umbracoIndexingHandler));
|
||||
_contentService = contentService ?? throw new ArgumentNullException(nameof(contentService));
|
||||
return;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Updates indexes based on content changes
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="args"></param>
|
||||
public void Handle(ContentCacheRefresherNotification args)
|
||||
if (Suspendable.ExamineEvents.CanIndex == false)
|
||||
{
|
||||
if (!_umbracoIndexingHandler.Enabled)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (Suspendable.ExamineEvents.CanIndex == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.MessageType != MessageType.RefreshByPayload)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
if (args.MessageType != MessageType.RefreshByPayload)
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
|
||||
// Used to track permanent deletions so we can bulk delete from the index
|
||||
// when needed. For example, when emptying the recycle bin, else it will
|
||||
// individually update the index which will be much slower.
|
||||
HashSet<int>? deleteBatch = null;
|
||||
// Used to track permanent deletions so we can bulk delete from the index
|
||||
// when needed. For example, when emptying the recycle bin, else it will
|
||||
// individually update the index which will be much slower.
|
||||
HashSet<int>? deleteBatch = null;
|
||||
|
||||
foreach (var payload in (ContentCacheRefresher.JsonPayload[])args.MessageObject)
|
||||
foreach (ContentCacheRefresher.JsonPayload payload in (ContentCacheRefresher.JsonPayload[])args.MessageObject)
|
||||
{
|
||||
if (payload.ChangeTypes.HasType(TreeChangeTypes.Remove))
|
||||
{
|
||||
if (payload.ChangeTypes.HasType(TreeChangeTypes.Remove))
|
||||
if (deleteBatch == null)
|
||||
{
|
||||
if (deleteBatch == null)
|
||||
{
|
||||
deleteBatch = new HashSet<int>();
|
||||
}
|
||||
|
||||
deleteBatch.Add(payload.Id);
|
||||
deleteBatch = new HashSet<int>();
|
||||
}
|
||||
else if (payload.ChangeTypes.HasType(TreeChangeTypes.RefreshAll))
|
||||
{
|
||||
// ExamineEvents does not support RefreshAll
|
||||
// just ignore that payload
|
||||
// so what?!
|
||||
|
||||
// TODO: Rebuild the index at this point?
|
||||
deleteBatch.Add(payload.Id);
|
||||
}
|
||||
else if (payload.ChangeTypes.HasType(TreeChangeTypes.RefreshAll))
|
||||
{
|
||||
// ExamineEvents does not support RefreshAll
|
||||
// just ignore that payload
|
||||
// so what?!
|
||||
|
||||
// TODO: Rebuild the index at this point?
|
||||
}
|
||||
|
||||
// RefreshNode or RefreshBranch (maybe trashed)
|
||||
else
|
||||
{
|
||||
if (deleteBatch != null && deleteBatch.Contains(payload.Id))
|
||||
{
|
||||
// the same node has already been deleted, to ensure ordering is
|
||||
// handled, we'll need to execute all queued deleted items now
|
||||
// and reset the deleted items list.
|
||||
_umbracoIndexingHandler.DeleteIndexForEntities(deleteBatch, false);
|
||||
deleteBatch = null;
|
||||
}
|
||||
else // RefreshNode or RefreshBranch (maybe trashed)
|
||||
|
||||
// don't try to be too clever - refresh entirely
|
||||
// there has to be race conditions in there ;-(
|
||||
IContent? content = _contentService.GetById(payload.Id);
|
||||
if (content == null)
|
||||
{
|
||||
if (deleteBatch != null && deleteBatch.Contains(payload.Id))
|
||||
// gone fishing, remove entirely from all indexes (with descendants)
|
||||
_umbracoIndexingHandler.DeleteIndexForEntity(payload.Id, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
IContent? published = null;
|
||||
if (content.Published && _contentService.IsPathPublished(content))
|
||||
{
|
||||
published = content;
|
||||
}
|
||||
|
||||
if (published == null)
|
||||
{
|
||||
_umbracoIndexingHandler.DeleteIndexForEntity(payload.Id, true);
|
||||
}
|
||||
|
||||
// just that content
|
||||
_umbracoIndexingHandler.ReIndexForContent(content, published != null);
|
||||
|
||||
// branch
|
||||
if (payload.ChangeTypes.HasType(TreeChangeTypes.RefreshBranch))
|
||||
{
|
||||
List<int>? masked = published == null ? null : new List<int>();
|
||||
const int pageSize = 500;
|
||||
var page = 0;
|
||||
var total = long.MaxValue;
|
||||
while (page * pageSize < total)
|
||||
{
|
||||
// the same node has already been deleted, to ensure ordering is
|
||||
// handled, we'll need to execute all queued deleted items now
|
||||
// and reset the deleted items list.
|
||||
_umbracoIndexingHandler.DeleteIndexForEntities(deleteBatch, false);
|
||||
deleteBatch = null;
|
||||
}
|
||||
// order by shallowest to deepest, this allows us to check it's published state without checking every item
|
||||
IEnumerable<IContent> descendants = _contentService.GetPagedDescendants(content.Id, page++, pageSize, out total, ordering: Ordering.By("Path"));
|
||||
|
||||
// don't try to be too clever - refresh entirely
|
||||
// there has to be race conditions in there ;-(
|
||||
|
||||
var content = _contentService.GetById(payload.Id);
|
||||
if (content == null)
|
||||
{
|
||||
// gone fishing, remove entirely from all indexes (with descendants)
|
||||
_umbracoIndexingHandler.DeleteIndexForEntity(payload.Id, false);
|
||||
continue;
|
||||
}
|
||||
|
||||
IContent? published = null;
|
||||
if (content.Published && _contentService.IsPathPublished(content))
|
||||
{
|
||||
published = content;
|
||||
}
|
||||
|
||||
if (published == null)
|
||||
{
|
||||
_umbracoIndexingHandler.DeleteIndexForEntity(payload.Id, true);
|
||||
}
|
||||
|
||||
// just that content
|
||||
_umbracoIndexingHandler.ReIndexForContent(content, published != null);
|
||||
|
||||
// branch
|
||||
if (payload.ChangeTypes.HasType(TreeChangeTypes.RefreshBranch))
|
||||
{
|
||||
var masked = published == null ? null : new List<int>();
|
||||
const int pageSize = 500;
|
||||
var page = 0;
|
||||
var total = long.MaxValue;
|
||||
while (page * pageSize < total)
|
||||
foreach (IContent descendant in descendants)
|
||||
{
|
||||
var descendants = _contentService.GetPagedDescendants(content.Id, page++, pageSize, out total,
|
||||
//order by shallowest to deepest, this allows us to check it's published state without checking every item
|
||||
ordering: Ordering.By("Path", Direction.Ascending));
|
||||
published = null;
|
||||
|
||||
foreach (var descendant in descendants)
|
||||
// else everything is masked
|
||||
if (masked != null)
|
||||
{
|
||||
published = null;
|
||||
if (masked != null) // else everything is masked
|
||||
if (masked.Contains(descendant.ParentId) || !descendant.Published)
|
||||
{
|
||||
if (masked.Contains(descendant.ParentId) || !descendant.Published)
|
||||
{
|
||||
masked.Add(descendant.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
published = descendant;
|
||||
}
|
||||
masked.Add(descendant.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
published = descendant;
|
||||
}
|
||||
|
||||
_umbracoIndexingHandler.ReIndexForContent(descendant, published != null);
|
||||
}
|
||||
|
||||
_umbracoIndexingHandler.ReIndexForContent(descendant, published != null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE
|
||||
//
|
||||
// DeleteIndexForEntity is handled by UmbracoContentIndexer.DeleteFromIndex() which takes
|
||||
// care of also deleting the descendants
|
||||
//
|
||||
// ReIndexForContent is NOT taking care of descendants so we have to reload everything
|
||||
// again in order to process the branch - we COULD improve that by just reloading the
|
||||
// XML from database instead of reloading content & re-serializing!
|
||||
//
|
||||
// BUT ... pretty sure it is! see test "Index_Delete_Index_Item_Ensure_Heirarchy_Removed"
|
||||
}
|
||||
|
||||
if (deleteBatch != null)
|
||||
{
|
||||
// process the delete batch
|
||||
_umbracoIndexingHandler.DeleteIndexForEntities(deleteBatch, false);
|
||||
}
|
||||
// NOTE
|
||||
//
|
||||
// DeleteIndexForEntity is handled by UmbracoContentIndexer.DeleteFromIndex() which takes
|
||||
// care of also deleting the descendants
|
||||
//
|
||||
// ReIndexForContent is NOT taking care of descendants so we have to reload everything
|
||||
// again in order to process the branch - we COULD improve that by just reloading the
|
||||
// XML from database instead of reloading content & re-serializing!
|
||||
//
|
||||
// BUT ... pretty sure it is! see test "Index_Delete_Index_Item_Ensure_Heirarchy_Removed"
|
||||
}
|
||||
|
||||
if (deleteBatch != null)
|
||||
{
|
||||
// process the delete batch
|
||||
_umbracoIndexingHandler.DeleteIndexForEntities(deleteBatch, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user