public void RemoveUnusedColumns_WithCount_Ensure_AggregateExpressionWithGrouping_Removed( )
        {
            ResourceEntity  resNode = new ResourceEntity( );
            AggregateEntity aggNode = new AggregateEntity {
                GroupedEntity = resNode
            };

            aggNode.GroupBy.Add(new ResourceDataColumn( ));
            SelectColumn col1 = new SelectColumn {
                Expression = new ResourceDataColumn( )
            };
            SelectColumn col2 = new SelectColumn {
                Expression = new AggregateExpression {
                    NodeId = aggNode.NodeId
                }
            };
            StructuredQuery query = new StructuredQuery( );

            query.RootEntity = aggNode;
            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);

            ClientAggregate agg = new ClientAggregate( );

            agg.AggregatedColumns.Add(new ReportAggregateField {
                AggregateMethod = AggregateMethod.Count
            });

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(2));
            Assert.That(result.SelectColumns [0].Expression, Is.TypeOf <IdExpression>( ));
            Assert.That(result.SelectColumns [1].Expression, Is.TypeOf <AggregateExpression>( ));
        }
        public void RemoveUnusedColumns_SupportQuickSearch_WithCount_Ensure_FieldExpression_NotReplaced()
        {
            SelectColumn col1 = new SelectColumn {
                Expression = new ResourceDataColumn()
            };
            SelectColumn col2 = new SelectColumn {
                Expression = new ResourceDataColumn()
            };
            StructuredQuery query = new StructuredQuery();

            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);

            ClientAggregate agg = new ClientAggregate();

            agg.AggregatedColumns.Add(new ReportAggregateField {
                AggregateMethod = AggregateMethod.Count
            });

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg, true);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(2));
            Assert.That(result.SelectColumns[0].Expression, Is.TypeOf <ResourceDataColumn>());
            Assert.That(result.SelectColumns[1].Expression, Is.TypeOf <ResourceDataColumn>());
            Assert.IsTrue(result.SelectColumns[0].IsHidden);
            Assert.IsTrue(result.SelectColumns[1].IsHidden);
        }
        public void RemoveUnusedColumns_ReturnClone()
        {
            StructuredQuery query  = new StructuredQuery( );
            ClientAggregate agg    = new ClientAggregate( );
            var             result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result, Is.Not.SameAs(query));
        }
        public void RemoveUnusedColumns_EnsureAtLeastOneColumnRemains( )
        {
            SelectColumn    col1  = new SelectColumn( );
            SelectColumn    col2  = new SelectColumn( );
            StructuredQuery query = new StructuredQuery( );

            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);

            ClientAggregate agg = new ClientAggregate( );

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(1));
            Assert.That(result.SelectColumns [0].ColumnId, Is.EqualTo(col1.ColumnId));
        }
        public void RemoveUnusedColumns_AggregateColumn_Not_Removed( )
        {
            SelectColumn    col1  = new SelectColumn( );
            SelectColumn    col2  = new SelectColumn( );
            StructuredQuery query = new StructuredQuery( );

            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);

            ClientAggregate agg = new ClientAggregate( );

            agg.AggregatedColumns.Add(new ReportAggregateField {
                ReportColumnId = col2.ColumnId, AggregateMethod = AggregateMethod.Max
            });

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(1));
            Assert.That(result.SelectColumns [0].ColumnId, Is.EqualTo(col2.ColumnId));
        }
        public void RemoveUnusedColumns_EnsureAnalyzerColumn_Not_Removed( )
        {
            SelectColumn   col1  = new SelectColumn( );
            SelectColumn   col2  = new SelectColumn( );
            QueryCondition cond1 = new QueryCondition {
                Expression = new ColumnReference {
                    ColumnId = col2.ColumnId
                }
            };
            StructuredQuery query = new StructuredQuery( );

            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);
            query.Conditions.Add(cond1);

            ClientAggregate agg = new ClientAggregate( );

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(1));
            Assert.That(result.SelectColumns [0].ColumnId, Is.EqualTo(col2.ColumnId));
        }
        public void RemoveUnusedColumns_EnsureUnusedOrderbyRemoved( )
        {
            SelectColumn col1   = new SelectColumn( );
            SelectColumn col2   = new SelectColumn( );
            SelectColumn col3   = new SelectColumn( );
            OrderByItem  order1 = new OrderByItem {
                Expression = new ColumnReference {
                    ColumnId = col1.ColumnId
                }, Direction = OrderByDirection.Ascending
            };
            OrderByItem order2 = new OrderByItem {
                Expression = new ColumnReference {
                    ColumnId = col2.ColumnId
                }, Direction = OrderByDirection.Descending
            };
            StructuredQuery query = new StructuredQuery( );

            query.SelectColumns.Add(col1);
            query.SelectColumns.Add(col2);
            query.SelectColumns.Add(col3);
            query.OrderBy.Add(order1);
            query.OrderBy.Add(order2);

            ClientAggregate agg = new ClientAggregate( );

            agg.AggregatedColumns.Add(new ReportAggregateField {
                ReportColumnId = col2.ColumnId, AggregateMethod = AggregateMethod.Max
            });

            StructuredQuery result = ReportRollupHelper.RemoveUnusedColumns(query, agg);

            Assert.That(result.SelectColumns.Count, Is.EqualTo(1), "Cols");
            Assert.That(result.SelectColumns [0].ColumnId, Is.EqualTo(col2.ColumnId));

            Assert.That(result.OrderBy.Count, Is.EqualTo(1), "Order");
            Assert.That(result.OrderBy [0].Direction, Is.EqualTo(OrderByDirection.Descending));
        }
        private PreparedQuery PrepareReportRollupRun(Model.Report report, StructuredQuery structuredQuery, ReportSettings reportSettings, QuerySettings nonRollupQuerySettings)
        {
            StructuredQuery rollupQuery     = null;
            ClientAggregate clientAggregate = null;
            StructuredQuery optimisedQuery;
            QuerySettings   rollupSettings;
            bool            adhocRollup;
            bool            reportRollup;

            adhocRollup  = reportSettings.ReportParameters != null && reportSettings.ReportParameters.GroupAggregateRules != null;
            reportRollup = !adhocRollup && report.ReportColumns.Any(rc => rc.ColumnRollup.Count > 0 || rc.ColumnGrouping.Count > 0);

            if (adhocRollup)
            {
                clientAggregate = ApplyAdhocAggregates(reportSettings.ReportParameters.GroupAggregateRules, structuredQuery);
            }
            else if (reportRollup)
            {
                clientAggregate = new ClientAggregate(report, structuredQuery);
                clientAggregate.IncludeRollup = true;
            }
            else if (report.RollupGrandTotals != null || report.RollupSubTotals != null || report.RollupOptionLabels != null)
            {
                return(new PreparedQuery
                {
                    ClientAggregate = new ClientAggregate( )
                });
            }
            else
            {
                return(new PreparedQuery( ));
            }

            // Clone the query, so that runs and rollups won't intefere with each others caches if they mutate the structure
            // In particular, calculated columns get evaluated during execution and mutate the query .. but only if the result doesn't come from cache, but this interferes with the rollup cache key.
            // Ideally, both calculations and optimisations would be provided in layers, and both applied, and cached, before either normal or rollup executions are run.
            rollupQuery = structuredQuery.DeepCopy( );

            // A poor proxy for determining that this is not a pivot chart.
            bool isGroupedReport = !(reportSettings.ReportParameters != null &&
                                     reportSettings.ReportParameters.GroupAggregateRules != null &&
                                     reportSettings.ReportParameters.GroupAggregateRules.IgnoreRows);

            if (isGroupedReport)
            {
                ReportRollupHelper.EnsureShowTotalsHasCount(rollupQuery, clientAggregate);
            }

            // Remove unused columns
            bool supportQuickSearch = !string.IsNullOrWhiteSpace(reportSettings.QuickSearch);

            optimisedQuery = ReportRollupHelper.RemoveUnusedColumns(rollupQuery, clientAggregate, supportQuickSearch);

            rollupSettings = new QuerySettings
            {
                SecureQuery             = nonRollupQuerySettings.SecureQuery,
                SupportClientAggregate  = true,
                SupportPaging           = false,
                QuickSearchTerm         = reportSettings.QuickSearch,
                SupportQuickSearch      = supportQuickSearch, // rollups query support quick search.
                ClientAggregate         = clientAggregate,
                AdditionalOrderColumns  = BuildAdditionOrderColumnDictionary(optimisedQuery, clientAggregate),
                FullAggregateClustering = true,
                Hint             = "RptRollup-" + report.Id,
                TargetResource   = nonRollupQuerySettings.TargetResource,
                IncludeResources = nonRollupQuerySettings.IncludeResources,
                ExcludeResources = nonRollupQuerySettings.ExcludeResources
            };
            // Note : do not apply quick search filter to rollups (for scalability reasons)


            PreparedQuery preparedQuery = new PreparedQuery
            {
                ClientAggregate = clientAggregate,
                StructuredQuery = optimisedQuery,
                QuerySettings   = rollupSettings
            };

            return(preparedQuery);
        }