/// <summary>
        /// Initializes a new instance of the <see cref="RESTStructureQueryCore"/> class. 
        /// Creation of a Structure Query for structures that match the given reference
        /// </summary>
        /// <param name="structureReference">
        /// The structure reference. 
        /// </param>
	    public RESTStructureQueryCore(IStructureReference structureReference)
        {
		    this._structureReference = structureReference;
            if(structureReference.Version != null)
            {
		  	  _structureQueryMetadata = new StructureQueryMetadataCore(StructureQueryDetail.GetFromEnum(StructureQueryDetailEnumType.Null), null, null, false);
		    }
	    }
        /// <summary>
        /// Initializes a new instance of the <see cref="RESTStructureQueryCore"/> class. 
        ///  Constructs a REST query from the rest query string, example:
        /// /dataflow/ALL/ALL/ALL
        /// </summary>
        /// <param name="queryString">
        /// The rest query string. 
        /// </param>
        /// <param name="queryParameters">
        /// The parameters. 
        /// </param>
        public RESTStructureQueryCore(string queryString, IDictionary<string, string> queryParameters)
        {
            if (queryString.StartsWith("/"))
            {
                queryString = queryString.Substring(1);
            }

            if (queryParameters == null)
            {
                queryParameters = new Dictionary<string, string>();
            }

            //Parse any additional parameters
            if (queryString.IndexOf("?", StringComparison.Ordinal) > 0)
            {
                string paramters = queryString.Substring(queryString.IndexOf("?", StringComparison.Ordinal) + 1);
                queryString = queryString.Substring(0, queryString.IndexOf("?", StringComparison.Ordinal));

                foreach (string currentParam in paramters.Split('&'))
                {
                    string[] param = currentParam.Split('=');
                    queryParameters.Add(param[0], param[1]);
                }
            }

            string[] args = queryString.Split('/');

            ParserQueryString(args);
            _structureQueryMetadata = new StructureQueryMetadataCore(args, queryParameters);
        }
        /// <summary>
         /// Initializes a new instance of the <see cref="RESTStructureQueryCore"/> class. 
         /// </summary>
         /// <param name="queryString">
         /// The query string. 
         /// </param>
         /// <param name="queryParameters">
         /// The query parameters. 
         /// </param>
	     public RESTStructureQueryCore(string[] queryString, IDictionary<string, string> queryParameters) 
         {
		       ParserQueryString(queryString);
		       _structureQueryMetadata = new StructureQueryMetadataCore(queryString, queryParameters);
	     }
        /// <summary>
        /// Initializes a new instance of the <see cref="RESTStructureQueryCore"/> class. 
        /// </summary>
        /// <param name="structureQueryDetail">
        /// The structure query detail. 
        /// </param>
        /// <param name="structureReferenceDetail">
        /// The structure reference detail. 
        /// </param>
        /// <param name="specificStructureReference">
        /// The specific structure reference. 
        /// </param>
        /// <param name="structureReference">
        /// The structure reference. 
        /// </param>
        /// <param name="returnLatest">
        /// The return last. 
        /// </param>
	    public RESTStructureQueryCore(StructureQueryDetail structureQueryDetail, StructureReferenceDetail structureReferenceDetail,
			SdmxStructureType specificStructureReference, IStructureReference structureReference, bool returnLatest)
         {
		       this._structureQueryMetadata = new StructureQueryMetadataCore(structureQueryDetail, structureReferenceDetail, specificStructureReference, returnLatest);
		       this._structureReference = structureReference;
	     }