Visit() public method

public Visit ( Expression expression ) : HqlTreeNode
expression System.Linq.Expressions.Expression
return NHibernate.Hql.Ast.HqlTreeNode
		private HqlEquality GenerateEqualityNode(Expression leftExpr, Expression rightExpr)
		{
            // TODO - why two visitors? Can't we just reuse?
			var left = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters);
			var right = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters);

		    return _hqlTreeBuilder.Equality(left.Visit(leftExpr).AsExpression(), right.Visit(rightExpr).AsExpression());
		}
Beispiel #2
0
        public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index)
        {
            var equalityVisitor = new EqualityHqlGenerator(VisitorParameters);
            var whereClause     = equalityVisitor.Visit(joinClause.InnerKeySelector, joinClause.OuterKeySelector);

            _hqlTree.AddWhereClause(whereClause);

            _hqlTree.AddFromClause(
                _hqlTree.TreeBuilder.Range(
                    HqlGeneratorExpressionTreeVisitor.Visit(joinClause.InnerSequence, VisitorParameters),
                    _hqlTree.TreeBuilder.Alias(joinClause.ItemName)));
        }
Beispiel #3
0
        public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
        {
            // Visit the predicate to build the query
            var expression = HqlGeneratorExpressionTreeVisitor.Visit(whereClause.Predicate, VisitorParameters).AsBooleanExpression();

            if (whereClause is NhHavingClause)
            {
                _hqlTree.AddHavingClause(expression);
            }
            else
            {
                _hqlTree.AddWhereClause(expression);
            }
        }
Beispiel #4
0
        public override Expression VisitExpression(Expression expression)
        {
            if (expression == null)
            {
                return(null);
            }

            if (_hqlNodes.Contains(expression))
            {
                // Pure HQL evaluation
                _hqlTreeNodes.Add(_hqlVisitor.Visit(expression).AsExpression());

                return(Expression.Convert(Expression.ArrayIndex(_inputParameter, Expression.Constant(_iColumn++)), expression.Type));
            }

            // Can't handle this node with HQL.  Just recurse down, and emit the expression
            return(base.VisitExpression(expression));
        }
        public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
        {
            var visitor = new SimplifyConditionalVisitor();

            whereClause.Predicate = visitor.VisitExpression(whereClause.Predicate);

            // Visit the predicate to build the query
            var expression = HqlGeneratorExpressionTreeVisitor.Visit(whereClause.Predicate, VisitorParameters).ToBooleanExpression();

            if (whereClause is NhHavingClause)
            {
                _hqlTree.AddHavingClause(expression);
            }
            else
            {
                _hqlTree.AddWhereClause(expression);
            }
        }
Beispiel #6
0
        public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel)
        {
            _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Range(
                                       HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters),
                                       _hqlTree.TreeBuilder.Alias(fromClause.ItemName)));

            // apply any result operators that were rewritten
            if (RewrittenOperatorResult != null)
            {
                CurrentEvaluationType = RewrittenOperatorResult.EvaluationType;
                foreach (ResultOperatorBase rewrittenOperator in RewrittenOperatorResult.RewrittenOperators)
                {
                    this.VisitResultOperator(rewrittenOperator, queryModel, -1);
                }
            }

            base.VisitMainFromClause(fromClause, queryModel);
        }
Beispiel #7
0
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            if (fromClause is NhJoinClause)
            {
                if (((NhJoinClause)fromClause).IsInner)
                {
                    _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Join(
                                               HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                                               _hqlTree.TreeBuilder.Alias(fromClause.ItemName)));
                }
                else
                {
                    _hqlTree.AddFromClause(_hqlTree.TreeBuilder.LeftJoin(
                                               HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                                               _hqlTree.TreeBuilder.Alias(fromClause.ItemName)));
                }
            }
            else if (fromClause.FromExpression is MemberExpression)
            {
                var member = (MemberExpression)fromClause.FromExpression;

                if (member.Expression is QuerySourceReferenceExpression)
                {
                    // It's a join
                    _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Join(
                                               HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                                               _hqlTree.TreeBuilder.Alias(fromClause.ItemName)));
                }
                else
                {
                    // What's this?
                    throw new NotSupportedException();
                }
            }
            else
            {
                // TODO - exact same code as in MainFromClause; refactor this out
                _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Range(
                                           HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters),
                                           _hqlTree.TreeBuilder.Alias(fromClause.ItemName)));
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }
        public override Expression VisitExpression(Expression expression)
        {
            if (expression == null)
            {
                return null;
            }

            if (_hqlNodes.Contains(expression))
            {
                // Pure HQL evaluation - TODO - cache the Visitor?
				var hqlVisitor = new HqlGeneratorExpressionTreeVisitor(_parameters);
                
                _hqlTreeNodes.Add(hqlVisitor.Visit(expression).AsExpression());

                return Expression.Convert(Expression.ArrayIndex(_inputParameter, Expression.Constant(_iColumn++)),
                                          expression.Type);
            }

            // Can't handle this node with HQL.  Just recurse down, and emit the expression
            return base.VisitExpression(expression);
        }
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            var querySourceName = VisitorParameters.QuerySourceNamer.GetName(fromClause);

            if (fromClause is NhJoinClause)
            {
                if (((NhJoinClause)fromClause).IsInner)
                {
                    _hqlTree.AddFromClause(
                        _hqlTree.TreeBuilder.Join(
                            HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                            _hqlTree.TreeBuilder.Alias(querySourceName)));
                }
                else
                {
                    _hqlTree.AddFromClause(
                        _hqlTree.TreeBuilder.LeftJoin(
                            HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                            _hqlTree.TreeBuilder.Alias(querySourceName)));
                }
            }
            else if (fromClause.FromExpression is MemberExpression)
            {
                // It's a join
                _hqlTree.AddFromClause(
                    _hqlTree.TreeBuilder.Join(
                        HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters).AsExpression(),
                        _hqlTree.TreeBuilder.Alias(querySourceName)));
            }
            else
            {
                // TODO - exact same code as in MainFromClause; refactor this out
                _hqlTree.AddFromClause(
                    _hqlTree.TreeBuilder.Range(
                        HqlGeneratorExpressionTreeVisitor.Visit(fromClause.FromExpression, VisitorParameters),
                        _hqlTree.TreeBuilder.Alias(querySourceName)));
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }
        private void VisitNhJoinClause(string querySourceName, NhJoinClause joinClause)
        {
            var expression = HqlGeneratorExpressionTreeVisitor.Visit(joinClause.FromExpression, VisitorParameters).AsExpression();
            var alias      = _hqlTree.TreeBuilder.Alias(querySourceName);

            HqlTreeNode hqlJoin;

            if (joinClause.IsInner)
            {
                hqlJoin = _hqlTree.TreeBuilder.Join(expression, @alias);
            }
            else
            {
                hqlJoin = _hqlTree.TreeBuilder.LeftJoin(expression, @alias);
            }

            foreach (var withClause in joinClause.Restrictions)
            {
                var booleanExpression = HqlGeneratorExpressionTreeVisitor.Visit(withClause.Predicate, VisitorParameters).AsBooleanExpression();
                hqlJoin.AddChild(_hqlTree.TreeBuilder.With(booleanExpression));
            }

            _hqlTree.AddFromClause(hqlJoin);
        }
		protected HqlTreeNode VisitNewArrayExpression(NewArrayExpression expression)
		{
			var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters);
			var expressionSubTree = expression.Expressions.Select(exp => visitor.Visit(exp));
			return _hqlTreeBuilder.ExpressionSubTreeHolder(expressionSubTree);
		}
 public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index)
 {
     // Visit the predicate to build the query
     _hqlTree.AddWhereClause(HqlGeneratorExpressionTreeVisitor.Visit(whereClause.Predicate, VisitorParameters).AsBooleanExpression());
 }