public void VisitSqlInExpression_RevisitingTerminatesAfterInnerChanges_WithoutOuterChanges()
        {
            var left         = Expression.Constant(0);
            var right        = Expression.Constant(1);
            var inExpression = new SqlInExpression(left, right);

            var fakeResolvedLeft = new SqlLiteralExpression(2);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(left)).Return(fakeResolvedLeft);
            var fakeResolvedRight = new SqlLiteralExpression(3);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(right)).Return(fakeResolvedRight);

            _entityIdentityResolverMock
            .Expect(mock => mock.ResolvePotentialEntityComparison(Arg <SqlInExpression> .Is.Anything))
            .Return(null)
            .WhenCalled(mi => mi.ReturnValue = mi.Arguments[0]);

            // No revisiting

            var result = _visitor.Visit(inExpression);

            _resolverMock.VerifyAllExpectations();
            _entityIdentityResolverMock.VerifyAllExpectations();

            Assert.That(result, Is.TypeOf <SqlInExpression> ());
            Assert.That(((SqlInExpression)result).LeftExpression, Is.SameAs(fakeResolvedLeft));
            Assert.That(((SqlInExpression)result).RightExpression, Is.SameAs(fakeResolvedRight));
        }
        public void SetUp()
        {
            _leftExpression  = Expression.Constant(1);
            _rightExpression = Expression.Constant(2);

            _expression = new SqlInExpression(_leftExpression, _rightExpression);
        }
        public void ResolvePotentialEntityComparison_SqlInExpression_NonEntities_ReturnsSameExpression()
        {
            var sqlInExpression = new SqlInExpression(Expression.Constant(0), Expression.Constant(0));

            var result = _entityIdentityResolver.ResolvePotentialEntityComparison(sqlInExpression);

            Assert.That(result, Is.SameAs(sqlInExpression));
        }
        public void ResolvePotentialEntityComparison_SqlInExpression_EntitiesAreResolvedToIdentity_RightOnly()
        {
            var sqlInExpression = new SqlInExpression(Expression.Constant(null, typeof(Cook)), _entityExpression);

            var result = _entityIdentityResolver.ResolvePotentialEntityComparison(sqlInExpression);

            var expected = new SqlInExpression(Expression.Constant(null, typeof(Cook)), _entityExpression.GetIdentityExpression());

            SqlExpressionTreeComparer.CheckAreEqualTrees(expected, result);
        }
        public void ResolvePotentialEntityComparison_SqlInExpression_ResolvesEntitiesToIdentity()
        {
            var sqlInExpression = new SqlInExpression(_entityExpression, _entityConstantExpression);

            var result = _entityIdentityResolver.ResolvePotentialEntityComparison(sqlInExpression);

            var expected = new SqlInExpression(_entityExpression.GetIdentityExpression(), _entityConstantExpression.IdentityExpression);

            SqlExpressionTreeComparer.CheckAreEqualTrees(expected, result);
        }
示例#6
0
        public virtual Expression VisitSqlInExpression(SqlInExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            VisitExpression(expression.LeftExpression);
            _commandBuilder.Append(" IN ");
            VisitExpression(expression.RightExpression);

            return(expression);
        }
        public void ResolveTypeCheck_ExpressionTypeIsAssignableFromDesiredType_WithSingleClassID()
        {
            var sqlEntityExpression = (SqlEntityExpression)CreateFakeEntityExpression(typeof(Company));

            var result = _resolver.ResolveTypeCheck(sqlEntityExpression, typeof(Distributor));

            var idExpression       = Expression.MakeMemberAccess(sqlEntityExpression, typeof(DomainObject).GetProperty("ID"));
            var classIDExpression  = Expression.MakeMemberAccess(idExpression, typeof(ObjectID).GetProperty("ClassID"));
            var expectedExpression = new SqlInExpression(
                classIDExpression, new SqlCollectionExpression(typeof(string[]), new Expression[] { new SqlLiteralExpression("Distributor") }));

            SqlExpressionTreeComparer.CheckAreEqualTrees(result, expectedExpression);
        }
        public void ResolveTypeCheck_NoQueryableTable()
        {
            var sqlEntityExpression = (SqlEntityExpression)CreateFakeEntityExpression(typeof(AboveInheritanceRootClass));

            var result = _resolver.ResolveTypeCheck(sqlEntityExpression, typeof(StorageGroupClass));

            var idExpression       = Expression.MakeMemberAccess(sqlEntityExpression, typeof(DomainObject).GetProperty("ID"));
            var classIDExpression  = Expression.MakeMemberAccess(idExpression, typeof(ObjectID).GetProperty("ClassID"));
            var expectedExpression = new SqlInExpression(
                classIDExpression, new SqlCollectionExpression(typeof(string[]), new Expression[] { new SqlLiteralExpression("StorageGroupClass") }));

            SqlExpressionTreeComparer.CheckAreEqualTrees(result, expectedExpression);
        }
示例#9
0
        public Expression VisitSqlInExpression(SqlInExpression expression)
        {
            var baseVisitedExpression = (SqlInExpression)VisitExtensionExpression(expression);

            var expressionWithSimplifiedEntities = _entityIdentityResolver.ResolvePotentialEntityComparison(baseVisitedExpression);

            if (expressionWithSimplifiedEntities != baseVisitedExpression)
            {
                return(VisitExpression(expressionWithSimplifiedEntities));
            }

            return(baseVisitedExpression);
        }
示例#10
0
        public SqlInExpression ResolvePotentialEntityComparison(SqlInExpression inExpression)
        {
            ArgumentUtility.CheckNotNull("inExpression", inExpression);

            var newLeft  = ResolvePotentialEntity(inExpression.LeftExpression);
            var newRight = ResolvePotentialEntity(inExpression.RightExpression);

            if (newLeft != inExpression.LeftExpression || newRight != inExpression.RightExpression)
            {
                return(new SqlInExpression(newLeft, newRight));
            }

            return(inExpression);
        }
示例#11
0
        protected virtual string VisitIn(SqlInExpression expr)
        {
            string result;

            if (expr.Not)
            {
                result = $"{Visit(expr.Expression)} NOT IN ({EmitParameter(expr.Range)})";
            }
            else
            {
                result = $"{Visit(expr.Expression)} IN ({EmitParameter(expr.Range)})";
            }

            return(result.Braces(!expr.IsTop));
        }
 public Expression VisitSqlIn(SqlInExpression expression)
 {
     try
     {
         return(VisitChildrenWithGivenSemantics(expression, SqlExpressionContext.SingleValueRequired));
     }
     catch (NotSupportedException ex)
     {
         var message = string.Format(
             "The SQL 'IN' operator (originally probably a call to a 'Contains' method) requires a single value, so the following expression cannot "
             + "be translated to SQL: '{0}'.",
             expression);
         throw new NotSupportedException(message, ex);
     }
 }
        public Expression VisitSqlIn(SqlInExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            var baseVisitedExpression = (SqlInExpression)VisitExtension(expression);

            var expressionWithSimplifiedEntities = _entityIdentityResolver.ResolvePotentialEntityComparison(baseVisitedExpression);

            if (expressionWithSimplifiedEntities != baseVisitedExpression)
            {
                return(Visit(expressionWithSimplifiedEntities));
            }

            return(baseVisitedExpression);
        }
示例#14
0
        public void VisitSqlInExpression()
        {
            var sqlStatement = SqlStatementModelObjectMother.CreateSqlStatementWithCook();
            var sqlSubStatementExpression = new SqlSubStatementExpression(sqlStatement);
            var sqlInExpression           = new SqlInExpression(Expression.Constant(1), sqlSubStatementExpression);

            _stageMock
            .Expect(
                mock =>
                mock.GenerateTextForSqlStatement(
                    Arg.Is(_commandBuilder), Arg <SqlStatement> .Is.Anything))
            .WhenCalled(mi => ((SqlCommandBuilder)mi.Arguments[0]).Append("test"));
            _stageMock.Replay();

            SqlGeneratingExpressionVisitor.GenerateSql(
                sqlInExpression, _commandBuilder, _stageMock);

            Assert.That(_commandBuilder.GetCommandText(), Is.EqualTo("@1 IN (test)"));
            _stageMock.VerifyAllExpectations();
        }
        public void HandleResultOperator()
        {
            var itemExpression = Expression.Constant(new Cook());
            var resultOperator = new ContainsResultOperator(itemExpression);
            var sqlStatement   = _sqlStatementBuilder.GetSqlStatement();

            var preparedExpression = Expression.Constant(new Cook(), typeof(Cook));

            _stageMock.Expect(mock => mock.PrepareResultOperatorItemExpression(itemExpression, _context)).Return(preparedExpression);
            _stageMock.Replay();

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

            _stageMock.VerifyAllExpectations();

            Assert.That(_sqlStatementBuilder.DataInfo, Is.TypeOf(typeof(StreamedScalarValueInfo)));
            Assert.That(((StreamedScalarValueInfo)_sqlStatementBuilder.DataInfo).DataType, Is.EqualTo(typeof(Boolean)));

            var expectedExpression = new SqlInExpression(preparedExpression, new SqlSubStatementExpression(sqlStatement));

            SqlExpressionTreeComparer.CheckAreEqualTrees(expectedExpression, _sqlStatementBuilder.SelectProjection);
        }
        public void VisitSqlInExpression()
        {
            var left         = Expression.Constant(0);
            var right        = Expression.Constant(1);
            var inExpression = new SqlInExpression(left, right);

            var fakeResolvedLeft = new SqlLiteralExpression(2);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(left)).Return(fakeResolvedLeft);
            var fakeResolvedRight = new SqlLiteralExpression(3);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(right)).Return(fakeResolvedRight);

            var fakeResolvedInExpression = new SqlInExpression(Expression.Constant(4), Expression.Constant(5));

            _entityIdentityResolverMock
            .Expect(
                mock => mock.ResolvePotentialEntityComparison(
                    Arg <SqlInExpression> .Matches(e => e.LeftExpression == fakeResolvedLeft && e.RightExpression == fakeResolvedRight)))
            .Return(fakeResolvedInExpression);

            // Result is revisited
            _resolverMock
            .Expect(mock => mock.ResolveConstantExpression((ConstantExpression)fakeResolvedInExpression.LeftExpression))
            .Return(fakeResolvedInExpression.LeftExpression);
            _resolverMock
            .Expect(mock => mock.ResolveConstantExpression((ConstantExpression)fakeResolvedInExpression.RightExpression))
            .Return(fakeResolvedInExpression.RightExpression);
            _entityIdentityResolverMock
            .Expect(mock => mock.ResolvePotentialEntityComparison(fakeResolvedInExpression))
            .Return(fakeResolvedInExpression);

            var result = _visitor.Visit(inExpression);

            _resolverMock.VerifyAllExpectations();
            _entityIdentityResolverMock.VerifyAllExpectations();

            Assert.That(result, Is.SameAs(fakeResolvedInExpression));
        }