using System.Collections.Generic; using System.Linq; using Examine; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Services; namespace Umbraco.Examine { /// /// Performs the data lookups required to rebuild a media index /// public class MediaIndexPopulator : IndexPopulator { private readonly int? _parentId; private readonly IMediaService _mediaService; private readonly IValueSetBuilder _mediaValueSetBuilder; /// /// Default constructor to lookup all content data /// /// /// public MediaIndexPopulator(IMediaService mediaService, IValueSetBuilder mediaValueSetBuilder) : this(null, mediaService, mediaValueSetBuilder) { } /// /// Optional constructor allowing specifying custom query parameters /// /// /// /// public MediaIndexPopulator(int? parentId, IMediaService mediaService, IValueSetBuilder mediaValueSetBuilder) { _parentId = parentId; _mediaService = mediaService; _mediaValueSetBuilder = mediaValueSetBuilder; } protected override void PopulateIndexes(IReadOnlyList 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); } } }