public void GetTableForFromExpression_SqlMemberExpression_ReturnsSqlTableWithJoinedTable()
        {
            // from r in Restaurant => sqlTable
            // from c in r.Cooks => MemberExpression (QSRExpression (r), "Cooks") => Join: sqlTable.Cooks

            var memberInfo       = typeof(Restaurant).GetProperty("Cooks");
            var memberExpression = Expression.MakeMemberAccess(Expression.Constant(new Restaurant()), memberInfo);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                memberExpression,
                _stageMock,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            Assert.That(result.SqlTable.TableInfo, Is.TypeOf(typeof(SqlJoinedTable)));
            Assert.That(((SqlJoinedTable)result.SqlTable.TableInfo).JoinSemantics, Is.EqualTo(JoinSemantics.Inner));

            var joinInfo = ((SqlJoinedTable)result.SqlTable.TableInfo).JoinInfo;

            Assert.That(joinInfo, Is.TypeOf(typeof(UnresolvedCollectionJoinInfo)));

            Assert.That(((UnresolvedCollectionJoinInfo)joinInfo).MemberInfo, Is.EqualTo(memberInfo));
            Assert.That(joinInfo.ItemType, Is.SameAs(typeof(Cook)));
        }
        public void VisitSqlEntityConstantExpression()
        {
            var expression = new SqlEntityConstantExpression(typeof(Cook), "test", new SqlLiteralExpression(12));

            SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression, _stageMock, _generator, _methodCallTransformerProvider, _context, _tableGenerator, _someOrderingExtractionPolicy);
        }
        public void VisitSqlTableReferenceExpression_Grouping()
        {
            var sqlTable   = new SqlTable(new ResolvedSimpleTableInfo(typeof(IGrouping <string, int>), "test", "t0"), JoinSemantics.Inner);
            var expression = new SqlTableReferenceExpression(sqlTable);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression,
                _stageMock,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            Assert.That(result.SqlTable, Is.Not.SameAs(sqlTable));
            Assert.That(result.WhereCondition, Is.Null);
            Assert.That(result.ExtractedOrderings, Is.Empty);

            var expectedItemSelector = new SqlTableReferenceExpression(result.SqlTable);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedItemSelector, result.ItemSelector);

            var tableInfo = result.SqlTable.TableInfo;

            Assert.That(tableInfo, Is.TypeOf(typeof(UnresolvedGroupReferenceTableInfo)));
            var castTableInfo = (UnresolvedGroupReferenceTableInfo)tableInfo;

            Assert.That(castTableInfo.ItemType, Is.SameAs(typeof(int)));
            Assert.That(castTableInfo.ReferencedGroupSource, Is.SameAs(sqlTable));
            Assert.That(result.SqlTable.JoinSemantics, Is.EqualTo(JoinSemantics.Inner));
        }
        public void VisitMemberExpression()
        {
            var memberExpression = Expression.MakeMemberAccess(Expression.Constant(new Cook()), typeof(Cook).GetProperty("IllnessDays"));
            var result           = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                memberExpression,
                _stageMock,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            Assert.That(result.SqlTable, Is.TypeOf(typeof(SqlTable)));
            Assert.That(result.SqlTable.TableInfo, Is.TypeOf(typeof(SqlJoinedTable)));
            Assert.That(((SqlJoinedTable)result.SqlTable.TableInfo).JoinInfo, Is.TypeOf(typeof(UnresolvedCollectionJoinInfo)));
            Assert.That(
                ((UnresolvedCollectionJoinInfo)((SqlJoinedTable)result.SqlTable.TableInfo).JoinInfo).SourceExpression,
                Is.EqualTo(memberExpression.Expression));
            Assert.That(
                ((UnresolvedCollectionJoinInfo)((SqlJoinedTable)result.SqlTable.TableInfo).JoinInfo).MemberInfo,
                Is.EqualTo(memberExpression.Member));
            var expectedWherecondition = new JoinConditionExpression(((SqlJoinedTable)result.SqlTable.TableInfo));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedWherecondition, result.WhereCondition);
        }
        public void VisitMemberExpression_InnerExpressionIsPrepared()
        {
            var fakeQuerySource = MockRepository.GenerateStub <IQuerySource>();

            fakeQuerySource.Stub(stub => stub.ItemType).Return(typeof(Cook));

            var replacement = Expression.Constant(null, typeof(Cook));

            _context.AddExpressionMapping(new QuerySourceReferenceExpression(fakeQuerySource), replacement);

            var memberExpression = Expression.MakeMemberAccess(
                new QuerySourceReferenceExpression(fakeQuerySource), typeof(Cook).GetProperty("IllnessDays"));
            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                memberExpression,
                _stageMock,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            var sqlTable    = result.SqlTable;
            var joinedTable = (SqlJoinedTable)sqlTable.TableInfo;

            Assert.That(((UnresolvedCollectionJoinInfo)joinedTable.JoinInfo).SourceExpression, Is.SameAs(replacement));
        }
        public void GetTableForFromExpression_UnsupportedExpression_Throws()
        {
            var customExpression = new CustomExpression(typeof(Cook[]));

            SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                customExpression, _stageMock, _generator, _methodCallTransformerProvider, _context, _tableGenerator, _someOrderingExtractionPolicy);
        }
        public void VisitSqlSubStatementExpression_WithOrderingsAndNoTopExpression()
        {
            var builder = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatementWithCook())
            {
                SelectProjection = new NamedExpression("test", Expression.Constant("test")),
                Orderings        = { new Ordering(Expression.Constant("order1"), OrderingDirection.Asc) }
            };
            var statement = builder.GetSqlStatement();
            var sqlSubStatementExpression = new SqlSubStatementExpression(statement);

            var stage = new DefaultSqlPreparationStage(_methodCallTransformerProvider, new ResultOperatorHandlerRegistry(), _generator);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                sqlSubStatementExpression,
                stage,
                _generator,
                _methodCallTransformerProvider,
                _context,
                info => new SqlTable(info, JoinSemantics.Inner));

            var sqlTable = (SqlTable)result.SqlTable;

            Assert.That(sqlTable.TableInfo, Is.TypeOf(typeof(ResolvedSubStatementTableInfo)));
            Assert.That(((ResolvedSubStatementTableInfo)sqlTable.TableInfo).SqlStatement.Orderings.Count, Is.EqualTo(0));
        }
        public void VisitSqlEntityRefMemberExpression()
        {
            var memberInfo       = typeof(Restaurant).GetProperty("Cooks");
            var entityExpression = SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Restaurant));
            var expression       = new SqlEntityRefMemberExpression(entityExpression, memberInfo);

            SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression, _stageMock, _generator, _methodCallTransformerProvider, _context, _tableGenerator, _someOrderingExtractionPolicy);
        }
        public void VisitEntityRefMemberExpression_ThrowsNotSupportException()
        {
            var memberInfo       = typeof(Restaurant).GetProperty("Cooks");
            var entityExpression = SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Restaurant));
            var expression       = new SqlEntityRefMemberExpression(entityExpression, memberInfo);

            SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression, _stageMock, _generator, _methodCallTransformerProvider, _context, null);
        }
        public void GetTableForFromExpression_ConstantExpression_ReturnsUnresolvedTable()
        {
            var expression = Expression.Constant(new Cook[0]);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression, _stageMock, _generator, _methodCallTransformerProvider, _context, info => new SqlTable(info, JoinSemantics.Inner));

            Assert.That(result.SqlTable, Is.TypeOf(typeof(SqlTable)));

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

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

            Assert.That(tableInfo.ItemType, Is.SameAs(typeof(Cook)));
        }
        public void VisitSqlSubStatementExpression()
        {
            var sqlStatement = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatementWithCook())
            {
                SelectProjection = new NamedExpression("test", Expression.Constant("test"))
            }.GetSqlStatement();

            var sqlSubStatementExpression = new SqlSubStatementExpression(sqlStatement);
            var stage = new DefaultSqlPreparationStage(_methodCallTransformerProvider, new ResultOperatorHandlerRegistry(), _generator);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                sqlSubStatementExpression,
                stage,
                _generator,
                _methodCallTransformerProvider,
                _context,
                info => new SqlTable(info, JoinSemantics.Inner));

            Assert.That(((SqlTable)result.SqlTable).TableInfo, Is.InstanceOf(typeof(ResolvedSubStatementTableInfo)));
        }
        public void GetTableForFromExpression_ConstantExpression_ReturnsUnresolvedTable()
        {
            var expression = Expression.Constant(new Cook[0]);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                expression,
                _stageMock,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            Assert.That(result.SqlTable, Is.TypeOf(typeof(SqlTable)));

            var tableInfo = result.SqlTable.TableInfo;

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

            Assert.That(tableInfo.ItemType, Is.SameAs(typeof(Cook)));
        }
        public void VisitSqlSubStatementExpression_WithNonBooleanSqlGroupingSelectExpression()
        {
            var sqlStatement = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatementWithCook())
            {
                SelectProjection =
                    new NamedExpression(
                        "test", new SqlGroupingSelectExpression(Expression.Constant("key"), Expression.Constant("element")))
            }.GetSqlStatement();

            var sqlSubStatementExpression = new SqlSubStatementExpression(sqlStatement);
            var stage = new DefaultSqlPreparationStage(_methodCallTransformerProvider, new ResultOperatorHandlerRegistry(), _generator);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                sqlSubStatementExpression,
                stage,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                _someOrderingExtractionPolicy);

            Assert.That(result.SqlTable.TableInfo, Is.InstanceOf(typeof(ResolvedSubStatementTableInfo)));
        }
        public void VisitSqlSubStatementExpression_WithDoNotExtractOrderingsPolicy()
        {
            var sqlStatement = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatementWithCook())
            {
                SelectProjection = new NamedExpression("test", Expression.Constant("test")),
                Orderings        = { SqlStatementModelObjectMother.CreateOrdering() }
            }.GetSqlStatement();

            var sqlSubStatementExpression = new SqlSubStatementExpression(sqlStatement);
            var stage = new DefaultSqlPreparationStage(_methodCallTransformerProvider, new ResultOperatorHandlerRegistry(), _generator);

            var result = SqlPreparationFromExpressionVisitor.AnalyzeFromExpression(
                sqlSubStatementExpression,
                stage,
                _generator,
                _methodCallTransformerProvider,
                _context,
                _tableGenerator,
                OrderingExtractionPolicy.DoNotExtractOrderings);

            Assert.That(result.SqlTable.TableInfo, Is.InstanceOf(typeof(ResolvedSubStatementTableInfo)));
            Assert.That(((ResolvedSubStatementTableInfo)result.SqlTable.TableInfo).SqlStatement.Orderings.Count, Is.EqualTo(0));
            Assert.That(result.ExtractedOrderings, Is.Empty);
        }