public void TestReadOnlyCopy() { using (var tempFile = new TempFile()) { var options = new BPlusTree <int, string> .OptionsV2(new PrimitiveSerializer(), new PrimitiveSerializer()) { CreateFile = CreatePolicy.Always, FileName = tempFile.TempPath, } .CalcBTreeOrder(4, 10); var readcopy = options.Clone(); readcopy.CreateFile = CreatePolicy.Never; readcopy.ReadOnly = true; using (var tree = new BPlusTree <int, string>(options)) { using (var copy = new BPlusTree <int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(0, copy.Count); } //insert some data... tree.AddRange(MakeValues(0, 100)); using (var copy = new BPlusTree <int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(0, copy.Count); } tree.Commit(); //insert some data... for (int i = 0; i < 100; i++) { tree.Remove(i); } tree.AddRange(MakeValues(1000, 1000)); using (var copy = new BPlusTree <int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(100, copy.Count); Assert.AreEqual(0, copy.First().Key); Assert.AreEqual(99, copy.Last().Key); } tree.Commit(); } } }
public void TestFirstAndLast() { using (BPlusTree <int, string> data = Create(Options)) { data.Add(1, "a"); data.Add(2, "b"); data.Add(3, "c"); data.Add(4, "d"); data.Add(5, "e"); Assert.AreEqual(1, data.First().Key); Assert.AreEqual("a", data.First().Value); data.Remove(1); Assert.AreEqual(2, data.First().Key); Assert.AreEqual("b", data.First().Value); Assert.AreEqual(5, data.Last().Key); Assert.AreEqual("e", data.Last().Value); data.Remove(5); Assert.AreEqual(4, data.Last().Key); Assert.AreEqual("d", data.Last().Value); data.Remove(4); data.Remove(3); KeyValuePair <int, string> kv; Assert.IsTrue(data.TryGetLast(out kv)); Assert.IsTrue(data.TryGetFirst(out kv)); data.Remove(2); Assert.IsFalse(data.TryGetLast(out kv)); Assert.IsFalse(data.TryGetFirst(out kv)); try { data.First(); Assert.Fail("Should raise InvalidOperationException"); } catch (InvalidOperationException) { } try { data.Last(); Assert.Fail("Should raise InvalidOperationException"); } catch (InvalidOperationException) { } } }
public void TestReadOnlyCopy() { using (var tempFile = new TempFile()) { var options = new BPlusTree<int, string>.OptionsV2(new PrimitiveSerializer(), new PrimitiveSerializer()) { CreateFile = CreatePolicy.Always, FileName = tempFile.TempPath, }.CalcBTreeOrder(4, 10); var readcopy = options.Clone(); readcopy.CreateFile = CreatePolicy.Never; readcopy.ReadOnly = true; using (var tree = new BPlusTree<int, string>(options)) { using (var copy = new BPlusTree<int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(0, copy.Count); } //insert some data... tree.AddRange(MakeValues(0, 100)); using (var copy = new BPlusTree<int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(0, copy.Count); } tree.Commit(); //insert some data... for (int i = 0; i < 100; i++) tree.Remove(i); tree.AddRange(MakeValues(1000, 1000)); using (var copy = new BPlusTree<int, string>(readcopy)) { copy.EnableCount(); Assert.AreEqual(100, copy.Count); Assert.AreEqual(0, copy.First().Key); Assert.AreEqual(99, copy.Last().Key); } tree.Commit(); } } }
public void TestErrorsOnInsertAndDelete() { const int CountPerThread = 100; BPlusTree <KeyInfo, DataValue> .OptionsV2 options = new BPlusTree <KeyInfo, DataValue> .OptionsV2( new KeyInfoSerializer(), new DataValueSerializer(), new KeyInfoComparer()); options.CalcBTreeOrder(32, 300); options.FileName = TempFile.TempPath; options.CreateFile = CreatePolicy.Always; using (BPlusTree <KeyInfo, DataValue> dictionary = new BPlusTree <KeyInfo, DataValue>(options)) using (WorkQueue work = new WorkQueue(Environment.ProcessorCount)) { Exception lastError = null; work.OnError += delegate(object o, ErrorEventArgs e) { lastError = e.GetException(); }; for (int i = 0; i < Environment.ProcessorCount; i++) { work.Enqueue(new ThreadedTest(dictionary, CountPerThread).Run); } for (int i = 0; i < CountPerThread; i++) { if (i % 2 == 0) { try { dictionary.TryAdd(new KeyInfo(Guid.NewGuid(), i), k => { throw new ExpectedException(); }); } catch { } } else { try { dictionary.TryRemove(dictionary.First().Key, (k, v) => { throw new ExpectedException(); }); } catch { } } } Assert.IsTrue(work.Complete(true, 60000)); Assert.IsNull(lastError, "Exception raised in worker: {0}", lastError); } }
private static void BasicTest() { BPlusTree <double, string> .OptionsV2 options = new BPlusTree <double, string> .OptionsV2(PrimitiveSerializer.Double, PrimitiveSerializer.String); options.CalcBTreeOrder(16, 24); options.CreateFile = CreatePolicy.Always; options.FileName = System.IO.Path.GetTempFileName(); using (var tree = new BPlusTree <double, string>(options)) { // Insertion to tree. // Note: numbers are NOT inserted sorted. tree.Add(30.1, "30.2"); tree.Add(10.1, "10.2"); tree.Add(20.1, "20.2"); tree.Add(80.1, "80.2"); tree.Add(40.1, "40.2"); tree.Add(60.1, "60.2"); tree.Add(70.1, "70.2"); tree.Add(50.1, "50.2"); // To get first element. // Since sorted, first element is: 10.1 KeyValuePair <double, string> first_with_Try; tree.TryGetFirst(out first_with_Try); // Similar to previous function. var first = tree.First(); // To get last element. // Since sorted, last element is: 80.1 KeyValuePair <double, string> last_with_Try; tree.TryGetLast(out last_with_Try); // Similar to previous function. var last = tree.Last(); // Given key get the value. // Key is valid, region.e., it is available in tree. // Hence it returns: "50.2" string value_of_valid_key; tree.TryGetValue(50.1, out value_of_valid_key); // Given key get the value. // Key is invalid, region.e., it is NOT available in tree. // Hence it returns: null (default value of int) string value_of_invalid_key; tree.TryGetValue(55, out value_of_invalid_key); // The "100" key is not available and no key is available greater than // that, hence .Current should return default value of key type (0 in this case). var key_not_available = tree.EnumerateFrom(100).GetEnumerator().Current; // Runtime error //var list = tree.ToList(); // Gets an enumerator. IEnumerator <KeyValuePair <double, string> > enumerator = tree.GetEnumerator(); // Iterating through items with enumerator. // starting from first item to last. while (enumerator.MoveNext()) { var item = enumerator.Current; } // Another syntac of iterations, which is automatically // calling "GetEnumerator" function. // starting from first item to last. foreach (var item in tree) { } // Iterates through items starting from given key: 40.1 (inclusively) // and goes till the last item. foreach (var item in tree.EnumerateFrom(39.1)) { } // Iterates through items starting from given index: 2 (inclusively) // and goes till the last item. foreach (var item in tree.EnumerateFrom(tree.ElementAtOrDefault(2).Key)) { } // Iterate from an item that is NOT available in collection // to the item which is neither available. foreach (var item in tree.EnumerateRange(20.5, 40.9)) { } // Gets the item at specific index. // All return valid values, but the last one which is // refereing to an index out-of-bound; the return of this // call is the default value for key and value. var element_at_0 = tree.ElementAtOrDefault(0); var element_at_1 = tree.ElementAtOrDefault(1); var element_at_2 = tree.ElementAtOrDefault(2); var element_at_3 = tree.ElementAtOrDefault(3); var element_at_100 = tree.ElementAtOrDefault(100); using (BPlusTree <double, string> data = new BPlusTree <double, string>(options)) { bool sT1 = data.TryAdd(1, "a"); bool sF1 = data.TryAdd(1, "a"); data[1] = "did it"; bool sT2 = data.TryUpdate(1, "a"); bool sT3 = data.TryUpdate(1, "c"); bool sT4 = data.TryUpdate(1, "d", "c"); bool sF2 = data.TryUpdate(1, "f", "c"); bool equality1 = "d".Equals(data[1]); bool sT5 = data.TryUpdate(1, "a", data[1]); bool equality2 = "a".Equals(data[1]); bool sF3 = data.TryUpdate(2, "b"); string val; bool st6 = data.TryRemove(1, out val) && val == "a"; bool sF4 = data.TryRemove(2, out val); bool notEqual = val.Equals("a"); } } }