예제 #1
0
        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();
            }
        }
예제 #2
0
        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();
            }
        }