=== modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/CrossTabService.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/CrossTabService.java 2011-01-09 13:02:36 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/CrossTabService.java 2011-01-09 21:24:40 +0000 @@ -49,7 +49,7 @@ * @param organisationUnitIds the collection of OrganisationUnit identifiers. * @return the DataElementOperands where data exists. */ - boolean populateAndTrimCrossTabTable( final Collection operands, + Collection populateAndTrimCrossTabTable( final Collection operands, final Collection periodIds, final Collection organisationUnitIds, String key ); /** === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java 2011-01-09 13:02:36 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java 2011-01-09 21:24:40 +0000 @@ -87,14 +87,14 @@ // CrossTabService implementation // ------------------------------------------------------------------------- - public boolean populateAndTrimCrossTabTable( final Collection operands, + public Collection populateAndTrimCrossTabTable( final Collection operands, final Collection periodIds, final Collection organisationUnitIds, String key ) { Collection operandsWithData = populateCrossTabTable( operands, periodIds, organisationUnitIds, key ); trimCrossTabTable( operandsWithData, key ); - return operandsWithData != null; + return operandsWithData; } public Collection populateCrossTabTable( final Collection operands, @@ -102,7 +102,7 @@ { if ( validate( operands, periodIds, organisationUnitIds ) ) { - final Set operandsWithData = new HashSet( operands ); + final Set operandsWithData = new HashSet(); final List operandList = new ArrayList( operands ); @@ -116,8 +116,7 @@ log.info( "Created crosstab table" ); - final BatchHandler batchHandler = batchHandlerFactory - .createBatchHandler( GenericBatchHandler.class ); + final BatchHandler batchHandler = batchHandlerFactory.createBatchHandler( GenericBatchHandler.class ); batchHandler.setTableName( CrossTabStore.TABLE_NAME + key ); batchHandler.init(); @@ -190,7 +189,8 @@ public void trimCrossTabTable( Collection operands, String key ) { // TODO use H2 in-memory table for datavaluecrosstab table ? - + // TODO more compact crosstab tables by dividing up based on periodtype? + if ( operands != null && key != null ) { crossTabStore.createTrimmedCrossTabTable( operands, key ); === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java 2011-01-09 20:16:36 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java 2011-01-09 21:24:40 +0000 @@ -235,7 +235,7 @@ } // --------------------------------------------------------------------- - // Filter and get operands + // Get operands // --------------------------------------------------------------------- Collection nonCalculatedOperands = categoryService.getOperands( nonCalculatedDataElements ); @@ -268,20 +268,27 @@ state.setMessage( "crosstabulating_data" ); - Collection childrenIds = organisationUnitService.getOrganisationUnitHierarchy().getChildren( - organisationUnitIds ); - + Collection childrenIds = organisationUnitService.getOrganisationUnitHierarchy().getChildren( organisationUnitIds ); Collection intersectingPeriodIds = ConversionUtils.getIdentifiers( Period.class, periodService.getIntersectionPeriods( periods ) ); - boolean valid = crossTabService.populateAndTrimCrossTabTable( allOperands, intersectingPeriodIds, childrenIds, key ); + Collection operandsWithData = crossTabService.populateAndTrimCrossTabTable( allOperands, intersectingPeriodIds, childrenIds, key ); - if ( !valid ) - { - return 0; - } - log.info( "Populated crosstab table: " + TimeUtils.getHMS() ); + if ( operandsWithData == null ) + { + return 0; + } + + // --------------------------------------------------------------------- + // Remove operands without data + // --------------------------------------------------------------------- + + nonCalculatedOperands.retainAll( operandsWithData ); + indicatorOperands.retainAll( operandsWithData ); + calculatedOperands.retainAll( operandsWithData ); + allOperands.retainAll( operandsWithData ); + // --------------------------------------------------------------------- // Data element export // --------------------------------------------------------------------- === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/util/ParserUtil.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/util/ParserUtil.java 2010-12-08 15:13:31 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/util/ParserUtil.java 2011-01-09 21:24:40 +0000 @@ -29,8 +29,6 @@ import static org.hisp.dhis.expression.Expression.SEPARATOR; -import java.util.ArrayList; -import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -118,27 +116,4 @@ throw new RuntimeException( "Illegal data element or category combo id", ex ); } } - - /** - * Filters the data element operands based on the value type. - * - * @param valueType the value type to filter. - * @param aggregationOperator the aggregation operator to filter. - */ - public static Collection filterOperands( Collection operands, String valueType, - String aggregationOperator ) - { - final Collection filtered = new ArrayList(); - - for ( DataElementOperand operand : operands ) - { - if ( operand.getValueType().equals( valueType ) - && operand.getAggregationOperator().equals( aggregationOperator ) ) - { - filtered.add( operand ); - } - } - - return filtered; - } }