public void ResolveWhereCondition_ResolvesExpression()
        {
            var expression = new SqlTableReferenceExpression(_sqlTable);
            var fakeResult = Expression.Constant(0);

            _stageMock
            .Expect(mock => mock.ResolveWhereExpression(expression, _mappingResolutionContext))
            .Return(fakeResult);
            _stageMock.Replay();

            var result = _visitor.ResolveWhereCondition(expression);

            _stageMock.VerifyAllExpectations();

            Assert.That(result, Is.SameAs(fakeResult));
        }
        public void VisitQuerySourceReferenceExpression_WithNonNullWhereCondition()
        {
            var memberInfo = typeof(Cook).GetProperty("Assistants");
            var sqlTableReferenceExpression = new SqlTableReferenceExpression(SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook)));
            var innerSequenceExpression     =
                Expression.MakeMemberAccess(
                    sqlTableReferenceExpression, memberInfo);
            var joinClause = new JoinClause(
                "x",
                typeof(Cook[]),
                innerSequenceExpression,
                Expression.Constant(new Cook()),
                Expression.Constant(new Cook()));
            var groupJoinClause = new GroupJoinClause("g", typeof(Cook[]), joinClause);
            var querySourceReferenceExpression = new QuerySourceReferenceExpression(groupJoinClause);
            var fakeWhereExpression            = Expression.Constant(true);

            _stageMock
            .Expect(mock => mock.PrepareWhereExpression(Arg <Expression> .Matches(e => e is BinaryExpression), Arg.Is(_context)))
            .WhenCalled(
                mi =>
                SqlExpressionTreeComparer.CheckAreEqualTrees(
                    Expression.Equal(groupJoinClause.JoinClause.OuterKeySelector, groupJoinClause.JoinClause.InnerKeySelector),
                    (Expression)mi.Arguments[0]))
            .Return(fakeWhereExpression);
            _stageMock.Replay();

            var visitor = CreateTestableVisitor(_someOrderingExtractionPolicy);

            visitor.VisitQuerySourceReference(querySourceReferenceExpression);

            _stageMock.VerifyAllExpectations();

            Assert.That(visitor.FromExpressionInfo != null); // inline condition because of ReSharper
            var fromExpressionInfo = (FromExpressionInfo)visitor.FromExpressionInfo;

            Assert.That(fromExpressionInfo.WhereCondition, Is.AssignableTo(typeof(BinaryExpression)));
            Assert.That(fromExpressionInfo.WhereCondition.NodeType, Is.EqualTo(ExpressionType.AndAlso));
            Assert.That(((BinaryExpression)fromExpressionInfo.WhereCondition).Left, Is.TypeOf(typeof(JoinConditionExpression)));
            Assert.That(((JoinConditionExpression)((BinaryExpression)fromExpressionInfo.WhereCondition).Left).JoinedTable.JoinInfo, Is.TypeOf(typeof(UnresolvedCollectionJoinInfo)));
            Assert.That(
                ((UnresolvedCollectionJoinInfo)((JoinConditionExpression)((BinaryExpression)fromExpressionInfo.WhereCondition).Left).JoinedTable.JoinInfo).SourceExpression, Is.SameAs(sqlTableReferenceExpression));
            Assert.That(
                ((UnresolvedCollectionJoinInfo)((JoinConditionExpression)((BinaryExpression)fromExpressionInfo.WhereCondition).Left).JoinedTable.JoinInfo).MemberInfo, Is.SameAs(memberInfo));
            Assert.That(((JoinConditionExpression)((BinaryExpression)fromExpressionInfo.WhereCondition).Left).JoinedTable.JoinSemantics, Is.EqualTo(JoinSemantics.Inner));
            Assert.That(((BinaryExpression)fromExpressionInfo.WhereCondition).Right, Is.SameAs(fakeWhereExpression));
        }
예제 #3
0
        public void ResolveSelectProjection_ResolvesExpression()
        {
            var expression          = new SqlTableReferenceExpression(_sqlTable);
            var sqlStatementBuilder = new SqlStatementBuilder();
            var fakeResult          = Expression.Constant(0);

            _stageMock
            .Expect(mock => mock.ResolveSelectExpression(expression, sqlStatementBuilder, _mappingResolutionContext))
            .Return(fakeResult);
            _stageMock.Replay();

            var result = _visitor.ResolveSelectProjection(expression, sqlStatementBuilder);

            _stageMock.VerifyAllExpectations();

            Assert.That(result, Is.SameAs(fakeResult));
        }
예제 #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));
        }
예제 #5
0
        public override Expression VisitSqlSubStatement(SqlSubStatementExpression expression)
        {
            var newExpression = base.VisitSqlSubStatement(expression);
            var newExpressionAsSqlSubStatementExpression = newExpression as SqlSubStatementExpression;

            // Substatements returning a single value need to be moved to the FROM part of the SQL statement because they might return more than one column.
            // Since a SqlSubStatementExpression must return a single row anyway, we can do this.
            // (However, errors that would have arisen because the statement does not return exactly one row will not be found.)
            if (newExpressionAsSqlSubStatementExpression != null &&
                newExpressionAsSqlSubStatementExpression.SqlStatement.DataInfo is StreamedSingleValueInfo)
            {
                var sqlTable = newExpressionAsSqlSubStatementExpression.ConvertToSqlTable(Generator.GetUniqueIdentifier("q"));
                var sqlTableReferenceExpression = new SqlTableReferenceExpression(sqlTable);

                Context.AddSqlTable(sqlTable, _sqlStatementBuilder);
                return(Visit(sqlTableReferenceExpression));
            }
            return(newExpression);
        }
예제 #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));
        }
        public void VisitSelectClause_CreatesSelectProjection()
        {
            var preparedExpression = new SqlTableReferenceExpression(SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook)));

            _stageMock
            .Expect(
                mock =>
                mock.PrepareSelectExpression(
                    Arg <Expression> .Matches(e => e == _selectClause.Selector),
                    Arg <ISqlPreparationContext> .Matches(c => c != _context)))
            .Return(preparedExpression);
            _stageMock.Replay();

            _visitor.VisitSelectClause(_selectClause, _queryModel);

            _stageMock.VerifyAllExpectations();
            Assert.That(_visitor.SqlStatementBuilder.SelectProjection, Is.SameAs(preparedExpression));
            Assert.That(_visitor.SqlStatementBuilder.DataInfo, Is.TypeOf(typeof(StreamedSequenceInfo)));
            Assert.That(((StreamedSequenceInfo)_visitor.SqlStatementBuilder.DataInfo).DataType, Is.EqualTo(_selectClause.GetOutputDataInfo().DataType));
        }
        public void VisitSqlTableReferenceExpression_RevisitsResult()
        {
            var tableReferenceExpression = new SqlTableReferenceExpression(_sqlTable);
            var fakeResult = Expression.Constant(0);

            _stageMock
            .Expect(mock => mock.ResolveTableReferenceExpression(tableReferenceExpression, _mappingResolutionContext))
            .Return(fakeResult);
            _stageMock.Replay();
            _resolverMock
            .Expect(mock => mock.ResolveConstantExpression(fakeResult))
            .Return(fakeResult);
            _resolverMock.Replay();

            var result = _visitor.Visit(tableReferenceExpression);

            _stageMock.VerifyAllExpectations();
            _resolverMock.VerifyAllExpectations();
            Assert.That(result, Is.SameAs(fakeResult));
        }
        public void SetUp()
        {
            _stageMock = MockRepository.GenerateMock <ISqlPreparationStage> ();
            _generator = new UniqueIdentifierGenerator();
            _context   = SqlStatementModelObjectMother.CreateSqlPreparationContext();

            _handler = new SkipResultOperatorHandler();

            _sqlTable         = new SqlTable(new UnresolvedTableInfo(typeof(Cook)), JoinSemantics.Inner);
            _selectProjection = new SqlTableReferenceExpression(_sqlTable);

            _ordering            = new Ordering(Expression.Constant(7), OrderingDirection.Asc);
            _sqlStatementBuilder = new SqlStatementBuilder
            {
                SelectProjection = _selectProjection,
                DataInfo         = new StreamedSequenceInfo(typeof(Cook[]), Expression.Constant(new Cook())),
                SqlTables        = { _sqlTable },
            };

            _tupleCtor = _tupleCtor = typeof(KeyValuePair <Cook, int>).GetConstructor(new[] { typeof(Cook), typeof(int) });
        }
        public void ResolveSqlStatement()
        {
            var sqlTable = SqlStatementModelObjectMother.CreateSqlTable_WithUnresolvedTableInfo(typeof(Cook));
            var tableReferenceExpression = new SqlTableReferenceExpression(new SqlTable(_fakeResolvedSimpleTableInfo, JoinSemantics.Inner));
            var sqlStatement             = SqlStatementModelObjectMother.CreateSqlStatement(tableReferenceExpression, new[] { sqlTable });
            var fakeEntityExpression     = SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Cook));

            _resolverMock
            .Expect(mock => mock.ResolveTableInfo((UnresolvedTableInfo)((SqlTable)sqlStatement.SqlTables[0]).TableInfo, _uniqueIdentifierGenerator))
            .Return(_fakeResolvedSimpleTableInfo);
            _resolverMock
            .Expect(mock => mock.ResolveSimpleTableInfo(tableReferenceExpression.SqlTable.GetResolvedTableInfo(), _uniqueIdentifierGenerator))
            .Return(fakeEntityExpression);
            _resolverMock.Replay();

            var newSqlStatment = _stage.ResolveSqlStatement(sqlStatement, _mappingResolutionContext);

            _resolverMock.VerifyAllExpectations();
            Assert.That(((SqlTable)newSqlStatment.SqlTables[0]).TableInfo, Is.SameAs(_fakeResolvedSimpleTableInfo));
            Assert.That(newSqlStatment.SelectProjection, Is.SameAs(fakeEntityExpression));
        }
        public void CreateSqlTableForSubStatement_WithoutOrderings()
        {
            var statementWithoutOrderings = SqlStatementModelObjectMother.CreateSqlStatementWithCook();

            var result = _factory.CreateSqlTableForStatement(statementWithoutOrderings, info => new SqlTable(info, JoinSemantics.Inner));

            _stageMock.VerifyAllExpectations();

            var tableInfo = ((SqlTable)result.SqlTable).TableInfo;

            Assert.That(tableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));

            var subStatement = ((ResolvedSubStatementTableInfo)tableInfo).SqlStatement;

            Assert.That(subStatement, Is.SameAs(statementWithoutOrderings));

            Assert.That(result.WhereCondition, Is.Null);
            Assert.That(result.ExtractedOrderings, Is.Empty);

            var expectedItemSelector = new SqlTableReferenceExpression(result.SqlTable);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedItemSelector, result.ItemSelector);
        }
예제 #12
0
 public void SetUp()
 {
     _tableReferenceExpression = new SqlTableReferenceExpression(SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook)));
 }
        public void VisitQuerySourceReferenceExpression_WithOrderings_AndExtractOrdingsPolicy()
        {
            var sqlTable = SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook));
            var sqlTableReferenceExpression = new SqlTableReferenceExpression(sqlTable);
            var selectProjection            = new NamedExpression("test", Expression.MakeMemberAccess(sqlTableReferenceExpression, typeof(Cook).GetProperty("Name")));
            var orderingExpression          = Expression.MakeMemberAccess(sqlTableReferenceExpression, typeof(Cook).GetProperty("ID"));
            var sqlStatement = new SqlStatementBuilder
            {
                DataInfo         = new StreamedSequenceInfo(typeof(DateTime[]), Expression.Constant(new DateTime(2000, 1, 1))),
                SelectProjection = selectProjection,
                SqlTables        = { sqlTable },
                Orderings        =
                { new Ordering(orderingExpression, OrderingDirection.Asc) }
            }.GetSqlStatement();
            var fakeSelectExpression = Expression.Constant(new KeyValuePair <string, int>("test", 5));
            var fakeWhereExpression  = Expression.Constant(true);

            var innerSequenceExpression = new SqlSubStatementExpression(sqlStatement);

            var joinClause = new JoinClause(
                "x",
                typeof(Cook[]),
                innerSequenceExpression,
                Expression.Constant(new Cook()),
                Expression.Constant(new Cook()));
            var groupJoinClause = new GroupJoinClause("g", typeof(Cook[]), joinClause);
            var querySourceReferenceExpression = new QuerySourceReferenceExpression(groupJoinClause);

            _stageMock
            .Expect(mock => mock.PrepareSelectExpression(Arg <Expression> .Is.Anything, Arg <ISqlPreparationContext> .Is.Anything))
            .Return(fakeSelectExpression);
            _stageMock
            .Expect(mock => mock.PrepareWhereExpression(Arg <Expression> .Matches(e => e is BinaryExpression), Arg.Is(_context)))
            .WhenCalled(
                mi =>
                SqlExpressionTreeComparer.CheckAreEqualTrees(
                    Expression.Equal(groupJoinClause.JoinClause.OuterKeySelector, groupJoinClause.JoinClause.InnerKeySelector),
                    (Expression)mi.Arguments[0]))
            .Return(fakeWhereExpression);
            _stageMock.Replay();

            var visitor = CreateTestableVisitor(OrderingExtractionPolicy.ExtractOrderingsIntoProjection);

            visitor.VisitQuerySourceReference(querySourceReferenceExpression);

            _stageMock.VerifyAllExpectations();

            Assert.That(visitor.FromExpressionInfo != null); // inline condition because of ReSharper
            var fromExpressionInfo = (FromExpressionInfo)visitor.FromExpressionInfo;

            Assert.That(fromExpressionInfo.ExtractedOrderings.Count, Is.EqualTo(1));
            Assert.That(fromExpressionInfo.ExtractedOrderings[0].Expression, Is.AssignableTo(typeof(MemberExpression)));
            Assert.That(((MemberExpression)fromExpressionInfo.ExtractedOrderings[0].Expression).Expression, Is.TypeOf(typeof(SqlTableReferenceExpression)));
            Assert.That(
                ((SqlTableReferenceExpression)((MemberExpression)fromExpressionInfo.ExtractedOrderings[0].Expression).Expression).SqlTable, Is.TypeOf(typeof(SqlTable)));
            Assert.That(
                ((SqlTable)((SqlTableReferenceExpression)((MemberExpression)fromExpressionInfo.ExtractedOrderings[0].Expression).Expression).SqlTable).TableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));
            var resolvedSubStatementtableInfo =
                (ResolvedSubStatementTableInfo)((SqlTable)((SqlTableReferenceExpression)((MemberExpression)fromExpressionInfo.ExtractedOrderings[0].Expression).Expression).SqlTable).TableInfo;

            Assert.That(resolvedSubStatementtableInfo.SqlStatement.SelectProjection, Is.SameAs(fakeSelectExpression));
            Assert.That(resolvedSubStatementtableInfo.SqlStatement.Orderings.Count, Is.EqualTo(0));
            Assert.That(((MemberExpression)fromExpressionInfo.ExtractedOrderings[0].Expression).Member, Is.EqualTo(typeof(KeyValuePair <,>).MakeGenericType(typeof(string), typeof(int)).GetProperty("Value")));
            Assert.That(fromExpressionInfo.ItemSelector, Is.AssignableTo(typeof(MemberExpression)));
            Assert.That(((MemberExpression)fromExpressionInfo.ItemSelector).Expression, Is.TypeOf(typeof(SqlTableReferenceExpression)));
            Assert.That(((SqlTableReferenceExpression)((MemberExpression)fromExpressionInfo.ItemSelector).Expression).SqlTable, Is.TypeOf(typeof(SqlTable)));
            Assert.That(
                ((SqlTable)((SqlTableReferenceExpression)((MemberExpression)fromExpressionInfo.ItemSelector).Expression).SqlTable).TableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));
            Assert.That(((MemberExpression)fromExpressionInfo.ItemSelector).Member, Is.EqualTo(typeof(KeyValuePair <,>).MakeGenericType(typeof(string), typeof(int)).GetProperty("Key")));
        }