Пример #1
0
 public virtual SortedCollection CreateSortedCollection(PersistentComparator comparator, bool unique)
 {
     if (!opened)
         throw new StorageError(StorageError.STORAGE_NOT_OPENED);
     return new Ttree(comparator, unique);
 }
Пример #2
0
        internal int Remove(PersistentComparator comparator, IPersistent mbr, PageReference ref_Renamed)
        {
            Load();
            TtreePage pg;
            int n = nItems;
            int diff = comparator.CompareMembers(mbr, LoadItem(0));
            if (diff <= 0)
            {
                if (left != null)
                {
                    Modify();
                    pg = ref_Renamed.pg;
                    ref_Renamed.pg = left;
                    int h = left.Remove(comparator, mbr, ref_Renamed);
                    left = ref_Renamed.pg;
                    ref_Renamed.pg = pg;
                    if (h == UNDERFLOW)
                    {
                        return BalanceLeftBranch(ref_Renamed);
                    }
                    else if (h == OK)
                    {
                        return OK;
                    }
                }
            }
            diff = comparator.CompareMembers(mbr, LoadItem(n - 1));
            if (diff <= 0)
            {
                for (int i = 0; i < n; i++)
                {
                    if (item[i] == mbr)
                    {
                        if (n == 1)
                        {
                            if (right == null)
                            {
                                Deallocate();
                                ref_Renamed.pg = left;
                                return UNDERFLOW;
                            }
                            else if (left == null)
                            {
                                Deallocate();
                                ref_Renamed.pg = right;
                                return UNDERFLOW;
                            }
                        }
                        Modify();
                        if (n <= minItems)
                        {
                            if (left != null && balance <= 0)
                            {
                                TtreePage prev = left;
                                prev.Load();
                                while (prev.right != null)
                                {
                                    prev = prev.right;
                                    prev.Load();
                                }
                                Array.Copy(item, 0, item, 1, i);
                                //while (--i >= 0) {
                                //    item[i+1] = item[i];
                                //}
                                item[0] = prev.item[prev.nItems - 1];
                                pg = ref_Renamed.pg;
                                ref_Renamed.pg = left;
                                int h = left.Remove(comparator, LoadItem(0), ref_Renamed);
                                left = ref_Renamed.pg;
                                ref_Renamed.pg = pg;
                                if (h == UNDERFLOW)
                                {
                                    h = BalanceLeftBranch(ref_Renamed);
                                }
                                return h;
                            }
                            else if (right != null)
                            {
                                TtreePage next = right;
                                next.Load();
                                while (next.left != null)
                                {
                                    next = next.left;
                                    next.Load();
                                }
                                Array.Copy(item, i + 1, item, i, n - i - 1);
                                //while (++i < n) {
                                //    item[i-1] = item[i];
                                //}
                                item[n - 1] = next.item[0];
                                pg = ref_Renamed.pg;
                                ref_Renamed.pg = right;
                                int h = right.Remove(comparator, LoadItem(n - 1), ref_Renamed);
                                right = ref_Renamed.pg;
                                ref_Renamed.pg = pg;
                                if (h == UNDERFLOW)
                                {
                                    h = BalanceRightBranch(ref_Renamed);
                                }
                                return h;
                            }
                        }
                        Array.Copy(item, i + 1, item, i, n - i - 1);
                        //while (++i < n) {
                        //    item[i-1] = item[i];
                        //}
                        item[n - 1] = null;
                        nItems -= 1;
                        return OK;
                    }
                }
            }

            if (right != null)
            {
                Modify();
                pg = ref_Renamed.pg;
                ref_Renamed.pg = right;
                int h = right.Remove(comparator, mbr, ref_Renamed);
                right = ref_Renamed.pg;
                ref_Renamed.pg = pg;
                if (h == UNDERFLOW)
                {
                    return BalanceRightBranch(ref_Renamed);
                }
                else
                {
                    return h;
                }
            }
            return NOT_FOUND;
        }
Пример #3
0
        internal int Insert(PersistentComparator comparator, IPersistent mbr, bool unique, PageReference ref_Renamed)
        {
            Load();
            int n = nItems;
            TtreePage pg;
            int diff = comparator.CompareMembers(mbr, LoadItem(0));
            if (diff <= 0)
            {
                if (unique && diff == 0)
                {
                    return NOT_UNIQUE;
                }
                if ((this.left == null || diff == 0) && n != maxItems)
                {
                    Modify();
                    //for (int i = n; i > 0; i--) item[i] = item[i-1];
                    Array.Copy(item, 0, item, 1, n);
                    item[0] = mbr;
                    nItems += 1;
                    return OK;
                }
                if (this.left == null)
                {
                    Modify();
                    this.left = new TtreePage(mbr);
                }
                else
                {
                    pg = ref_Renamed.pg;
                    ref_Renamed.pg = this.left;
                    int result = this.left.Insert(comparator, mbr, unique, ref_Renamed);
                    if (result == NOT_UNIQUE)
                    {
                        return NOT_UNIQUE;
                    }
                    Modify();
                    this.left = ref_Renamed.pg;
                    ref_Renamed.pg = pg;
                    if (result == OK)
                        return OK;
                }

                if (balance > 0)
                {
                    balance = 0;
                    return OK;
                }
                else if (balance == 0)
                {
                    balance = -1;
                    return OVERFLOW;
                }
                else
                {
                    TtreePage left = this.left;
                    left.Load();
                    left.Modify();
                    if (left.balance < 0)
                    {
                        // single LL turn
                        this.left = left.right;
                        left.right = this;
                        balance = 0;
                        left.balance = 0;
                        ref_Renamed.pg = left;
                    }
                    else
                    {
                        // double LR turn
                        TtreePage right = left.right;
                        right.Load();
                        right.Modify();
                        left.right = right.left;
                        right.left = left;
                        this.left = right.right;
                        right.right = this;
                        balance = (right.balance < 0) ? 1 : 0;
                        left.balance = (right.balance > 0) ? -1 : 0;
                        right.balance = 0;
                        ref_Renamed.pg = right;
                    }
                    return OK;
                }
            }

            diff = comparator.CompareMembers(mbr, LoadItem(n - 1));
            if (diff >= 0)
            {
                if (unique && diff == 0)
                {
                    return NOT_UNIQUE;
                }

                if ((this.right == null || diff == 0) && n != maxItems)
                {
                    Modify();
                    item[n] = mbr;
                    nItems += 1;
                    return OK;
                }
                if (this.right == null)
                {
                    Modify();
                    this.right = new TtreePage(mbr);
                }
                else
                {
                    pg = ref_Renamed.pg;
                    ref_Renamed.pg = this.right;
                    int result = this.right.Insert(comparator, mbr, unique, ref_Renamed);
                    if (result == NOT_UNIQUE)
                    {
                        return NOT_UNIQUE;
                    }
                    Modify();
                    this.right = ref_Renamed.pg;
                    ref_Renamed.pg = pg;
                    if (result == OK)
                        return OK;
                }

                if (balance < 0)
                {
                    balance = 0;
                    return OK;
                }
                else if (balance == 0)
                {
                    balance = 1;
                    return OVERFLOW;
                }
                else
                {
                    TtreePage right = this.right;
                    right.Load();
                    right.Modify();
                    if (right.balance > 0)
                    {
                        // single RR turn
                        this.right = right.left;
                        right.left = this;
                        balance = 0;
                        right.balance = 0;
                        ref_Renamed.pg = right;
                    }
                    else
                    {
                        // double RL turn
                        TtreePage left = right.left;
                        left.Load();
                        left.Modify();
                        right.left = left.right;
                        left.right = right;
                        this.right = left.left;
                        left.left = this;
                        balance = (left.balance > 0) ? -1 : 0;
                        right.balance = (left.balance < 0) ? 1 : 0;
                        left.balance = 0;
                        ref_Renamed.pg = left;
                    }
                    return OK;
                }
            }

            int l = 1, r = n - 1;
            while (l < r)
            {
                int i = (l + r) >> 1;
                diff = comparator.CompareMembers(mbr, LoadItem(i));
                if (diff > 0)
                {
                    l = i + 1;
                }
                else
                {
                    r = i;
                    if (diff == 0)
                    {
                        if (unique)
                        {
                            return NOT_UNIQUE;
                        }
                        break;
                    }
                }
            }
            // Insert before item[r]
            Modify();
            if (n != maxItems)
            {
                Array.Copy(item, r, item, r + 1, n - r);
                //for (int i = n; i > r; i--) item[i] = item[i-1];
                item[r] = mbr;
                nItems += 1;
                return OK;
            }
            else
            {
                IPersistent reinsertItem;
                if (balance >= 0)
                {
                    reinsertItem = LoadItem(0);
                    Array.Copy(item, 1, item, 0, r - 1);
                    //for (int i = 1; i < r; i++) item[i-1] = item[i];
                    item[r - 1] = mbr;
                }
                else
                {
                    reinsertItem = LoadItem(n - 1);
                    Array.Copy(item, r, item, r + 1, n - r - 1);
                    //for (int i = n-1; i > r; i--) item[i] = item[i-1];
                    item[r] = mbr;
                }
                return Insert(comparator, reinsertItem, unique, ref_Renamed);
            }
        }
Пример #4
0
        internal bool Find(PersistentComparator comparator, object minValue, int minInclusive, object maxValue, int maxInclusive, ArrayList selection)
        {
            int l, r, m, n;
            Load();
            n = nItems;
            if (minValue != null)
            {
                if (-comparator.CompareMemberWithKey(LoadItem(0), minValue) >= minInclusive)
                {
                    if (-comparator.CompareMemberWithKey(LoadItem(n - 1), minValue) >= minInclusive)
                    {
                        if (right != null)
                        {
                            return right.Find(comparator, minValue, minInclusive, maxValue, maxInclusive, selection);
                        }
                        return true;
                    }

                    for (l = 0, r = n; l < r; )
                    {
                        m = (l + r) >> 1;
                        if (-comparator.CompareMemberWithKey(LoadItem(m), minValue) >= minInclusive)
                        {
                            l = m + 1;
                        }
                        else
                        {
                            r = m;
                        }
                    }

                    while (r < n)
                    {
                        if (maxValue != null && comparator.CompareMemberWithKey(LoadItem(r), maxValue) >= maxInclusive)
                        {
                            return false;
                        }
                        selection.Add(LoadItem(r));
                        r += 1;
                    }

                    if (right != null)
                    {
                        return right.Find(comparator, minValue, minInclusive, maxValue, maxInclusive, selection);
                    }
                    return true;
                }
            }

            if (left != null)
            {
                if (!left.Find(comparator, minValue, minInclusive, maxValue, maxInclusive, selection))
                {
                    return false;
                }
            }

            for (l = 0; l < n; l++)
            {
                if (maxValue != null && comparator.CompareMemberWithKey(LoadItem(l), maxValue) >= maxInclusive)
                {
                    return false;
                }
                selection.Add(LoadItem(l));
            }

            if (right != null)
            {
                return right.Find(comparator, minValue, minInclusive, maxValue, maxInclusive, selection);
            }

            return true;
        }
Пример #5
0
        internal bool Contains(PersistentComparator comparator, IPersistent mbr)
        {
            int l, r, m, n;
            Load();
            n = nItems;
            if (comparator.CompareMembers(LoadItem(0), mbr) < 0)
            {
                if (comparator.CompareMembers(LoadItem(n - 1), mbr) < 0)
                {
                    if (right != null)
                    {
                        return right.Contains(comparator, mbr);
                    }
                    return false;
                }

                for (l = 0, r = n; l < r; )
                {
                    m = (l + r) >> 1;
                    if (comparator.CompareMembers(LoadItem(m), mbr) < 0)
                    {
                        l = m + 1;
                    }
                    else
                    {
                        r = m;
                    }
                }

                while (r < n)
                {
                    if (mbr == LoadItem(r))
                    {
                        return true;
                    }
                    if (comparator.CompareMembers(item[r], mbr) > 0)
                    {
                        return false;
                    }
                    r += 1;
                }
                if (right != null)
                {
                    return right.Contains(comparator, mbr);
                }
                return false;
            }

            if (left != null)
            {
                if (left.Contains(comparator, mbr))
                {
                    return true;
                }
            }

            for (l = 0; l < n; l++)
            {
                if (mbr == LoadItem(l))
                {
                    return true;
                }
                if (comparator.CompareMembers(item[l], mbr) > 0)
                {
                    return false;
                }
            }

            if (right != null)
            {
                return right.Contains(comparator, mbr);
            }

            return false;
        }
Пример #6
0
 internal Ttree(PersistentComparator comparator, bool unique)
 {
     this.comparator = comparator;
     this.unique = unique;
 }