private void FlattenSubQuery(SubQueryExpression subQueryExpression, FromClauseBase fromClause,
                                     QueryModel queryModel)
        {
            // Move the result operator up
            if (queryModel.ResultOperators.Count != 0)
            {
                throw new NotImplementedException();
            }

            var groupBy = (GroupResultOperator)subQueryExpression.QueryModel.ResultOperators[0];

            // Replace the outer select clause...
            queryModel.SelectClause.TransformExpressions(s => GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryExpression.QueryModel));

            queryModel.SelectClause.TransformExpressions(
                s =>
                new SwapQuerySourceVisitor(queryModel.MainFromClause, subQueryExpression.QueryModel.MainFromClause).Swap
                    (s));

            MainFromClause innerMainFromClause = subQueryExpression.QueryModel.MainFromClause;

            CopyFromClauseData(innerMainFromClause, fromClause);

            foreach (var bodyClause in subQueryExpression.QueryModel.BodyClauses)
            {
                queryModel.BodyClauses.Add(bodyClause);
            }

            queryModel.ResultOperators.Add(groupBy);
        }
Example #2
0
 protected override Expression VisitSubQueryExpression(SubQueryExpression expression)
 {
     // TODO - is this safe?  All we are extracting is the select clause from the sub-query.  Assumes that everything
     // else in the subquery has been removed.  If there were two subqueries, one aggregating & one not, this may not be a
     // valid assumption.  Should probably be passed a list of aggregating subqueries that we are flattening so that we can check...
     return(GroupBySelectClauseRewriter.ReWrite(expression.QueryModel.SelectClause.Selector, _groupBy, _model));
 }
Example #3
0
        private static void FlattenSubQuery(QueryModel queryModel, QueryModel subQueryModel)
        {
            // Move the result operator up
            if (queryModel.ResultOperators.Count > 0 && queryModel.ResultOperators.Any(resultOperator => !_resultOperators.Contains(resultOperator.GetType())))
            {
                throw new NotImplementedException();
            }

            var groupBy = (GroupResultOperator)subQueryModel.ResultOperators[0];

            queryModel.ResultOperators.Insert(0, groupBy);

            for (var i = 0; i < queryModel.BodyClauses.Count; i++)
            {
                var clause = queryModel.BodyClauses[i];
                clause.TransformExpressions(s => GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryModel));

                //all outer where clauses actually are having clauses
                var whereClause = clause as WhereClause;
                if (whereClause != null)
                {
                    queryModel.BodyClauses.RemoveAt(i);
                    queryModel.BodyClauses.Insert(i, new NhHavingClause(whereClause.Predicate));
                }
            }

            foreach (var bodyClause in subQueryModel.BodyClauses)
            {
                queryModel.BodyClauses.Add(bodyClause);
            }


            // Replace the outer select clause...
            queryModel.SelectClause.TransformExpressions(s =>
                                                         GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryModel));

            // Point all query source references to the outer from clause
            var visitor = new SwapQuerySourceVisitor(queryModel.MainFromClause, subQueryModel.MainFromClause);

            queryModel.TransformExpressions(visitor.Swap);

            // Replace the outer query source
            queryModel.MainFromClause = subQueryModel.MainFromClause;
        }
Example #4
0
        private static void FlattenSubQuery(SubQueryExpression subQueryExpression, QueryModel queryModel)
        {
            // Move the result operator up
            if (queryModel.ResultOperators.Count != 0)
            {
                throw new NotImplementedException();
            }

            var groupBy = (GroupResultOperator)subQueryExpression.QueryModel.ResultOperators[0];

            queryModel.ResultOperators.Add(groupBy);

            foreach (var whereClause in queryModel.BodyClauses.OfType <WhereClause>().ToArray())
            {
                //all outer where clauses actually are having clauses
                var clause = new NhHavingClause(whereClause.Predicate);

                queryModel.BodyClauses.Add(clause);
                queryModel.BodyClauses.Remove(whereClause);
            }

            foreach (var bodyClause in subQueryExpression.QueryModel.BodyClauses)
            {
                queryModel.BodyClauses.Add(bodyClause);
            }

            // Replace the outer select clause...
            queryModel.SelectClause.TransformExpressions(s =>
                                                         GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryExpression.QueryModel));

            foreach (var clause in queryModel.BodyClauses)
            {
                clause.TransformExpressions(s => GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryExpression.QueryModel));
            }

            // Point all query source references to the outer from clause
            queryModel.TransformExpressions(s =>
                                            new SwapQuerySourceVisitor(queryModel.MainFromClause, subQueryExpression.QueryModel.MainFromClause).Swap(s));

            // Replace the outer query source
            queryModel.MainFromClause = subQueryExpression.QueryModel.MainFromClause;
        }
Example #5
0
        private static void FlattenSubQuery(QueryModel queryModel, QueryModel subQueryModel, GroupResultOperator groupBy)
        {
            foreach (var resultOperator in queryModel.ResultOperators.Where(resultOperator => !AcceptableOuterResultOperators.Contains(resultOperator.GetType())))
            {
                throw new NotImplementedException("Cannot use group by with the " + resultOperator.GetType().Name + " result operator.");
            }

            // Move the result operator up.
            SubQueryFromClauseFlattener.InsertResultOperators(subQueryModel.ResultOperators, queryModel);

            for (var i = 0; i < queryModel.BodyClauses.Count; i++)
            {
                var clause = queryModel.BodyClauses[i];
                clause.TransformExpressions(s => GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryModel));

                //all outer where clauses actually are having clauses
                var whereClause = clause as WhereClause;
                if (whereClause != null)
                {
                    queryModel.BodyClauses.RemoveAt(i);
                    queryModel.BodyClauses.Insert(i, new NhHavingClause(whereClause.Predicate));
                }
            }

            foreach (var bodyClause in subQueryModel.BodyClauses)
            {
                queryModel.BodyClauses.Add(bodyClause);
            }

            // Replace the outer select clause...
            queryModel.SelectClause.TransformExpressions(s =>
                                                         GroupBySelectClauseRewriter.ReWrite(s, groupBy, subQueryModel));

            // Point all query source references to the outer from clause
            var visitor = new SwapQuerySourceVisitor(queryModel.MainFromClause, subQueryModel.MainFromClause);

            queryModel.TransformExpressions(visitor.Swap);

            // Replace the outer query source
            queryModel.MainFromClause = subQueryModel.MainFromClause;
        }
Example #6
0
        public static Expression ReWrite(Expression expression, GroupResultOperator groupBy, QueryModel model)
        {
            var visitor = new GroupBySelectClauseRewriter(groupBy, model);

            return(visitor.VisitExpression(expression));
        }
		public static Expression ReWrite(Expression expression, GroupResultOperator groupBy, QueryModel model)
		{
			var visitor = new GroupBySelectClauseRewriter(groupBy, model);
			return visitor.VisitExpression(expression);
		}
Example #8
0
        public static Expression ReWrite(Expression expression, GroupResultOperator groupBy, QueryModel model)
        {
            var visitor = new GroupBySelectClauseRewriter(groupBy, model);

            return(TransparentIdentifierRemovingExpressionTreeVisitor.ReplaceTransparentIdentifiers(visitor.VisitExpression(expression)));
        }
		public static Expression ReWrite(Expression expression, GroupResultOperator groupBy, QueryModel model)
		{
			var visitor = new GroupBySelectClauseRewriter(groupBy, model);
			return TransparentIdentifierRemovingExpressionTreeVisitor.ReplaceTransparentIdentifiers(visitor.VisitExpression(expression));
		}