예제 #1
0
        private FSDirectory createKeywordsFrom(CardRepository repository)
        {
            if (!repository.IsLoadingComplete)
            {
                throw new InvalidOperationException($"{nameof(CardRepository)} must be loaded first");
            }

            var keywordsList = new List <CardKeywords>(repository.Cards.Count);

            foreach (var set in repository.SetsByCode.Values)
            {
                if (!FilterSet(set))
                {
                    continue;
                }

                var setKeywords = new CardKeywords[set.Cards.Count];

                IndexUtils.For(0, set.Cards.Count, i => setKeywords[i] = set.Cards[i].GetAllKeywords());

                keywordsList.AddRange(setKeywords);

                SetsCount++;
                LoadingProgress?.Invoke();
            }

            _version.CreateDirectory();

            var fsIndex           = FSDirectory.Open(_version.Directory);
            var indexWriterConfig = IndexUtils.CreateWriterConfig(new LowercaseKeywordAnalyzer());

            using (var writer = new IndexWriter(fsIndex, indexWriterConfig))
            {
                IndexUtils.ForEach(keywordsList,
                                   keyword =>
                {
                    var doc = keyword.ToDocument();
                    // ReSharper disable once AccessToDisposedClosure
                    writer.AddDocument(doc);
                });
            }

            _version.SetIsUpToDate();

            return(fsIndex);
        }
예제 #2
0
 public CardKeywords GetAllKeywords() => _keywords ?? (_keywords = new CardKeywords(this));