/// <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; }
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; }
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; }
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); }