예제 #1
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(
                    HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters),
                    _hqlTree.TreeBuilder.Alias(joinClause.ItemName)));
        }
예제 #2
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);
            }
        }
예제 #3
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));
            }
        }
예제 #4
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(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));
        }
예제 #5
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);
        }
예제 #6
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);
        }