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))); }
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); }
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)); } }
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)); } }
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); }
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)); }
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); }
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); }
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); }