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); }
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; }
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; }
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); }
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); }