/// <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);
        }
Exemplo n.º 2
0
        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));
        }