protected PackageSearcherManager(string indexName, Lucene.Net.Store.Directory directory, Rankings rankings, DownloadCounts downloadCounts, FrameworksList frameworks) : base(directory) { Rankings = rankings; DownloadCounts = downloadCounts; Frameworks = frameworks; IndexName = indexName; _currentDownloadCounts = new IndexData <IDictionary <int, DownloadCountRecord> >( "DownloadCounts", DownloadCounts.Path, DownloadCounts.Load, DownloadCountRefreshRate); _currentRankings = new IndexData <IDictionary <string, IDictionary <string, int> > >( "Rankings", Rankings.Path, Rankings.Load, RankingRefreshRate); _currentFrameworkList = new IndexData <IList <FrameworkName> >( "FrameworkList", Frameworks.Path, Frameworks.Load, FrameworksRefreshRate); Id = Guid.NewGuid(); // Used for identifying changes to the searcher manager at runtime. }
// this function will incrementally build an index from the gallery using a high water mark stored in the commit metadata // this function is useful for building a fresh index as in that case it is more efficient than diff-ing approach public static void RebuildIndex(string sqlConnectionString, Lucene.Net.Store.Directory directory, FrameworksList frameworks, TextWriter log = null, PerfEventTracker perfTracker = null) { perfTracker = perfTracker ?? new PerfEventTracker(); log = log ?? DefaultTraceWriter; Stopwatch sw = new Stopwatch(); sw.Start(); using (perfTracker.TrackEvent("RebuildIndex", String.Empty)) { // Empty the index, we're rebuilding CreateNewEmptyIndex(directory); var projectFxs = frameworks.Load(); log.WriteLine("get curated feeds by PackageRegistration"); IDictionary <int, IEnumerable <string> > feeds = GalleryExport.GetFeedsByPackageRegistration(sqlConnectionString, log, verbose: false); int highestPackageKey = 0; while (true) { log.WriteLine("get the checksums from the gallery"); IDictionary <int, int> checksums = GalleryExport.FetchGalleryChecksums(sqlConnectionString, highestPackageKey); log.WriteLine("get packages from gallery where the Package.Key > {0}", highestPackageKey); List <Package> packages = GalleryExport.GetPublishedPackagesSince(sqlConnectionString, highestPackageKey, log, verbose: false); if (packages.Count == 0) { break; } log.WriteLine("associate the feeds and checksum data with each packages"); List <IndexDocumentData> indexDocumentData = MakeIndexDocumentData(packages, feeds, checksums); highestPackageKey = indexDocumentData.Max(d => d.Package.Key); AddPackagesToIndex(indexDocumentData, directory, log, projectFxs, perfTracker); // Summarize performance // (Save some time by not bothering if the log is "null") if (!ReferenceEquals(TextWriter.Null, log) && !ReferenceEquals(PerfEventTracker.Null, perfTracker)) { SummarizePerf(log, perfTracker); } } } SummarizePerf(log, perfTracker); sw.Stop(); log.WriteLine("all done, took {0}", sw.Elapsed); }