public void ResolveTableInfo_GroupReferenceTableInfo_NoSubStatement()
        {
            var groupSource = SqlStatementModelObjectMother.CreateSqlTable_WithResolvedTableInfo(typeof(IEnumerable <Cook>));
            var tableInfo   = new UnresolvedGroupReferenceTableInfo(groupSource);

            ResolvingTableInfoVisitor.ResolveTableInfo(tableInfo, _resolverMock, _generator, _stageMock, _mappingResolutionContext);
        }
        public void ResolveTableInfo_GroupReferenceTableInfo_NoGorupingSubStatement()
        {
            var subStatement = SqlStatementModelObjectMother.CreateSqlStatement(Expression.Constant(new int[0]));
            var groupSource  = SqlStatementModelObjectMother.CreateSqlTable(new ResolvedSubStatementTableInfo("q0", subStatement));
            var tableInfo    = new UnresolvedGroupReferenceTableInfo(groupSource);

            ResolvingTableInfoVisitor.ResolveTableInfo(tableInfo, _resolverMock, _generator, _stageMock, _mappingResolutionContext);
        }
        public Expression VisitSqlTableReferenceExpression(SqlTableReferenceExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            var tableInfo = new UnresolvedGroupReferenceTableInfo(expression.SqlTable);
            var sqlTable  = new SqlTable(tableInfo, JoinSemantics.Inner);

            FromExpressionInfo = new FromExpressionInfo(sqlTable, new Ordering[0], new SqlTableReferenceExpression(sqlTable), null);

            return(expression);
        }
        public ITableInfo VisitUnresolvedGroupReferenceTableInfo(UnresolvedGroupReferenceTableInfo tableInfo)
        {
            var groupSourceSubStatementTableInfo = tableInfo.ReferencedGroupSource.GetResolvedTableInfo() as ResolvedSubStatementTableInfo;

            if (groupSourceSubStatementTableInfo == null)
            {
                var message = string.Format(
                    "This SQL generator only supports sequences in from expressions if they are members of an entity or if they come from a GroupBy operator. "
                    + "Sequence: '{0}'", tableInfo);
                throw new NotSupportedException(message);
            }

            var groupingSelectExpression = groupSourceSubStatementTableInfo.SqlStatement.SelectProjection as SqlGroupingSelectExpression;

            if (groupingSelectExpression == null)
            {
                throw new NotSupportedException(
                          "When a sequence retrieved by a subquery is used in a from expression, the subquery must end with a GroupBy operator.");
            }

            var elementSelectingStatementBuilder = new SqlStatementBuilder(groupSourceSubStatementTableInfo.SqlStatement)
            {
                GroupByExpression = null
            };

            var currentKeyExpression = Expression.MakeMemberAccess(
                new SqlTableReferenceExpression(tableInfo.ReferencedGroupSource),
                groupingSelectExpression.Type.GetProperty("Key"));

            var groupKeyJoinCondition = _stage.ResolveWhereExpression(
                Expression.OrElse(
                    Expression.AndAlso(new SqlIsNullExpression(groupingSelectExpression.KeyExpression), new SqlIsNullExpression(currentKeyExpression)),
                    Expression.AndAlso(
                        Expression.AndAlso(
                            new SqlIsNotNullExpression(groupingSelectExpression.KeyExpression),
                            new SqlIsNotNullExpression(currentKeyExpression)),
                        Expression.Equal(groupingSelectExpression.KeyExpression, currentKeyExpression))),
                _context);

            elementSelectingStatementBuilder.AddWhereCondition(groupKeyJoinCondition);

            elementSelectingStatementBuilder.SelectProjection = groupingSelectExpression.ElementExpression;
            elementSelectingStatementBuilder.RecalculateDataInfo(groupingSelectExpression);

            return(new ResolvedJoinedGroupingTableInfo(
                       _generator.GetUniqueIdentifier("q"),
                       elementSelectingStatementBuilder.GetSqlStatement(),
                       groupingSelectExpression,
                       groupSourceSubStatementTableInfo.TableAlias));
        }
        public void ResolveTableInfo_GroupReferenceTableInfo()
        {
            var sqlTable       = SqlStatementModelObjectMother.CreateSqlTable(typeof(Cook));
            var groupingSelect = new SqlGroupingSelectExpression(
                Expression.MakeMemberAccess(new SqlTableReferenceExpression(sqlTable), typeof(Cook).GetProperty("Name")),
                Expression.MakeMemberAccess(new SqlTableReferenceExpression(sqlTable), typeof(Cook).GetProperty("ID")));
            var dataInfo = new StreamedSequenceInfo(
                typeof(IEnumerable <>).MakeGenericType(groupingSelect.Type),
                Expression.Constant(null, groupingSelect.Type));
            var whereCondition       = Expression.Constant(false);
            var groupByExpression    = groupingSelect.KeyExpression;
            var groupingSubStatement = new SqlStatementBuilder
            {
                DataInfo          = dataInfo,
                SelectProjection  = groupingSelect,
                SqlTables         = { sqlTable },
                WhereCondition    = whereCondition,
                GroupByExpression = groupByExpression
            }.GetSqlStatement();
            var groupSource = SqlStatementModelObjectMother.CreateSqlTable(new ResolvedSubStatementTableInfo("q0", groupingSubStatement));
            var tableInfo   = new UnresolvedGroupReferenceTableInfo(groupSource);

            var expectedKeyViaElement     = Expression.MakeMemberAccess(new SqlTableReferenceExpression(sqlTable), typeof(Cook).GetProperty("Name"));
            var expectedKeyViaGroupSource = Expression.MakeMemberAccess(new SqlTableReferenceExpression(groupSource), groupSource.ItemType.GetProperty("Key"));

            var expectedResultWhereCondition =
                Expression.OrElse(
                    Expression.AndAlso(new SqlIsNullExpression(expectedKeyViaElement), new SqlIsNullExpression(expectedKeyViaGroupSource)),
                    Expression.AndAlso(
                        Expression.AndAlso(new SqlIsNotNullExpression(expectedKeyViaElement), new SqlIsNotNullExpression(expectedKeyViaGroupSource)),
                        Expression.Equal(expectedKeyViaElement, expectedKeyViaGroupSource)));

            var fakeWhereCondition = Expression.Constant(false);

            _stageMock
            .Expect(mock => mock.ResolveWhereExpression(Arg <Expression> .Is.Anything, Arg.Is(_mappingResolutionContext)))
            .WhenCalled(mi => SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResultWhereCondition, (Expression)mi.Arguments[0]))
            .Return(fakeWhereCondition);
            _stageMock.Replay();

            var result = ResolvingTableInfoVisitor.ResolveTableInfo(tableInfo, _resolverMock, _generator, _stageMock, _mappingResolutionContext);

            _stageMock.VerifyAllExpectations();

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

            var castResult = ((ResolvedJoinedGroupingTableInfo)result);

            var resultGroupingSelector = castResult.AssociatedGroupingSelectExpression;

            Assert.That(resultGroupingSelector, Is.SameAs(groupingSelect));

            Assert.That(castResult.GroupSourceTableAlias, Is.EqualTo("q0"));

            var resultSqlStatement = castResult.SqlStatement;

            Assert.That(resultSqlStatement.SqlTables, Is.EqualTo(groupingSubStatement.SqlTables));
            Assert.That(resultSqlStatement.Orderings, Is.Empty);
            Assert.That(resultSqlStatement.GroupByExpression, Is.Null);

            SqlExpressionTreeComparer.CheckAreEqualTrees(
                Expression.AndAlso(groupingSubStatement.WhereCondition, fakeWhereCondition),
                resultSqlStatement.WhereCondition);

            var expectedResultSelectProjection =
                Expression.MakeMemberAccess(new SqlTableReferenceExpression(resultSqlStatement.SqlTables[0]), typeof(Cook).GetProperty("ID"));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedResultSelectProjection, resultSqlStatement.SelectProjection);

            Assert.That(resultSqlStatement.DataInfo, Is.TypeOf(typeof(StreamedSequenceInfo)));
            Assert.That(resultSqlStatement.DataInfo.DataType, Is.SameAs(typeof(IQueryable <int>)));

            var expectedItemExpression = resultSqlStatement.SelectProjection;

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedItemExpression, ((StreamedSequenceInfo)resultSqlStatement.DataInfo).ItemExpression);
        }
Exemple #6
0
 public ITableInfo VisitUnresolvedGroupReferenceTableInfo(UnresolvedGroupReferenceTableInfo tableInfo)
 {
     throw new InvalidOperationException("UnresolvedGroupReferenceTableInfo is not valid at this point.");
 }
 public void SetUp()
 {
     _referencedGroupSource = SqlStatementModelObjectMother.CreateSqlTable(typeof(IGrouping <int, string>));
     _tableInfo             = new UnresolvedGroupReferenceTableInfo(_referencedGroupSource);
 }