public virtual void Test1() { DeleteBase("btree45.ndb"); var odb = Open("btree45.ndb"); var storageEngine = ((global::NDatabase.Odb)odb).GetStorageEngine(); var persister = new LazyOdbBtreePersister(storageEngine); IBTreeMultipleValuesPerKey tree = new OdbBtreeMultiple(3, persister); tree.Insert(1, new MyObject("Value 1")); tree.Insert(20, new MyObject("Value 20")); tree.Insert(25, new MyObject("Value 25")); tree.Insert(29, new MyObject("Value 29")); tree.Insert(21, new MyObject("Value 21")); AssertEquals(5, tree.GetRoot().GetNbKeys()); AssertEquals(0, tree.GetRoot().GetNbChildren()); AssertEquals(21, tree.GetRoot().GetMedian().GetKey()); var values = tree.GetRoot().GetMedian().GetValue() as List <object>; AssertEquals("Value 21", values[0].ToString()); AssertEquals(0, tree.GetRoot().GetNbChildren()); tree.Insert(45, new MyObject("Value 45")); AssertEquals(2, tree.GetRoot().GetNbChildren()); AssertEquals(1, tree.GetRoot().GetNbKeys()); AssertEquals(21, tree.GetRoot().GetKeyAt(0)); var valuesAsObjectAt = tree.GetRoot().GetValueAsObjectAt(0) as List <object>; AssertEquals("Value 21", valuesAsObjectAt[0].ToString()); persister.Close(); odb = Open("btree45.ndb"); storageEngine = ((global::NDatabase.Odb)odb).GetStorageEngine(); persister = new LazyOdbBtreePersister(storageEngine); tree = (IBTreeMultipleValuesPerKey)persister.LoadBTree(tree.GetId()); AssertEquals(6, tree.GetSize()); // println(tree.getRoot()); var o = (MyObject)tree.Search(20)[0]; AssertEquals("Value 20", o.GetName()); o = (MyObject)tree.Search(29)[0]; AssertEquals("Value 29", o.GetName()); o = (MyObject)tree.Search(45)[0]; AssertEquals("Value 45", o.GetName()); odb.Close(); DeleteBase("btree45.ndb"); }
public void AddIndexOn(string className, string indexName, string[] indexFields, bool acceptMultipleValuesForSameKey) { var classInfo = GetMetaModel().GetClassInfo(className, true); if (classInfo.HasIndex(indexName)) { throw new OdbRuntimeException( NDatabaseError.IndexAlreadyExist.AddParameter(indexName).AddParameter(className)); } var classInfoIndex = classInfo.AddIndexOn(indexName, indexFields, acceptMultipleValuesForSameKey); IBTree btree; var lazyOdbBtreePersister = new LazyOdbBtreePersister(this); if (acceptMultipleValuesForSameKey) { btree = new OdbBtreeMultiple(OdbConfiguration.GetIndexBTreeDegree(), lazyOdbBtreePersister); } else { btree = new OdbBtreeSingle(OdbConfiguration.GetIndexBTreeDegree(), lazyOdbBtreePersister); } classInfoIndex.BTree = btree; Store(classInfoIndex); // Now The index must be updated with all existing objects. if (classInfo.NumberOfObjects == 0) { // There are no objects. Nothing to do return; } var numberOfObjectsAsString = classInfo.NumberOfObjects.ToString(); Log4NetHelper.Instance.LogInfoMessage( string.Format( "StorageEngine: Creating index {0} on class {1} - Class has already {2} Objects. Updating index", indexName, className, numberOfObjectsAsString)); Log4NetHelper.Instance.LogInfoMessage(string.Format("StorageEngine: {0} : loading {1} objects from database", indexName, numberOfObjectsAsString)); // We must load all objects and insert them in the index! var criteriaQuery = new SodaQuery(classInfo.UnderlyingType); var objects = GetObjectInfos(criteriaQuery); numberOfObjectsAsString = classInfo.NumberOfObjects.ToString(); Log4NetHelper.Instance.LogInfoMessage(string.Format("StorageEngine: {0} : {1} objects loaded", indexName, numberOfObjectsAsString)); while (objects.HasNext()) { var nnoi = (NonNativeObjectInfo)objects.Next(); var odbComparable = IndexTool.BuildIndexKey(classInfoIndex.Name, nnoi, classInfoIndex.AttributeIds); btree.Insert(odbComparable, nnoi.GetOid()); } Log4NetHelper.Instance.LogInfoMessage(string.Format("StorageEngine: {0} created!", indexName)); }