예제 #1
0
        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;
            }
        }
예제 #2
0
        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));
        }
예제 #3
0
        // 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));
        }
예제 #4
0
        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);
        }
예제 #5
0
        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);
        }