public ITableInfo VisitSubStatementTableInfo(ResolvedSubStatementTableInfo tableInfo)
        {
            ArgumentUtility.CheckNotNull("tableInfo", tableInfo);

            var newSqlStatement = _stage.ResolveSqlStatement(tableInfo.SqlStatement, _context);

            if (newSqlStatement.Equals(tableInfo.SqlStatement))
            {
                return(tableInfo);
            }
            else
            {
                return(new ResolvedSubStatementTableInfo(tableInfo.TableAlias, newSqlStatement));
            }
        }
        /// <summary>
        /// Transforms and resolves <see cref="QueryModel"/> to build a <see cref="SqlStatement"/> which represents an AST to generate query text.
        /// </summary>
        /// <param name="queryModel">The <see cref="QueryModel"/> which should be transformed.</param>
        /// <returns>the generated <see cref="SqlStatement"/></returns>
        protected virtual SqlStatement TransformAndResolveQueryModel(QueryModel queryModel)
        {
            var sqlStatement             = _preparationStage.PrepareSqlStatement(queryModel, null);
            var mappingResolutionContext = new MappingResolutionContext();

            return(_resolutionStage.ResolveSqlStatement(sqlStatement, mappingResolutionContext));
        }
Пример #3
0
        protected virtual SqlStatement ResolveSqlStatement(SqlStatement sqlStatement)
        {
            ArgumentUtility.CheckNotNull("sqlStatement", sqlStatement);

            foreach (var sqlTable in sqlStatement.SqlTables)
            {
                sqlTable.Accept(this);
            }

            var sqlStatementBuilder = new SqlStatementBuilder(sqlStatement);

            var previousSelectProjection = sqlStatementBuilder.SelectProjection;

            sqlStatementBuilder.SelectProjection = ResolveSelectProjection(sqlStatementBuilder.SelectProjection, sqlStatementBuilder);
            sqlStatementBuilder.RecalculateDataInfo(previousSelectProjection);

            if (sqlStatementBuilder.GroupByExpression != null)
            {
                sqlStatementBuilder.GroupByExpression = ResolveGroupByExpression(sqlStatementBuilder.GroupByExpression);
            }

            if (sqlStatementBuilder.WhereCondition != null)
            {
                sqlStatementBuilder.WhereCondition = ResolveWhereCondition(sqlStatementBuilder.WhereCondition);
            }

            if (sqlStatementBuilder.TopExpression != null)
            {
                sqlStatementBuilder.TopExpression = ResolveTopExpression(sqlStatementBuilder.TopExpression);
            }

            if (sqlStatementBuilder.Orderings.Count > 0)
            {
                for (int i = 0; i < sqlStatementBuilder.Orderings.Count; ++i)
                {
                    var resolvedOrderingExpression = _stage.ResolveOrderingExpression(sqlStatementBuilder.Orderings[i].Expression, _context);
                    if (resolvedOrderingExpression != sqlStatementBuilder.Orderings[i].Expression)
                    {
                        sqlStatementBuilder.Orderings[i] = new Ordering(resolvedOrderingExpression, sqlStatementBuilder.Orderings[i].OrderingDirection);
                    }
                }
            }

            for (int i = 0; i < sqlStatement.SetOperationCombinedStatements.Count; i++)
            {
                var combinedStatement    = sqlStatement.SetOperationCombinedStatements[i];
                var resolvedSqlStatement = _stage.ResolveSqlStatement(combinedStatement.SqlStatement, _context);
                if (!Equals(resolvedSqlStatement, combinedStatement.SqlStatement))
                {
                    sqlStatementBuilder.SetOperationCombinedStatements[i] = new SetOperationCombinedStatement(
                        resolvedSqlStatement,
                        combinedStatement.SetOperation);
                }
            }

            return(sqlStatementBuilder.GetSqlStatement());
        }
        public virtual Expression VisitSqlSubStatement(SqlSubStatementExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            var resolvedSqlStatement = _stage.ResolveSqlStatement(expression.SqlStatement, _context);
            var resolvedExpression   = Equals(resolvedSqlStatement, expression.SqlStatement)
                                   ? expression
                                   : new SqlSubStatementExpression(resolvedSqlStatement);

            return(_groupAggregateSimplifier.SimplifyIfPossible(resolvedExpression, expression.SqlStatement.SelectProjection));
        }