public static void Main(string[] args) { DateTime tt0 = DateTime.Now; string path = @"..\..\..\Databases\"; //"C:\home\FactographDatabases" Console.WriteLine("Start."); Func <object, PxEntry, int> edepth = (object v1, PxEntry en2) => { string s1 = (string)(((object[])v1)[0]); return(String.Compare(s1, (string)(en2.Field(0).Get()), StringComparison.Ordinal)); }; // Инициируем типы // Создадим фиксированную ячейку PTypeRecord ptElement = new PTypeRecord( new NamedType("name", new PType(PTypeEnumeration.sstring)), new NamedType("id", new PType(PTypeEnumeration.sstring))); BTree cell = new BTree(ptElement, edepth, path + "btree.pxc", readOnly: false); cell.Clear(); //// Проверим существует ли пустое значение // Console.WriteLine(r1.Type.Interpret(r1.Value)); // сделаем пробное заполнение вручную object[] valu = { 1, new object[] { new object[] { "name1","333L" }, new object[] { 1, new object[] { new object[] { "name0","444L" }, BTree.Empty, BTree.Empty, 0 } }, BTree.Empty, 1 } }; cell.Fill2(valu); cell.Root.UElementUnchecked(1).Field(0).Set(new object[] { "", "" }); // проверяем содержимое var res = cell.Root.GetValue(); // Console.WriteLine(res.Type.Interpret(res.Value)); // Пробно добавим пару элементов через метод расширения, описанный в ExtensionMethods cell.Clear(); cell.Add(new object[] { "1", "333L" }); cell.Add(new object[] { "2", "444L" }); cell.Add(new object[] { "3", "555L" }); cell.Add(new object[] { "4", "666L" }); // Получается 444(333(), 555(, 666())) var res2 = cell.Root.GetValue(); Console.WriteLine(res2.Type.Interpret(res2.Value)); Console.WriteLine(); // Повернем дерево, чтобы стало 555(444(333(),), 666()) // Для этого, сначала выделим корневой узел 444 и узел 555 var h444 = cell.Root.GetHead(); var h555 = cell.Root.UElement().Field(2).GetHead(); // Теперь 555 запишем в корень cell.Root.SetHead(h555); // Левое поддерево у нас пустое, поэтому просто перепишем этот вход cell.Root.UElement().Field(1).SetHead(h444); // а в h444 заменим правое поддерево на пустое cell.Root.UElement().Field(1).UElement().Field(2).Set(BTree.Empty); var res3 = cell.Root.GetValue(); Console.WriteLine(res3.Type.Interpret(res3.Value)); // Теперь попробуем загрузить реальные данные tt0 = DateTime.Now; XElement db = XElement.Load(path + "0001.xml"); XName rdfabout = "{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about"; var query = db.Elements() .Where(el => el.Attribute(rdfabout) != null) .SelectMany(el => el.Elements()) .Where(prop => prop.Name.LocalName == "name") .Select(prop => new[] { (object)prop.Value, (object)prop.Parent.Attribute(rdfabout).Value }) .ToArray(); // Замерим время выборки данных из XML Console.WriteLine(query.Count()); Console.WriteLine("======Count() ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; // var addTree = TestQueryInput(query, ptElement, edepth, path); // BTree toBTree =TestToBTree(query, ptElement, path, edepth); // var treeFromFill = TestBTreeFill(query, ptElement, path, edepth); Func <object, object, bool> elementsComparer = (o1, o2) => (string)(((object[])o1)[0]) == (string)((object[])o2)[0]; // Console.WriteLine("tree sequantialy add == tree fill - " + treeFromFill.Equals(addTree, elementsComparer)); // Console.WriteLine("tree sequantialy add == query to BTree - " + toBTree.Equals(addTree, elementsComparer)); // treeFromFill.Close(); // addTree.Close(); // toBTree.Close(); // Console.WriteLine("======Total ok. duration=" + (DateTime.Now - tt0).Ticks / 10000L); tt0 = DateTime.Now; cell.Close(); File.Delete(path + "btree.pxc"); // GetOverflow(path); // TestTreeOfInt(query, path); SimpleTreeInt(path); }
static void Main(string[] args) { BTree tree = new BTree(); Node node = new Node(); ; for (int i = 1; i < 10; i++) node = tree.insert(node, i); tree.inorder(node); Console.ReadLine(); }