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); } } }
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); } }
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); } }