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