public void Constructor_NullWords() { DumpedChange change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), null, new List<DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); }
public void Constructor_NullMappings() { DumpedChange change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), null, new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); }
public void Constructor_NullDocument() { DumpedChange change = new DumpedChange( null, new List<DumpedWord>(new DumpedWord[] { new DumpedWord(1, "word") }), new List<DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); }
public void Constructor_NullDocument() { DumpedChange change = new DumpedChange( null, new List <DumpedWord>(new DumpedWord[] { new DumpedWord(1, "word") }), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); }
public void Constructor_EmptyMappings() { // Mappings can be empty DumpedChange change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List<DumpedWord>(new DumpedWord[] { new DumpedWord(1, "word") }), new List<DumpedWordMapping>()); }
public void Constructor_NullDocument() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List <DumpedWord>(), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); IndexChangedEventArgs args = new IndexChangedEventArgs(null, IndexChangeType.DocumentAdded, change, null); }
public void Constructor_Document_Null() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List <DumpedWord>(), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); var ex = Assert.Throws <ArgumentNullException>(() => new IndexChangedEventArgs(null, IndexChangeType.DocumentAdded, change, null)); Assert.Equal("Value cannot be null.\r\nParameter name: document", ex.Message); }
public void Constructor_NullDocument() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List<DumpedWord>(), new List<DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); IndexChangedEventArgs args = new IndexChangedEventArgs(null, IndexChangeType.DocumentAdded, change, null); }
public void Constructor_EmptyWords() { // Words can be empty var change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List <DumpedWord>(), new List <DumpedWordMapping>(new[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); }
public void Constructor_NullDocument() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List <DumpedWord>(), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); Assert.That(() => new IndexChangedEventArgs(null, IndexChangeType.DocumentAdded, change, null), Throws.ArgumentNullException); }
public void Constructor_EmptyMappings() { // Mappings can be empty var change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List <DumpedWord>(new[] { new DumpedWord(1, "word") }), new List <DumpedWordMapping>()); }
public void Constructor() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List<DumpedWord>(), new List<DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); IndexChangedEventArgs args = new IndexChangedEventArgs(doc, IndexChangeType.DocumentAdded, change, null); Assert.AreSame(doc, args.Document, "Invalid document instance"); Assert.AreEqual(IndexChangeType.DocumentAdded, args.Change, "Wrong change"); }
public void Constructor() { var doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); var change = new DumpedChange(new DumpedDocument(doc), new List <DumpedWord>(), new List <DumpedWordMapping>(new[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); var args = new IndexChangedEventArgs(doc, IndexChangeType.DocumentAdded, change, null); Assert.AreSame(doc, args.Document, "Invalid document instance"); Assert.AreEqual(IndexChangeType.DocumentAdded, args.Change, "Wrong change"); }
public void Constructor() { IDocument doc = MockDocument("Doc", "Document", "ptdoc", DateTime.Now); DumpedChange change = new DumpedChange(new DumpedDocument(doc), new List <DumpedWord>(), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 1, 1, 1) })); IndexChangedEventArgs args = new IndexChangedEventArgs(doc, IndexChangeType.DocumentAdded, change, null); Assert.Same(doc, args.Document); Assert.Equal(IndexChangeType.DocumentAdded, args.Change); }
public void Constructor() { var change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List <DumpedWord>(new[] { new DumpedWord(1, "word") }), new List <DumpedWordMapping>(new[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); Assert.AreEqual("doc", change.Document.Name, "Wrong name"); Assert.AreEqual(1, change.Words.Count, "Wrong words count"); Assert.AreEqual("word", change.Words[0].Text, "Wrong word"); Assert.AreEqual(1, change.Mappings.Count, "Wrong mappings count"); Assert.AreEqual(1, change.Mappings[0].WordID, "Wrong word index"); }
public void Constructor() { DumpedChange sut = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List <DumpedWord>(new DumpedWord[] { new DumpedWord(1, "word") }), new List <DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); Assert.Equal("doc", sut.Document.Name); Assert.Single(sut.Words); Assert.Equal("word", sut.Words[0].Text); Assert.Single(sut.Mappings); Assert.Equal((uint)1, sut.Mappings[0].WordID); }
public void Constructor() { DumpedChange change = new DumpedChange( new DumpedDocument(MockDocument("doc", "Docum", "d", DateTime.Now)), new List<DumpedWord>(new DumpedWord[] { new DumpedWord(1, "word") }), new List<DumpedWordMapping>(new DumpedWordMapping[] { new DumpedWordMapping(1, 1, 4, 1, WordLocation.Content.Location) })); Assert.AreEqual("doc", change.Document.Name, "Wrong name"); Assert.AreEqual(1, change.Words.Count, "Wrong words count"); Assert.AreEqual("word", change.Words[0].Text, "Wrong word"); Assert.AreEqual(1, change.Mappings.Count, "Wrong mappings count"); Assert.AreEqual(1, change.Mappings[0].WordID, "Wrong word index"); }
/// <summary> /// Deletes data from the data storage. /// </summary> /// <param name="data">The data to delete.</param> /// <param name="state">A state object passed from the index.</param> protected override void DeleteData(DumpedChange data, object state) { // Files are regenerated in a tempDumpedWord location and copied back string tempDocumentsFile = GetTempFile(_documentsFile); string tempWordsFile = GetTempFile(_wordsFile); string tempMappingsFile = GetTempFile(_mappingsFile); // 1. Remove Mappings using (FileStream fsi = new FileStream(_mappingsFile, FileMode.Open, FileAccess.Read, FileShare.None)) { int count = ReadCount(fsi); int countLocation = (int)fsi.Position - 4; int writeCount = 0; BinaryReader reader = new BinaryReader(fsi, Encoding.UTF8); using (FileStream fso = new FileStream(tempMappingsFile, FileMode.Create, FileAccess.Write, FileShare.None)) { BinaryWriter writer = new BinaryWriter(fso, Encoding.UTF8); WriteHeader(writer); DumpedWordMapping m; for (int i = 0; i < count; i++) { m = ReadDumpedWordMapping(reader); // If m is not contained in data.Mappings, store it in tempDumpedWord file if (!Find(m, data.Mappings)) { WriteDumpedWordMapping(writer, m); writeCount++; } } writer.Seek(countLocation, SeekOrigin.Begin); writer.Write(writeCount); } } // Replace the file File.Copy(tempMappingsFile, _mappingsFile, true); File.Delete(tempMappingsFile); // 2. Remove Words using (FileStream fsi = new FileStream(_wordsFile, FileMode.Open, FileAccess.Read, FileShare.None)) { int count = ReadCount(fsi); int countLocation = (int)fsi.Position - 4; int writeCount = 0; BinaryReader reader = new BinaryReader(fsi, Encoding.UTF8); using (FileStream fso = new FileStream(tempWordsFile, FileMode.Create, FileAccess.Write, FileShare.None)) { BinaryWriter writer = new BinaryWriter(fso, Encoding.UTF8); WriteHeader(writer); DumpedWord w; for (int i = 0; i < count; i++) { w = ReadDumpedWord(reader); // If w is not contained in data.Words, store it in tempDumpedWord file if (!Find(w, data.Words)) { WriteDumpedWord(writer, w); writeCount++; } } writer.Seek(countLocation, SeekOrigin.Begin); writer.Write(writeCount); } } // Replace the file File.Copy(tempWordsFile, _wordsFile, true); File.Delete(tempWordsFile); // 3. Remove Document using (FileStream fsi = new FileStream(_documentsFile, FileMode.Open, FileAccess.Read, FileShare.None)) { int count = ReadCount(fsi); int countLocation = (int)fsi.Position - 4; BinaryReader reader = new BinaryReader(fsi, Encoding.UTF8); using (FileStream fso = new FileStream(tempDocumentsFile, FileMode.Create, FileAccess.Write, FileShare.None)) { BinaryWriter writer = new BinaryWriter(fso, Encoding.UTF8); WriteHeader(writer); DumpedDocument d; for (int i = 0; i < count; i++) { d = ReadDumpedDocument(reader); // If d is not equal to data.Document (to be deleted), then copy it to the result file if (!EqualDumpedDocument(d, data.Document)) { WriteDumpedDocument(writer, d); } } writer.Seek(countLocation, SeekOrigin.Begin); writer.Write(count - 1); } } File.Copy(tempDocumentsFile, _documentsFile, true); File.Delete(tempDocumentsFile); }
/// <summary> /// Stores new data into the data storage. /// </summary> /// <param name="data">The data to store.</param> /// <param name="state">A state object passed from the index.</param> /// <returns>The storer result, if any.</returns> /// <remarks>When saving a new document, the document ID in data.Mappings must be /// replaced with the currect document ID, generated by the concrete implementation of /// this method. data.Words should have IDs numbered from uint.MaxValue downwards. /// The method re-numbers the words appropriately.</remarks> protected override IndexStorerResult SaveData(DumpedChange data, object state) { IndexStorerResult result = new IndexStorerResult(null, null); // 1. Save Document using (FileStream fs = new FileStream(_documentsFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { int count = ReadCount(fs); // Update count and append document BinaryWriter writer = new BinaryWriter(fs, Encoding.UTF8); fs.Seek(-4, SeekOrigin.Current); writer.Write(count + 1); writer.Seek(0, SeekOrigin.End); data.Document.ID = _firstFreeDocumentId; WriteDumpedDocument(writer, data.Document); result.DocumentID = _firstFreeDocumentId; _firstFreeDocumentId++; } // 2. Save Words Dictionary <uint, WordId> wordIds = null; using (FileStream fs = new FileStream(_wordsFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { int count = ReadCount(fs); // Update count and append words BinaryWriter writer = new BinaryWriter(fs, Encoding.UTF8); fs.Seek(-4, SeekOrigin.Current); writer.Write(count + data.Words.Count); fs.Seek(0, SeekOrigin.End); wordIds = new Dictionary <uint, WordId>(data.Words.Count); foreach (DumpedWord dw in data.Words) { wordIds.Add(dw.ID, new WordId(dw.Text, _firstFreeWordId)); dw.ID = _firstFreeWordId; WriteDumpedWord(writer, dw); _firstFreeWordId++; } result.WordIDs = new List <WordId>(wordIds.Values); } // 3. Save Mappings using (FileStream fs = new FileStream(_mappingsFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { int count = ReadCount(fs); // Update count and append mappings BinaryWriter writer = new BinaryWriter(fs, Encoding.UTF8); fs.Seek(-4, SeekOrigin.Current); writer.Write(count + data.Mappings.Count); fs.Seek(0, SeekOrigin.End); foreach (DumpedWordMapping map in data.Mappings) { // Words are autonumbered from uint.MaxValue downwards by IndexBase so that // IndexStorer can identify the DumpedWordMappings easily and // fix the IDs with the ones actually stored WordId newMappingWordId; if (wordIds != null && wordIds.TryGetValue(map.WordID, out newMappingWordId)) { map.WordID = newMappingWordId.ID; } WriteDumpedWordMapping(writer, new DumpedWordMapping(map.WordID, result.DocumentID.Value, map.FirstCharIndex, map.WordIndex, map.Location)); } } return(result); }