示例#1
0
 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) }));
 }
示例#2
0
 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) }));
 }
示例#3
0
 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) }));
 }
示例#4
0
 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) }));
 }
示例#5
0
 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>());
 }
示例#6
0
        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);
        }
示例#9
0
 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);
        }
示例#11
0
 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");
        }
示例#13
0
        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);
        }
示例#15
0
        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");
        }
示例#16
0
        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);
        }
示例#17
0
        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");
        }
示例#18
0
        /// <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);
        }
示例#19
0
        /// <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);
        }