Ejemplo n.º 1
0
        public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel queryModel, int index)
        {
            foreach (var clause in orderByClause.Orderings)
            {
                var orderBy   = HqlGeneratorExpressionVisitor.Visit(clause.Expression, VisitorParameters).ToArithmeticExpression();
                var direction = clause.OrderingDirection == OrderingDirection.Asc
                                        ? _hqlTree.TreeBuilder.Ascending()
                                        : (HqlDirectionStatement)_hqlTree.TreeBuilder.Descending();

                _hqlTree.AddOrderByClause(orderBy, direction);
            }
        }
        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(
                    HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters),
                    _hqlTree.TreeBuilder.Alias(joinClause.ItemName)));
        }
Ejemplo n.º 3
0
        private void AddJoin(JoinClause joinClause, QueryModel queryModel, bool innerJoin)
        {
            var equalityVisitor = new EqualityHqlGenerator(VisitorParameters);
            var withClause      = equalityVisitor.Visit(joinClause.InnerKeySelector, joinClause.OuterKeySelector);
            var alias           = _hqlTree.TreeBuilder.Alias(VisitorParameters.QuerySourceNamer.GetName(joinClause));
            var joinExpression  = HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters);
            var join            = innerJoin
                                ? _hqlTree.TreeBuilder.InnerJoin(joinExpression.AsExpression(), alias)
                                : (HqlTreeNode)_hqlTree.TreeBuilder.LeftJoin(joinExpression.AsExpression(), alias);

            join.AddChild(_hqlTree.TreeBuilder.With(withClause));
            _hqlTree.AddFromClause(join);
        }
Ejemplo n.º 4
0
        private void VisitUpdateClause(Expression expression)
        {
            var assignments = expression as BlockExpression
                              ?? throw new QueryException("Malformed update expression");

            foreach (BinaryExpression assigment in assignments.Expressions)
            {
                var propName  = ((ParameterExpression)assigment.Left).Name;
                var setter    = assigment.Right;
                var setterHql = HqlGeneratorExpressionVisitor.Visit(setter, VisitorParameters).AsExpression();

                _hqlTree.AddSet(_hqlTree.TreeBuilder.Equality(_hqlTree.TreeBuilder.Ident(propName), setterHql));
            }
        }
Ejemplo n.º 5
0
        private void VisitUpdateClause(Expression expression)
        {
            var listInit = expression as ListInitExpression
                           ?? throw new QueryException("Malformed update expression");

            foreach (var initializer in listInit.Initializers)
            {
                var member    = (ConstantExpression)initializer.Arguments[0];
                var setter    = initializer.Arguments[1];
                var setterHql = HqlGeneratorExpressionVisitor.Visit(setter, VisitorParameters).AsExpression();

                _hqlTree.AddSet(_hqlTree.TreeBuilder.Equality(_hqlTree.TreeBuilder.Ident((string)member.Value),
                                                              setterHql));
            }
        }
Ejemplo n.º 6
0
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            var querySourceName    = VisitorParameters.QuerySourceNamer.GetName(fromClause);
            var fromExpressionTree = HqlGeneratorExpressionVisitor.Visit(fromClause.FromExpression, VisitorParameters);
            var alias = _hqlTree.TreeBuilder.Alias(querySourceName);

            if (fromClause.FromExpression is MemberExpression)
            {
                // It's a join
                _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Join(fromExpressionTree.AsExpression(), alias));
            }
            else
            {
                _hqlTree.AddFromClause(CreateCrossJoin(fromExpressionTree, alias));
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }
Ejemplo n.º 7
0
        public override Expression Visit(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.Visit(expression));
        }
Ejemplo n.º 8
0
        public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel)
        {
            var querySourceName   = VisitorParameters.QuerySourceNamer.GetName(fromClause);
            var hqlExpressionTree = HqlGeneratorExpressionVisitor.Visit(fromClause.FromExpression, VisitorParameters);

            _hqlTree.AddFromClause(_hqlTree.TreeBuilder.Range(hqlExpressionTree, _hqlTree.TreeBuilder.Alias(querySourceName)));

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

            base.VisitMainFromClause(fromClause, queryModel);
        }
Ejemplo n.º 9
0
        public override void VisitAdditionalFromClause(AdditionalFromClause fromClause, QueryModel queryModel, int index)
        {
            var querySourceName = VisitorParameters.QuerySourceNamer.GetName(fromClause);

            if (fromClause.FromExpression is MemberExpression)
            {
                // It's a join
                _hqlTree.AddFromClause(
                    _hqlTree.TreeBuilder.Join(
                        HqlGeneratorExpressionVisitor.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(
                        HqlGeneratorExpressionVisitor.Visit(fromClause.FromExpression, VisitorParameters),
                        _hqlTree.TreeBuilder.Alias(querySourceName)));
            }

            base.VisitAdditionalFromClause(fromClause, queryModel, index);
        }
Ejemplo n.º 10
0
        public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index)
        {
            var         equalityVisitor = new EqualityHqlGenerator(VisitorParameters);
            var         withClause      = equalityVisitor.Visit(joinClause.InnerKeySelector, joinClause.OuterKeySelector);
            var         alias           = _hqlTree.TreeBuilder.Alias(VisitorParameters.QuerySourceNamer.GetName(joinClause));
            var         joinExpression  = HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters);
            HqlTreeNode join;

            // When associations are located inside the inner key selector we have to use a cross join instead of an inner
            // join and add the condition in the where statement.
            if (queryModel.BodyClauses.OfType <NhJoinClause>().Any(o => o.ParentJoinClause == joinClause))
            {
                _hqlTree.AddWhereClause(withClause);
                join = CreateCrossJoin(joinExpression, alias);
            }
            else
            {
                join = _hqlTree.TreeBuilder.InnerJoin(joinExpression.AsExpression(), alias);
                join.AddChild(_hqlTree.TreeBuilder.With(withClause));
            }

            _hqlTree.AddFromClause(join);
        }
        public override void VisitNhJoinClause(NhJoinClause joinClause, QueryModel queryModel, int index)
        {
            var querySourceName = VisitorParameters.QuerySourceNamer.GetName(joinClause);
            var fetchRequest    = GetRelatedFetchRequest(queryModel, joinClause);

            if (fetchRequest != null)
            {
                RelatedJoinFetchRequests.Add(joinClause, fetchRequest);
            }

            var expression = HqlGeneratorExpressionVisitor.Visit(joinClause.FromExpression, VisitorParameters).AsExpression();
            var alias      = _hqlTree.TreeBuilder.Alias(querySourceName);

            HqlTreeNode hqlJoin;

            if (joinClause.IsInner)
            {
                hqlJoin = fetchRequest != null
                                        ? _hqlTree.TreeBuilder.FetchJoin(expression, alias)
                                        : (HqlTreeNode)_hqlTree.TreeBuilder.Join(expression, alias);
            }
            else
            {
                hqlJoin = fetchRequest != null
                                        ? _hqlTree.TreeBuilder.LeftFetchJoin(expression, alias)
                                        : (HqlTreeNode)_hqlTree.TreeBuilder.LeftJoin(expression, alias);
            }

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

            _hqlTree.AddFromClause(hqlJoin);
        }