Пример #1
0
        private bool Delete(IOrderedSet <IData, IData> set, DeleteRangeOperation operation)
        {
            long from = ((Data <long>)operation.FromKey).Slot0;
            long to   = ((Data <long>)operation.ToKey).Slot0;

            int  localFrom = (int)(from % BLOCK_SIZE);
            int  localTo   = (int)(to % BLOCK_SIZE);
            long baseFrom  = from - localFrom;
            long baseTo    = to - localTo;

            long internalFrom = localFrom > 0 ? baseFrom + BLOCK_SIZE : baseFrom;
            long internalTo   = localTo < BLOCK_SIZE - 1 ? baseTo - 1 : baseTo;

            bool isModified = false;

            if (internalFrom <= internalTo)
            {
                isModified = set.Remove(new Data <long>(internalFrom), true, new Data <long>(internalTo), true);
            }

            IData         tmp;
            Data <byte[]> record;

            if (localFrom > 0 && set.TryGetValue(new Data <long>(baseFrom), out tmp))
            {
                record = (Data <byte[]>)tmp;
                if (localFrom < record.Slot0.Length)
                {
                    Array.Clear(record.Slot0, localFrom, baseFrom < baseTo ? record.Slot0.Length - localFrom : localTo - localFrom + 1);
                    isModified = true;
                }
                if (baseFrom == baseTo)
                {
                    return(isModified);
                }
            }

            if (localTo < BLOCK_SIZE - 1 && set.TryGetValue(new Data <long>(baseTo), out tmp))
            {
                record = (Data <byte[]>)tmp;
                if (localTo < record.Slot0.Length - 1)
                {
                    Array.Clear(record.Slot0, 0, localTo + 1);
                    isModified = true;
                }
                else
                {
                    isModified = set.Remove(new Data <long>(baseTo));
                }
            }

            return(isModified);
        }
Пример #2
0
        public bool Leaf(IOperationCollection operations, IOrderedSet<IData, IData> data)
        {
            //sequential optimization
            if (operations.AreAllMonotoneAndPoint && data.IsInternallyOrdered && (data.Count == 0 || operations.Locator.KeyComparer.Compare(data.Last.Key, operations[0].FromKey) < 0))
                return SequentialApply(operations, data);

            //common action optimization
            if (operations.CommonAction != OperationCode.UNDEFINED)
                return CommonApply(operations, data);

            //standart apply
            bool isModified = false;

            foreach (var opr in operations)
            {
                switch (opr.Code)
                {
                    case OperationCode.REPLACE:
                        {
                            data[opr.FromKey] = ((ReplaceOperation)opr).Record;

                            isModified = true;
                        }
                        break;
                    case OperationCode.INSERT_OR_IGNORE:
                        {
                            if (data.ContainsKey(opr.FromKey))
                                continue;

                            data[opr.FromKey] = ((InsertOrIgnoreOperation)opr).Record;

                            isModified = true;
                        }
                        break;
                    case OperationCode.DELETE:
                        {
                            if (data.Remove(opr.FromKey))
                                isModified = true;
                        }
                        break;
                    case OperationCode.DELETE_RANGE:
                        {
                            if (data.Remove(opr.FromKey, true, opr.ToKey, true))
                                isModified = true;
                        }
                        break;
                    case OperationCode.CLEAR:
                        {
                            data.Clear();
                            isModified = true;
                        }
                        break;
                    default:
                        throw new NotImplementedException();
                }
            }

            return isModified;
        }
Пример #3
0
        private bool CommonApply(IOperationCollection operations, IOrderedSet<IData, IData> data)
        {
            int commonAction = operations.CommonAction;

            int changes = 0;

            switch (commonAction)
            {
                case OperationCode.REPLACE:
                    {
                        foreach (var opr in operations)
                        {
                            data[opr.FromKey] = ((ReplaceOperation)opr).Record;
                            changes++;
                        }
                    }
                    break;

                case OperationCode.INSERT_OR_IGNORE:
                    {
                        foreach (var opr in operations)
                        {
                            if (data.ContainsKey(opr.FromKey))
                                continue;

                            data[opr.FromKey] = ((InsertOrIgnoreOperation)opr).Record;
                            changes++;
                        }
                    }
                    break;

                case OperationCode.DELETE:
                    {
                        foreach (var opr in operations)
                        {
                            if (data.Remove(opr.FromKey))
                                changes++;
                        }
                    }
                    break;

                case OperationCode.DELETE_RANGE:
                    {
                        foreach (var opr in operations)
                        {
                            if (data.Remove(opr.FromKey, true, opr.ToKey, true))
                                changes++;
                        }
                    }
                    break;

                case OperationCode.CLEAR:
                    {
                        foreach (var opr in operations)
                        {
                            data.Clear();
                            changes++;
                            break;
                        }
                    }
                    break;

                default:
                    throw new NotImplementedException();
            }

            return changes > 0;
        }
Пример #4
0
        private bool CommonApply(IOperationCollection operations, IOrderedSet <IData, IData> data)
        {
            int commonAction = operations.CommonAction;

            int changes = 0;

            switch (commonAction)
            {
            case OperationCode.REPLACE:
            {
                foreach (var opr in operations)
                {
                    data[opr.FromKey] = ((ReplaceOperation)opr).Record;
                    changes++;
                }
            }
            break;

            case OperationCode.INSERT_OR_IGNORE:
            {
                foreach (var opr in operations)
                {
                    if (data.ContainsKey(opr.FromKey))
                    {
                        continue;
                    }

                    data[opr.FromKey] = ((InsertOrIgnoreOperation)opr).Record;
                    changes++;
                }
            }
            break;

            case OperationCode.DELETE:
            {
                foreach (var opr in operations)
                {
                    if (data.Remove(opr.FromKey))
                    {
                        changes++;
                    }
                }
            }
            break;

            case OperationCode.DELETE_RANGE:
            {
                foreach (var opr in operations)
                {
                    if (data.Remove(opr.FromKey, true, opr.ToKey, true))
                    {
                        changes++;
                    }
                }
            }
            break;

            case OperationCode.CLEAR:
            {
                foreach (var opr in operations)
                {
                    data.Clear();
                    changes++;
                    break;
                }
            }
            break;

            default:
                throw new NotImplementedException();
            }

            return(changes > 0);
        }
Пример #5
0
        public bool Leaf(IOperationCollection operations, IOrderedSet <IData, IData> data)
        {
            //sequential optimization
            if (operations.AreAllMonotoneAndPoint && data.IsInternallyOrdered && (data.Count == 0 || operations.Locator.KeyComparer.Compare(data.Last.Key, operations[0].FromKey) < 0))
            {
                return(SequentialApply(operations, data));
            }

            //common action optimization
            if (operations.CommonAction != OperationCode.UNDEFINED)
            {
                return(CommonApply(operations, data));
            }

            //standart apply
            bool isModified = false;

            foreach (var opr in operations)
            {
                switch (opr.Code)
                {
                case OperationCode.REPLACE:
                {
                    data[opr.FromKey] = ((ReplaceOperation)opr).Record;

                    isModified = true;
                }
                break;

                case OperationCode.INSERT_OR_IGNORE:
                {
                    if (data.ContainsKey(opr.FromKey))
                    {
                        continue;
                    }

                    data[opr.FromKey] = ((InsertOrIgnoreOperation)opr).Record;

                    isModified = true;
                }
                break;

                case OperationCode.DELETE:
                {
                    if (data.Remove(opr.FromKey))
                    {
                        isModified = true;
                    }
                }
                break;

                case OperationCode.DELETE_RANGE:
                {
                    if (data.Remove(opr.FromKey, true, opr.ToKey, true))
                    {
                        isModified = true;
                    }
                }
                break;

                case OperationCode.CLEAR:
                {
                    data.Clear();
                    isModified = true;
                }
                break;

                default:
                    throw new NotImplementedException();
                }
            }

            return(isModified);
        }