public virtual void Test1() { const string bigbtreeTest1DbName = "bigbtree.test1.ndb"; DeleteBase(bigbtreeTest1DbName); using (var odb = OdbFactory.Open(bigbtreeTest1DbName)) { var size = 10000; IBTree tree = new OdbBtreeSingle(50, new LazyOdbBtreePersister(((global::NDatabase.Odb)odb).GetStorageEngine())); for (var i = 0; i < size; i++) { if (i % 1000 == 0) { Println(i); } tree.Insert(i + 1, "value " + (i + 1)); } AssertEquals(size, tree.GetSize()); IEnumerator iterator = new BTreeIteratorSingleValuePerKey <object>(tree, OrderByConstants.OrderByAsc); var j = 0; while (iterator.MoveNext()) { var o = iterator.Current; // println(o); j++; if (j == size) { AssertEquals("value " + size, o); } } } }
public virtual void Test2SameKeySingleBTree() { const string singlevaluebtreeTest1DbName = "singlevaluebtree.test1.ndb"; DeleteBase(singlevaluebtreeTest1DbName); using (var odb = OdbFactory.Open(singlevaluebtreeTest1DbName)) { var size = 1000; IBTree tree = new OdbBtreeSingle(50, new LazyOdbBtreePersister(((global::NDatabase.Odb)odb).GetStorageEngine())); for (var i = 0; i < size; i++) { if (i % 10000 == 0) { Println(i); } tree.Insert(i + 1, "value " + (i + 1)); } try { for (var i = 0; i < 10; i++) { if (i % 10000 == 0) { Println(i); } tree.Insert(100, "value " + (i + 1)); Fail("Single Value Btree should not accept duplcited key"); } } catch (DuplicatedKeyException ex) { Console.WriteLine(ex.Message); Assert.Pass(); } } }
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)); }