public void ResolveSubStatementReferenceExpression_CopiesExpression_ForUnknownExpression()
        {
            var referencedExpression = Expression.Constant(0);
            var sqlStatement         = SqlStatementModelObjectMother.CreateSqlStatement(referencedExpression);

            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(
                referencedExpression, tableInfo, sqlTable, _context);

            Assert.That(result, Is.SameAs(referencedExpression));
        }
        public void ResolveSubStatementReferenceExpression_CreatesColumnExpression_ForNamedExpression()
        {
            var referencedExpression = new NamedExpression("test", Expression.Constant(0));
            var sqlStatement         = SqlStatementModelObjectMother.CreateSqlStatement(referencedExpression);

            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(
                referencedExpression, tableInfo, sqlTable, _context);

            var expectedResult = new SqlColumnDefinitionExpression(typeof(int), "q0", "test", false);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public void ResolveSubStatementReferenceExpression_RegistersEntityTable_WithinUnknownExpression()
        {
            var referencedExpression = Expression.Convert(SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Cook)), typeof(Chef));
            var sqlStatement         = SqlStatementModelObjectMother.CreateSqlStatement(referencedExpression);

            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(
                referencedExpression, tableInfo, sqlTable, _context);

            Assert.That(result.NodeType, Is.EqualTo(ExpressionType.Convert));
            var entityReference = (SqlEntityExpression)((UnaryExpression)result).Operand;

            Assert.That(_context.GetSqlTableForEntityExpression(entityReference), Is.SameAs(sqlTable));
        }
        public void ResolveSubStatementReferenceExpression_CreatesSqlGroupingSelectExpressionWithNamedExpressions()
        {
            var expression = new SqlGroupingSelectExpression(
                Expression.Constant("key"), Expression.Constant("element"), new[] { Expression.Constant("aggregation") });
            var tableInfo = new ResolvedSubStatementTableInfo("q0", SqlStatementModelObjectMother.CreateSqlStatement_Resolved(typeof(Cook)));
            var sqlTable  = SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook));

            var exprectedResult = new SqlGroupingSelectExpression(
                new NamedExpression("key", Expression.Constant("key")),
                new NamedExpression("element", Expression.Constant("element")),
                new[] { new NamedExpression("a0", Expression.Constant("aggregation")) });

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(expression, tableInfo, sqlTable, _context);

            SqlExpressionTreeComparer.CheckAreEqualTrees(result, exprectedResult);
            Assert.That(_context.GetReferencedGroupSource(((SqlGroupingSelectExpression)result)), Is.SameAs(sqlTable));
        }
        public void ResolveSubStatementReferenceExpression_CreatesNewExpressionWithReferences_ForNewExpressions_WithoutMembers()
        {
            var newExpression = Expression.New(
                TypeForNewExpression.GetConstructor(typeof(int)),
                new[] { new NamedExpression("const", Expression.Constant(0)) });

            var sqlStatement = SqlStatementModelObjectMother.CreateSqlStatement(newExpression);

            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(newExpression, tableInfo, sqlTable, _context);

            var expectedResult = Expression.New(
                TypeForNewExpression.GetConstructor(typeof(int)),
                new Expression[] { new NamedExpression("m0", new SqlColumnDefinitionExpression(typeof(int), "q0", "const", false)) });

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public void ResolveSubStatementReferenceExpression_CreatesEntityReference_ForEntities()
        {
            var entityDefinitionExpression = SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Cook));
            var sqlStatement = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatement_Resolved(typeof(Cook)))
            {
                SelectProjection = entityDefinitionExpression,
                DataInfo         = new StreamedSequenceInfo(typeof(Cook[]), Expression.Constant(new Cook()))
            }.GetSqlStatement();
            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(entityDefinitionExpression, tableInfo, sqlTable, _context);

            Assert.That(result, Is.TypeOf(typeof(SqlEntityReferenceExpression)));
            Assert.That(_context.GetSqlTableForEntityExpression((SqlEntityReferenceExpression)result), Is.SameAs(sqlTable));

            var expectedResult = entityDefinitionExpression.CreateReference("q0", tableInfo.SqlStatement.SelectProjection.Type);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResult, result);
        }
        public void ResolveSubStatementReferenceExpression_CreatesSqlGroupingReferenceExpression_ForSqlGroupingSelectExpression()
        {
            var groupingSelectExpression = new SqlGroupingSelectExpression(
                SqlStatementModelObjectMother.CreateSqlEntityDefinitionExpression(typeof(Cook), "key"),
                new NamedExpression("element", Expression.Constant(0)),
                new[] { new NamedExpression("a0", Expression.Constant(1)) });
            var sqlStatement = new SqlStatementBuilder(SqlStatementModelObjectMother.CreateSqlStatement_Resolved(typeof(Cook)))
            {
                SelectProjection = groupingSelectExpression,
                DataInfo         = new StreamedSequenceInfo(typeof(IGrouping <int, int>[]), Expression.Constant(null, typeof(IGrouping <int, int>)))
            }.GetSqlStatement();
            var tableInfo = new ResolvedSubStatementTableInfo("q0", sqlStatement);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            var result = SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(groupingSelectExpression, tableInfo, sqlTable, _context);

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

            var referencedKeyExpression         = ((SqlGroupingSelectExpression)result).KeyExpression;
            var expectedReferencedKeyExpression = new NamedExpression("key", new SqlEntityReferenceExpression(
                                                                          typeof(Cook),
                                                                          "q0",
                                                                          null,
                                                                          (SqlEntityExpression)groupingSelectExpression.KeyExpression));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedReferencedKeyExpression, referencedKeyExpression);

            var referencedElementExpression         = ((SqlGroupingSelectExpression)result).ElementExpression;
            var expectedReferencedElementExpression = new NamedExpression("element", new SqlColumnDefinitionExpression(typeof(int), "q0", "element", false));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedReferencedElementExpression, referencedElementExpression);

            Assert.That(((SqlGroupingSelectExpression)result).AggregationExpressions.Count, Is.EqualTo(1));
            var referencedAggregationExpression         = ((SqlGroupingSelectExpression)result).AggregationExpressions[0];
            var expectedReferencedAggregationExpression = new NamedExpression("a0", new SqlColumnDefinitionExpression(typeof(int), "q0", "a0", false));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedReferencedAggregationExpression, referencedAggregationExpression);

            Assert.That(_context.GetReferencedGroupSource(((SqlGroupingSelectExpression)result)), Is.SameAs(sqlTable));
        }
        public Expression ResolveReference(SqlTableBase sqlTable, IMappingResolver mappingResolver, IMappingResolutionContext context, UniqueIdentifierGenerator generator)
        {
            var selectProjection = SqlStatement.SelectProjection;

            return(SubStatementReferenceResolver.ResolveSubStatementReferenceExpression(selectProjection, this, sqlTable, context));
        }