Exemplo n.º 1
0
        private async Task RefreshEntriesAsync(LocalizationStateDocument state)
        {
            if (_stateIdentifier == state.Identifier)
            {
                return;
            }

            await _semaphore.WaitAsync();

            try
            {
                if (_stateIdentifier != state.Identifier)
                {
                    var indexes = await Session
                                  .QueryIndex <LocalizedContentItemIndex>(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.Culture == null)
                                          .SelectMany(i => _localizations.Values.Where(e =>
                                                                                       // The item was removed.
                                                                                       ((!i.Published && !i.Latest) ||
                                                                                       // The part was removed.
                                                                                        (i.Culture == null && i.Published) ||
                                                                                       // The item was unpublished.
                                                                                        (!i.Published && e.DocumentId == i.DocumentId)) &&
                                                                                       (e.ContentItemId == i.ContentItemId)));

                    var entriesToAdd = indexes.
                                       Where(i => i.Published && i.Culture != null)
                                       .Select(i => new LocalizationEntry
                    {
                        DocumentId      = i.DocumentId,
                        ContentItemId   = i.ContentItemId,
                        LocalizationSet = i.LocalizationSet,
                        Culture         = i.Culture.ToLowerInvariant()
                    });

                    RemoveEntries(entriesToRemove);
                    AddEntries(entriesToAdd);

                    _lastIndexId     = indexes.LastOrDefault()?.Id ?? 0;
                    _stateIdentifier = state.Identifier;
                }
            }
            finally
            {
                _semaphore.Release();
            }
        }
        private async Task RefreshEntriesAsync(LocalizationStateDocument state)
        {
            if (_stateIdentifier == state.Identifier)
            {
                return;
            }

            await _semaphore.WaitAsync();

            try
            {
                if (_stateIdentifier != state.Identifier)
                {
                    var indexes = await Session.QueryIndex <LocalizedContentItemIndex>(i => i.Id > _lastIndexId).ListAsync();

                    RemoveEntries(indexes.Where(i => !i.Published)
                                  .Select(i => new LocalizationEntry
                    {
                        ContentItemId   = i.ContentItemId,
                        LocalizationSet = i.LocalizationSet,
                        Culture         = i.Culture.ToLowerInvariant()
                    }));

                    AddEntries(indexes.Where(i => i.Published)
                               .Select(i => new LocalizationEntry
                    {
                        ContentItemId   = i.ContentItemId,
                        LocalizationSet = i.LocalizationSet,
                        Culture         = i.Culture.ToLowerInvariant()
                    }));

                    _lastIndexId     = indexes.LastOrDefault()?.Id ?? 0;
                    _stateIdentifier = state.Identifier;
                }
            }
            finally
            {
                _semaphore.Release();
            }
        }