public void Include(Person person, PeopleSummary peopleSummary) { peopleSummary.Count++; if (peopleSummary.DateOfBirthMin == null || person.DateOfBirth < peopleSummary.DateOfBirthMin) { peopleSummary.DateOfBirthMin = person.DateOfBirth; } if (peopleSummary.DateOfBirthMax == null || person.DateOfBirth > peopleSummary.DateOfBirthMax) { peopleSummary.DateOfBirthMax = person.DateOfBirth; } }
public StartableBlock <DataBatch <Person> > Create(string targetFilePath, IProgress <PipelineProgress> progress, CancellationToken cancellation) { File.Create(targetFilePath).Dispose(); var builtSummary = new PeopleSummary(); // Create pipelines var summaryFromDbPipeline = CreateSummaryFormDbPipeline(targetFilePath, progress, cancellation); var writeEmptyLineBlock1 = new StartableBlock <object>( () => { if (!summaryFromDbPipeline.Completion.IsFaulted && !summaryFromDbPipeline.Completion.IsCanceled) { File.AppendAllLines(targetFilePath, new[] { string.Empty }); } }); var peoplePipeline = CreatePeoplePipeline(targetFilePath, builtSummary, progress, cancellation); var writeEmptyLineBlock2 = new StartableBlock <object>( () => { if (!peoplePipeline.Completion.IsFaulted && !peoplePipeline.Completion.IsCanceled) { File.AppendAllLines(targetFilePath, new[] { string.Empty }); } }); var builtSummaryPipeline = CreateBuiltSummaryPipeline(targetFilePath, builtSummary, progress, cancellation); // Link pipelines summaryFromDbPipeline.ContinueWith(writeEmptyLineBlock1); writeEmptyLineBlock1.ContinueWith(peoplePipeline); peoplePipeline.ContinueWith(writeEmptyLineBlock2, false); writeEmptyLineBlock2.ContinueWith(builtSummaryPipeline); builtSummaryPipeline.Output.IgnoreOutput(); return(new StartableBlock <DataBatch <Person> >( summaryFromDbPipeline.Start, peoplePipeline.Output, peoplePipeline.EstimatedOutputCount, builtSummaryPipeline.Completion, true)); }
// GET api/<controller>/5 public IHttpActionResult Get(int id) { var people = PeopleController.GetPeople(id, false); if (people == null) { return(NotFound()); } PeopleSummary summ = new PeopleSummary { Race = (Races)id, NumOfPeople = people.Count(), AverageAge = Math.Round(people.Average(p => p.Age), 2), MinAge = people.Min(p => p.Age), MaxAge = people.Max(p => p.Age) }; return(Ok(summ)); }
private StartableBlock <DataBatch <PeopleSummary> > CreateBuiltSummaryPipeline(string targetFilePath, PeopleSummary aggregatedSummary, IProgress <PipelineProgress> progress, CancellationToken cancellation) { var cancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellation); // Create blocks var sourceBlock = _singleItemSourceBlockFactory.Create(() => new DataBatch <PeopleSummary> { Number = -1, DataOffset = 0, IntendedSize = 1, Data = new[] { aggregatedSummary } }, cancellationSource.Token); var writeBlock = _writeCsvBlockFactory.Create <PeopleSummary>(targetFilePath, true, cancellationSource.Token); var progressBlock = _progressReportingBlockFactory.Create("BuiltPeopleSummaryProgress", DataBatch <PeopleSummary> .IdGetter, progress, sourceBlock.EstimatedOutputCount, 1, cancellationSource.Token); // Create pipeline var pipeline = _straightPipelineFactory.Create(sourceBlock, new[] { writeBlock, progressBlock }, cancellationSource); pipeline.ContinueCompletionWith(_ => cancellationSource.Dispose()); return(pipeline); }
private StartableBlock <DataBatch <Person> > CreatePeoplePipeline(string targetFilePath, PeopleSummary builtSummary, IProgress <PipelineProgress> progress, CancellationToken cancellation) { var cancellationSource = CancellationTokenSource.CreateLinkedTokenSource(cancellation); // Create blocks var readBlock = _readPeopleBlockFactory.Create(cancellationSource.Token); var writeBlock = _writeCsvBlockFactory.Create <Person>(targetFilePath, true, cancellationSource.Token); var buildSummaryBlock = new ProcessingBlock <DataBatch <Person> >(DataflowFacade.TransformBlock("BuildSummary", DataBatch <Person> .IdGetter, x => x.Data.ForEach(person => _peopleSummaryBuilder.Include(person, builtSummary)), cancellationSource.Token)); var progressBlock = _progressReportingBlockFactory.Create("PersonProgress", DataBatch <Person> .IdGetter, progress, readBlock.EstimatedOutputCount, 1, cancellationSource.Token); // Create pipeline var pipeline = _straightPipelineFactory.Create(readBlock, new[] { writeBlock, buildSummaryBlock, progressBlock }, cancellationSource); pipeline.ContinueCompletionWith(_ => cancellationSource.Dispose()); return(pipeline); }