Files
Umbraco-CMS/src/Umbraco.Infrastructure/Examine/MediaIndexPopulator.cs
2021-02-12 10:57:50 +01:00

74 lines
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Examine;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Infrastructure.Examine
{
/// <summary>
/// Performs the data lookups required to rebuild a media index
/// </summary>
public class MediaIndexPopulator : IndexPopulator<IUmbracoContentIndex>
{
private readonly int? _parentId;
private readonly IMediaService _mediaService;
private readonly IValueSetBuilder<IMedia> _mediaValueSetBuilder;
/// <summary>
/// Default constructor to lookup all content data
/// </summary>
/// <param name="mediaService"></param>
/// <param name="mediaValueSetBuilder"></param>
public MediaIndexPopulator(IMediaService mediaService, IValueSetBuilder<IMedia> mediaValueSetBuilder)
: this(null, mediaService, mediaValueSetBuilder)
{
}
/// <summary>
/// Optional constructor allowing specifying custom query parameters
/// </summary>
/// <param name="parentId"></param>
/// <param name="mediaService"></param>
/// <param name="mediaValueSetBuilder"></param>
public MediaIndexPopulator(int? parentId, IMediaService mediaService, IValueSetBuilder<IMedia> mediaValueSetBuilder)
{
_parentId = parentId;
_mediaService = mediaService;
_mediaValueSetBuilder = mediaValueSetBuilder;
}
protected override void PopulateIndexes(IReadOnlyList<IIndex> indexes)
{
if (indexes.Count == 0) return;
const int pageSize = 10000;
var pageIndex = 0;
var mediaParentId = -1;
if (_parentId.HasValue && _parentId.Value > 0)
{
mediaParentId = _parentId.Value;
}
IMedia[] media;
do
{
media = _mediaService.GetPagedDescendants(mediaParentId, pageIndex, pageSize, out var total).ToArray();
if (media.Length > 0)
{
// ReSharper disable once PossibleMultipleEnumeration
foreach (var index in indexes)
index.IndexItems(_mediaValueSetBuilder.GetValueSets(media));
}
pageIndex++;
} while (media.Length == pageSize);
}
}
}