public override Models.ILiiteriMarker Create(DbDataReader rdr) { var obj = new Models.TimePeriod(); obj.Id = (int)rdr["PeriodId"]; obj.DataAreaTypes = new List <Models.DataAreaType>(); return(obj); }
public override IEnumerable <Models.IndicatorDetails> FindAll() { /* This is a bit different from standard way of handling results; * here we aggregate different sets of data from a single query * into nested object tree */ var entityList = new List <Models.IndicatorDetails>(); int prevDetailsId = 0; int prevPeriodId = 0; var detailsFactory = new Factories.IndicatorDetailsFactory(); var periodFactory = new Factories.TimePeriodFactory(); var dataAreaTypeFactory = new Factories.DataAreaTypeFactory(); var areaTypeFactory = new Factories.AreaTypeFactory(); var annotationFactory = new Factories.AnnotationFactory(); var accessRightFactory = new Factories.AccessRightFactory(); Models.IndicatorDetails details = null; Models.TimePeriod timePeriod = null; List <Models.TimePeriod> timePeriods = null; /* DataAreaType (or "database areatype") used internally * AreaType is provided via API for the client to use */ Models.DataAreaType dataAreaType = null; List <Models.DataAreaType> dataAreaTypes = null; List <Models.AreaType> areaTypes = null; List <Models.Annotation> annotations = null; using (DbDataReader rdr = this.GetDbDataReader(this.queries.Single())) { while (rdr.Read()) { /* each IndicatorDetails instance may have a number * of TimePeriods */ if (prevDetailsId != (prevDetailsId = (int)rdr["Id"])) { details = (Models.IndicatorDetails) detailsFactory.Create(rdr); if (new[] { 3, 5 }.Contains( (int)rdr["CalculationType"])) { details.DerivedStatistics = this.GetDerivedStatistics( (int)rdr["Id"], (int)rdr["CalculationType"]); } if (!Convert.IsDBNull(rdr["AccessRightId"])) { details.AccessRight = (Models.AccessRight) accessRightFactory.Create(rdr); } timePeriods = new List <Models.TimePeriod>(); details.TimePeriods = timePeriods; entityList.Add(details); } /* each TimePeriod instance may have a number * of AreaTypes, as well as a a number of Annotations */ if (prevPeriodId != (prevPeriodId = (int)rdr["PeriodId"])) { timePeriod = (Models.TimePeriod) periodFactory.Create(rdr); dataAreaTypes = new List <Models.DataAreaType>(); areaTypes = new List <Models.AreaType>(); timePeriod.DataAreaTypes = dataAreaTypes; timePeriod.AreaTypes = areaTypes; timePeriod.BlockedAreaTypes = new string[0]; annotations = new List <Models.Annotation>(); timePeriod.Annotations = annotations; timePeriods.Add(timePeriod); } /* AreaTypes are exposed by the API */ int databaseAreaType = (int)rdr["AreaTypeId"]; IEnumerable <Models.AreaType> applicableAreaTypes; /* special statistics should only return * one available areaType */ if (details.CalculationType == 4) { applicableAreaTypes = new List <Models.AreaType>() { AreaTypeMappings.GetPrimaryAreaType(databaseAreaType) }; } else { applicableAreaTypes = AreaTypeMappings.GetAreaTypes(databaseAreaType); } timePeriod.BlockedAreaTypes = Convert.IsDBNull(rdr["BlockedAreaTypes"]) ? new string[0] : ((string)rdr["BlockedAreaTypes"]).Split(','); foreach (Models.AreaType a in applicableAreaTypes) { if (timePeriod.BlockedAreaTypes.Contains(a.Id)) { continue; } areaTypes.Add((Models.AreaType) areaTypeFactory.Create(a, rdr)); } /* DataAreaTypes (or "database areatypes") are not * exposed by the API, but are used internally */ dataAreaType = (Models.DataAreaType) dataAreaTypeFactory.Create(rdr); dataAreaTypes.Add(dataAreaType); /* Each TimePeriod can also have a number * of Annotations */ if (!Convert.IsDBNull(rdr["Annotation"])) { annotations.Add((Models.Annotation) annotationFactory.Create(rdr)); } } } return(entityList); }