/// <summary> /// Deletes the array. /// </summary> /// <param name="targetIndex">Index of the target.</param> /// <param name="targetArray">The target array.</param> public void DeleteArray(MemoryIndex targetIndex, AssociativeArray targetArray) { IArrayDescriptor targetArrayDescriptor = targetStructure.GetDescriptor(targetArray); foreach (var index in targetArrayDescriptor.Indexes) { // Enqueue delete operation for every child index MemoryIndex childIndex = index.Value; MergeOperation childOperation = new MergeOperation(); childOperation.SetTargetIndex(childIndex); childOperation.SetDeleteOperation(); operationQueue.AddLast(childOperation); } // Enqueue delete operation for unknown index MergeOperation unknownOperation = new MergeOperation(); unknownOperation.SetTargetIndex(targetArrayDescriptor.UnknownIndex); unknownOperation.SetUndefined(); unknownOperation.SetDeleteOperation(); operationQueue.AddLast(unknownOperation); // Deletes array from structure writeableTargetStructure.RemoveArray(targetIndex, targetArray); }
/// <summary> /// Enqueues the merge operation. /// </summary> /// <param name="childName">Name of the child.</param> /// <param name="operation">The operation.</param> /// <param name="targetContainerContext">The target container context.</param> /// <param name="childTreeNode">The child tree node.</param> /// <param name="alwaysDefined">if set to <c>true</c> [always defined].</param> private void enqueueMergeOperation(string childName, MergeOperation operation, ITargetContainerContext targetContainerContext, MemoryIndexTreeNode childTreeNode, bool alwaysDefined) { IReadonlyIndexContainer targetContainer = targetContainerContext.getSourceContainer(); MemoryIndex targetIndex; // Use index from target collection or crete and add it to the target collection if (!targetContainer.TryGetIndex(childName, out targetIndex)) { targetIndex = createNewTargetIndex(targetContainerContext, childName); if (targetIndex == null) { return; } } // Set parameters and add it to collection operation.TreeNode = childTreeNode; operation.SetTargetIndex(targetIndex); if (!alwaysDefined) { operation.SetUndefined(); } operationQueue.AddLast(operation); }
/// <summary> /// Collects the indexes. /// </summary> /// <param name="childName">Name of the child.</param> /// <param name="sourceContainers">The source containers.</param> /// <param name="operation">The operation.</param> /// <returns>True if there is some defined child; otherwise false</returns> private bool collectIndexes(string childName, List <ContainerContext> sourceContainers, MergeOperation operation) { bool childDefined = false; // Collect source indexes from source collection foreach (ContainerContext containerContext in sourceContainers) { MemoryIndex sourceIndex; if (containerContext.IndexContainer.TryGetIndex(childName, out sourceIndex)) { // Collection contains field - use it operation.Add(new MergeOperationContext(sourceIndex, containerContext.SnapshotContext)); childDefined = true; } else { // Collection do not contain - use unknown index as source // When unknown index is the source - all subtree has to be merged into operation.Add( new MergeOperationContext( containerContext.IndexContainer.UnknownIndex, containerContext.SnapshotContext, MergeOperationType.WholeSubtree) ); operation.SetUndefined(); } } return(childDefined); }
/// <summary> /// Enqueues the merge unknown operation. /// </summary> /// <param name="targetContainerContext">The target container context.</param> /// <param name="anyNode">Any node.</param> /// <param name="sourceContainers">The source containers.</param> private void enqueueMergeUnknownOperation(ITargetContainerContext targetContainerContext, MemoryIndexTreeNode anyNode, List <ContainerContext> sourceContainers) { MergeOperation unknownOperation = new MergeOperation(); foreach (ContainerContext containerContext in sourceContainers) { unknownOperation.Add(new MergeOperationContext( containerContext.IndexContainer.UnknownIndex, containerContext.SnapshotContext)); } IReadonlyIndexContainer targetContainer = targetContainerContext.getSourceContainer(); unknownOperation.TreeNode = anyNode; unknownOperation.SetTargetIndex(targetContainer.UnknownIndex); unknownOperation.SetUndefined(); operationQueue.AddLast(unknownOperation); }