public IDataQuery Build(IDataStructureObject dsd, IDataflowObject dataflowObject)
 {
     IDataQuerySelection dataQuerySelection = new DataQueryDimensionSelectionImpl("FREQ", "M", "A");
     IDataQuerySelectionGroup dataQuerySelectionGroup = new DataQuerySelectionGroupImpl(new HashSet<IDataQuerySelection> { dataQuerySelection }, new SdmxDateCore("2000-01"), new SdmxDateCore("2005-03"));
     return new DataQueryImpl(
         dataStructure: dsd,
         lastUpdated: null,
         dataQueryDetail: DataQueryDetail.GetFromEnum(DataQueryDetailEnumType.Full),
         firstNObs: null,
         lastNObs: null,
         dataProviders: null,
         dataflow: dataflowObject,
         dimensionAtObservation: "TIME_PERIOD",
         selectionGroup: new[] { dataQuerySelectionGroup });
 }
        /// <summary>
        /// Create a SDMX Model Query for <see cref="SessionQuery.Dataflow"/> from the criteria at <see cref="SessionQuery._queryComponentIndex"/>
        /// </summary>
        /// <returns>
        /// A QueryBean object
        /// </returns>
        public IDataQuery CreateQueryBean()
        {
            if (!this._sessionQuery.IsDataflowSet)
            {
                throw new InvalidOperationException("Dataflow is not set");
            }

            ISet<IDataQuerySelection> selections = new HashSet<IDataQuerySelection>();
            string startTime = String.Empty;
            string endTime = String.Empty;

            // Under the DataWhere only one child MUST reside.
            foreach (var queryComponent in this._sessionQuery.GetQueryComponents())
            {
                if (queryComponent != null)
                {
                    IComponent component = queryComponent.GetKeyFamilyComponent();
                    var dimension = component as IDimension;

                    if (dimension != null && !dimension.TimeDimension)
                    {
                        IDataQuerySelection selection = this.AddDimensionToQuery(queryComponent, component);
                        selections.Add(selection);
                    }
                    else if (dimension != null && dimension.TimeDimension)
                    {
                        if (!string.IsNullOrEmpty(queryComponent.StartDate))
                        {
                            startTime = queryComponent.StartDate;
                            endTime = queryComponent.EndDate;
                        }
                    }
                }
            }
            IDataQuerySelectionGroup sel = new DataQuerySelectionGroupImpl(selections, null, null);
            if ((string.IsNullOrEmpty(startTime)) && (!string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, null, new SdmxDateCore(endTime));
            }
            else if ((!string.IsNullOrEmpty(startTime)) && (string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, new SdmxDateCore(startTime), null);
            }
            else if ((!string.IsNullOrEmpty(startTime)) && (!string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, new SdmxDateCore(startTime), new SdmxDateCore(endTime));
            }
            IList<IDataQuerySelectionGroup> selGroup = new List<IDataQuerySelectionGroup>();
            selGroup.Add(sel);
            IDataQuery query;
            if (_sessionQuery.EndPointType == EndpointType.REST)
            {
                query = new DataQueryFluentBuilder().Initialize(_sessionQuery.KeyFamily, _sessionQuery.Dataflow).
                      WithDataQuerySelectionGroup(selGroup).Build();
            }
            else
            {
                query = new DataQueryFluentBuilder().Initialize(_sessionQuery.KeyFamily, _sessionQuery.Dataflow).
                       WithOrderAsc(true).
                       WithMaxObservations(_sessionQuery.MaximumObservations).
                       WithDataQuerySelectionGroup(selGroup).Build();
            }
            return query;
        }
        /*
        internal List<DataCriteria> InitCriteria(IDataStructureObject kf, Dictionary<string, List<string>> Criteria)
        {
            List<DataCriteria> criterias = new List<DataCriteria>();
            foreach (IComponent comp in kf.Components.Where(c => Criteria.ContainsKey(c.Id)))
            {
                criterias.Add(new DataCriteria() { component = comp.Id, values = Criteria[comp.Id] });
            }

            foreach (IComponent comp in kf.DimensionList.Dimensions.Where(c => !Criteria.ContainsKey(c.Id)))
            {
                criterias.Add(new DataCriteria() { component = comp.Id, values = Criteria[comp.Id] });
            }
            return criterias;
        }
        */
        public IDataQuery CreateQueryBean(IDataflowObject df, IDataStructureObject kf, List<DataCriteria> Criterias)
        {
            ISet<IDataQuerySelection> selections = new HashSet<IDataQuerySelection>();
            string startTime = String.Empty;
            string endTime = String.Empty;

            // Under the DataWhere only one child MUST reside.
            foreach (var queryComponent in Criterias)
            {
                if (queryComponent != null)
                {

                    if (!string.IsNullOrEmpty(queryComponent.component) && queryComponent.component != kf.TimeDimension.Id)
                    {
                        //if (queryComponent.values.Count > 0) baco 25/11/2015
                        if (queryComponent.values.Count > 0 && !string.IsNullOrEmpty(queryComponent.values[0]))
                        {
                            ISet<string> valuern = new HashSet<string>();
                            foreach (string c in queryComponent.values)
                            {
                                if (!string.IsNullOrEmpty(c))
                                    valuern.Add((c));
                            }
                            IDataQuerySelection selection = new DataQueryDimensionSelectionImpl(queryComponent.component, valuern);
                            selections.Add(selection);
                        }
                    }
                    else if (!string.IsNullOrEmpty(queryComponent.component) && queryComponent.component == kf.TimeDimension.Id)
                    {
                        if (queryComponent.values.Count > 0 && !string.IsNullOrEmpty(queryComponent.values[0]))
                        {
                            startTime = queryComponent.values[0];
                            //if (queryComponent.values.Count > 1 && !string.IsNullOrEmpty(queryComponent.values[1]))
                            if (queryComponent.values.Count > 1 && !string.IsNullOrEmpty(queryComponent.values[queryComponent.values.Count-1]))
                                endTime = queryComponent.values[queryComponent.values.Count - 1];
                        }
                    }
                }
            }
            IDataQuerySelectionGroup sel = new DataQuerySelectionGroupImpl(selections, null, null);
            if ((string.IsNullOrEmpty(startTime)) && (!string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, new SdmxDateCore(endTime), new SdmxDateCore(endTime));
            }
            else if ((!string.IsNullOrEmpty(startTime)) && (string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, new SdmxDateCore(startTime), new SdmxDateCore(startTime));
            }
            else if ((!string.IsNullOrEmpty(startTime)) && (!string.IsNullOrEmpty(endTime)))
            {
                sel = new DataQuerySelectionGroupImpl(selections, new SdmxDateCore(startTime), new SdmxDateCore(endTime));
            }
            IList<IDataQuerySelectionGroup> selGroup = new List<IDataQuerySelectionGroup>();
            selGroup.Add(sel);
            IDataQuery query;
            if (DataObjConfiguration._TypeEndpoint == EndpointType.REST)
            {
                query = new DataQueryFluentBuilder().Initialize(kf, df).
                      WithDataQuerySelectionGroup(selGroup).Build();
            }
            else
            {
                query = new DataQueryFluentBuilder().Initialize(kf, df).
                       WithOrderAsc(true).
                       WithMaxObservations(MaximumObservations).
                       WithDataQuerySelectionGroup(selGroup).Build();
            }
            return query;
        }