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; }
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; }
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; }
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; }
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; }
public object Eval(ResultObjectMapping item) { return(Func(item)); }
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); }
public ResultObjectMapping ProcessRow(IDataReader dr) { var result = new ResultObjectMapping(); Query.Selects.ForEach(it => result.Add(it.QuerySource, it.Instancer(result, dr))); return result; }