public Expression SimplifyIfPossible (
SqlSubStatementExpression subStatementExpression,
Expression unresolvedSelectProjection)
{
ArgumentUtility.CheckNotNull ("subStatementExpression", subStatementExpression);
ArgumentUtility.CheckNotNull ("unresolvedSelectProjection", unresolvedSelectProjection);
var resolvedSqlStatement = subStatementExpression.SqlStatement;
if (IsSimplifiableGroupAggregate (resolvedSqlStatement))
{
var joinedGroupingTableInfo = (ResolvedJoinedGroupingTableInfo) resolvedSqlStatement.SqlTables[0].GetResolvedTableInfo ();
// Strip surrounding names so that there won't be a named expression inside the new aggregation
var elementExpression = _context.RemoveNamesAndUpdateMapping (joinedGroupingTableInfo.AssociatedGroupingSelectExpression.ElementExpression);
var visitor = new SimplifyingVisitor (resolvedSqlStatement.SqlTables[0], elementExpression);
var aggregationExpression = FindAggregationExpression (unresolvedSelectProjection);
if (aggregationExpression == null)
{
throw new ArgumentException (
"The unresolved projection doesn't match the resolved statement: it has no aggregation.",
"unresolvedSelectProjection");
}
var newAggregation = visitor.VisitExpression (aggregationExpression);
if (visitor.CanBeTransferredToGroupingSource)
{
var resolvedNewAggregation = _stage.ResolveAggregationExpression (newAggregation, _context);
var aggregationName = joinedGroupingTableInfo.AssociatedGroupingSelectExpression.AddAggregationExpressionWithName (resolvedNewAggregation);
return new SqlColumnDefinitionExpression (
resolvedSqlStatement.SelectProjection.Type,
joinedGroupingTableInfo.GroupSourceTableAlias,
aggregationName,
false);
}
}
return subStatementExpression;
}