/// <summary> /// Execute /// </summary> /// <returns></returns> protected override bool Execute() { dynamic result = new ExpandoObject(); Stopwatch sw = new Stopwatch(); sw.Start(); //This is required for validation in the Matrix code, but is not used for px build Request.parameters.GrpCode = Utility.GetCustomConfig("APP_DEFAULT_GROUP"); Request.parameters.source = Utility.GetCustomConfig("APP_DEFAULT_SOURCE"); //We get the PxDocument from the validator PxValidator pxValidator = new PxValidator(); PxDocument PxDoc = pxValidator.ParsePxFile(DTO.MtrInput); if (!pxValidator.ParseValidatorResult.IsValid) { Response.error = Error.GetValidationFailure(pxValidator.ParseValidatorResult.Errors); return(false); } Log.Instance.Debug("*Diagnostic* px valid: " + sw.ElapsedMilliseconds); Matrix matrixPxFile = new Matrix(PxDoc, DTO.FrqCodeTimeval ?? "", DTO.FrqValueTimeval ?? ""); Log.Instance.Debug("*Diagnostic* Matrix created: " + sw.ElapsedMilliseconds); //Sorting, in case the px file is not in SPC order Build_BSO pBso = new Build_BSO(); //List<DataItem_DTO> existingItems = pBso.GetExistingDataItems(matrixPxFile, matrixPxFile.MainSpec, true, false); Specification theSpec = matrixPxFile.GetSpecFromLanguage(DTO.LngIsoCode); // pBso.SetMetadataSortIds(ref theSpec); List <DataItem_DTO> existingItems = pBso.GetMatrixDataItems(matrixPxFile, DTO.LngIsoCode, theSpec); // pBso.SetDataSortIds(ref existingItems, theSpec); //Log.Instance.Debug("*Diagnostic* GetExistingDataItems: " + sw.ElapsedMilliseconds); Log.Instance.Debug("*Diagnostic* Read Cells - count = " + matrixPxFile.Cells.Count + " elapsed: " + sw.ElapsedMilliseconds); result.csv = matrixPxFile.GetCsvObject(existingItems, DTO.LngIsoCode, true); Log.Instance.Debug("*Diagnostic* GetCsvObject- elapsed: " + sw.ElapsedMilliseconds); result.MtrCode = matrixPxFile.Code; Response.data = result; Log.Instance.Debug("GetCsvObject: " + sw.ElapsedMilliseconds); return(true); }
/// <summary> /// Execute /// </summary> /// <returns></returns> protected override bool Execute() { //do the physical structure validation //This is required for validation in the Matrix code, but is not used for px build Request.parameters.GrpCode = Utility.GetCustomConfig("APP_DEFAULT_GROUP"); Request.parameters.CprCode = Utility.GetCustomConfig("APP_DEFAULT_SOURCE"); //validate the px file //We get the PxDocument from the validator PxValidator pxValidator = new PxValidator(); PxDocument PxDoc = pxValidator.ParsePxFile(DTO.MtrInput); if (!pxValidator.ParseValidatorResult.IsValid) { Response.error = Error.GetValidationFailure(pxValidator.ParseValidatorResult.Errors); return(false); } Matrix theMatrixData; //Get this matrix from the px file theMatrixData = new Matrix(PxDoc, DTO.FrqCodeTimeval ?? "", DTO.FrqValueTimeval ?? ""); Build_BSO bBso = new Build_BSO(); //We need to add the new periods to the matrix //And either add cells of default data or else the values from DTO.data var requestPeriods = DTO.Periods;//.OrderBy(x => x.Code).ToList(); DTO.Periods = DTO.Periods.Except(theMatrixData.MainSpec.Frequency.Period).ToList(); theMatrixData = bBso.UpdateMatrixFromBuild(theMatrixData, DTO, Ado); theMatrixData.MainSpec.MainValues = sortMainValuesSpc(theMatrixData.MainSpec); theMatrixData.MainSpec.Values = theMatrixData.MainSpec.MainValues; //bBso.Query needs to be in the same order as the periods in the matrix - why? theMatrixData = bBso.Query(theMatrixData, GetQueryMatrix(requestPeriods, theMatrixData)); theMatrixData.ValidateMyMaps(true); var dataList = bBso.GetMatrixDataItems(theMatrixData, DTO.LngIsoCode, theMatrixData.MainSpec, false); dynamic result = new ExpandoObject(); result.csv = theMatrixData.GetCsvObject(dataList, DTO.LngIsoCode, true, null, DTO.Labels); result.MtrCode = theMatrixData.Code; Response.data = result; return(true); }
internal string GetSDMXdata(Matrix theMatrix, string LngIsoCode) { Specification theSpec = theMatrix.GetSpecFromLanguage(LngIsoCode); Build_BSO bso = new Build_BSO(); List <DataItem_DTO> dataItems = bso.GetMatrixDataItems(theMatrix, LngIsoCode, theSpec, false, true); //sort the data in SCP order foreach (var item in dataItems) { item.sortWord = item.statistic.Code + '/'; foreach (var cls in item.classifications) { item.sortWord = item.sortWord + cls.Code + '/' + cls.Variable[0].Code; } item.sortWord = item.sortWord + item.period.Code; } var slist = dataItems.OrderBy(x => x.sortWord); int counter = 0; List <SdmxItem> sdmxList = new List <SdmxItem>(); SdmxItem sdmx = new SdmxItem(); foreach (var item in slist) { if (counter == 0 || counter % theSpec.Frequency.Period.Count == 0) { if (sdmx.Period != null) { sdmxList.Add(sdmx); } sdmx = new SdmxItem() { Statistic = item.statistic, Classifications = item.classifications, Period = new List <PeriodRecordDTO_Create>(), Value = item.dataValue, PeriodValue = new Dictionary <string, dynamic>() }; sdmx.Period.Add(item.period); sdmx.PeriodValue.Add(item.period.Code, item.dataValue); } else { sdmx.Period.Add(item.period); sdmx.PeriodValue.Add(item.period.Code, item.dataValue); } counter++; } sdmxList.Add(sdmx); XNamespace messageNS = "http://www.sdmx.org/resources/sdmxml/schemas/v2_0/message"; XNamespace c = "http://www.sdmx.org/resources/sdmxml/schemas/v2_0/common"; XNamespace xml = "http://www.w3.org/XML/1998/namespace"; XNamespace ss = "http://www.sdmx.org/resources/sdmxml/schemas/v2_0/data/structurespecific"; XNamespace xsi = "http://www.sdmx.org/resources/sdmxml/schemas/v2_0/data/structurespecific"; XNamespace g = "http://www.sdmx.org/resources/sdmxml/schemas/v2_0/generic"; XElement id = new XElement(g + "ID", theMatrix.Code); XElement test = new XElement(g + "Test", "false"); XElement prepared = new XElement(g + "Prepared", theMatrix.CreationDateTime.ToString("yyyy-MM-ddTHH:mm")); XAttribute senderID = new XAttribute("ID", "CSO"); XAttribute senderNameAttr = new XAttribute(xml + "lang", LngIsoCode); XElement senderName = new XElement(g + "Name", theSpec.Source, senderNameAttr); XElement sender = new XElement(g + "Sender", senderName, senderID); XElement header = new XElement(g + "Header", id, test, prepared, sender ); XElement keyfamilyref = new XElement(g + "KeyFamilyRef", "REF"); XElement series = new XElement(g + "Series"); foreach (SdmxItem item in sdmxList) { XElement seriesKey = new XElement(g + "SeriesKey"); seriesKey.Add(new XElement(g + "Value", new XAttribute("concept", theSpec.ContentVariable), new XAttribute("value", item.Statistic.Code))); seriesKey.Add(new XElement(g + "Value", new XAttribute("concept", theSpec.Frequency.Value), new XAttribute("value", theSpec.Frequency.Code))); foreach (var cls in item.Classifications) { seriesKey.Add(new XElement(g + "Value", new XAttribute("concept", cls.Value), new XAttribute("value", cls.Variable[0].Code))); } series.Add(seriesKey); XElement attributes = new XElement(g + "Attributes"); attributes.Add(new XElement(g + "Values", new XAttribute("concept", "UNIT_VALUE"), new XAttribute("value", item.Statistic.Unit))); series.Add(attributes); foreach (var per in item.Period) { XElement Obs = new XElement(g + "Obs"); Obs.Add(new XElement(g + "Time", per.Code)); Obs.Add(new XElement(g + "ObsValue", new XAttribute("value", item.PeriodValue[per.Code]))); Obs.Add(new XElement(g + "Attributes", new XElement("Value", new XAttribute("concept", "OBS_STATUS"), new XAttribute("value", "A")))); series.Add(Obs); } } XElement annotations = new XElement(c + "Annotations"); if (theSpec.Notes != null) { foreach (string note in theSpec.Notes) { annotations.Add(new XElement(c + "AnnotationText", new XAttribute(xml + "lang", LngIsoCode), note)); } } XElement dataset = new XElement("DataSet", new XAttribute(XNamespace.Xmlns + "g", g), new XAttribute(XNamespace.Xmlns + "c", c), keyfamilyref, series, annotations); XElement root = new XElement(g + "GenericData", header, dataset); XmlDocument document = new XmlDocument(); XmlDeclaration xmldecl; xmldecl = document.CreateXmlDeclaration("1.0", null, null); xmldecl.Encoding = "UTF-8"; xmldecl.Standalone = "yes"; document.Load(new StringReader(root.ToString())); XmlElement rt = document.DocumentElement; document.InsertBefore(xmldecl, rt); StringBuilder builder = new StringBuilder(); using (XmlTextWriter writer = new XmlTextWriter(new StringWriter(builder))) { writer.Formatting = Formatting.Indented; document.Save(writer); } return(builder.ToString()); // return root.ToString(); }