private DataStructureObjectImpl BuildDataStructure(string _foundedDataflowId) { try { string ConceptSchemeId = string.Format(FlyConfiguration.ConceptSchemeFormat, _foundedDataflowId); List <IComponentMutableObject> components = new List <IComponentMutableObject>(); if (!this.ReferencesObject.Concepts.ContainsKey(ConceptSchemeId)) { ConceptSchemeManager gdf = new ConceptSchemeManager((ISdmxParsingObject)this.parsingObject.Clone(), this.versionTypeResp); ReferencesObject.Concepts.Add(string.Format(FlyConfiguration.ConceptSchemeFormat, _foundedDataflowId), gdf.GetConceptList(_foundedDataflowId)); } if (!this.ReferencesObject.Concepts.ContainsKey(ConceptSchemeId)) { throw new Exception("ConceptScheme not found"); } List <IConceptObjectImpl> conceptsObject = this.ReferencesObject.Concepts[ConceptSchemeId]; if (!this.parsingObject.ReturnStub) { foreach (IConceptObjectImpl _concept in conceptsObject) { //Cerco la giusta Codelist ICodelistMutableObject _CodelistAssociata = null; if (this.ReferencesObject.Codelists != null) { _CodelistAssociata = this.ReferencesObject.Codelists.Find(cl => cl.Id.ToUpper() == _concept.CodelistCode); } // CodelistBuilder _CodelistAssociata = this._Codelists.Find(cl => cl.Concept.ConceptObjectCode == _concept.ConceptObjectCode); //Capire se è un attribute/Dimension if (_CodelistAssociata == null) { CodelistManager cm = new CodelistManager((ISdmxParsingObject)this.parsingObject.Clone(), this.versionTypeResp); if (!String.IsNullOrEmpty(_concept.CodelistCode)) { cm.parsingObject.MaintainableId = string.Format(FlyConfiguration.CodelistFormat, _concept.CodelistCode.Substring(3)); } else { cm.parsingObject.MaintainableId = null; } cm.parsingObject.QueryDetail = StructureQueryDetailEnumType.AllStubs; cm.BuildCodelist(_foundedDataflowId, _concept); if (cm.ReferencesObject.Codelists != null && cm.ReferencesObject.Codelists.Count > 0) { _CodelistAssociata = cm.ReferencesObject.Codelists[0]; } } if (_CodelistAssociata != null) { _concept.ConceptDSDInfo = new ConceptDSDInfoObject() { CodelistId = _CodelistAssociata.Id, CodelistAgency = _CodelistAssociata.AgencyId, CodelistVersion = _CodelistAssociata.Version }; } switch (_concept.ConceptType) { case ConceptTypeEnum.Dimension: //Se è una Dimension Capire che tipologia di Dimension è Frequency/Time switch (((IDimensionConcept)_concept).DimensionType) { case DimensionTypeEnum.Dimension: DimensionMutableCore dim = new DimensionMutableCore(); dim.ConceptRef = ReferenceBuilder.CreateConceptReference(ConceptSchemeId, _concept.Id); dim.Id = _concept.Id; if (_CodelistAssociata != null) { dim.Representation = new RepresentationMutableCore() { Representation = ReferenceBuilder.CreateCodelistReference(_CodelistAssociata.Id), }; } components.Add(dim); break; case DimensionTypeEnum.Time: DimensionMutableCore TimeDim = new DimensionMutableCore(); TimeDim.ConceptRef = ReferenceBuilder.CreateConceptReference(ConceptSchemeId, _concept.ConceptObjectCode); TimeDim.Id = _concept.ConceptObjectCode; TimeDim.TimeDimension = true; components.Add(TimeDim); break; case DimensionTypeEnum.Frequency: DimensionMutableCore FreqDim = new DimensionMutableCore(); FreqDim.ConceptRef = ReferenceBuilder.CreateConceptReference(ConceptSchemeId, _concept.ConceptObjectCode); if (_CodelistAssociata != null) { FreqDim.Representation = new RepresentationMutableCore() { ////Si da per scontato che la frequency la codelist ce l'abbia Representation = ReferenceBuilder.CreateCodelistReference(_CodelistAssociata.Id), }; } FreqDim.Id = _concept.ConceptObjectCode; FreqDim.FrequencyDimension = true; if (FreqDim.ConceptRole != null) { FreqDim.ConceptRole.Add(new StructureReferenceImpl("ESTAT", "ESTAT_CONCEPT_ROLES_SCHEME", "0.1", SdmxStructureType.GetFromEnum(SdmxStructureEnumType.Concept), new List <string> { "FREQUENCY" })); } components.Add(FreqDim); break; default: break; } break; case ConceptTypeEnum.Attribute: AttributeMutableCore attr = new AttributeMutableCore(); attr.ConceptRef = ReferenceBuilder.CreateConceptReference(ConceptSchemeId, _concept.ConceptObjectCode); if (_CodelistAssociata != null) { IRepresentationMutableObject representation = new RepresentationMutableCore(); representation.Representation = ReferenceBuilder.CreateCodelistReference(_CodelistAssociata.Id); attr.Representation = representation; } //Aggiungo attributi all'attribute AssignmentStatus e AttachmentLevel attr.AssignmentStatus = ((IAttributeConcept)_concept).AssignmentStatusType.ToString(); attr.AttachmentLevel = ((IAttributeConcept)_concept).AttributeAttachmentLevelType; if (attr.AttachmentLevel == AttributeAttachmentLevel.DimensionGroup) { foreach (var dimref in ((IAttributeConcept)_concept).GetDimensionsReference(ReferencesObject.Concepts[ConceptSchemeId])) { attr.DimensionReferences.Add(dimref); } } if (attr.AttachmentLevel == AttributeAttachmentLevel.Group) { throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.AttributeErrorAttachmentGroup); } //if (_CodelistAssociata.CodesObjects == null || _CodelistAssociata.CodesObjects.Count == 0) //{//levo dall'attribute la referenza alla codelist // attr.Representation = null; //} if (((IAttributeConcept)_concept).IsValueAttribute) { PrimaryMeasureMutableCore PrimaryMeasure = new PrimaryMeasureMutableCore(); //SdmxStructureType.GetFromEnum(SdmxStructureEnumType.PrimaryMeasure)); PrimaryMeasure.ConceptRef = ReferenceBuilder.CreateConceptReference(ConceptSchemeId, _concept.ConceptObjectCode); components.Add(PrimaryMeasure); } else { components.Add(attr); } break; } } } this.ReferencesObject.Codelists = null; DataStructureBuilder _DataStructureBuilder = new DataStructureBuilder(conceptsObject, this.parsingObject, this.versionTypeResp); _DataStructureBuilder.Code = string.Format(FlyConfiguration.DsdFormat, _foundedDataflowId); _DataStructureBuilder.Names = new List <SdmxObjectNameDescription>(); foreach (var nome in ReferencesObject.FoundedDataflows.Find(df => df.Id == _foundedDataflowId).Names) { _DataStructureBuilder.Names.Add(new SdmxObjectNameDescription() { Lingua = nome.Locale, Name = nome.Value }); } return(_DataStructureBuilder.BuildDataStructure(components, null, FlyConfiguration.MainAgencyId, FlyConfiguration.Version)); } catch (SdmxException) { throw; } catch (Exception ex) { throw new SdmxException(this, FlyExceptionObject.FlyExceptionTypeEnum.CreateImmutable, ex); } }
/// <summary> /// Retrieve component type. /// </summary> /// <param name="parent"> /// The parent. /// </param> /// <param name="dataReader"> /// The data reader. /// </param> /// <param name="crossSectionalMeasures"> /// The cross sectional measures. /// </param> /// <returns> /// The <see cref="IComponentMutableObject"/>. /// </returns> /// <exception cref="InvalidOperationException"> /// Invalid DSD Component type. /// </exception> private static IComponentMutableObject RetrieveComponentType( IDataStructureMutableObject parent, IDataRecord dataReader, ICollection <ICrossSectionalMeasureMutableObject> crossSectionalMeasures) { string type = DataReaderHelper.GetString(dataReader, "TYPE"); SdmxComponentType componentType; if (!Enum.TryParse(type, out componentType)) { componentType = SdmxComponentType.None; } IComponentMutableObject component; switch (componentType) { case SdmxComponentType.Dimension: var dimension = new DimensionMutableCore { FrequencyDimension = DataReaderHelper.GetBoolean(dataReader, "IS_FREQ_DIM"), MeasureDimension = DataReaderHelper.GetBoolean(dataReader, "IS_MEASURE_DIM") }; component = dimension; parent.AddDimension(dimension); break; case SdmxComponentType.Attribute: component = PopulateAttributes(parent, dataReader); break; case SdmxComponentType.TimeDimension: var timeDimension = new DimensionMutableCore { TimeDimension = true }; component = timeDimension; parent.AddDimension(timeDimension); break; case SdmxComponentType.PrimaryMeasure: var primaryMeasure = new PrimaryMeasureMutableCore(); component = primaryMeasure; parent.PrimaryMeasure = primaryMeasure; break; case SdmxComponentType.CrossSectionalMeasure: { var crossSectionalMeasureBean = new CrossSectionalMeasureMutableCore { Code = DataReaderHelper.GetString(dataReader, "XS_MEASURE_CODE") }; component = crossSectionalMeasureBean; crossSectionalMeasures.Add(crossSectionalMeasureBean); } break; default: throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "Invalid DSD Component type. Mapping Store Database, COMPONENT.TYPE = '{0}'", type)); } return(component); }