public void HandleResultOperator()
        {
            var resultOperator = new AnyResultOperator();
            var sqlStatement   = _sqlStatementBuilder.GetSqlStatement();

            var fakePreparedSelectProjection = Expression.Constant(false);

            _stageMock
            .Expect(mock => mock.PrepareSelectExpression(Arg <Expression> .Matches(e => e is SqlExistsExpression), Arg.Is(_context)))
            .WhenCalled(
                mi =>
            {
                var selectProjection = (Expression)mi.Arguments[0];
                Assert.That(selectProjection, Is.TypeOf(typeof(SqlExistsExpression)));

                var expectedExistsExpression = new SqlExistsExpression(new SqlSubStatementExpression(sqlStatement));
                SqlExpressionTreeComparer.CheckAreEqualTrees(expectedExistsExpression, selectProjection);
            })
            .Return(fakePreparedSelectProjection);

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

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

            _stageMock.VerifyAllExpectations();

            Assert.That(_sqlStatementBuilder.SelectProjection, Is.SameAs(fakePreparedSelectProjection));
        }
        public void VisitSqlExistsExpression()
        {
            var inner            = Expression.Constant(0);
            var existsExpression = new SqlExistsExpression(inner);

            var fakeResolvedInner = new SqlLiteralExpression(1);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(inner)).Return(fakeResolvedInner);

            var fakeResolvedEntityIdentity = Expression.Constant(1);

            _entityIdentityResolverMock
            .Expect(mock => mock.ResolvePotentialEntity(fakeResolvedInner))
            .Return(fakeResolvedEntityIdentity);

            // Result is revisited
            _resolverMock.Expect(mock => mock.ResolveConstantExpression(fakeResolvedEntityIdentity)).Return(fakeResolvedEntityIdentity);
            _entityIdentityResolverMock.Expect(mock => mock.ResolvePotentialEntity(fakeResolvedEntityIdentity)).Return(fakeResolvedEntityIdentity);

            var result = _visitor.Visit(existsExpression);

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

            Assert.That(result, Is.TypeOf <SqlExistsExpression>());
            Assert.That(((SqlExistsExpression)result).Expression, Is.SameAs(fakeResolvedEntityIdentity));
        }
예제 #3
0
        public void VisitExistsExpression()
        {
            var expression = new SqlExistsExpression(Expression.Constant("test"));

            SqlGeneratingExpressionVisitor.GenerateSql(expression, _commandBuilder, _stageMock);

            var result = _commandBuilder.GetCommandText();

            Assert.That(result, Is.EqualTo("EXISTS(@1)"));
        }
예제 #4
0
        public virtual Expression VisitSqlExistsExpression(SqlExistsExpression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            _commandBuilder.Append("EXISTS");
            _commandBuilder.Append("(");
            VisitExpression(expression.Expression);
            _commandBuilder.Append(")");

            return(expression);
        }
예제 #5
0
        public Expression VisitSqlExistsExpression(SqlExistsExpression expression)
        {
            var baseVisitedExpression = (SqlExistsExpression)VisitExtensionExpression(expression);

            // Within an EXISTS query, an entity can be replaced by its IdentityExpression, so try to simplify it.
            var newInnerExpression = _entityIdentityResolver.ResolvePotentialEntity(baseVisitedExpression.Expression);

            if (newInnerExpression != baseVisitedExpression.Expression)
            {
                return(VisitExpression(new SqlExistsExpression(newInnerExpression)));
            }

            return(baseVisitedExpression);
        }
예제 #6
0
        public override void HandleResultOperator(AnyResultOperator resultOperator, SqlStatementBuilder sqlStatementBuilder, UniqueIdentifierGenerator generator, ISqlPreparationStage stage, ISqlPreparationContext context)
        {
            ArgumentUtility.CheckNotNull("resultOperator", resultOperator);
            ArgumentUtility.CheckNotNull("sqlStatementBuilder", sqlStatementBuilder);
            ArgumentUtility.CheckNotNull("generator", generator);
            ArgumentUtility.CheckNotNull("stage", stage);
            ArgumentUtility.CheckNotNull("context", context);

            // No name required for the select projection inside of an EXISTS expression
            var sqlSubStatement        = sqlStatementBuilder.GetStatementAndResetBuilder();
            var subStatementExpression = new SqlSubStatementExpression(sqlSubStatement);

            var sqlExistsExpression = new SqlExistsExpression(subStatementExpression);

            sqlStatementBuilder.SelectProjection = stage.PrepareSelectExpression(sqlExistsExpression, context);
            UpdateDataInfo(resultOperator, sqlStatementBuilder, sqlSubStatement.DataInfo);
        }
        public void HandleResultOperator()
        {
            var predicate         = Expression.Constant(true);
            var preparedPredicate = Expression.Constant(false);
            var resultOperator    = new AllResultOperator(predicate);
            var sqlStatement      = _sqlStatementBuilder.GetSqlStatement();

            var fakePreparedSelectProjection = Expression.Constant(false);

            _stageMock
            .Expect(mock => mock.PrepareWhereExpression(
                        Arg <Expression> .Matches(e => e.NodeType == ExpressionType.Not && (((UnaryExpression)e).Operand == predicate)),
                        Arg <ISqlPreparationContext> .Matches(c => c == _context)))
            .Return(preparedPredicate);
            _stageMock
            .Expect(mock => mock.PrepareSelectExpression(Arg <Expression> .Matches(e => e.NodeType == ExpressionType.Not), Arg.Is(_context)))
            .WhenCalled(
                mi =>
            {
                var selectProjection     = (Expression)mi.Arguments[0];
                var expectedSubStatement = new SqlStatementBuilder(sqlStatement)
                {
                    WhereCondition = preparedPredicate
                }.GetSqlStatement();
                var expectedExistsExpression = new SqlExistsExpression(new SqlSubStatementExpression(expectedSubStatement));
                var expectedExpression       = Expression.Not(expectedExistsExpression);

                SqlExpressionTreeComparer.CheckAreEqualTrees(expectedExpression, selectProjection);
            })
            .Return(fakePreparedSelectProjection);
            _stageMock.Replay();

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

            _stageMock.VerifyAllExpectations();

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

            Assert.That(_sqlStatementBuilder.SelectProjection, Is.SameAs(fakePreparedSelectProjection));
        }
        public void VisitSqlExistsExpression_RevisitingTerminatesAfterInnerChanges_WithoutOuterChanges()
        {
            var inner            = Expression.Constant(0);
            var existsExpression = new SqlExistsExpression(inner);

            var fakeResolvedInner = new SqlLiteralExpression(1);

            _resolverMock.Expect(mock => mock.ResolveConstantExpression(inner)).Return(fakeResolvedInner);

            _entityIdentityResolverMock
            .Expect(mock => mock.ResolvePotentialEntity(fakeResolvedInner))
            .Return(fakeResolvedInner);

            // No revisiting!

            var result = _visitor.Visit(existsExpression);

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

            Assert.That(result, Is.TypeOf <SqlExistsExpression> ());
            Assert.That(((SqlExistsExpression)result).Expression, Is.SameAs(fakeResolvedInner));
        }
 public Expression VisitSqlExists(SqlExistsExpression expression)
 {
     return(VisitChildrenWithGivenSemantics(expression, SqlExpressionContext.ValueRequired));
 }
예제 #10
0
 public void SetUp()
 {
     _sqlExistsExpression = new SqlExistsExpression(Expression.Constant("test"));
 }