protected override Expression VisitExpression(Expression expression) { if (expression == null) { return null; } if (_hqlNodes.Contains(expression)) { // Pure HQL evaluation var hqlVisitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); hqlVisitor.Visit(expression); hqlVisitor.GetHqlTreeNodes().ForEach(n =>_stack.PushLeaf(n) ); 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) { if (fromClause.FromExpression is MemberExpression) { var member = (MemberExpression) fromClause.FromExpression; if (member.Expression is QuerySourceReferenceExpression) { // It's a join var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); visitor.Visit(fromClause.FromExpression); HqlJoin joinNode = _hqlTreeBuilder.Join( visitor.GetHqlTreeNodes().Single(), _hqlTreeBuilder.Alias(fromClause.ItemName)); _fromClause.AddChild(joinNode); } } base.VisitAdditionalFromClause(fromClause, queryModel, index); }
public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel queryModel, int index) { _orderByClause = _hqlTreeBuilder.OrderBy(); foreach (Ordering clause in orderByClause.Orderings) { var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); visitor.Visit(clause.Expression); _orderByClause.AddChild(visitor.GetHqlTreeNodes().Single()); _orderByClause.AddChild(clause.OrderingDirection == OrderingDirection.Asc ? _hqlTreeBuilder.Ascending() : (HqlTreeNode) _hqlTreeBuilder.Descending()); } base.VisitOrderByClause(orderByClause, queryModel, index); }
public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { // Visit the predicate to build the query var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); visitor.Visit(whereClause.Predicate); // There maybe a where clause in existence already, in which case we AND with it. if (_whereClause == null) { _whereClause = _hqlTreeBuilder.Where(visitor.GetHqlTreeNodes().Single()); } else { HqlAnd mergedPredicates = _hqlTreeBuilder.And(_whereClause.Children.Single(), visitor.GetHqlTreeNodes().Single()); _whereClause = _hqlTreeBuilder.Where(mergedPredicates); } }
private void ProcessGroupByOperator(GroupResultOperator resultOperator) { var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); visitor.Visit(resultOperator.KeySelector); _groupByClause = _hqlTreeBuilder.GroupBy(); _groupByClause.AddChild(visitor.GetHqlTreeNodes().Single()); }
public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel) { var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); visitor.Visit(fromClause.FromExpression); _fromClause = _hqlTreeBuilder.From( _hqlTreeBuilder.Range( visitor.GetHqlTreeNodes().Single(), _hqlTreeBuilder.Alias(fromClause.ItemName))); base.VisitMainFromClause(fromClause, queryModel); }