Exemplo n.º 1
0
		public ResultObjectMapping ProcessRow(ResultObjectMapping parent, BufferedTextReader reader, object row)
		{
			var result = new ResultObjectMapping();
			Selects.ForEach(it => result.Add(it.Key, it.Value(row, reader)));
			result.Add(parent);
			return result;
		}
Exemplo n.º 2
0
 public ResultObjectMapping ProcessRow(IDataReader dr, BufferedTextReader reader)
 {
     var result = new ResultObjectMapping();
     foreach (var sel in Query.Selects)
         result.Add(sel.QuerySource, sel.Instancer(result, reader, dr));
     return result;
 }
Exemplo n.º 3
0
 public ResultObjectMapping ProcessRow(IDataReader dr)
 {
     var result = new ResultObjectMapping();
     foreach (var it in Query.Selects)
         if (it.Instancer != null)
             result.Add(it.QuerySource, it.Instancer(result, dr));
     return result;
 }
Exemplo n.º 4
0
		public ResultObjectMapping ProcessRow(ResultObjectMapping parent, BufferedTextReader reader, string[] items)
		{
			var result = new ResultObjectMapping();
			for (int i = 0; i < Selects.Count; i++)
			{
				var sel = Selects[i];
				result.Add(sel.Key, sel.Value(items[i], reader));
			}
			result.Add(parent);
			return result;
		}
Exemplo n.º 5
0
 public ResultObjectMapping ProcessRow(ResultObjectMapping parent, object row)
 {
     var result = new ResultObjectMapping();
     for (int i = 0; i < Selects.Count; i++)
     {
         var sel = Selects[i];
         result.Add(sel.Key, sel.Value(row));
     }
     result.Add(parent);
     return result;
 }
Exemplo n.º 6
0
 public object Eval(ResultObjectMapping item)
 {
     return(Func(item));
 }
Exemplo n.º 7
0
        protected override Expression VisitSubQueryExpression(SubQueryExpression expression)
        {
            if (ProcessedExpressions.Contains(expression))
            {
                return(expression);
            }

            if (DataSources.Count == 0)
            {
                DataSources.Add(Query.MainFrom.FromExpression);
                DataSources.AddRange(Query.Joins.Select(it => it.InnerSequence));
                DataSources.AddRange(Query.AdditionalJoins.Select(it => it.FromExpression));
            }

            var model = expression.QueryModel;

            if (model.BodyClauses.Count == 0 &&
                DataSources.Contains(model.MainFromClause.FromExpression))
            {
                return(expression);
            }

            ProcessedExpressions.Add(expression);

            foreach (var candidate in Query.ProjectionMatchers)
            {
                if (candidate.TryMatch(expression, Query, exp => VisitExpression(exp), Query.Context))
                {
                    return(expression);
                }
            }

            var subquery = SubqueryGeneratorQueryModelVisitor.ParseSubquery(expression.QueryModel, Query, true);

            var cnt = Query.CurrentSelectIndex;
            //TODO true or false
            var sql = subquery.BuildSqlString(true);

            var selector  = model.SelectClause.Selector;
            var projector = (IExecuteFunc)Activator.CreateInstance(typeof(GenericProjection <>).MakeGenericType(selector.Type), model);
            var ssd       = SelectSubqueryData.Create(Query, subquery);

            if (subquery.ResultOperators.Any(it => it is FirstResultOperator))
            {
                Query.AddSelectPart(
                    expression.QueryModel.MainFromClause,
                    @"(SELECT ""{1}"" FROM ({2}) ""{1}"" LIMIT 1) AS ""{0}""".With(
                        "_first_or_default_" + cnt,
                        expression.QueryModel.MainFromClause.ItemName,
                        sql),
                    "_first_or_default_" + cnt,
                    expression.QueryModel.ResultTypeOverride,
                    (rom, reader, dr) =>
                {
                    if (dr.IsDBNull(cnt))
                    {
                        return(null);
                    }
                    var tuple  = new[] { dr.GetValue(cnt).ToString() };
                    var result = ssd.ProcessRow(rom, reader, tuple);
                    return(projector.Eval(result));
                });
            }
            else
            {
                Query.AddSelectPart(
                    expression.QueryModel.MainFromClause,
                    @"(SELECT ARRAY_AGG(""{1}"") FROM ({2}) ""{1}"") AS ""{0}""".With(
                        "_subquery_" + cnt,
                        expression.QueryModel.MainFromClause.ItemName,
                        sql),
                    "_subquery_" + cnt,
                    expression.QueryModel.ResultTypeOverride,
                    (rom, reader, dr) =>
                {
                    object[] array;
                    if (dr.IsDBNull(cnt))
                    {
                        array = new string[0];
                    }
                    else
                    {
                        var value = dr.GetValue(cnt);
                        if (value is string[])
                        {
                            array = value as string[];
                        }
                        else
                        {
                            var obj = dr.GetValue(cnt);
                            //TODO fix dead code usage
                            var tr = obj as TextReader;
                            if (tr != null)
                            {
                                array = PostgresRecordConverter.ParseArray(tr.ReadToEnd());
                            }
                            else
                            {
                                array = PostgresRecordConverter.ParseArray(obj as string);
                            }
                        }
                    }
                    var resultItems = new ResultObjectMapping[array.Length];
                    for (int i = 0; i < array.Length; i++)
                    {
                        resultItems[i] = ssd.ProcessRow(rom, reader, array[i]);
                    }
                    return(projector.Process(resultItems));
                });
            }
            return(expression);
        }
Exemplo n.º 8
0
 public ResultObjectMapping ProcessRow(IDataReader dr)
 {
     var result = new ResultObjectMapping();
     Query.Selects.ForEach(it => result.Add(it.QuerySource, it.Instancer(result, dr)));
     return result;
 }