示例#1
0
        public override void HandleResultOperator(
            GroupResultOperator resultOperator,
            SqlStatementBuilder sqlStatementBuilder,
            UniqueIdentifierGenerator generator,
            ISqlPreparationStage stage,
            ISqlPreparationContext context)
        {
            ArgumentUtility.CheckNotNull("resultOperator", resultOperator);
            ArgumentUtility.CheckNotNull("sqlStatementBuilder", sqlStatementBuilder);
            ArgumentUtility.CheckNotNull("generator", generator);
            ArgumentUtility.CheckNotNull("stage", stage);
            ArgumentUtility.CheckNotNull("context", context);

            EnsureNoTopExpression(sqlStatementBuilder, generator, stage, context);
            EnsureNoGroupExpression(sqlStatementBuilder, generator, stage, context);
            EnsureNoDistinctQuery(sqlStatementBuilder, generator, stage, context);
            UpdateDataInfo(resultOperator, sqlStatementBuilder, sqlStatementBuilder.DataInfo);

            var preparedKeySelector = stage.PrepareResultOperatorItemExpression(resultOperator.KeySelector, context);

            preparedKeySelector = HandlePotentialConstantExpression(preparedKeySelector);
            preparedKeySelector = HandlePotentialSubStatementExpression(preparedKeySelector, sqlStatementBuilder, generator);

            var preparedElementSelector = stage.PrepareResultOperatorItemExpression(resultOperator.ElementSelector, context);

            sqlStatementBuilder.GroupByExpression = preparedKeySelector;
            sqlStatementBuilder.SelectProjection  = SqlGroupingSelectExpression.CreateWithNames(preparedKeySelector, preparedElementSelector);
        }
        public void CreateWithNames()
        {
            var result = SqlGroupingSelectExpression.CreateWithNames(_keyExpression, _elementExpression);

            var expectedKeyExpression = new NamedExpression("key", _keyExpression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedKeyExpression, result.KeyExpression);

            var expectedElementExpression = new NamedExpression("element", _elementExpression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedElementExpression, result.ElementExpression);
        }
示例#3
0
        public void VisitSqlGroupingSelectExpression_WithAggregationExpressions_AndNames()
        {
            var groupingExpression = SqlGroupingSelectExpression.CreateWithNames(Expression.Constant("keyExpression"), Expression.Constant("elementExpression"));

            groupingExpression.AddAggregationExpressionWithName(Expression.Constant("aggregation1"));
            groupingExpression.AddAggregationExpressionWithName(Expression.Constant("aggregation2"));

            SqlGeneratingSelectExpressionVisitor.GenerateSql(groupingExpression, _commandBuilder, _stageMock);

            Assert.That(_commandBuilder.GetCommandText(), Is.EqualTo("@1 AS [key], @2 AS [a0], @3 AS [a1]"));
            Assert.That(_commandBuilder.GetCommandParameters()[0].Value, Is.EqualTo("keyExpression"));
            Assert.That(_commandBuilder.GetCommandParameters()[1].Value, Is.EqualTo("aggregation1"));
            Assert.That(_commandBuilder.GetCommandParameters()[2].Value, Is.EqualTo("aggregation2"));
        }
示例#4
0
        public void HandleResultOperator_DetectConstantKeysAndReplaceWithSubStatement()
        {
            var keySelector     = Expression.Constant("keySelector");
            var elementSelector = Expression.Constant("elementSelector");
            var resultOperator  = new GroupResultOperator("itemName", keySelector, elementSelector);

            var preparedConstantKeySelector = Expression.Constant("test");

            _stageMock
            .Expect(mock => mock.PrepareResultOperatorItemExpression(keySelector, _context))
            .Return(preparedConstantKeySelector);
            _stageMock
            .Expect(mock => mock.PrepareResultOperatorItemExpression(elementSelector, _context))
            .Return(elementSelector);
            _stageMock.Replay();

            _handler.HandleResultOperator(resultOperator, _sqlStatementBuilder, _generator, _stageMock, _context);

            _stageMock.VerifyAllExpectations();
            Assert.That(_sqlStatementBuilder.SqlTables.Count, Is.EqualTo(2));
            Assert.That(_sqlStatementBuilder.SqlTables[1], Is.TypeOf(typeof(SqlTable)));
            Assert.That(((SqlTable)_sqlStatementBuilder.SqlTables[1]).TableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));

            var groupKeyTableTableInfo   = (ResolvedSubStatementTableInfo)((SqlTable)_sqlStatementBuilder.SqlTables[1]).TableInfo;
            var expectedSelectExpression = new NamedExpression(null, preparedConstantKeySelector);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedSelectExpression, groupKeyTableTableInfo.SqlStatement.SelectProjection);

            var expectedStatement = new SqlStatementBuilder
            {
                DataInfo         = new StreamedSequenceInfo(typeof(IEnumerable <string>), groupKeyTableTableInfo.SqlStatement.SelectProjection),
                SelectProjection = groupKeyTableTableInfo.SqlStatement.SelectProjection
            }
            .GetSqlStatement();

            Assert.That(groupKeyTableTableInfo.SqlStatement, Is.EqualTo(expectedStatement));

            var expectedGroupGyExpression = new SqlTableReferenceExpression(_sqlStatementBuilder.SqlTables[1]);

            SqlExpressionTreeComparer.CheckAreEqualTrees(_sqlStatementBuilder.GroupByExpression, expectedGroupGyExpression);
            SqlExpressionTreeComparer.CheckAreEqualTrees(
                _sqlStatementBuilder.SelectProjection,
                SqlGroupingSelectExpression.CreateWithNames(expectedGroupGyExpression, elementSelector));
        }
        public Expression VisitSqlGroupingSelectExpression(SqlGroupingSelectExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            var referenceToKeyExpression          = ResolveChildExpression(expression.KeyExpression);
            var referenceToElementExpression      = ResolveChildExpression(expression.ElementExpression);
            var referenceToAggregationExpressions = expression.AggregationExpressions.Select(expr => ResolveChildExpression(expr));

            var newGroupingExpression = SqlGroupingSelectExpression.CreateWithNames(referenceToKeyExpression, referenceToElementExpression);

            foreach (var aggregationExpression in referenceToAggregationExpressions)
            {
                newGroupingExpression.AddAggregationExpressionWithName(aggregationExpression);
            }

            _context.AddGroupReferenceMapping(newGroupingExpression, _sqlTable);

            return(newGroupingExpression);
        }
示例#6
0
        public void HandleResultOperator_TransformSubqueriesUsedAsGroupByKeys()
        {
            var keySelector     = Expression.Constant("keySelector");
            var elementSelector = Expression.Constant("elementSelector");
            var resultOperator  = new GroupResultOperator("itemName", keySelector, elementSelector);

            var sqlStatement = SqlStatementModelObjectMother.CreateSqlStatement_Single();
            var preparedSubStatementKeySelector = new SqlSubStatementExpression(sqlStatement);

            _stageMock
            .Expect(mock => mock.PrepareResultOperatorItemExpression(keySelector, _context))
            .Return(preparedSubStatementKeySelector);
            _stageMock
            .Expect(mock => mock.PrepareResultOperatorItemExpression(elementSelector, _context))
            .Return(elementSelector);

            _stageMock.Replay();

            _handler.HandleResultOperator(resultOperator, _sqlStatementBuilder, _generator, _stageMock, _context);

            _stageMock.VerifyAllExpectations();

            Assert.That(_sqlStatementBuilder.SqlTables.Count, Is.EqualTo(2));
            Assert.That(_sqlStatementBuilder.SqlTables[1], Is.TypeOf(typeof(SqlTable)));
            Assert.That(((SqlTable)_sqlStatementBuilder.SqlTables[1]).TableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));

            var groupKeyTableTableInfo = (ResolvedSubStatementTableInfo)((SqlTable)_sqlStatementBuilder.SqlTables[1]).TableInfo;
            var expectedStatement      = new SqlStatementBuilder(sqlStatement)
            {
                DataInfo = new StreamedSequenceInfo(typeof(IEnumerable <int>), sqlStatement.SelectProjection)
            }
            .GetSqlStatement();

            Assert.That(groupKeyTableTableInfo.SqlStatement, Is.EqualTo(expectedStatement));

            var expectedGroupGyExpression = new SqlTableReferenceExpression(_sqlStatementBuilder.SqlTables[1]);

            SqlExpressionTreeComparer.CheckAreEqualTrees(_sqlStatementBuilder.GroupByExpression, expectedGroupGyExpression);
            SqlExpressionTreeComparer.CheckAreEqualTrees(
                _sqlStatementBuilder.SelectProjection,
                SqlGroupingSelectExpression.CreateWithNames(expectedGroupGyExpression, elementSelector));
        }