/// <summary>
 /// Process the datawhere updated element to get the last updated information.
 /// </summary>
 /// <param name="dataWhere">
 /// The data where.
 /// </param>
 /// <returns>
 /// A list of time range objects.
 /// </returns>
 private IList<ITimeRange> GetDataWhereUpdatedDates(DataParametersAndType dataWhere)
 {
     IList<ITimeRange> updatedDates = new List<ITimeRange>();
     if (dataWhere.Updated.Count > 0)
     {
         //there should exist one or 2 time range values
         for (int i = 0; i < dataWhere.Updated.Count; i++)
         {
             TimeRangeValueType timeRangeValueType = dataWhere.Updated[i];
             updatedDates.Add(BuildTimeRange(timeRangeValueType));
         }
     }
     return updatedDates;
 }
        /// <summary>
        /// Builds the complex data query groups, by processing the or types, dimension/primary measure/attribute/time dimension values.
        ///  It then calls the 'addGroupIfSelectionsExist' method in order to add the newly built-in ComplexDataQuerySelectionGroup. It returns
        /// a set of Complex Data Query Selection Groups.
        /// Build complex data queries from the specified <paramref name="dataWhere"/>
        /// </summary>
        /// <param name="dataWhere">
        /// The data query type.
        /// </param>
        /// <param name="structureRetrievalManager">
        /// The structure retrieval manager.
        /// </param>
        /// <param name="dataProviders">
        /// The data providers.
        /// </param>
        /// <returns>
        /// The complex data query groups.
        /// </returns>
        private ISet<IComplexDataQuerySelectionGroup> BuildComplexDataQueryGroups(DataParametersAndType dataWhere, ISdmxObjectRetrievalManager structureRetrievalManager, ISet<IDataProvider> dataProviders)
        {
            ISet<IComplexDataQuerySelectionGroup> complexDataQuerySelectionGroups = new HashSet<IComplexDataQuerySelectionGroup>();
            ISet<IComplexDataQuerySelection> complexSelections = new HashSet<IComplexDataQuerySelection>();
            ISet<IComplexComponentValue> primaryMeasureValues = new HashSet<IComplexComponentValue>();
            OrderedOperator dateFromOperator = OrderedOperator.GetFromEnum(OrderedOperatorEnumType.Equal);
            OrderedOperator dateToOperator = OrderedOperator.GetFromEnum(OrderedOperatorEnumType.Equal);
            ISdmxDate dateFrom = null;
            ISdmxDate dateTo = null;

            //primary measure
            if (dataWhere.PrimaryMeasureValue != null && (dataWhere.PrimaryMeasureValue.Count > 0))
            {
                PrimaryMeasureValueType primaryMeasure = dataWhere.PrimaryMeasureValue[0];
                var complexValues = GetComplexComponentValues(primaryMeasure, SdmxStructureEnumType.PrimaryMeasure);
                foreach (var complexValue in complexValues)
                {
                    primaryMeasureValues.Add(complexValue);
                }
            }
            //time dimension
            if (dataWhere.TimeDimensionValue != null && dataWhere.TimeDimensionValue.Count > 0)
            {
                TimeDimensionValueType timeValue = dataWhere.TimeDimensionValue[0];
                var complexValues = GetComplexComponentValues(timeValue, SdmxStructureEnumType.TimeDimension);

                if (complexValues != null && complexValues.Count > 0)
                {
                    var complexValue = complexValues[0];
                    switch (complexValue.OrderedOperator.EnumType)
                    {
                        case OrderedOperatorEnumType.GreaterThan:
                        case OrderedOperatorEnumType.GreaterThanOrEqual:
                        case OrderedOperatorEnumType.Equal:
                            dateFromOperator = complexValue.OrderedOperator;
                            dateFrom = new SdmxDateCore(complexValue.Value);
                            if (complexValues.Count == 2)
                            {
                                dateTo = new SdmxDateCore(complexValues[1].Value);
                                dateToOperator = complexValues[1].OrderedOperator;
                            }

                            break;
                        default:
                            dateToOperator = complexValue.OrderedOperator;
                            dateTo = new SdmxDateCore(complexValue.Value);
                            if (complexValues.Count == 2)
                            {
                                dateFrom = new SdmxDateCore(complexValues[1].Value);
                                dateFromOperator = complexValues[1].OrderedOperator;
                            }

                            break;
                    }

                    if (complexValues.Count == 2)
                    {
                        if (dateFrom != null && dateFrom.IsLater(dateTo))
                        {
                            // interchange dates if not the correct order
                            var tempDate = dateTo;
                            dateTo = dateFrom;
                            dateFrom = tempDate;
                            var tempOperator = dateToOperator;
                            dateToOperator = dateFromOperator;
                            dateFromOperator = tempOperator;
                        }

                        // cases when same operator is used
                        if (dateToOperator.Equals(dateFromOperator))
                        {
                            switch (dateToOperator.EnumType)
                            {
                                case OrderedOperatorEnumType.GreaterThan:
                                case OrderedOperatorEnumType.GreaterThanOrEqual:

                                    // only the greatest date is considered
                                    dateFrom = dateTo;
                                    dateTo = null;
                                    break;
                                case OrderedOperatorEnumType.LessThan:
                                case OrderedOperatorEnumType.LessThanOrEqual:

                                    // only the lowest date is considered
                                    dateTo = dateFrom;
                                    dateFrom = null;
                                    break;
                            }
                        }
                    }
                }
            }
            //dimensions
            if (dataWhere.DimensionValue != null && dataWhere.DimensionValue.Count > 0)
            {
                foreach (DimensionValueType dimValue in dataWhere.DimensionValue)
                {
                    IComplexComponentValue comValue = GetComplexComponentValue(dimValue, SdmxStructureEnumType.Dimension);
                    AddComponentSelection(complexSelections, dimValue.ID, comValue);
                }
            }
            //attributes
            if (dataWhere.AttributeValue != null && dataWhere.AttributeValue.Count > 0)
            {
                foreach (AttributeValueType attrValue in dataWhere.AttributeValue)
                {
                    IComplexComponentValue comValue = GetComplexComponentValue(attrValue, SdmxStructureEnumType.DataAttribute);
                    AddComponentSelection(complexSelections, attrValue.ID, comValue);
                }
            }
            //DataParametersOrType
            ProcessParametersOrType(dataWhere.Or, complexSelections, structureRetrievalManager, dataProviders);
            AddGroupIfSelectionsExist(complexSelections, dateFrom, dateFromOperator, dateTo, dateToOperator, primaryMeasureValues, complexDataQuerySelectionGroups);
            return complexDataQuerySelectionGroups;
        }
        /// <summary>
        /// Processes the dataWhere element to get the DSD reference and retrieve the respective DSD.
        /// It throws an exception if the DSD cannot be retrieved.
        /// </summary>
        /// <param name="dataWhere">
        /// The data where.
        /// </param>
        /// <param name="structureRetrievalManager">
        /// The structure retrieval manager.
        /// </param>
        /// <param name="dataFlow">
        /// The data flow.
        /// </param>
        /// <returns>
        /// The data structure object.
        /// </returns>
        private IDataStructureObject GetDataWhereDataStrucuture(DataParametersAndType dataWhere,
                                            ISdmxObjectRetrievalManager structureRetrievalManager,
                                            IDataflowObject dataFlow)
        {
            IDataStructureObject dataStructure = null;

            if (dataWhere.DataStructure != null && dataWhere.DataStructure.Count > 0)
            {
                var refBaseType = dataWhere.DataStructure[0].GetTypedRef<DataStructureRefType>();
                string dataStructureAgency = refBaseType.agencyID;
                string dataStructureId = refBaseType.id;
                string dataStructureVersion = null;
                if (refBaseType.version != null)
                    dataStructureVersion = refBaseType.version;

                IMaintainableRefObject dsdRef = new MaintainableRefObjectImpl(dataStructureAgency, dataStructureId, dataStructureVersion);
                dataStructure = structureRetrievalManager.GetMaintainableObject<IDataStructureObject>(dsdRef);
                if (dataStructure == null)
                {
                    throw new SdmxNoResultsException("DSD not found: " + dsdRef);
                }
            }
            else
            {
                IMaintainableRefObject dsdRef = dataFlow.DataStructureRef.MaintainableReference;
                dataStructure = structureRetrievalManager.GetMaintainableObject<IDataStructureObject>(dsdRef);
                if (dataStructure == null)
                {
                    throw new SdmxNoResultsException("Data Structure not found: " + dsdRef);
                }
            }
            return dataStructure;
        }
        /// <summary>
        /// Processes the dataWhere element to get the Provisionn Agreeement reference and retrieve the respective artefact bean.
        /// If the provision agreement cannot be found it throws an exception.
        /// </summary>
        /// <param name="dataWhere">
        /// The data where.
        /// </param>
        /// <param name="structureRetrievalManager">
        /// The structure retrieval manager.
        /// </param>
        /// <returns>
        /// The provision agreement object.
        /// </returns>
        private IProvisionAgreementObject GetProvisionAgreement(DataParametersAndType dataWhere, ISdmxObjectRetrievalManager structureRetrievalManager)
        {
            IProvisionAgreementObject provisionAgreement = null;

            if (dataWhere.ProvisionAgreement != null && dataWhere.ProvisionAgreement.Count > 0)
            {
                var refBaseType = dataWhere.ProvisionAgreement[0].GetTypedRef<ProvisionAgreementRefType>();
                string praAgency = refBaseType.agencyID;
                string praId = refBaseType.id;
                string praVersion = null;
                if (refBaseType.version != null)
                    praVersion = refBaseType.version;
                IMaintainableRefObject praRef = new MaintainableRefObjectImpl(praAgency, praId, praVersion);
                provisionAgreement = structureRetrievalManager.GetMaintainableObject<IProvisionAgreementObject>(praRef);
                if (provisionAgreement == null)
                {
                    throw new SdmxNoResultsException("Provision Agreement not found: " + praRef);
                }
            }
            return provisionAgreement;
        }
Пример #5
0
        internal void Retrieve_DataTable_From_Query(DataParametersAndType DataWhere)
        {
            string IndicatorGId, UnitGId, SubgroupValGId, AreaId, Source, TimePeriodText, Language, IUSNId;
            List<string> IUSNIds, AreaIds, AreaNIds, SourceTexts, SourceNIds, TimePeriods, TimePeriodNIds;
            Dictionary<string, string> DictSubgroupBreakup;
            DataTable DtSubgroupBreakup, DtIUS, DtLanguageSpecificTable;
            DataColumn DcLanguage;

            IndicatorGId = string.Empty;
            UnitGId = string.Empty;
            SubgroupValGId = string.Empty;
            AreaId = string.Empty;
            Source = string.Empty;
            TimePeriodText = string.Empty;
            Language = string.Empty;
            IUSNId = string.Empty;

            IUSNIds = new List<string>();
            AreaIds = new List<string>();
            AreaNIds = new List<string>();
            SourceTexts = new List<string>();
            SourceNIds = new List<string>();
            TimePeriods = new List<string>();
            TimePeriodNIds = new List<string>();
            DictSubgroupBreakup = new Dictionary<string, string>();

            DtSubgroupBreakup = this._diConnection.ExecuteDataTable(this._diQueries.SubgroupValSubgroup.GetSubgroupValsWithSubgroups());
            DtSubgroupBreakup = DtSubgroupBreakup.DefaultView.ToTable(true, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupVals.SubgroupValGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupTypes.SubgroupTypeGID, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Subgroup.SubgroupGId);

            DtIUS = this._diConnection.ExecuteDataTable(this._diQueries.IUS.GetIUS(FilterFieldType.None, string.Empty, FieldSelection.Light));
            DtIUS = DtIUS.DefaultView.ToTable(true, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Indicator_Unit_Subgroup.IUSNId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Indicator.IndicatorGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Unit.UnitGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupVals.SubgroupValGId);
            DtLanguageSpecificTable = null;
            DcLanguage = null;

            foreach (DataParametersOrType ORItem in DataWhere.Or)
            {
                if (ORItem.DimensionValue.Count > 0)
                {
                    foreach (DimensionValueType Dimension in ORItem.DimensionValue)
                    {
                        switch (Dimension.ID)
                        {
                            case Constants.Xml.AREA:
                                AreaId = ((SimpleValueType)Dimension.Items[0]).Value;
                                AreaIds.Add(AreaId);
                                break;
                            case Constants.Xml.SOURCE:
                                Source = ((SimpleValueType)Dimension.Items[0]).Value;
                                SourceTexts.Add(Source);
                                break;
                            case Constants.Xml.TIME_PERIOD:
                                TimePeriodText = ((SimpleValueType)Dimension.Items[0]).Value;
                                if (this._isMRD == false)
                                {
                                    if (TimePeriodText == Constants.MRD)
                                    {
                                        this._isMRD = true;
                                        TimePeriods = null;
                                    }
                                    else
                                    {
                                        TimePeriods.Add(TimePeriodText);
                                    }
                                }
                                break;
                            default:
                                break;
                        }
                    }
                }
                else if (ORItem.AttributeValue.Count > 0)
                {
                    switch (ORItem.AttributeValue[0].ID)
                    {
                        case Constants.Xml.FOOTNOTES:
                            this._langauge = ((QueryTextType)ORItem.AttributeValue[0].Items[0]).lang;
                            break;
                    }
                }
                else if (ORItem.And.Count > 0)
                {
                    IUSNIds.Add(Constants.MinusOne);

                    foreach (DataParametersAndType ANDItem in ORItem.And)
                    {
                        DictSubgroupBreakup = new Dictionary<string, string>();

                        foreach (DimensionValueType Dimension in ANDItem.DimensionValue)
                        {
                            switch (Dimension.ID)
                            {
                                case Constants.Xml.INDICATOR:
                                    IndicatorGId = ((SimpleValueType)Dimension.Items[0]).Value;
                                    break;
                                case Constants.Xml.UNIT:
                                    UnitGId = ((SimpleValueType)Dimension.Items[0]).Value;
                                    break;
                                default:
                                    DictSubgroupBreakup.Add(Dimension.ID, ((SimpleValueType)Dimension.Items[0]).Value);
                                    break;
                            }
                        }

                        SubgroupValGId = this.Get_SubgroupVal_GId(DictSubgroupBreakup, DtSubgroupBreakup);
                        IUSNId = this.Get_IUSNId_From_GIds(IndicatorGId, UnitGId, SubgroupValGId, DtIUS);
                        IUSNIds.Add(IUSNId);
                    }
                }
            }

            if (this.IsMRD == false)
            {
                TimePeriodNIds = this.Get_TimePeriodNIds_From_Text(TimePeriods);
            }

            this._dtDatas = new List<DataTable>();
            if (string.IsNullOrEmpty(this._langauge))
            {
                foreach (DataRow LanguageRow in this._diConnection.DILanguages(this._diQueries.DataPrefix).Rows)
                {
                    Language = LanguageRow[DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Language.LanguageCode].ToString();
                    AreaNIds = this.Get_AreaNIds_From_Ids(AreaIds, Language);
                    SourceNIds = this.Get_SourceNIds_From_Texts(SourceTexts, Language);
                    DtLanguageSpecificTable = this.Get_Language_Specific_Datatable(Language, String.Join(Constants.Comma, IUSNIds.ToArray()), String.Join(Constants.Comma, AreaNIds.ToArray()), String.Join(Constants.Comma, TimePeriodNIds.ToArray()), String.Join(Constants.Comma, SourceNIds.ToArray()));

                    DcLanguage = new DataColumn("Language", typeof(System.String));
                    DcLanguage.DefaultValue = Language;
                    DtLanguageSpecificTable.Columns.Add(DcLanguage);

                    this._dtDatas.Add(DtLanguageSpecificTable);
                }
            }
            else
            {
                if (this._diConnection.IsValidDILanguage(this._diQueries.DataPrefix, this._langauge))
                {
                    Language = this._langauge;
                }
                else
                {
                    Language = this._diQueries.LanguageCode.Substring(1);
                }

                AreaNIds = this.Get_AreaNIds_From_Ids(AreaIds, Language);
                SourceNIds = this.Get_SourceNIds_From_Texts(SourceTexts, Language);
                DtLanguageSpecificTable = this.Get_Language_Specific_Datatable(Language, String.Join(Constants.Comma, IUSNIds.ToArray()), String.Join(Constants.Comma, AreaNIds.ToArray()), String.Join(Constants.Comma, TimePeriodNIds.ToArray()), String.Join(Constants.Comma, SourceNIds.ToArray()));

                DcLanguage = new DataColumn("Language", typeof(System.String));
                DcLanguage.DefaultValue = Language;
                DtLanguageSpecificTable.Columns.Add(DcLanguage);

                this._dtDatas.Add(DtLanguageSpecificTable);
            }
        }
        /// <summary>
        /// Processes the dataWhere element to get the dataflow reference and retrieve the respective dataflow.
        /// It throws an exception if the dataflow retrieved is null
        /// </summary>
        /// <param name="dataWhere">
        /// The data where.
        /// </param>
        /// <param name="structureRetrievalManager">
        /// The structure retrieval manager.
        /// </param>
        /// <returns>
        /// The data flow object.
        /// </returns>
        private IDataflowObject GetDataWhereDataFlow(DataParametersAndType dataWhere, ISdmxObjectRetrievalManager structureRetrievalManager)
        {
            IDataflowObject dataFlow = null;
            if (dataWhere.Dataflow != null && dataWhere.Dataflow.Count > 0)
            {
                var dataflowRefType = dataWhere.Dataflow[0].GetTypedRef<DataflowRefType>();
                string dataFlowAgency = dataflowRefType.agencyID;
                string dataFlowId = dataflowRefType.id;
                string dataFlowVersion = null; // null if not specified so as to get the latest

                if (dataflowRefType.version != null)
                {
                    dataFlowVersion = dataflowRefType.version;
                }

                IMaintainableRefObject flowRef = new MaintainableRefObjectImpl(dataFlowAgency, dataFlowId, dataFlowVersion);
                dataFlow = structureRetrievalManager.GetMaintainableObject<IDataflowObject>(flowRef);
                if (dataFlow == null)
                {
                    throw new SdmxNoResultsException("Dataflow not found: " + flowRef);
                }
            }
            else
            {
                throw new ArgumentException("Can not create DataQuery, Dataflow is required");
            }
            return dataFlow;
        }
        /// <summary>
        /// Fills the type of the data query.
        /// </summary>
        /// <param name="queryType">Type of the query.</param>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxException">Too many Selection Groups in ComplexDataQuery max one supported.</exception>
        public void FillDataQueryType(DataQueryType queryType, IComplexDataQuery complexDataQuery)
        {
            var dataReturnDetailsType = new DataReturnDetailsType();
            queryType.ReturnDetails = dataReturnDetailsType;

            // TODO: check null in java
            if (complexDataQuery.DefaultLimit.HasValue && complexDataQuery.DefaultLimit.Value != 0)
            {
                dataReturnDetailsType.defaultLimit = complexDataQuery.DefaultLimit;
            }

            if (complexDataQuery.FirstNObservations.HasValue)
            {
                dataReturnDetailsType.FirstNObservations = complexDataQuery.FirstNObservations;
            }

            if (complexDataQuery.LastNObservations.HasValue)
            {
                dataReturnDetailsType.LastNObservations = complexDataQuery.LastNObservations;
            }
            if (complexDataQuery.DataQueryDetail != null)
            {
                dataReturnDetailsType.detail = complexDataQuery.DataQueryDetail.EnumType.ToString();
            }

            if (complexDataQuery.ObservationAction != null)
            {
                dataReturnDetailsType.observationAction = complexDataQuery.ObservationAction.EnumType.ToString();
            }

            HandleStructure(complexDataQuery, dataReturnDetailsType);
            var whereType = new DataParametersAndType();
            queryType.DataWhere = whereType;

            //DataSetId at DataWhere Leveln - Optional
            if (complexDataQuery.DatasetId != null)
            {
                var datasetIdType = new QueryIDType { TypedValue = complexDataQuery.DatasetId, @operator = complexDataQuery.DatasetIdOperator.Operator };

                whereType.DataSetID.Add(datasetIdType);

            }

            //DataProvider at DataWhere Level - Optional; 
            if (complexDataQuery.DataProvider != null && complexDataQuery.DataProvider.Count != 0)
            {
                HandleDataProvider(complexDataQuery, whereType);
            }

            //Dataflow at DataWhere Level - Optional
            if (complexDataQuery.Dataflow != null)
            {

                HandleDataflow(complexDataQuery, whereType);
            }

            //ProvisionAgreement at DataWhere Level - Optional  
            if (complexDataQuery.ProvisionAgreement != null)
            {

                HandleProvisionAgreement(complexDataQuery, whereType);
            }

            //Updated tag that can have 0 to 2 repetitions
            if (complexDataQuery.LastUpdatedDateTimeRange != null)
            {
                HandleLastUpdatedTime(complexDataQuery, whereType);
            }

            //Selection Groups - and clause (DataWhere)
            if (complexDataQuery.SelectionGroups != null && complexDataQuery.SelectionGroups.Count > 1)
            {
                throw new SdmxException("Too many Selection Groups in ComplexDataQuery max one supported.", SdmxErrorCode.GetFromEnum(SdmxErrorCodeEnumType.SemanticError));
            }

            if (complexDataQuery.SelectionGroups != null && complexDataQuery.SelectionGroups.Count != 0)
            {
                HandleSelectionGroups(complexDataQuery, whereType);
            }
        }
 /// <summary>
 /// Populates the and parameter.
 /// </summary>
 /// <param name="andParameter">
 /// The and parameter.
 /// </param>
 public void PopulateAndParameter(DataParametersAndType andParameter)
 {
     andParameter.DimensionValue.AddAll(this._dimensions);
     andParameter.AttributeValue.AddAll(this._attributes);
 }
        /// <summary>
        /// Handles the dataflow.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        private static void HandleDataflow(IComplexDataQuery complexDataQuery, DataParametersAndType whereType)
        {
            var dataflowReferenceType = new DataflowReferenceType();

            RefBaseType dataflowRefType = new DataflowRefType();

            dataflowRefType.agencyID = complexDataQuery.Dataflow.AgencyId;
            dataflowRefType.id = complexDataQuery.Dataflow.Id;
            dataflowRefType.version = complexDataQuery.Dataflow.Version;
            dataflowReferenceType.Ref = dataflowRefType;
            whereType.Dataflow.Add(dataflowReferenceType);
        }
        /// <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>
        /// Handles the provision agreement.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        private static void HandleProvisionAgreement(IComplexDataQuery complexDataQuery, DataParametersAndType whereType)
        {
            RefBaseType provisionReferenceType = new ProvisionAgreementRefType();

            provisionReferenceType.id = complexDataQuery.ProvisionAgreement.Id;
            provisionReferenceType.agencyID = complexDataQuery.ProvisionAgreement.AgencyId;
            provisionReferenceType.version = complexDataQuery.ProvisionAgreement.Version;

            var provisionAgreementReferenceType = new ProvisionAgreementReferenceType { Ref = provisionReferenceType };
            whereType.ProvisionAgreement.Add(provisionAgreementReferenceType);
        }
        /// <summary>
        /// Handles the selections.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        /// <param name="complexDataQuerySelections"></param>
        /// <exception cref="Org.Sdmxsource.Sdmx.Api.Exception.SdmxSemmanticException">
        /// Invalid structure type for component and 
        /// </exception>
        private static void HandleSelections(IComplexDataQuery complexDataQuery, DataParametersAndType whereType, IEnumerable<IComplexDataQuerySelection> complexDataQuerySelections, IParameterBuilder builder)
        {
            foreach (IComplexDataQuerySelection complexDataQuerySelection in complexDataQuerySelections)
            {
                builder.Reset();

                // Dimension Values inside an OR -or- AND clause
                foreach (IComplexComponentValue complexComponentValue in complexDataQuerySelection.Values)
                {
                    var component = complexDataQuery.DataStructure.GetComponent(complexDataQuerySelection.ComponentId);
                    if (component == null)
                    {
                        throw new SdmxSemmanticException(string.Format("Component with ID {0} does not exist in the DSD {1}", complexDataQuerySelection.ComponentId, complexDataQuery.DataStructure));
                    }

                    switch (component.StructureType.EnumType)
                    {
                        case SdmxStructureEnumType.Dimension:
                        case SdmxStructureEnumType.MeasureDimension:
                            {
                                var dimensionValueType = new DimensionValueType { ID = complexDataQuerySelection.ComponentId };
                                SetOperatorAndValue(component, complexComponentValue, dimensionValueType);
                                builder.AddDimension(dimensionValueType);
                            }

                            break;
                        case SdmxStructureEnumType.DataAttribute:
                            {
                                var attributeValueType = new AttributeValueType { ID = complexDataQuerySelection.ComponentId };
                                SetOperatorAndValue(component, complexComponentValue, attributeValueType);

                                builder.AddAttribute(attributeValueType);
                            }

                            break;
                        default:
                            throw new SdmxSemmanticException(string.Format("Invalid structure type for component ID : {1} Type {0} ", component.StructureType.EnumType, component.Urn));
                    }
                }

                builder.PopulateAndParameter(whereType);
            }
        }
        /// <summary>
        /// Handles the selection groups.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        private static void HandleSelectionGroups(IComplexDataQuery complexDataQuery, DataParametersAndType whereType)
        {
            // TODO support for multiple selection groups. 
            IComplexDataQuerySelectionGroup complexDataQuerySelectionGroup = complexDataQuery.SelectionGroups.First();

            //Selections in SelectionGroups - at DataWhere Level
            if (complexDataQuerySelectionGroup.Selections != null)
            {
                HandleSelections(complexDataQuery, whereType, complexDataQuerySelectionGroup.Selections.Where(selection => selection.ShouldUseAnd()), new ParameterBuilderAnd());
            }

            //Time Dimension clause at DataWhere Level for Date From/To - optional
            if (complexDataQuerySelectionGroup.DateFrom != null || complexDataQuerySelectionGroup.DateTo != null)
            {
                HandleTime(whereType, complexDataQuerySelectionGroup);
            }

            //Primary Measure Value at DataWhere Level - Zero to more repetitions
            if (complexDataQuerySelectionGroup.PrimaryMeasureValue != null)
            {
                HandlePrimaryMeasure(whereType, complexDataQuerySelectionGroup, complexDataQuery);
            }

            //Selections in SelectionGroups - OR clauses at DataWhere Level
            if (complexDataQuerySelectionGroup.Selections != null)
            {
                HandleSelections(complexDataQuery, whereType, complexDataQuerySelectionGroup.Selections.Where(selection => !selection.ShouldUseAnd()), new ParameterBuilderOr());
            }
        }
 /// <summary>
 /// Processes the ParametersAndType, to be supported in the future
 /// </summary>
 /// <param name="andType">
 /// The and type.
 /// </param>
 /// <param name="complexSelections">
 /// The complex selections.
 /// </param>
 private void ProcessParametersAndType(DataParametersAndType andType,
                                         ISet<IComplexDataQuerySelection> complexSelections)
 {
     //ProcessParametersOrType(andType.getOrList(),complexSelections);
 }
 /// <summary>
 /// Processes an XML data where element to return the data providers.
 /// </summary>
 /// <param name="dataWhere">
 /// The data where.
 /// </param>
 /// <param name="structureRetrievalManager">
 /// The structure retrieval manager.
 /// </param>
 /// <returns>
 /// The data providers, an empty list if unspecified in the data query.
 /// </returns>
 private ISet<IDataProvider> GetDataWhereDataProviders(DataParametersAndType dataWhere, ISdmxObjectRetrievalManager structureRetrievalManager)
 {
     ISet<IDataProvider> dataProviders = new HashSet<IDataProvider>();
     if (dataWhere.DataProvider != null && dataWhere.DataProvider.Count > 0)
     {
         foreach (DataProviderReferenceType dataProviderRefType in dataWhere.DataProvider)
         {
             IDataProvider dataProviderBean = ProcessDataProviderType(dataProviderRefType, structureRetrievalManager);
             dataProviders.Add(dataProviderBean);
         }
     }
     return dataProviders;
 }
Пример #16
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>
        /// Processes an XML data where element to return the data set identification and its operator.
        /// </summary>
        /// <param name="dataWhere">
        /// The data where.
        /// </param>
        /// <returns>
        /// The data set identification and its operator. Can be NULL, if not specified in the xml data query.
        /// </returns>
        private string[] GetDataWhereDatasetId(DataParametersAndType dataWhere)
        {
            string[] datasetArray = null;
            string datasetId = null;
            string datasetIdOperator = null;
            if (dataWhere.DataSetID != null && dataWhere.DataSetID.Count > 0)
            {
                datasetArray = new string[2];
                datasetId = dataWhere.DataSetID[0].TypedValue;
                datasetArray[0] = datasetId;
                var @operator = dataWhere.DataSetID[0].@operator;
                if (@operator != null)
                {
                    string sOperator = @operator.ToString();
                    datasetIdOperator = sOperator;
                }
                else
                {
                    datasetIdOperator = "equals";
                }

                datasetArray[1] = datasetIdOperator;
            }
            return datasetArray;
        }
Пример #18
0
        internal void Parse_Query(DataParametersAndType DataWhere, DataReturnDetailsType ReturnDetails)
        {
            string IndicatorGId, UnitGId, SubgroupValGId, AreaId, SourceText, TimePeriodText, Language, IUSNId;
            List<string> IUSNIds, AreaIds, SourceTexts, TimePeriods;
            Dictionary<string, string> DictSubgroupBreakup;
            DataTable DtSubgroupBreakup, DtIUS;

            IndicatorGId = string.Empty;
            UnitGId = string.Empty;
            SubgroupValGId = string.Empty;
            AreaId = string.Empty;
            SourceText = string.Empty;
            TimePeriodText = string.Empty;
            Language = string.Empty;
            IUSNId = string.Empty;

            IUSNIds = new List<string>();
            AreaIds = new List<string>();
            SourceTexts = new List<string>();
            TimePeriods = new List<string>();
            DictSubgroupBreakup = new Dictionary<string, string>();

            DtSubgroupBreakup = this._diConnection.ExecuteDataTable(this._diQueries.SubgroupValSubgroup.GetSubgroupValsWithSubgroups());
            DtSubgroupBreakup = DtSubgroupBreakup.DefaultView.ToTable(true, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupVals.SubgroupValGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupTypes.SubgroupTypeGID, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Subgroup.SubgroupGId);

            DtIUS = this._diConnection.ExecuteDataTable(this._diQueries.IUS.GetIUS(FilterFieldType.None, string.Empty, FieldSelection.Light));
            DtIUS = DtIUS.DefaultView.ToTable(true, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Indicator_Unit_Subgroup.IUSNId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Indicator.IndicatorGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Unit.UnitGId, DevInfo.Lib.DI_LibDAL.Queries.DIColumns.SubgroupVals.SubgroupValGId);

            if ((DataReturnDetailTypes)Enum.Parse(typeof(DataReturnDetailTypes), ReturnDetails.detail) == DataReturnDetailTypes.Full)
            {
                if (DataWhere != null)
                {
                    foreach (DataParametersOrType ORItem in DataWhere.Or)
                    {
                        if (ORItem.DimensionValue.Count > 0)
                        {
                            foreach (DimensionValueType Dimension in ORItem.DimensionValue)
                            {
                                switch (Dimension.ID)
                                {
                                    case Constants.Concept.AREA.Id:
                                        AreaId = ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value;
                                        AreaIds.Add(AreaId);
                                        break;
                                    case Constants.Concept.SOURCE.Id:
                                        SourceText = ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value;
                                        SourceTexts.Add(SourceText);
                                        break;
                                    case Constants.Concept.TIME_PERIOD.Id:
                                        TimePeriodText = ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value;
                                        if (this._isMRD == false)
                                        {
                                            if (TimePeriodText == Constants.MRD)
                                            {
                                                this._isMRD = true;
                                                TimePeriods = null;
                                            }
                                            else
                                            {
                                                TimePeriods.Add(TimePeriodText);
                                            }
                                        }
                                        break;
                                    default:
                                        break;
                                }
                            }
                        }
                        else if (ORItem.AttributeValue.Count > 0)
                        {
                            switch (ORItem.AttributeValue[0].ID)
                            {
                                case Constants.Concept.FOOTNOTES.Id:
                                    Language = ((QueryTextType)ORItem.AttributeValue[0].Items[0]).lang;
                                    break;
                            }
                        }
                        else if (ORItem.And.Count > 0)
                        {
                            IUSNIds.Add(Constants.MinusOne);

                            foreach (DataParametersAndType ANDItem in ORItem.And)
                            {
                                DictSubgroupBreakup = new Dictionary<string, string>();

                                foreach (DimensionValueType Dimension in ANDItem.DimensionValue)
                                {
                                    switch (Dimension.ID)
                                    {
                                        case Constants.Concept.INDICATOR.Id:
                                            IndicatorGId = ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value;
                                            break;
                                        case Constants.Concept.UNIT.Id:
                                            UnitGId = ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value;
                                            break;
                                        default:
                                            DictSubgroupBreakup.Add(Dimension.ID, ((SDMXObjectModel.Query.SimpleValueType)Dimension.Items[0]).Value);
                                            break;
                                    }
                                }

                                SubgroupValGId = this.Get_SubgroupVal_GId(DictSubgroupBreakup, DtSubgroupBreakup);
                                IUSNId = this.Get_IUSNId_From_GIds(IndicatorGId, UnitGId, SubgroupValGId, DtIUS);
                                IUSNIds.Add(IUSNId);
                            }
                        }
                    }

                    if (DataWhere.DataStructure != null && DataWhere.DataStructure.Count > 0 && DataWhere.DataStructure[0].Items != null &&
                        DataWhere.DataStructure[0].Items.Count > 0)
                    {
                        this._agencyID = ((DataStructureRefType)DataWhere.DataStructure[0].Items[0]).agencyID;
                    }
                    else
                    {
                        throw new Exception(Constants.SDMXWebServices.Exceptions.InvalidSyntax.Message);
                    }
                }
                else
                {
                    throw new Exception(Constants.SDMXWebServices.Exceptions.InvalidSyntax.Message);
                }
            }
            else if ((DataReturnDetailTypes)Enum.Parse(typeof(DataReturnDetailTypes), ReturnDetails.detail) == DataReturnDetailTypes.SeriesKeyOnly)
            {
                this._agencyID = "agency";
            }

            this._iusNIds = String.Join(Constants.Comma, IUSNIds.ToArray());
            this._areaIds = AreaIds;
            this._sourceTexts = SourceTexts;

            if (this.IsMRD == false)
            {
                this._timeperiodNIds = this.Get_TimePeriodNIds_From_Text(TimePeriods);
            }

            this._languages = new List<string>();

            if (string.IsNullOrEmpty(Language))
            {
                foreach (DataRow LanguageRow in this._diConnection.DILanguages(this._diQueries.DataPrefix).Rows)
                {
                    this._languages.Add(LanguageRow[DevInfo.Lib.DI_LibDAL.Queries.DIColumns.Language.LanguageCode].ToString());
                }
            }
            else
            {
                if (this._diConnection.IsValidDILanguage(this._diQueries.DataPrefix, Language))
                {
                    this._languages.Add(Language);
                }
                else
                {
                    this._languages.Add(this._diQueries.LanguageCode.Substring(1));
                }
            }

            this._dataReturnDetailType = (DataReturnDetailTypes)Enum.Parse(typeof(DataReturnDetailTypes), ReturnDetails.detail);
        }
 /// <summary>
 /// Populates the AND parameter.
 /// </summary>
 /// <param name="andParameter">
 /// The and parameter.
 /// </param>
 public void PopulateAndParameter(DataParametersAndType andParameter)
 {
     andParameter.Or.Add(this._dataParametersOrType);
 }