/// <summary>
        /// processes all v2.1 structure Query messages and build the {@link ComplexStructureQuery}
        /// </summary>
        /// <param name="reader">The reader.</param>
        /// <param name="queryMessageType">Type of the query message.</param>
        /// <returns>a parsed {@link ComplexStructureQuery} set in the {@link QueryWorkspace} </returns>
        /// <exception cref="System.ArgumentException">Not a structure query message: + queryMessageType</exception>
        private IQueryWorkspace ProcessQueryMessage(XmlReader reader, QueryMessageEnumType queryMessageType)
        {
            IComplexStructureQuery complexQuery;
            switch (queryMessageType)
            {
                case QueryMessageEnumType.StructuresWhere:
                    StructuresQuery structuresQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<StructuresQuery, StructuresQueryType>(reader);
                    complexQuery = _queryBuilder.Build(structuresQuery.Content);
                    break;
                case QueryMessageEnumType.DataflowWhere:
                    DataflowQuery dataflowQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<DataflowQuery, DataflowQueryType>(reader);
                    complexQuery = _queryBuilder.Build(dataflowQuery.Content);
                    break;
                case QueryMessageEnumType.MetadataflowWhere:
                    MetadataflowQuery metadataflowQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<MetadataflowQuery, MetadataflowQueryType>(reader);
                    complexQuery = _queryBuilder.Build(metadataflowQuery.Content);
                    break;
                case QueryMessageEnumType.DsdWhere:
                    DataStructureQuery dataStructureQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<DataStructureQuery, DataStructureQueryType>(reader);
                    complexQuery = _queryBuilder.Build(dataStructureQuery.Content);
                    break;
                case QueryMessageEnumType.MdsWhere:
                    MetadataStructureQuery metadataStructureQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<MetadataStructureQuery, MetadataStructureQueryType>(reader);
                    complexQuery = _queryBuilder.Build(metadataStructureQuery.Content);
                    break;
                case QueryMessageEnumType.CategorySchemeWhere:
                    CategorySchemeQuery categorySchemeQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<CategorySchemeQuery, CategorySchemeQueryType>(reader);
                    complexQuery = _queryBuilder.Build(categorySchemeQuery.Content);
                    break;
                case QueryMessageEnumType.ConceptSchemeWhere:
                    ConceptSchemeQuery conceptSchemeQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<ConceptSchemeQuery, ConceptSchemeQueryType>(reader);
                    complexQuery = _queryBuilder.Build(conceptSchemeQuery.Content);
                    break;
                case QueryMessageEnumType.CodelistWhere:
                    CodelistQuery codelistQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<CodelistQuery, CodelistQueryType>(reader);
                    complexQuery = _queryBuilder.Build(codelistQuery.Content);
                    break;
                case QueryMessageEnumType.HclWhere:
                    HierarchicalCodelistQuery hierarchicalCodelistQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<HierarchicalCodelistQuery, HierarchicalCodelistQueryType>(reader);
                    complexQuery = _queryBuilder.Build(hierarchicalCodelistQuery.Content);
                    break;
                case QueryMessageEnumType.OrganisationSchemeWhere:
                    OrganisationSchemeQuery organisationSchemeQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<OrganisationSchemeQuery, OrganisationSchemeQueryType>(reader);
                    complexQuery = _queryBuilder.Build(organisationSchemeQuery.Content);
                    break;
                case QueryMessageEnumType.ReportingTaxonomyWhere:
                    ReportingTaxonomyQuery reportingTaxonomyQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<ReportingTaxonomyQuery, ReportingTaxonomyQueryType>(reader);
                    complexQuery = _queryBuilder.Build(reportingTaxonomyQuery.Content);
                    break;
                case QueryMessageEnumType.StructureSetWhere:
                    StructureSetQuery structureSetQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<StructureSetQuery, StructureSetQueryType>(reader);
                    complexQuery = _queryBuilder.Build(structureSetQuery.Content);
                    break;
                case QueryMessageEnumType.ProcessWhere:
                    ProcessQuery processQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<ProcessQuery, ProcessQueryType>(reader);
                    complexQuery = _queryBuilder.Build(processQuery.Content);
                    break;
                case QueryMessageEnumType.CategorisationWhere:
                    CategorisationQuery categorisationQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<CategorisationQuery, CategorisationQueryType>(reader);
                    complexQuery = _queryBuilder.Build(categorisationQuery.Content);
                    break;
                case QueryMessageEnumType.ProvisionAgreementWhere:
                    ProvisionAgreementQuery provisionAgreementQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<ProvisionAgreementQuery, ProvisionAgreementQueryType>(reader);
                    complexQuery = _queryBuilder.Build(provisionAgreementQuery.Content);
                    break;
                case QueryMessageEnumType.ConstraintWhere:
                    ConstraintQuery constraintQuery = Org.Sdmx.Resources.SdmxMl.Schemas.V21.MessageFactory.Load<ConstraintQuery, ConstraintQueryType>(reader);
                    complexQuery = _queryBuilder.Build(constraintQuery.Content);
                    break;
                default:
                    throw new ArgumentException("Not a structure query message:" + queryMessageType);
            }

            return new QueryWorkspace(complexQuery);
        }
 public void TestGetQueryMessageTypes(string file, QueryMessageEnumType expectedResult)
 {
     using (var readable = new FileReadableDataLocation(file))
     {
         IList<QueryMessageEnumType> queryMessageEnumTypes = SdmxMessageUtil.GetQueryMessageTypes(readable);
         Assert.IsNotNull(queryMessageEnumTypes);
         if (expectedResult != QueryMessageEnumType.Null)
         {
             Assert.IsNotEmpty(queryMessageEnumTypes);
             var messageEnumTypes = from x in queryMessageEnumTypes where (x == expectedResult) select x;
             CollectionAssert.AreEquivalent(queryMessageEnumTypes, messageEnumTypes);
         }
     }
 }