/// <summary> /// Processes the merge operation. /// </summary> /// <param name="operation">The operation.</param> private void processMergeOperation(MergeOperation operation) { MemoryIndex targetIndex = operation.TargetIndex; var targetIndexDatasources = targetSnapshot.MergeInfo.GetOrCreateDatasourcesContaier(targetIndex); // Iterate sources foreach (MergeOperationContext operationContext in operation.Indexes) { // Retreive source context and definition MemoryIndex sourceIndex = operationContext.Index; SnapshotContext context = operationContext.SnapshotContext; IIndexDefinition sourceDefinition = context.SourceStructure.GetIndexDefinition(sourceIndex); // Collect array and aliases data arrayWorker.collectSourceArray(targetIndex, operation, operationContext, sourceDefinition.Array); aliasWorker.collectSourceAliases(sourceDefinition.Aliases); objectWorker.collectSourceObjects(sourceDefinition.Objects); // Store datasource for data and info merging targetIndexDatasources.SetDatasource(context.SourceSnapshot, sourceIndex); } IIndexDefinition targetDefinition; if (targetStructure.TryGetIndexDefinition(targetIndex, out targetDefinition)) { // Index is set in target snapshot if (targetDefinition.Array != null) { arrayWorker.SetTargetArray(targetDefinition.Array); } } else { // Index is not set in target snapshot - create it writeableTargetStructure.NewIndex(targetIndex); } aliasWorker.MergeAliasesAndClear(targetIndex, operation); arrayWorker.MergeArraysAndClear(targetSnapshot, targetIndex, operation); objectWorker.MergeObjectsAndClear(targetIndex); }