Exemple #1
0
 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;
 }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        /// <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);
        }