public void TestAllCountyUAsInDeprivationDecile()
        {
            Grouping grouping = new Grouping
            {
                AgeId = AgeIds.Under75,
                SexId = SexIds.Persons,
                IndicatorId = IndicatorIds.OverallPrematureDeaths,
                GroupId = GroupIds.LongerLives,
                ComparatorId = ComparatorIds.Subnational,
                ComparatorMethodId = ComparatorMethodId.SingleOverlappingCIs,
                AreaTypeId = AreaTypeIds.CountyAndUnitaryAuthority,
                YearRange = 3,
                DataPointYear = 2010
            };

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(
                new IndicatorComparerFactory { PholioReader = ReaderFactory.GetPholioReader() },
                ReaderFactory.GetGroupDataReader(),
                ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                AreaTypeId = grouping.AreaTypeId,
                DataPointOffset = 0,
                ParentAreaCode = CategoryArea.CreateAreaCode(
                    CategoryTypeIds.DeprivationDecileCountyAndUA2010, 1),
                ComparatorId = grouping.ComparatorId
            };

            BuildAndVerifyData(builder, grouping);
        }
        public void TestAllCountyAndUAsForEngland()
        {
            var grouping = GroupingForEngland();

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(
                new IndicatorComparerFactory { PholioReader = ReaderFactory.GetPholioReader() },
                ReaderFactory.GetGroupDataReader(),
                ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                AreaTypeId = grouping.AreaTypeId,
                DataPointOffset = 0,
                ParentAreaCode = AreaCodes.England,
                ComparatorId = grouping.ComparatorId
            };

            BuildAndVerifyData(builder, grouping);
        }
        private void InitBuilder(int childAreaTypeId)
        {
            builder = new GroupRootNationalValuesBuilder();

            var indicatorComparer = new IndicatorComparerFactory
            {
                PholioReader = ReaderFactory.GetPholioReader()
            };

            var listBuilder = new ChildAreaValuesBuilder(indicatorComparer,
                ReaderFactory.GetGroupDataReader(), ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                ParentAreaCode = AreaCodes.England,
                AreaTypeId = childAreaTypeId
            };

            builder.ChildAreaValuesBuilder = listBuilder;
        }
        public IList<CoreDataSet> GetValues()
        {
            var profileId = GetProfileId();
            var grouping = GetGrouping(profileId);

            var indicatorComparerFactory = new IndicatorComparerFactory
            {
                PholioReader = ReaderFactory.GetPholioReader()
            };

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(indicatorComparerFactory, groupDataReader,
                ReaderFactory.GetAreasReader(), profileReader)
            {
                AreaTypeId = _parameters.AreaTypeId,
                ParentAreaCode = _parameters.ParentAreaCode,
                DataPointOffset = _parameters.DataPointOffset,
                ComparatorId = _parameters.ComparatorId,
                RestrictToProfileId = GetProfileId()
            };

            return builder.Build(grouping);
        }
        public void TestAllCountyUAsWithQuintilesComparison()
        {
            Grouping grouping = new Grouping
            {
                AgeId = AgeIds.Under75,
                SexId = SexIds.Persons,
                IndicatorId = IndicatorIds.OverallPrematureDeaths,
                GroupId = GroupIds.LongerLives,
                ComparatorId = ComparatorIds.Subnational,
                ComparatorMethodId = ComparatorMethodId.Quintiles,
                AreaTypeId = AreaTypeIds.CountyAndUnitaryAuthority,
                YearRange = 3,
                DataPointYear = 2010
            };

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(
                new IndicatorComparerFactory { PholioReader = ReaderFactory.GetPholioReader() },
                ReaderFactory.GetGroupDataReader(),
                ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                AreaTypeId = grouping.AreaTypeId,
                DataPointOffset = 0,
                ParentAreaCode = AreaCodes.Gor_EastMidlands,
                ComparatorId = grouping.ComparatorId
            };

            var list = builder.Build(grouping);

            Assert.IsTrue(list.Any());

            var categoriesFound = new [] {false,false,false,false,false};
            foreach (var coreDataSet in list)
            {
                var sig = coreDataSet.Significance[grouping.ComparatorId];
                categoriesFound[sig - 1] = true;
                Assert.AreNotEqual(Significance.None,sig);
            }

            // Check at least one of each category was found
            foreach (var b in categoriesFound)
            {
                Assert.IsTrue(b);
            }
        }
        private static void BuildAndVerifyData(ChildAreaValuesBuilder builder, Grouping grouping)
        {
            var list = builder.Build(grouping);

            Assert.IsTrue(list.Any());

            // Significance is calculated
            Assert.AreNotEqual(Significance.None,
                list.First().Significance[grouping.ComparatorId]);
        }
        public void TestTargetComparisonIsMade()
        {
            Grouping grouping = new Grouping
            {
                AgeId = AgeIds.Plus15,
                SexId = SexIds.Persons,
                IndicatorId = IndicatorIds.HIVLateDiagnosis, // an indicator with a target
                GroupId = GroupIds.SexualAndReproductiveHealth,
                ComparatorId = ComparatorIds.England,
                ComparatorMethodId = ComparatorMethodId.SingleOverlappingCIs,
                AreaTypeId = AreaTypeIds.DistrictAndUnitaryAuthority,
                YearRange = 3,
                DataPointYear = 2011
            };

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(
                new IndicatorComparerFactory { PholioReader = ReaderFactory.GetPholioReader() },
                ReaderFactory.GetGroupDataReader(),
                ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                AreaTypeId = grouping.AreaTypeId,
                DataPointOffset = 0,
                ParentAreaCode = AreaCodes.England,
                ComparatorId = grouping.ComparatorId
            };

            var list = builder.Build(grouping);

            // Target significance is calculated
            Assert.AreNotEqual(Significance.None,
                list.First().Significance[ComparatorIds.Target]);
        }
        public void TestEmptyListReturnedWhenNoData()
        {
            var grouping = GroupingForEngland();

            grouping.DataPointYear = 1900;

            ChildAreaValuesBuilder builder = new ChildAreaValuesBuilder(
                new IndicatorComparerFactory { PholioReader = ReaderFactory.GetPholioReader() },
                ReaderFactory.GetGroupDataReader(),
                ReaderFactory.GetAreasReader(),
                ReaderFactory.GetProfileReader())
            {
                AreaTypeId = grouping.AreaTypeId,
                DataPointOffset = 0,
                ParentAreaCode = AreaCodes.England,
                ComparatorId = grouping.ComparatorId
            };

            var list = builder.Build(grouping);

            Assert.IsFalse(list.Any());
        }
        public Dictionary<string, IList<SimpleAreaData>> Build()
        {
            IndicatorMetadataRepository indicatorMetadataRepository = IndicatorMetadataRepository.Instance;
            IList<Grouping> groupings = groupDataReader.GetGroupingsByGroupIdAndAreaTypeIdOrderedBySequence(GroupId, AreaTypeId);
            GroupRootBuilder rootBuilder = new GroupRootBuilder();
            IList<GroupRoot> roots = rootBuilder.BuildGroupRoots(groupings);

            CoreDataSetProviderFactory coreDataSetProviderFactory = new CoreDataSetProviderFactory();

            Dictionary<string, IList<SimpleAreaData>> responseObjects = new Dictionary<string, IList<SimpleAreaData>>();

            foreach (IArea area in Areas)
            {
                List<SimpleAreaData> dataObjects = new List<SimpleAreaData>();
                responseObjects.Add(area.Code, dataObjects);

                var isAreaCcg = area.IsCcg;

                bool isAreaAggregate = isAreaCcg || area.IsGpDeprivationDecile || area.IsShape;

                CoreDataSetProvider coreDataSetProvider = coreDataSetProviderFactory.New(area);

                var indicatorComparerFactory =
                    new IndicatorComparerFactory { PholioReader = pholioReader };
                foreach (GroupRoot root in roots)
                {
                    Grouping grouping = root.FirstGrouping;

                    IndicatorComparer comparer = indicatorComparerFactory.New(grouping);
                    IndicatorMetadata metadata = indicatorMetadataRepository.GetIndicatorMetadata(grouping.IndicatorId);

                    var formatter = NumericFormatterFactory.New(metadata, groupDataReader);
                    var dataProcessor = new ValueWithCIsDataProcessor(formatter);

                    List<ValueData> dataList = new List<ValueData>();

                    ITimePeriodTextListBuilder timePeriodTextListBuilder =
                        TimePeriodTextListBuilderFactory.New(IncludeTimePeriods, metadata);

                    Dictionary<string, List<int?>> significanceHash = null;
                    if (isAreaAggregate == false || isAreaCcg)
                    {
                        significanceHash = GetSignificanceHash(ComparatorAreaCodes);
                    }

                    var timePeriods = GetTimePeriods(grouping, metadata.YearType);
                    foreach (TimePeriod timePeriod in timePeriods)
                    {
                        timePeriodTextListBuilder.Add(timePeriod);

                        CoreDataSet areaData = coreDataSetProvider.GetData(grouping, timePeriod, metadata);

                        if (areaData != null)
                        {
                            ValueWithCIsData data = areaData.GetValueWithCIsData();
                            dataProcessor.FormatAndTruncate(data);

                            if (isAreaAggregate && isAreaCcg == false)
                            {
                                dataList.Add(data.GetValueData());
                            }
                            else
                            {
                                dataList.Add(data);

                                foreach (var comparatorAreaCode in ComparatorAreaCodes)
                                {
                                    CoreDataSet comparatorData =
                                        groupDataReader.GetCoreData(grouping, timePeriod, comparatorAreaCode)
                                            .FirstOrDefault();
                                    try
                                    {
                                        int significance;
                                        if (comparer is ICategoryComparer)
                                        {
                                            var d = new ChildAreaValuesBuilder(indicatorComparerFactory,
                                                groupDataReader, areasReader, profileReader)
                                            {
                                                ParentAreaCode = comparatorAreaCode,
                                                AreaTypeId = AreaTypeId,
                                                ComparatorId = grouping.ComparatorId
                                            }.Build(grouping);
                                            var coreData = d.First(x => x.AreaCode.Equals(area.Code));
                                            significance = coreData.Significance.Values.First();
                                        }
                                        else
                                        {
                                            significance =
                                                (int)comparer.Compare(areaData, comparatorData, metadata);
                                        }

                                        var significanceList = significanceHash[comparatorAreaCode];
                                        significanceList.Add(significance);
                                    }
                                    catch (Exception ex)
                                    {
                                        ExceptionLog.LogException(ex, string.Empty);
                                    }
                                }
                            }
                        }
                        else
                        {
                            // Placeholders for missing data
                            dataList.Add(null);
                            if (significanceHash != null)
                            {
                                foreach (var comparatorAreaCode in ComparatorAreaCodes)
                                {
                                    significanceHash[comparatorAreaCode].Add(null);
                                }
                            }
                        }
                    }

                    SimpleAreaData dataObject;
                    if (IncludeTimePeriods)
                    {
                        // Only attach metadata when requested (hybrid of GroupRoot & CoreDataSet)
                        //TODO this is difficult to keep aligned with Grouping class
                        dataObject = new FullAreaData
                        {
                            IndicatorId = grouping.IndicatorId,
                            Significances = significanceHash,
                            Data = dataList,
                            StateSex = root.StateSex,
                            Sex = grouping.Sex,
                            Age = grouping.Age,
                            ComparatorConfidence = grouping.ComparatorConfidence,
                            ComparatorMethodId = grouping.ComparatorMethodId,
                            Periods = timePeriodTextListBuilder.GetTimePeriodStrings()
                        };
                    }
                    else
                    {
                        dataObject = new SimpleAreaData
                        {
                            IndicatorId = grouping.IndicatorId,
                            Significances = significanceHash,
                            Data = dataList
                        };
                    }
                    dataObjects.Add(dataObject);
                }
            }

            return responseObjects;
        }