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); }