Пример #1
0
        public void Rebuild_Large_Files()
        {
            // do some tests
            void DoTest(LiteDatabase db, LiteCollection <Zip> col)
            {
                Assert.Equal(1, col.Count());
                Assert.Equal(99, db.UserVersion);
            };

            using (var file = new TempFile())
            {
                using (var db = new LiteDatabase(file.Filename))
                {
                    var col = db.GetCollection <Zip>();

                    db.UserVersion = 99;

                    col.EnsureIndex("city", false);

                    var inserted = col.Insert(DataGen.Zip());            // 29.353 docs
                    var deleted  = col.DeleteMany(x => x.Id != "01001"); // delete 29.352 docs

                    Assert.Equal(29353, inserted);
                    Assert.Equal(29352, deleted);

                    Assert.Equal(1, col.Count());

                    // must checkpoint
                    db.Checkpoint();

                    // file still large than 5mb (even with only 1 document)
                    Assert.True(file.Size > 5 * 1024 * 1024);

                    // reduce datafile
                    var reduced = db.Rebuild();

                    // now file are small than 50kb
                    Assert.True(file.Size < 50 * 1024);

                    DoTest(db, col);
                }

                // re-open and rebuild again
                using (var db = new LiteDatabase(file.Filename))
                {
                    var col = db.GetCollection <Zip>();

                    DoTest(db, col);

                    db.Rebuild();

                    DoTest(db, col);
                }
            }
        }
Пример #2
0
        public void Analyze_Collection_Count()
        {
            var zip = DataGen.Zip().Take(100).ToArray();

            using (var db = new LiteDatabase(new MemoryStream()))
            {
                var col = db.GetCollection <Zip>();

                // init zip collection with 100 document
                col.Insert(zip);

                col.EnsureIndex(x => x.City);
                col.EnsureIndex(x => x.Loc);

                var indexes = db.GetCollection("$indexes").FindAll()
                              .ToDictionary(x => x["name"].AsString, x => x, StringComparer.OrdinalIgnoreCase);

                // testing for just-created indexes (always be zero)
                Assert.AreEqual(0, indexes["_id"]["keyCount"].AsInt32);
                Assert.AreEqual(0, indexes["_id"]["uniqueKeyCount"].AsInt32);
                Assert.AreEqual(0, indexes["city"]["uniqueKeyCount"].AsInt32);
                Assert.AreEqual(0, indexes["loc"]["uniqueKeyCount"].AsInt32);

                // but indexes created after data exists will count
                Assert.AreEqual(100, indexes["city"]["keyCount"].AsInt32);
                Assert.AreEqual(200, indexes["loc"]["keyCount"].AsInt32);

                db.Analyze("zip");

                indexes = db.GetCollection("$indexes").FindAll()
                          .ToDictionary(x => x["name"].AsString, x => x, StringComparer.OrdinalIgnoreCase);

                // count unique values
                var uniqueCity = new HashSet <string>(zip.Select(x => x.City));
                var uniqueLoc  = new HashSet <double>(zip.Select(x => x.Loc[0]).Union(zip.Select(x => x.Loc[1])));

                Assert.AreEqual(zip.Length, indexes["_id"]["keyCount"].AsInt32);
                Assert.AreEqual(zip.Length, indexes["_id"]["uniqueKeyCount"].AsInt32);

                Assert.AreEqual(zip.Length, indexes["city"]["keyCount"].AsInt32);
                Assert.AreEqual(uniqueCity.Count, indexes["city"]["uniqueKeyCount"].AsInt32);

                Assert.AreEqual(zip.Length * 2, indexes["loc"]["keyCount"].AsInt32);
                Assert.AreEqual(uniqueLoc.Count, indexes["loc"]["uniqueKeyCount"].AsInt32);
            }
        }
Пример #3
0
        public void Rebuild_After_DropCollection()
        {
            using (var file = new TempFile())
                using (var db = new LiteDatabase(file.Filename))
                {
                    var col = db.GetCollection <Zip>("zip");

                    col.Insert(DataGen.Zip());

                    db.DropCollection("zip");

                    db.Checkpoint();

                    // full disk usage
                    var size = file.Size;

                    var r = db.Rebuild();

                    // only header page
                    Assert.Equal(8192, size - r);
                }
        }