コード例 #1
0
        public static FromExpressionInfo AnalyzeFromExpression(
            Expression fromExpression,
            ISqlPreparationStage stage,
            UniqueIdentifierGenerator generator,
            IMethodCallTransformerProvider provider,
            ISqlPreparationContext context,
            Func <ITableInfo, SqlTable> tableGenerator,
            OrderingExtractionPolicy orderingExtractionPolicy)
        {
            ArgumentUtility.CheckNotNull("fromExpression", fromExpression);
            ArgumentUtility.CheckNotNull("stage", stage);
            ArgumentUtility.CheckNotNull("generator", generator);
            ArgumentUtility.CheckNotNull("provider", provider);
            ArgumentUtility.CheckNotNull("context", context);

            var visitor = new SqlPreparationFromExpressionVisitor(generator, stage, provider, context, tableGenerator, orderingExtractionPolicy);

            visitor.Visit(fromExpression);
            if (visitor.FromExpressionInfo != null)
            {
                return(visitor.FromExpressionInfo.Value);
            }

            var message = string.Format(
                "Error parsing expression '{0}'. Expressions of type '{1}' cannot be used as the SqlTables of a from clause.",
                fromExpression,
                fromExpression.Type.Name);

            throw new NotSupportedException(message);
        }
コード例 #2
0
        public FromExpressionInfo CreateSqlTableForStatement(
            SqlStatement sqlStatement,
            Func <ITableInfo, SqlTable> tableCreator,
            OrderingExtractionPolicy orderingExtractionPolicy)
        {
            ArgumentUtility.CheckNotNull("sqlStatement", sqlStatement);
            ArgumentUtility.CheckNotNull("tableCreator", tableCreator);

            if (sqlStatement.Orderings.Count == 0)
            {
                var tableInfo = new ResolvedSubStatementTableInfo(_uniqueIdentifierGenerator.GetUniqueIdentifier("q"), sqlStatement);
                var sqlTable  = tableCreator(tableInfo);
                return(new FromExpressionInfo(sqlTable, new Ordering[0], new SqlTableReferenceExpression(sqlTable), null));
            }

            // If we have orderings, we need to:
            // - Build a nested projection that includes the original orderings if OrderingExtractionPolicy.ExtractOrderingsIntoProjection is specified.
            // - Create a substatement clearing orderings, unless a TOP expression is present.
            // - Put it into a SqlTable.
            // - Put a reference to everything in the select projection (i.e., the original projection and the extracted orderings) into a
            //   FromExpressionInfo and return that.

            var newSelectProjection = sqlStatement.SelectProjection;

            if (orderingExtractionPolicy == OrderingExtractionPolicy.ExtractOrderingsIntoProjection)
            {
                newSelectProjection = GetNewSelectExpressionWithOrderings(sqlStatement);
            }

            var tableWithSubStatement = CreateSqlCompatibleSubStatementTable(sqlStatement, newSelectProjection, tableCreator);

            return(GetFromExpressionInfoForSubStatement(sqlStatement, tableWithSubStatement));
        }
コード例 #3
0
        protected void MoveCurrentStatementToSqlTable(
            SqlStatementBuilder sqlStatementBuilder,
            ISqlPreparationContext context,
            Func <ITableInfo, SqlTable> tableGenerator,
            ISqlPreparationStage stage,
            OrderingExtractionPolicy orderingExtractionPolicy = OrderingExtractionPolicy.ExtractOrderingsIntoProjection)
        {
            // Ensure that select clause is named - usually SqlPreparationQueryModelVisitor would do this, but it hasn't done it yet
            sqlStatementBuilder.SelectProjection = new NamedExpression(null, sqlStatementBuilder.SelectProjection);

            var oldStatement       = sqlStatementBuilder.GetStatementAndResetBuilder();
            var fromExpressionInfo = stage.PrepareFromExpression(
                new SqlSubStatementExpression(oldStatement),
                context,
                tableGenerator,
                orderingExtractionPolicy);

            sqlStatementBuilder.SqlTables.Add(fromExpressionInfo.SqlTable);
            sqlStatementBuilder.SelectProjection = fromExpressionInfo.ItemSelector;
            sqlStatementBuilder.Orderings.AddRange(fromExpressionInfo.ExtractedOrderings);
            Assertion.DebugAssert(fromExpressionInfo.WhereCondition == null);

            // the new statement is an identity query that selects the result of its subquery, so it starts with the same data type
            sqlStatementBuilder.DataInfo = oldStatement.DataInfo;

            AddMappingForItemExpression(context, oldStatement.DataInfo, fromExpressionInfo.ItemSelector);
        }
コード例 #4
0
 public new void MoveCurrentStatementToSqlTable(
     SqlStatementBuilder sqlStatementBuilder,
     ISqlPreparationContext context,
     Func <ITableInfo, SqlTable> tableGenerator,
     ISqlPreparationStage stage,
     OrderingExtractionPolicy orderingExtractionPolicy)
 {
     base.MoveCurrentStatementToSqlTable(sqlStatementBuilder, context, tableGenerator, stage, orderingExtractionPolicy);
 }
 public TestableSqlPreparationFromExpressionVisitor(
     UniqueIdentifierGenerator generator,
     ISqlPreparationStage stage,
     IMethodCallTransformerProvider provider,
     ISqlPreparationContext context,
     Func <ITableInfo, SqlTable> tableGenerator,
     OrderingExtractionPolicy orderingExtractionPolicy)
     : base(generator, stage, provider, context, tableGenerator, orderingExtractionPolicy)
 {
 }
コード例 #6
0
 public virtual FromExpressionInfo PrepareFromExpression(
     Expression fromExpression,
     ISqlPreparationContext context,
     Func <ITableInfo, SqlTable> tableGenerator,
     OrderingExtractionPolicy orderingExtractionPolicy)
 {
     return(SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                fromExpression, this, _uniqueIdentifierGenerator, _methodCallTransformerProvider, context, tableGenerator,
                orderingExtractionPolicy));
 }
        public void SetUp()
        {
            _stageMock = MockRepository.GenerateStrictMock <ISqlPreparationStage>();
            _generator = new UniqueIdentifierGenerator();
            _context   = SqlStatementModelObjectMother.CreateSqlPreparationContext();
            _methodCallTransformerProvider = CompoundMethodCallTransformerProvider.CreateDefault();

            _someOrderingExtractionPolicy = Some.Item(
                OrderingExtractionPolicy.ExtractOrderingsIntoProjection,
                OrderingExtractionPolicy.DoNotExtractOrderings);

            _tableGenerator = info => new SqlTable(info, JoinSemantics.Inner);
        }
コード例 #8
0
        protected SqlPreparationFromExpressionVisitor(
            UniqueIdentifierGenerator generator,
            ISqlPreparationStage stage,
            IMethodCallTransformerProvider provider,
            ISqlPreparationContext context,
            Func <ITableInfo, SqlTable> tableGenerator,
            OrderingExtractionPolicy orderingExtractionPolicy)
            : base(context, stage, provider)
        {
            ArgumentUtility.CheckNotNull("generator", generator);
            ArgumentUtility.CheckNotNull("tableGenerator", tableGenerator);

            _generator                = generator;
            _tableGenerator           = tableGenerator;
            _orderingExtractionPolicy = orderingExtractionPolicy;

            FromExpressionInfo = null;
        }