public SqlSelectStatement() { IsDistinct = false; OutputColumnsRenamed = false; OutputColumns = null; AllJoinExtents = null; FromExtents = new List <Symbol>(); OuterExtents = new Dictionary <Symbol, bool>(); Top = new TopClause(); Select = new SelectColumnList(); From = new SqlBuilder(); Where = new SqlBuilder(); GroupBy = new SqlBuilder(); OrderBy = new SqlBuilder(); IsTopMost = false; }
/// <summary> /// We assume that this is only called as a child of a Project. /// /// This replaces <see cref="Visit(DbNewInstanceExpression)"/>, since /// we do not allow DbNewInstanceExpression as a child of any node other than /// DbProjectExpression. /// /// We write out the translation of each of the columns in the record. /// </summary> /// <param name="e"></param> /// <returns>A <see cref="SqlBuilder"/></returns> ISqlFragment VisitNewInstanceExpression(DbNewInstanceExpression e) { var result = new SelectColumnList(); var rowType = e.ResultType.EdmType as RowType; if (rowType != null) { var members = rowType.Properties; for (int i = 0; i < e.Arguments.Count; ++i) { var argument = e.Arguments[i]; if (MetadataHelpers.IsRowType(argument.ResultType)) { // We do not support nested records or other complex objects. throw new NotSupportedException(); } EdmProperty member = members[i]; var expression = argument.Accept(this); var columnSymbol = expression as ColumnSymbol; if (columnSymbol != null) { result.Append(new SelectColumn(new Symbol(member.Name, member.TypeUsage), columnSymbol.Source, columnSymbol.Column)); } else { result.Append(new SelectColumn(new Symbol(member.Name, member.TypeUsage), expression)); } } } else { // // Types other then RowType (such as UDTs for instance) are not supported. // throw new NotSupportedException(); } return(result); }
/// <summary> /// <see cref="Visit(DbFilterExpression)"/> for the general ideas. /// </summary> /// <param name="e"></param> /// <returns>A <see cref="SqlSelectStatement"/></returns> /// <seealso cref="Visit(DbFilterExpression)"/> public override ISqlFragment Visit(DbProjectExpression e) { Symbol fromSymbol; var inputSelect = VisitInputExpression(e.Input.Expression, e.Input.VariableName, e.Input.VariableType, out fromSymbol); var select = inputSelect; // Project is compatible with Filter // but not with Project, GroupBy if (!IsCompatible(inputSelect, e.ExpressionKind)) { select = CreateNewSelectStatement(inputSelect, e.Input.VariableName, e.Input.VariableType, out fromSymbol); select.Top.SetTopClause(inputSelect.Top); //select.OrderBy.Set(inputSelect.OrderBy); inputSelect.Top.Clear(); //inputSelect.OrderBy.Clear(); } selectStatementStack.Push(select); symbolTable.EnterScope(); AddFromSymbol(select, e.Input.VariableName, fromSymbol); // Project is the only node that can have DbNewInstanceExpression as a child // so we have to check it here. // We call VisitNewInstanceExpression instead of Visit(DbNewInstanceExpression), since // the latter throws. if (e.Projection is DbNewInstanceExpression) { select.Select.Append(VisitNewInstanceExpression((DbNewInstanceExpression)e.Projection) as IEnumerable <SelectColumn>); if ((select != inputSelect) && (select.Select.Count == inputSelect.Select.Count)) { var newSelect = new SelectColumnList(); var inputColumns = inputSelect.Select.ToDictionary(x => x.Column.Name, x => x); foreach (var column in select.Select) { if (!column.IsSimple) { break; } SelectColumn inputColumn; if (inputColumns.TryGetValue(column.InnerName.Name, out inputColumn)) { newSelect.Append(new SelectColumn(new Symbol(column.InnerName.Name), inputColumn.Expression)); } else { break; } } if (inputColumns.Count == select.Select.Count) { inputSelect.Select = newSelect; inputSelect.Top.SetTopClause(select.Top); //inputSelect.OrderBy.Set(select.OrderBy); select = inputSelect; } } } else { select.Select.Append(e.Projection.Accept(this) as IEnumerable <SelectColumn>); } symbolTable.ExitScope(); selectStatementStack.Pop(); return(select); }