private async Task RefreshEntriesAsync(AutorouteStateDocument state) { if (_stateIdentifier == state.Identifier) { return; } await _semaphore.WaitAsync(); try { if (_stateIdentifier != state.Identifier) { var indexes = await Session .QueryIndex <AutoroutePartIndex>(i => i.Id > _lastIndexId) .OrderBy(i => i.Id) .ListAsync(); // A draft is indexed to check for conflicts, and to remove an entry, but only if an item is unpublished, // so only if the entry 'DocumentId' matches, this because when a draft is saved more than once, the index // is not updated for the published version that may be already scanned, so the entry may not be re-added. var entriesToRemove = indexes .Where(i => !i.Published || i.Path == null) .SelectMany(i => _paths.Values.Where(e => // The item was removed. ((!i.Published && !i.Latest) || // The part was disabled or removed. (i.Path == null && i.Published) || // The item was unpublished. (!i.Published && e.DocumentId == i.DocumentId)) && (e.ContentItemId == i.ContentItemId || e.ContainedContentItemId == i.ContentItemId))); var entriesToAdd = indexes .Where(i => i.Published && i.Path != null) .Select(i => new AutorouteEntry(i.ContentItemId, i.Path, i.ContainedContentItemId, i.JsonPath) { DocumentId = i.DocumentId }); RemoveEntries(entriesToRemove); AddEntries(entriesToAdd); _lastIndexId = indexes.LastOrDefault()?.Id ?? 0; _stateIdentifier = state.Identifier; } } finally { _semaphore.Release(); } }
private async Task RefreshEntriesAsync(AutorouteStateDocument state) { if (_stateIdentifier == state.Identifier) { return; } await _semaphore.WaitAsync(); try { if (_stateIdentifier != state.Identifier) { var indexes = await Session.QueryIndex <AutoroutePartIndex>(i => i.Id > _lastIndexId).ListAsync(); var contentItemIdsToRemove = indexes .Where(i => !i.Published || i.Path == null) .Select(i => i.ContentItemId) .Distinct(); var entriesToRemove = contentItemIdsToRemove.SelectMany(id => _paths.Values .Where(e => e.ContentItemId == id || e.ContainedContentItemId == id)); var entriesToAdd = indexes .Where(i => i.Published && i.Path != null) .Select(i => new AutorouteEntry(i.ContentItemId, i.Path, i.ContainedContentItemId, i.JsonPath)); RemoveEntries(entriesToRemove); AddEntries(entriesToAdd); _lastIndexId = indexes.LastOrDefault()?.Id ?? 0; _stateIdentifier = state.Identifier; } } finally { _semaphore.Release(); } }