/// <summary>
        /// Move WebSpeciesFactCondition information into the
        /// SqlSpeciesFactQueryBuilder instance.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="speciesFactCondition">The species fact condition.</param>
        /// <param name="queryBuilder">The query builder.</param>
        private static void GetSpeciesFactCondition(WebServiceContext context,
                                                    WebSpeciesFactCondition speciesFactCondition,
                                                    SqlSpeciesFactQueryBuilder queryBuilder)
        {
            // Start new species fact condition.
            queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.SpeciesFactCondition);

            // Add all factors.
            if (speciesFactCondition.Factors.IsNotEmpty())
            {
                foreach (WebFactor factor in speciesFactCondition.Factors)
                {
                    queryBuilder.AddFactor(factor.Id);
                }
            }

            // Add all hosts.
            if (speciesFactCondition.HostIds.IsNotEmpty())
            {
                foreach (Int32 hostId in speciesFactCondition.HostIds)
                {
                    queryBuilder.AddHost(hostId);
                }
            }

            // Add all individual categories.
            if (speciesFactCondition.IndividualCategories.IsNotEmpty())
            {
                foreach (WebIndividualCategory individualCategory in speciesFactCondition.IndividualCategories)
                {
                    queryBuilder.AddIndividualCategory(individualCategory.Id);
                }
            }

            // Add all periods.
            if (speciesFactCondition.Periods.IsNotEmpty() &&
                speciesFactCondition.Factors.IsNotEmpty() &&
                speciesFactCondition.Factors[0].IsPeriodic)
            {
                foreach (WebPeriod period in speciesFactCondition.Periods)
                {
                    queryBuilder.AddPeriod(period.Id);
                }
            }

            // Add all species fact field conditions.
            if (speciesFactCondition.SpeciesFactFieldConditions.IsNotEmpty())
            {
                foreach (WebSpeciesFactFieldCondition speciesFactFieldCondition in speciesFactCondition.SpeciesFactFieldConditions)
                {
                    queryBuilder.AddSpeciesFactFieldCondition(speciesFactFieldCondition);
                }
            }

            // Add all taxons.
            if (speciesFactCondition.TaxonIds.IsNotEmpty())
            {
                throw new NotImplementedException("Limitation on taxa in species fact condition is not implemented!");
            }
        }
 private SqlSpeciesFactQueryBuilder GetQueryBuilder(Boolean refresh)
 {
     if (_queryBuilder.IsNull() || refresh)
     {
         _queryBuilder = new SqlSpeciesFactQueryBuilder();
     }
     return(_queryBuilder);
 }
        /// <summary>
        /// Convert a WebDataQuery instance to a string that
        /// represents the query as a SQL condition.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="dataQuery">The data query.</param>
        /// <returns>A SQL condition string.</returns>
        protected static String GetDataQuery(WebServiceContext context,
                                             WebDataQuery dataQuery)
        {
            SqlSpeciesFactQueryBuilder queryBuilder;

            queryBuilder = new SqlSpeciesFactQueryBuilder();
            GetDataQuery(context, dataQuery, queryBuilder);
            return(queryBuilder.GetQuery(context));
        }
        /// <summary>
        /// Move WebDataLogicCondition information into the
        /// SqlSpeciesFactQueryBuilder instance.
        /// </summary>
        /// <param name="context">Web service request context.</param>
        /// <param name="logicCondition">The data logic condition.</param>
        /// <param name="queryBuilder">The query builder.</param>
        private static void GetDataLogicCondition(WebServiceContext context,
                                                  WebDataLogicCondition logicCondition,
                                                  SqlSpeciesFactQueryBuilder queryBuilder)
        {
            Int32 queryIndex;

            switch (logicCondition.Operator)
            {
            case DataLogicConditionOperatorId.And:
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.LeftBracket);
                for (queryIndex = 0; queryIndex < logicCondition.DataQueries.Count; queryIndex++)
                {
                    if (queryIndex > 0)
                    {
                        queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.And);
                    }
                    GetDataQuery(context, logicCondition.DataQueries[queryIndex], queryBuilder);
                }
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.RightBracket);
                break;

            case DataLogicConditionOperatorId.Not:
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.LeftBracket);
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.Not);
                GetDataQuery(context, logicCondition.DataQueries[0], queryBuilder);
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.RightBracket);
                break;

            case DataLogicConditionOperatorId.Or:
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.LeftBracket);
                for (queryIndex = 0; queryIndex < logicCondition.DataQueries.Count; queryIndex++)
                {
                    if (queryIndex > 0)
                    {
                        queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.Or);
                    }
                    GetDataQuery(context, logicCondition.DataQueries[queryIndex], queryBuilder);
                }
                queryBuilder.AddQueryCondition(SqlSpeciesFactQueryBuilder.ConditionType.RightBracket);
                break;

            default:
                throw new ApplicationException("Unknown logic condition operator " + logicCondition.Operator);
            }
        }
 /// <summary>
 /// Move WebDataQuery information into the
 /// SqlSpeciesFactQueryBuilder instance.
 /// </summary>
 /// <param name="context">Web service request context.</param>
 /// <param name="dataQuery">The data query.</param>
 /// <param name="queryBuilder">The query builder.</param>
 private static void GetDataQuery(WebServiceContext context,
                                  WebDataQuery dataQuery,
                                  SqlSpeciesFactQueryBuilder queryBuilder)
 {
     if (dataQuery.DataCondition.IsNotNull())
     {
         if (dataQuery.DataCondition.DataLogicCondition.IsNotNull())
         {
             GetDataLogicCondition(context, dataQuery.DataCondition.DataLogicCondition, queryBuilder);
         }
         if (dataQuery.DataCondition.SpeciesFactCondition.IsNotNull())
         {
             GetSpeciesFactCondition(context, dataQuery.DataCondition.SpeciesFactCondition, queryBuilder);
         }
     }
     if (dataQuery.DataConversion.IsNotNull())
     {
         throw new NotImplementedException("Conversion of data type in data query is not implemented!");
     }
     if (dataQuery.DataLimitation.IsNotNull())
     {
         throw new NotImplementedException("Limitation of data scope in data query is not implemented!");
     }
 }
 public SqlSpeciesFactQueryBuilderTest()
 {
     _queryBuilder = null;
 }