public static void ReWrite(QueryModel model)
        {
            // firstly, get the group join clauses
            var groupJoin = model.BodyClauses.OfType <GroupJoinClause>();

            if (!groupJoin.Any())
            {
                // No group join here..
                return;
            }

            // Now walk the tree to decide which groupings are fully aggregated (and can hence be done in hql)
            var aggregateDetectorResults = IsAggregatingGroupJoin(model, groupJoin);

            if (aggregateDetectorResults.AggregatingClauses.Count > 0)
            {
                NonAggregatingGroupJoinRewriter.RewriteGroupJoins(aggregateDetectorResults.AggregatingClauses, model);

                // Re-write the select expression
                model.SelectClause.TransformExpressions(s => GroupJoinSelectClauseRewriter.ReWrite(s, aggregateDetectorResults));

                // Remove the aggregating group joins
                foreach (var aggregatingGroupJoin in aggregateDetectorResults.AggregatingClauses)
                {
                    model.BodyClauses.Remove(aggregatingGroupJoin);
                }
            }
        }