/// <summary> /// Sends the data to the operator's ReduceReceiver to be aggregated. /// </summary> /// <param name="data">The data to send</param> public void Send(T data) { var messageList = PipelineDataConverter.PipelineMessage(data); if (data == null) { throw new ArgumentNullException("data"); } foreach (var message in messageList) { if (_topology.HasChildren()) { var reducedValueOfChildren = _topology.ReceiveFromChildren(_pipelinedReduceFunc); var mergeddData = new List <PipelineMessage <T> > { message }; if (reducedValueOfChildren != null) { mergeddData.Add(reducedValueOfChildren); } var reducedValue = _pipelinedReduceFunc.Reduce(mergeddData); _topology.SendToParent(reducedValue, MessageType.Data); } else { _topology.SendToParent(message, MessageType.Data); } } }