Esempio n. 1
0
        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);
                    }
                }
            }
        }
Esempio n. 2
0
        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));
        }