public static void CreateNewEmptyIndex(Lucene.Net.Store.Directory directory)
 {
     using (IndexWriter indexWriter = CreateIndexWriter(directory, true))
     {
         indexWriter.Commit(PackageIndexing.CreateCommitMetadata(DateTime.MinValue, 0, 0, "creation"));
     }
 }
        private static void ApplyAdds(List <int> packageKeys, Func <int, IndexDocumentData> fetch, Lucene.Net.Store.Directory directory, TextWriter log, PerfEventTracker perfTracker, IEnumerable <FrameworkName> projectFxs)
        {
            log.WriteLine("ApplyAdds");

            // Collect all the packages
            var packages = packageKeys.Select(k => fetch(k));

            using (IndexWriter indexWriter = CreateIndexWriter(directory, false))
            {
                IDictionary <string, string> commitUserData;
                var dirtyDocuments = new List <FacetedDocument>();
                using (var reader = indexWriter.GetReader())
                {
                    commitUserData = reader.CommitUserData;
                    foreach (var group in packages.GroupBy(p => p.Package.PackageRegistration.Id))
                    {
                        var newDirtyDocs = DetermineDirtyDocuments(projectFxs, perfTracker, reader, group.Key, group);
                        dirtyDocuments.AddRange(newDirtyDocs);
                    }
                }

                WriteDirtyDocuments(dirtyDocuments, indexWriter, perfTracker);

                string lastEditsIndexTime = commitUserData["last-edits-index-time"];
                if (lastEditsIndexTime == null)
                {
                    //  this should never happen but if it did Lucene would throw
                    lastEditsIndexTime = DateTime.MinValue.ToString();
                }

                log.WriteLine("Commit {0} adds", packageKeys.Count);
                indexWriter.Commit(PackageIndexing.CreateCommitMetadata(lastEditsIndexTime, packageKeys.Max(), packageKeys.Count, "add"));
            }
        }
        private static void AddToIndex(Lucene.Net.Store.Directory directory, List <IndexDocumentData> rangeToIndex, TextWriter log, IEnumerable <FrameworkName> projectFxs, PerfEventTracker perfTracker)
        {
            log.WriteLine("begin AddToIndex");

            int highestPackageKey = -1;

            var groups = rangeToIndex.GroupBy(d => d.Package.PackageRegistration.Id).ToList();

            // Collect documents to change
            var dirtyDocs = new List <FacetedDocument>();

            using (var reader = IndexReader.Open(directory, readOnly: true))
                using (perfTracker.TrackEvent("CalculateChanges", ""))
                {
                    foreach (var group in groups)
                    {
                        var newDirtyDocs = DetermineDirtyDocuments(projectFxs, perfTracker, reader, group.Key, group);

                        // (Re-)Add any dirty documents to the index
                        dirtyDocs.AddRange(newDirtyDocs);
                    }
                }

            using (IndexWriter indexWriter = CreateIndexWriter(directory, create: false))
            {
                WriteDirtyDocuments(dirtyDocs, indexWriter, perfTracker);

                highestPackageKey = rangeToIndex.Max(i => i.Package.Key);

                log.WriteLine("about to commit {0} packages", rangeToIndex.Count);

                IDictionary <string, string> commitUserData = indexWriter.GetReader().CommitUserData;

                string lastEditsIndexTime = commitUserData["last-edits-index-time"];

                if (lastEditsIndexTime == null)
                {
                    //  this should never happen but if it did Lucene would throw
                    lastEditsIndexTime = DateTime.MinValue.ToString();
                }

                indexWriter.Commit(PackageIndexing.CreateCommitMetadata(lastEditsIndexTime, highestPackageKey, rangeToIndex.Count, "add"));

                log.WriteLine("commit done");
            }

            log.WriteLine("end AddToIndex");
        }