///////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////BUILD FROM V2.1 SCHEMA                 //////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Initializes a new instance of the <see cref="TimeRangeMutableCore"/> class.
        /// </summary>
        /// <param name="type">
        /// The type. 
        /// </param>
        public TimeRangeMutableCore(TimeRangeValueType type)
            : base(SdmxStructureType.GetFromEnum(SdmxStructureEnumType.TimeRange))
        {
            if (type.AfterPeriod != null)
            {
                this._isIsRange = false;

                // FUNC 2.1 ObservationalTimePeriodType - does this work?
                this.endDate = DateUtil.FormatDate(type.AfterPeriod.TypedValue, true);
                this.isEndInclusive = type.AfterPeriod.isInclusive;
            }

            if (type.BeforePeriod != null)
            {
                this._isIsRange = false;
                this.startDate = DateUtil.FormatDate(type.BeforePeriod.TypedValue, true);
                this.isStartInclusive = type.BeforePeriod.isInclusive;
            }

            if (type.StartPeriod != null)
            {
                this._isIsRange = true;
                this.startDate = DateUtil.FormatDate(type.StartPeriod.TypedValue, true);
                this.isStartInclusive = type.StartPeriod.isInclusive;
            }

            if (type.EndPeriod != null)
            {
                this._isIsRange = true;
                this.startDate = DateUtil.FormatDate(type.EndPeriod.TypedValue, true);
                this.isEndInclusive = type.EndPeriod.isInclusive;
            }

            this.Validate();
        }
        /**
         * Builds a time range from time range value from XML
         * @param timeRangeValueType
         * @return
         */
        private ITimeRange BuildTimeRange(TimeRangeValueType timeRangeValueType)
        {
            if (timeRangeValueType == null)
            {
                return null;
            }

            bool range = false;
            ISdmxDate startDate = null;
            ISdmxDate endDate = null;
            bool endInclusive = false;
            bool startInclusive = false;

            if (timeRangeValueType.AfterPeriod != null)
            {
                TimePeriodRangeType afterPeriod = timeRangeValueType.AfterPeriod;
                startDate = new SdmxDateCore(afterPeriod.TypedValue.ToString());
                startInclusive = afterPeriod.isInclusive;
            }
            else if (timeRangeValueType.BeforePeriod != null)
            {
                TimePeriodRangeType beforePeriod = timeRangeValueType.BeforePeriod;
                endDate = new SdmxDateCore(beforePeriod.TypedValue.ToString());
                endInclusive = beforePeriod.isInclusive;
            }
            else
            { //case that range is set
                range = true;
                TimePeriodRangeType startPeriod = timeRangeValueType.StartPeriod;
                startDate = new SdmxDateCore(startPeriod.TypedValue.ToString());
                startInclusive = startPeriod.isInclusive;

                TimePeriodRangeType endPeriod = timeRangeValueType.EndPeriod;
                endDate = new SdmxDateCore(endPeriod.TypedValue.ToString());
                endInclusive = endPeriod.isInclusive;
            }


            return new TimeRangeCore(range, startDate, endDate, startInclusive, endInclusive);
        }
        ///////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////BUILD FROM V2.1 SCHEMA                 //////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Initializes a new instance of the <see cref="TimeRangeCore"/> class.
        /// </summary>
        /// <param name="type">
        /// The type. 
        /// </param>
        /// <param name="parent">
        /// The parent. 
        /// </param>
        public TimeRangeCore(TimeRangeValueType type, ISdmxStructure parent)
            : base(SdmxStructureType.GetFromEnum(SdmxStructureEnumType.TimeRange), parent)
        {
            if (type.AfterPeriod != null)
            {
                this._isRange = false;

                // FUNC 2.1 ObservationalTimePeriodType - does this work?
                this._endDate = new SdmxDateCore(type.AfterPeriod.TypedValue.ToString());
                this._isEndInclusive = type.AfterPeriod.isInclusive;
            }

            if (type.BeforePeriod != null)
            {
                this._isRange = false;
                this._startDate = new SdmxDateCore(type.BeforePeriod.TypedValue.ToString());
                this._isStartInclusive = type.BeforePeriod.isInclusive;
            }

            if (type.StartPeriod != null)
            {
                this._isRange = true;
                this._startDate = new SdmxDateCore(type.StartPeriod.TypedValue.ToString());
                this._isStartInclusive = type.StartPeriod.isInclusive;
            }

            if (type.EndPeriod != null)
            {
                this._isRange = true;
                this._endDate = new SdmxDateCore(type.EndPeriod.TypedValue.ToString());
                this._isEndInclusive = type.EndPeriod.isInclusive;
            }

            this.Validate();
        }
        /**
         * builds the version reference from the XML beans values
         * @param version
         * @param versionFromType
         * @param versionToType
         * @return
         */
        private IComplexVersionReference BuildVersionReference(string version, TimeRangeValueType versionFromType, TimeRangeValueType versionToType)
        {
            TertiaryBool returnLatest = TertiaryBool.GetFromEnum(TertiaryBoolEnumType.Unset);
            string emptyCheckedString = null;
            if (!string.IsNullOrWhiteSpace(version))
            {
                if (version.Equals("*"))
                {
                    returnLatest = TertiaryBool.GetFromEnum(TertiaryBoolEnumType.True);
                    emptyCheckedString = null;
                }
                else
                {
                    emptyCheckedString = version;
                    returnLatest = TertiaryBool.GetFromEnum(TertiaryBoolEnumType.False);
                }
            }

            ITimeRange validFrom = BuildTimeRange(versionFromType);
            ITimeRange validTo = BuildTimeRange(versionToType);

            return new ComplexVersionReferenceCore(returnLatest, emptyCheckedString, validFrom, validTo);
        }
        /// <summary>
        /// Handles the last updated time.
        /// </summary>
        /// <param name="complexDataQuery">The complex data query.</param>
        /// <param name="whereType">Type of the where.</param>
        private static void HandleLastUpdatedTime(IComplexDataQuery complexDataQuery, DataParametersType whereType)
        {
            foreach (var timeRange in complexDataQuery.LastUpdatedDateTimeRange)
            {
                var timeRangeValueType = new TimeRangeValueType();

                var startTimePeriodRangeType = new TimePeriodRangeType();

                startTimePeriodRangeType.isInclusive = timeRange.IsStartInclusive;
                startTimePeriodRangeType.TypedValue = timeRange.StartDate.DateInSdmxFormat;

                timeRangeValueType.StartPeriod = startTimePeriodRangeType;

                var endTimePeriodRangeType = new TimePeriodRangeType();

                endTimePeriodRangeType.isInclusive = timeRange.IsEndInclusive;
                endTimePeriodRangeType.TypedValue = timeRange.StartDate.DateInSdmxFormat;

                timeRangeValueType.EndPeriod = endTimePeriodRangeType;

                whereType.Updated.Add(timeRangeValueType);
            }
        }