public ComplexDataQueryImpl(string datasetId, 
								TextSearch datasetIdOperator, 
								ISet<IDataProvider> dataProviders, 
								IDataStructureObject dataStructure, 
								IDataflowObject dataFlow,
								IProvisionAgreementObject provisionAgreement,  
								IList<ITimeRange> lastUpdatedDate, 
								int? maxObs, 
								int? defaultLimit, 
								bool orderAsc, 
								ObservationAction obsAction, 
								string dimensionAtObservation,
								bool hasExplicitMeasures, 
								DataQueryDetail queryDetail, 
								ICollection<IComplexDataQuerySelectionGroup> complexDataQuerySelectionGroup)
        {

		    this._datasetId = datasetId;

		    if (datasetIdOperator != null)
			    this._datasetIdOperator = datasetIdOperator;
		    else
			    this._datasetIdOperator = TextSearch.GetFromEnum(TextSearchEnumType.Equal);
		
            if (dataProviders != null) 
            {
			    this._dataProviders = new HashSet<IDataProvider>(dataProviders);
		    }

		    base.DataStructure = dataStructure;
		    base.Dataflow = dataFlow;
		    this._provisionAgreement = provisionAgreement;

		    if(lastUpdatedDate != null) 
            {
			    this._lastUpdatedDate = new List<ITimeRange>(lastUpdatedDate);
		    }

		    if (orderAsc) 
			    base.FirstNObservations = maxObs;
		    else 
			    base.LastNObservations = maxObs;

		    this._defaultLimit = defaultLimit;

		    if (obsAction!=null)
			    this._obsAction = obsAction;
		    else 
			    this._obsAction = ObservationAction.GetFromEnum(ObservationActionEnumType.Active);

		    this.DimensionAtObservation = dimensionAtObservation;

		    if (dimensionAtObservation != null)
            {
			    //the values: 'AllDimensions' and 'TIME_PERIOD' are valid values.
			    if (dimensionAtObservation.Equals(_allDimensions) || dimensionAtObservation.Equals(DimensionAtObservationEnumType.Time.ToString()))
				    this.DimensionAtObservation = dimensionAtObservation;
			    else //check if the value is a dimension Value
				    CheckDimensionExistence(dimensionAtObservation, dataStructure);
		    }
            else
            {
			    this.DimensionAtObservation = GetDimensionAtObservationLevel(dataStructure);
		    }

		    this._hasExplicitMeasures = hasExplicitMeasures;

		    if (queryDetail != null)
			    this._queryDetail = queryDetail;
		    else
			    this._queryDetail = DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);

		    if (complexDataQuerySelectionGroup != null) 
            {
			    foreach (IComplexDataQuerySelectionGroup cdqsg in complexDataQuerySelectionGroup) 
                {
				    if (cdqsg != null) 
                    {
					    this._complexDataQuerySelectionGroups.Add(cdqsg);
				    }
			    }
		    }

		    //perform validation 	
		    ValidateQuery();
		    ValidateProvisionAgreement();
	    }
 public IDataQueryFluentBuilder WithDataQueryDetail(DataQueryDetail dataQueryDetail)
 {
     if(dataQueryDetail != null)
         this._dataQueryDetail = dataQueryDetail;
     return this;
 }
 /// <summary>
 /// Sets the detail.
 /// </summary>
 /// <param name="detail">The detail.</param>
 private void SetDetail(string detail)
 {
     if (detail != null)
     {
         queryDetail = DataQueryDetail.ParseString(detail);
     }
 }
	    public ComplexDataQueryImpl(string datasetId, TextSearch datasetIdOperator, 
                                    ISet<IDataProvider> dataProviders, 
			                        IDataStructureObject dataStructure, IDataflowObject dataFlow,
			                        IProvisionAgreementObject provisionAgreement, 
                                    IList<ITimeRange> lastUpdatedDate,  
			                        int? firstNObs, int? lastNObs, int? defaultLimit, 
                                    ObservationAction obsAction, string dimensionAtObservation,
			                        bool hasExplicitMeasures, DataQueryDetail queryDetail, 
                                    ISet<IComplexDataQuerySelection> complexSelections, 
			                        DateTime dateFrom, OrderedOperator dateFromOperator, 
                                    DateTime dateTo,  OrderedOperator dateToOperator,
                                    ISet<IComplexComponentValue> primaryMeasureValues)
        {
		    this._datasetId = datasetId;
		    if (datasetIdOperator != null)
			    this._datasetIdOperator = datasetIdOperator;
		    else
			    this._datasetIdOperator = TextSearch.GetFromEnum(TextSearchEnumType.Equal);

		    this._dataProviders = dataProviders;
		    base.DataStructure = dataStructure;
		    base.Dataflow = dataFlow;
		    this._provisionAgreement = provisionAgreement;
		    this._lastUpdatedDate = lastUpdatedDate;
		    base.FirstNObservations = firstNObs;
		    base.LastNObservations = lastNObs;
		    this._defaultLimit = defaultLimit;

		    if (obsAction != null)
			    this._obsAction = obsAction;
		    else 
			    this._obsAction = ObservationAction.GetFromEnum(ObservationActionEnumType.Active);

		    this.DimensionAtObservation = dimensionAtObservation;
		    if (dimensionAtObservation != null)
            {
			    //the values: 'AllDimensions' and 'TIME_PERIOD' are valid values.
			    if (dimensionAtObservation.Equals(_allDimensions) || dimensionAtObservation.Equals(DimensionAtObservationEnumType.Time.ToString()))
				    this.DimensionAtObservation = dimensionAtObservation;
			    else//check if the value is a dimension Value
				    CheckDimensionExistence(dimensionAtObservation, dataStructure);
		    }
            else
            {
			    this.DimensionAtObservation = GetDimensionAtObservationLevel(dataStructure);
		    }
		
		    this._hasExplicitMeasures = hasExplicitMeasures;
		    if (queryDetail != null)
			    this._queryDetail = queryDetail;
		    else
			    this._queryDetail = DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);

		    if(ObjectUtil.ValidCollection(complexSelections) || dateFrom != null || dateTo != null) 
            {
			    ISdmxDate sdmxDateFrom = null;
			    if(dateFrom != null) 
                {
				    sdmxDateFrom = new SdmxDateCore(dateFrom, TimeFormatEnumType.Date);
			    }
			    ISdmxDate sdmxDateTo = null;
			    if(dateFrom != null) {
				    sdmxDateTo = new SdmxDateCore(dateTo, TimeFormatEnumType.Date);
			    }
			    this._complexDataQuerySelectionGroups.Add(new ComplexDataQuerySelectionGroupImpl(complexSelections, sdmxDateFrom, dateFromOperator, sdmxDateTo,  dateToOperator, primaryMeasureValues));
		    }

		    //perform validation 	
		    ValidateQuery();
		    ValidateProvisionAgreement();
	    }
        /// <summary>
        /// Build from a REST query and a bean retrival manager
        /// </summary>
        /// <param name="dataQuery"></param>
        /// <param name="retrievalManager"></param>
        /// <exception cref="SdmxSemmanticException"></exception>
        public DataQueryImpl(IRestDataQuery dataQuery, ISdmxObjectRetrievalManager retrievalManager)
        {
            this._lastUpdated = dataQuery.UpdatedAfter;
            this._dataQueryDetail = dataQuery.QueryDetail ?? DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);

            base.FirstNObservations = dataQuery.FirstNObservations;
            base.LastNObservations = dataQuery.LastNObsertations;
            if (ObjectUtil.ValidString(dataQuery.DimensionAtObservation))
            {
                this.DimensionAtObservation = dataQuery.DimensionAtObservation;
            }

            base.Dataflow = retrievalManager.GetMaintainableObject<IDataflowObject>(dataQuery.FlowRef.MaintainableReference);
            if (base.Dataflow == null)
            {
                throw new SdmxNoResultsException("Data Flow could not be found for query : " + dataQuery.FlowRef);
            }

            base.DataStructure =
                retrievalManager.GetMaintainableObject<IDataStructureObject>(base.Dataflow.DataStructureRef.MaintainableReference);
            if (base.DataStructure == null)
            {
                throw new SdmxNoResultsException("DSD could not be found for query : " + base.Dataflow.DataStructureRef);
            }

            ISet<IDataProvider> dataProviders = new HashSet<IDataProvider>();
            if (dataQuery.ProviderRef != null)
            {
                ISet<IDataProviderScheme> dataProviderSchemes =
                    retrievalManager.GetMaintainableObjects<IDataProviderScheme>(dataQuery.ProviderRef.MaintainableReference);
                foreach (IDataProviderScheme currentDpScheme in dataProviderSchemes)
                {
                    foreach (IDataProvider dataProvider in currentDpScheme.Items)
                    {
                        if (dataProvider.Id.Equals(dataQuery.ProviderRef.ChildReference.Id))
                        {
                            dataProviders.Add(dataProvider);
                        }
                    }
                }
            }
            ISet<IDataQuerySelection> selections = new HashSet<IDataQuerySelection>();
            if (dataQuery.QueryList.Count > 0)
            {
                int i = 0;
                foreach (IDimension dimension in base.DataStructure.GetDimensions(SdmxStructureEnumType.Dimension, SdmxStructureEnumType.MeasureDimension).OrderBy(dimension => dimension.Position))
                {
                    if (dataQuery.QueryList.Count <= i)
                    {
                        throw new SdmxSemmanticException(
                            "Not enough key values in query, expecting "
                            + base.DataStructure.GetDimensions(SdmxStructureEnumType.Dimension, SdmxStructureEnumType.MeasureDimension).Count + " got "
                            + dataQuery.QueryList.Count);
                    }
                    ISet<string> queriesForDimension = dataQuery.QueryList[i];
                    if (queriesForDimension != null && queriesForDimension.Count > 0)
                    {
                        IDataQuerySelection selectionsForDimension =
                            new DataQueryDimensionSelectionImpl(
                                dimension.Id,
                                new HashSet<string>(queriesForDimension));
                        selections.Add(selectionsForDimension);
                    }
                    i++;
                }
            }

            if (ObjectUtil.ValidCollection(selections) || dataQuery.StartPeriod != null || dataQuery.EndPeriod != null)
            {
                _dataQuerySelectionGroups.Add(
                    new DataQuerySelectionGroupImpl(selections, dataQuery.StartPeriod, dataQuery.EndPeriod));
            }
            ValidateQuery();
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="DataQueryImpl"/> class.
        /// </summary>
        /// <param name="dataStructure">
        /// The data structure.
        /// </param>
        /// <param name="lastUpdated">
        /// The last updated.
        /// </param>
        /// <param name="dataQueryDetail">
        /// The data query detail.
        /// </param>
        /// <param name="maxObs">
        /// The max obs.
        /// </param>
        /// <param name="orderAsc">
        /// If the order is ascending.
        /// </param>
        /// <param name="dataProviders">
        /// The data providers.
        /// </param>
        /// <param name="dataflow">
        /// The dataflow.
        /// </param>
        /// <param name="dimensionAtObservation">
        /// The dimension at observation.
        /// </param>
        /// <param name="selectionGroup">
        /// The selection group.
        /// </param>
        public DataQueryImpl(
            IDataStructureObject dataStructure,
            ISdmxDate lastUpdated,
            DataQueryDetail dataQueryDetail,
            int maxObs,
            bool orderAsc,
            ISet<IDataProvider> dataProviders,
            IDataflowObject dataflow,
            string dimensionAtObservation,
            ICollection<IDataQuerySelectionGroup> selectionGroup)
        {
            base.DataStructure = dataStructure;
            this._lastUpdated = lastUpdated;
            this._dataQueryDetail = dataQueryDetail ?? DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);
            if (orderAsc)
            {
                base.FirstNObservations = maxObs;
            }
            else
            {
                base.LastNObservations = maxObs;
            }
            if (dataProviders != null)
            {
                this._dataProviders = new HashSet<IDataProvider>(dataProviders);
            }
            base.Dataflow = dataflow;
            this.DimensionAtObservation = dimensionAtObservation;

            if (selectionGroup != null)
            {
                foreach (IDataQuerySelectionGroup dqsg in selectionGroup)
                {
                    if (dqsg != null)
                    {
                        this._dataQuerySelectionGroups.Add(dqsg);
                    }
                }
            }
            ValidateQuery();
        }
        public DataQueryImpl(
            IDataStructureObject dataStructure,
            ISdmxDate lastUpdated,
            DataQueryDetail dataQueryDetail,
            int maxObs,
            bool orderAsc,
            ISet<IDataProvider> dataProviders,
            IDataflowObject dataflow,
            string dimensionAtObservation,
            ISet<IDataQuerySelection> selections,
            DateTime? dateFrom,
            DateTime? dateTo)
        {
            base.DataStructure = dataStructure;
            this._lastUpdated = lastUpdated;
            this._dataQueryDetail = dataQueryDetail ?? DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);
            if (orderAsc)
            {
                base.FirstNObservations = maxObs;
            }
            else
            {
                base.LastNObservations = maxObs;
            }
            if (dataProviders != null)
            {
                this._dataProviders = new HashSet<IDataProvider>(dataProviders);
            }
            base.Dataflow = dataflow;
            this.DimensionAtObservation = dimensionAtObservation;

            if (ObjectUtil.ValidCollection(selections) || dateFrom != null || dateTo != null)
            {
                ISdmxDate sdmxDateFrom = null;
                if (dateFrom != null)
                {
                    sdmxDateFrom = new SdmxDateCore(dateFrom, TimeFormatEnumType.Date);
                }
                ISdmxDate sdmxDateTo = null;
                if (dateTo != null)
                {
                    sdmxDateTo = new SdmxDateCore(dateTo, TimeFormatEnumType.Date);
                }
                //TODO: move to fluent interface
                this._dataQuerySelectionGroups.Add(new DataQuerySelectionGroupImpl(selections, sdmxDateFrom, sdmxDateTo));
            }
            ValidateQuery();
        }
 public static IDataQuery BuildEmptyQuery(
     IDataStructureObject dataStructure, IDataflowObject dataflow, DataQueryDetail dataQueryDetail)
 {
     return new DataQueryImpl(dataStructure, dataflow, dataQueryDetail);
 }
 private DataQueryImpl(
     IDataStructureObject dataStructure, IDataflowObject dataflow, DataQueryDetail dataQueryDetail)
 {
     base.DataStructure = dataStructure;
     this._dataQueryDetail = dataQueryDetail ?? DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full);
     base.Dataflow = dataflow;
     ValidateQuery();
 }