/// <summary> /// Format a calculate table expression /// </summary> /// <param name="calculateTable">expression to be formatted</param> /// <returns>the original expression</returns> protected override Expression VisitCalculateTableExpression(CalculateTableExpression calculateTable) { if (calculateTable.Filters == null) { return(this.Visit(calculateTable.MainTable)); } this.Builder.Append("\tCALCULATETABLE("); this.Visit(calculateTable.MainTable); this.Builder.Append(","); this.Visit(calculateTable.Filters); this.Builder.Append(")"); return(calculateTable); }
internal Expression Rewrite() { var keys = Grouping.KeyProjection; var keyColumns = new ColumnProjector(TabularExpressionHelper.CanBeColumn).ProjectColumns(keys); var keyFilters = keyColumns.Columns.Select(c => Expression.Equal(c.Expression, c.Expression)).Aggregate((x, y) => Expression.And(x, y)); var subQueryBase = new CalculateTableExpression(Grouping.SubQueryProjectionExpression.Type, Grouping.SubQueryProjectionExpression.Source, keyFilters); var subQuery = new SubQueryProjection(Grouping.SubQueryProjectionExpression.Type, new ProjectionExpression(subQueryBase, Grouping.SubQueryProjectionExpression.Projector)); Type groupType = typeof(TabularGrouping <,>).MakeGenericType(new Type[] { Grouping.KeyProjection.Type, Grouping.SubQueryProjectionExpression.Type }); return(new ProjectionExpression(new SummarizeExpression(groupType, new List <ColumnDeclaration>().AsReadOnly(), Grouping.SubQueryProjectionExpression.Source), subQuery)); }