protected override object DoQuery(Context context)
        {
            var          handlerConfig = context.HandlerConfig;
            var          queryConfigs  = context.Configs;
            var          queryParam    = context.Params;
            IValueSetter valueSetter   = handlerConfig.Create();

            object outData = valueSetter.CreateInstance();

            context.Data = outData;

            IDictionary <string, object> contentData = new ExpandoObject();
            IValueSetter contentSetter = ValueSetterCreater.Create(contentData);

            foreach (var queryConfig in queryConfigs)
            {
                IQueryHandler          queryHandler          = QueryHandlerFactory.GetQueryHandler(queryConfig.QueryType);
                IConditionQueryHandler conditionQueryHandler = queryHandler as IConditionQueryHandler;
                var subContext = new Context(context)
                {
                    Data    = contentData,
                    Configs = new QueryConfig[] { queryConfig }
                };

                if (conditionQueryHandler != null)
                {
                    var isContinue = conditionQueryHandler.Continue(subContext);
                    if (isContinue == false)
                    {
                        if (conditionQueryHandler.WhetheStop(subContext))
                        {
                            return(outData);
                        }

                        continue;
                    }
                }

                context.Childs.Add(subContext);
                var data = queryHandler.Query(subContext);
                contentSetter.SetFieldByConfig(contentData, data, queryConfig);
                if (conditionQueryHandler != null)
                {
                    var result = conditionQueryHandler.WhetheResultStop(subContext, data);
                    if (result == true)
                    {
                        return(outData);
                    }
                }

                if (queryConfig.IngoreFill == true)
                {
                    continue;
                }

                valueSetter.SetField(queryConfig.Filed, data);
            }

            return(outData);
        }
Exemple #2
0
        public void ExcuteSubQueries(Context context, QueryConfig queryConfig, IValueSetter valueSetter, IEnumerable <object> parents)
        {
            if (queryConfig.Config == null ||
                queryConfig.Config["related_queries"] == null ||
                parents.Any() == false)
            {
                return;
            }

            var relatedQueryConfigs = JsonConvert.DeserializeObject <IEnumerable <ReleatedQuery> >(queryConfig.Config["related_queries"].ToString());

            if (relatedQueryConfigs.Any() == false)
            {
                return;
            }

            IDictionary <string, object> contentData = new ExpandoObject();

            foreach (var relatedQueryConfig in relatedQueryConfigs)
            {
                IQueryHandler          queryHandler          = QueryHandlerFactory.GetQueryHandler(relatedQueryConfig.QueryType);
                IConditionQueryHandler conditionQueryHandler = queryHandler as IConditionQueryHandler;

                var subContext = new Context(context)
                {
                    Data    = contentData,
                    Configs = new QueryConfig[] { relatedQueryConfig },
                    Params  = context.Params
                };

                if (conditionQueryHandler != null)
                {
                    var isContinue = conditionQueryHandler.Continue(subContext);
                    if (isContinue == false)
                    {
                        if (conditionQueryHandler.WhetheStop(subContext))
                        {
                            return;
                        }

                        continue;
                    }
                }

                context.Childs.Add(subContext);
                var obj = queryHandler.Query(subContext);
                if (!string.IsNullOrEmpty(relatedQueryConfig.Filed))
                {
                    contentData.Add(relatedQueryConfig.Filed, obj);
                }

                if (conditionQueryHandler != null)
                {
                    var result = conditionQueryHandler.WhetheResultStop(subContext, obj);
                    if (result == true)
                    {
                        return;
                    }
                }

                if (relatedQueryConfig.IngoreFill)
                {
                    continue;
                }

                SetSubQueryValue(relatedQueryConfig, valueSetter, parents, (IEnumerable <object>)obj);
            }
        }