Ejemplo n.º 1
0
        internal override XmlDocument Get_Query()
        {
            XmlDocument RetVal;
            SDMXObjectModel.Message.GenericDataQueryType GenericDataQuery;
            DataParametersOrType ORItem;
            DataParametersAndType ANDItem;
            DimensionValueType DimensionValue;
            DataTable DtSubgroupBreakup;
            Dictionary<string, string> DictSubgroupBreakup;
            string[] SplittedUserSelectionKeyValues;

            RetVal = null;
            ORItem = null;
            ANDItem = null;
            GenericDataQuery = new SDMXObjectModel.Message.GenericDataQueryType();
            GenericDataQuery.Header = Get_Appropriate_Header();
            GenericDataQuery.Query = new SDMXObjectModel.Query.GenericDataQueryType();
            GenericDataQuery.Query.ReturnDetails = new DataReturnDetailsType();
            GenericDataQuery.Query.ReturnDetails.detail = Enum.GetName(typeof(DataReturnDetailTypes), this.DataReturnDetailType).ToString();
            GenericDataQuery.Query.DataWhere = new DataParametersAndType();
            GenericDataQuery.Query.DataWhere.DataStructure = this.Get_DataStructure_Reference();
            GenericDataQuery.Query.DataWhere.Or = new List<DataParametersOrType>();

            if (this.DictUserSelections != null)
            {
                DtSubgroupBreakup = this.DIConnection.ExecuteDataTable(this.DIQueries.SubgroupValSubgroup.GetSubgroupValsWithSubgroups());
                DictSubgroupBreakup = new Dictionary<string, string>();

                foreach (string Key in this.DictUserSelections.Keys)
                {
                    switch (Key)
                    {
                        case Constants.Concept.INDICATOR.Id:
                            if (this.DictUserSelections[Key] != null && !string.IsNullOrEmpty(this.DictUserSelections[Key].ToString()))
                            {
                                ORItem = new DataParametersOrType();
                                ORItem.And = new List<DataParametersAndType>();
                                SplittedUserSelectionKeyValues = this.DictUserSelections[Key].Split(new string[] { Constants.Comma }, StringSplitOptions.None);
                                for (int i = 0; i < SplittedUserSelectionKeyValues.Length; i++)
                                {
                                    ANDItem = new DataParametersAndType();
                                    ANDItem.DimensionValue = new List<DimensionValueType>();

                                    DimensionValue = new DimensionValueType();
                                    DimensionValue.ID = Constants.Concept.INDICATOR.Id;
                                    DimensionValue.Items = new List<object>();
                                    DimensionValue.Items.Add(new SDMXObjectModel.Query.SimpleValueType());
                                    ((SDMXObjectModel.Query.SimpleValueType)DimensionValue.Items[0]).Value = SplittedUserSelectionKeyValues[i].Split(new string[] { Constants.AtTheRate }, StringSplitOptions.None)[0];
                                    ANDItem.DimensionValue.Add(DimensionValue);

                                    DimensionValue = new DimensionValueType();
                                    DimensionValue.ID = Constants.Concept.UNIT.Id;
                                    DimensionValue.Items = new List<object>();
                                    DimensionValue.Items.Add(new SDMXObjectModel.Query.SimpleValueType());
                                    ((SDMXObjectModel.Query.SimpleValueType)DimensionValue.Items[0]).Value = SplittedUserSelectionKeyValues[i].Split(new string[] { Constants.AtTheRate }, StringSplitOptions.None)[1];
                                    ANDItem.DimensionValue.Add(DimensionValue);

                                    DictSubgroupBreakup = this.Get_Subgroup_Breakup(SplittedUserSelectionKeyValues[i].Split(new string[] { Constants.AtTheRate }, StringSplitOptions.None)[2], DtSubgroupBreakup);

                                    foreach (string SubgroupTypeGId in DictSubgroupBreakup.Keys)
                                    {
                                        DimensionValue = new DimensionValueType();
                                        DimensionValue.ID = SubgroupTypeGId;
                                        DimensionValue.Items = new List<object>();
                                        DimensionValue.Items.Add(new SDMXObjectModel.Query.SimpleValueType());
                                        ((SDMXObjectModel.Query.SimpleValueType)DimensionValue.Items[0]).Value = DictSubgroupBreakup[SubgroupTypeGId].ToString();
                                        ANDItem.DimensionValue.Add(DimensionValue);
                                    }

                                    ORItem.And.Add(ANDItem);
                                }
                            }
                            break;
                        case Constants.Concept.SOURCE.Id:
                        case Constants.Concept.AREA.Id:
                        case Constants.Concept.TIME_PERIOD.Id:
                            if (this.DictUserSelections[Key] != null && !string.IsNullOrEmpty(this.DictUserSelections[Key].ToString()))
                            {
                                ORItem = new DataParametersOrType();
                                ORItem.DimensionValue = new List<DimensionValueType>();
                                SplittedUserSelectionKeyValues = this.DictUserSelections[Key].Split(new string[] { Constants.Comma }, StringSplitOptions.None);
                                for (int i = 0; i < SplittedUserSelectionKeyValues.Length; i++)
                                {
                                    DimensionValue = new DimensionValueType();
                                    DimensionValue.ID = Key;
                                    DimensionValue.Items = new List<object>();
                                    DimensionValue.Items.Add(new SDMXObjectModel.Query.SimpleValueType());
                                    ((SDMXObjectModel.Query.SimpleValueType)DimensionValue.Items[0]).Value = SplittedUserSelectionKeyValues[i];
                                    ORItem.DimensionValue.Add(DimensionValue);
                                }
                            }
                            break;
                        case Constants.Concept.FOOTNOTES.Id:
                            ORItem = new DataParametersOrType();
                            ORItem.AttributeValue = new List<AttributeValueType>();
                            ORItem.AttributeValue.Add(new AttributeValueType());
                            ORItem.AttributeValue[0].ID = Key;
                            ORItem.AttributeValue[0].Items = new List<object>();
                            ORItem.AttributeValue[0].Items.Add(new SDMXObjectModel.Query.QueryTextType());
                            ((QueryTextType)ORItem.AttributeValue[0].Items[0]).lang = this.DictUserSelections[Key];
                            break;
                        default:
                            break;
                    }

                    GenericDataQuery.Query.DataWhere.Or.Add(ORItem);
                }
            }
            RetVal = Serializer.SerializeToXmlDocument(typeof(SDMXObjectModel.Message.GenericDataQueryType), GenericDataQuery);

            return RetVal;
        }
        /// <summary>
        /// Handles the data provider.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        private static void HandleDataProvider(IComplexDataQuery complexDataQuery, DataParametersAndType whereType)
        {
            //if only one Data provider let alone otherwise encapsulate it in an Or clause
            if (complexDataQuery.DataProvider.Count == 1)
            {
                IDataProvider dataProvider = complexDataQuery.DataProvider.First();
                var dataProviderReferenceType = new DataProviderReferenceType();

                RefBaseType dataProviderRefType = new DataProviderRefType();

                dataProviderRefType.agencyID = dataProvider.CrossReferences.First().MaintainableReference.AgencyId;
                dataProviderRefType.id = dataProvider.Id;
                dataProviderRefType.maintainableParentID = dataProvider.MaintainableParent.Id;
                dataProviderRefType.maintainableParentVersion = dataProvider.MaintainableParent.Version;

                dataProviderReferenceType.Ref = dataProviderRefType;
                whereType.DataProvider.Add(dataProviderReferenceType);
            }
            else
            {
                var orForDataProviderType = new DataParametersOrType();

                foreach (IDataProvider dataProvider in complexDataQuery.DataProvider)
                {
                    RefBaseType dataProviderRefType = new DataProviderRefType();
                    dataProviderRefType.agencyID = dataProvider.CrossReferences.First().MaintainableReference.AgencyId;
                    dataProviderRefType.id = dataProvider.Id;
                    dataProviderRefType.maintainableParentID = dataProvider.MaintainableParent.Id;
                    dataProviderRefType.maintainableParentVersion = dataProvider.MaintainableParent.Version;
                    var dataProviderReferenceType = new DataProviderReferenceType { Ref = dataProviderRefType };
                    orForDataProviderType.DataProvider.Add(dataProviderReferenceType);
                }

                whereType.Or.Add(orForDataProviderType);
            }
        }
 /// <summary>
 /// Builds complex selections from DataParametersOr from XML.
 /// </summary>
 /// <param name="orType">
 /// The OrType.
 /// </param>
 /// <param name="complexSelections">
 /// The selections.
 /// </param>
 private void ProcessParametersOrType(DataParametersOrType orType,
                                         ISet<IComplexDataQuerySelection> complexSelections,
                                         ISdmxObjectRetrievalManager structureRetrievalManager,
                                         ISet<IDataProvider> dataProviders)
 {
     //data provider
     if (orType.DataProvider != null && orType.DataProvider.Count > 0)
     {
         foreach (DataProviderReferenceType dataProviderRefType in orType.DataProvider)
         {
             IDataProvider dataProviderBean = ProcessDataProviderType(dataProviderRefType, structureRetrievalManager);
             dataProviders.Add(dataProviderBean);
         }
     }
     //add a complex selection for dimensions
     if (orType.DimensionValue != null && orType.DimensionValue.Count > 0)
     {
         foreach (DimensionValueType dimValue in orType.DimensionValue)
         {
             IComplexComponentValue comValue = GetComplexComponentValue(dimValue, SdmxStructureEnumType.Dimension);
             AddComponentSelection(complexSelections, dimValue.ID, comValue);
         }
     }
     //add complex selections for attributes
     if (orType.AttributeValue != null && orType.AttributeValue.Count > 0)
     {
         foreach (AttributeValueType attrValue in orType.AttributeValue)
         {
             IComplexComponentValue comValue = GetComplexComponentValue(attrValue, SdmxStructureEnumType.DataAttribute);
             AddComponentSelection(complexSelections, attrValue.ID, comValue);
         }
     }
     //add complex selections for measure
     if (orType.PrimaryMeasureValue != null && orType.PrimaryMeasureValue.Count > 0)
     {
         foreach (PrimaryMeasureValueType measureValue in orType.PrimaryMeasureValue)
         {
             IList<IComplexComponentValue> comValues = GetComplexComponentValues(measureValue, SdmxStructureEnumType.PrimaryMeasure);
             this.AddComponentSelection(complexSelections, measureValue.ID, comValues);
         }
     }
     //add complex selections for time dimension
     if (orType.TimeDimensionValue != null && orType.TimeDimensionValue.Count > 0)
     {
         foreach (TimeDimensionValueType timeValue in orType.TimeDimensionValue)
         {
             IList<IComplexComponentValue> comValues = GetComplexComponentValues(timeValue, SdmxStructureEnumType.TimeDimension);
             AddComponentSelection(complexSelections, timeValue.ID, comValues);
         }
     }
     //TODO analyse to support in the future 
     //processParametersAndType(orType.getAndList(), complexSelections);		
 }
 /// <summary>
 /// Resets this instance.
 /// </summary>
 public void Reset()
 {
     this._dataParametersOrType = new DataParametersOrType();
 }