/// <summary> /// Złącza pliki wynikowe obiektów tworzących w plik odwróconego indeksu /// /// Złącza wszystkie pliki tymczasowe posortowane wszystkich obiektów celu zapisu indeksu IxStdDiskRIIndex.Writer w jeden plik /// posortowany wg ID tokenów rosnąco, wag wystąpień w dokumentach malejąco. Tworzy indeks na plik danych. /// </summary> private void mergeAll() { /* Posortowana lista czytaczy plików tymczasowych */ SortedLinkedList<TmpPostingsFileReader> sordedReaders = new SortedLinkedList<TmpPostingsFileReader>(); /* Dodaj do listy czytacze plików ze wszystkich obiektów celu zapisu indeksu */ for (int i = 0; i < writers.Count; i++) { TmpPostingsFileReader[] readers = writers[i].getTmpPostingsFileReaders(); foreach (TmpPostingsFileReader reader in readers) sordedReaders.add(reader); } /* Utwórz strumienie binarne do zapisu danych indeksu i indeksu indeksu i używając ich */ using (BinaryWriter postingsFileWriter = new BinaryWriter(File.Create(indexDirPath + "postings.dat")), postingsIndexFileWriter = new BinaryWriter(File.Create(indexDirPath + "postings.idx"))) { /* Wybierz czytacz pliku tymczasowego o najniższym ID tokenu, najwyższej wadze (tak są posortowane) */ TmpPostingsFileReader first = sordedReaders.getFirst(); /* Na potrzeby tworzenia indeksu */ uint lastTokenId = first.current().tokenId; uint count = 0; long offset = 0, startOffset = 0; /* Nie istnieje token o ID 0, dlatego musimy mu sztucznie wstawić wpis indeksu (zerowy) * aby mechanizmy działały poprawnie */ if (lastTokenId == 1) writeIndex(postingsIndexFileWriter, 0, 0); do { /* Usuń z listy pierwszy czytacz */ sordedReaders.remove(first); /* Jeśli zmienił się ID tokenu, zapisz wpis w indeksie */ if (first.current().tokenId != lastTokenId) { writeIndex(postingsIndexFileWriter, startOffset, count); lastTokenId = first.current().tokenId; count = 0; startOffset = offset; } /* Zapisz wystąpienie, już bez ID tokenu, do pliku danych indeksu */ writePosting(postingsFileWriter, first.current().posting); offset += Posting.size; count++; /* Spróbuj odczytać następne wystąpienie przez czytacz, jeśli to nie koniec jego pliku, * dodaj go do listy (sortowanie zostanie zachowane) */ first.moveNext(); if (!first.end()) sordedReaders.add(first); } while ((first = sordedReaders.getFirst()) != null); // Póki jest jeszcze jakiś czytacz /* Zapisz ostatni wpis indeksu */ writeIndex(postingsIndexFileWriter, startOffset, count); } }