=== modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/dataelement/DefaultDataElementDataMart.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/dataelement/DefaultDataElementDataMart.java 2010-06-17 21:08:46 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/dataelement/DefaultDataElementDataMart.java 2010-06-17 21:58:12 +0000 @@ -125,29 +125,32 @@ { final Map currentOperandIndexMap = dataElementAggregator.getOperandIndexMap( operands, period.getPeriodType(), operandIndexMap ); - for ( final OrganisationUnit unit : organisationUnits ) + if ( currentOperandIndexMap != null && currentOperandIndexMap.size() > 0 ) { - final int level = aggregationCache.getLevelOfOrganisationUnit( unit.getId() ); - - final Map valueMap = dataElementAggregator.getAggregatedValues( currentOperandIndexMap, period, unit, level, hierarchy ); - - final PeriodType periodType = period.getPeriodType(); - - for ( Entry entry : valueMap.entrySet() ) + for ( final OrganisationUnit unit : organisationUnits ) { - value.clear(); - - value.setDataElementId( entry.getKey().getDataElementId() ); - value.setCategoryOptionComboId( entry.getKey().getOptionComboId() ); - value.setPeriodId( period.getId() ); - value.setPeriodTypeId( periodType.getId() ); - value.setOrganisationUnitId( unit.getId() ); - value.setLevel( level ); - value.setValue( getRounded( entry.getValue(), DECIMALS ) ); - - batchHandler.addObject( value ); - - count++; + final int level = aggregationCache.getLevelOfOrganisationUnit( unit.getId() ); + + final Map valueMap = dataElementAggregator.getAggregatedValues( currentOperandIndexMap, period, unit, level, hierarchy ); + + final PeriodType periodType = period.getPeriodType(); + + for ( Entry entry : valueMap.entrySet() ) + { + value.clear(); + + value.setDataElementId( entry.getKey().getDataElementId() ); + value.setCategoryOptionComboId( entry.getKey().getOptionComboId() ); + value.setPeriodId( period.getId() ); + value.setPeriodTypeId( periodType.getId() ); + value.setOrganisationUnitId( unit.getId() ); + value.setLevel( level ); + value.setValue( getRounded( entry.getValue(), DECIMALS ) ); + + batchHandler.addObject( value ); + + count++; + } } } } === 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 2010-06-17 21:08:46 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java 2010-06-17 21:58:12 +0000 @@ -29,6 +29,8 @@ import static org.hisp.dhis.dataelement.DataElement.VALUE_TYPE_BOOL; import static org.hisp.dhis.dataelement.DataElement.VALUE_TYPE_INT; +import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_SUM; +import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_AVERAGE; import static org.hisp.dhis.datamart.util.ParserUtil.getDataElementIdsInExpression; import java.util.ArrayList; @@ -236,10 +238,12 @@ final Collection dataElementInCalculatedDataElementOperands = categoryService.getOperandsByIds( dataElementInCalculatedDataElementIds ); final Collection nonCalculatedDataElementOperands = categoryService.getOperandsByIds( nonCalculatedDataElementIds ); - final Collection intNonCalculatedDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_INT ); - final Collection boolNonCalculatedDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_BOOL ); + final Collection sumIntDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_INT, AGGREGATION_OPERATOR_SUM ); + final Collection averageIntDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_INT, AGGREGATION_OPERATOR_AVERAGE ); + final Collection sumBoolDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_BOOL, AGGREGATION_OPERATOR_SUM ); + final Collection averageBoolDataElementOperands = filterOperands( nonCalculatedDataElementOperands, VALUE_TYPE_BOOL, AGGREGATION_OPERATOR_AVERAGE ); - log.info( "Filtered data elements" ); + log.info( "Filtered data elements: " + TimeUtils.getHMS() ); // --------------------------------------------------------------------- // Create and trim crosstabtable @@ -276,39 +280,39 @@ state.setMessage( "exporting_data_for_data_elements" ); - if ( intNonCalculatedDataElementOperands.size() > 0 ) - { - count += dataElementDataMart.exportDataValues( intNonCalculatedDataElementOperands, periodIds, organisationUnitIds, sumIntAggregator ); - - log.info( "Exported values for data elements with sum aggregation operator of type number: " + TimeUtils.getHMS() ); - } - - if ( intNonCalculatedDataElementOperands.size() > 0 ) - { - count += dataElementDataMart.exportDataValues( intNonCalculatedDataElementOperands, periodIds, organisationUnitIds, averageIntAggregator ); - - log.info( "Exported values for data elements with average aggregation operator of type number: " + TimeUtils.getHMS() ); - } - - if ( intNonCalculatedDataElementOperands.size() > 0 ) - { - count += dataElementDataMart.exportDataValues( intNonCalculatedDataElementOperands, periodIds, organisationUnitIds, averageIntSingleValueAggregator ); - - log.info( "Exported values for data elements with average aggregation operator with single value of type number: " + TimeUtils.getHMS() ); - } - - if ( boolNonCalculatedDataElementOperands.size() > 0 ) - { - count += dataElementDataMart.exportDataValues( boolNonCalculatedDataElementOperands, periodIds, organisationUnitIds, sumBoolAggregator ); - - log.info( "Exported values for data elements with sum aggregation operator of type yes/no: " + TimeUtils.getHMS() ); - } - - if ( boolNonCalculatedDataElementOperands.size() > 0 ) - { - count += dataElementDataMart.exportDataValues( boolNonCalculatedDataElementOperands, periodIds, organisationUnitIds, averageBoolAggregator ); - - log.info( "Exported values for data elements with average aggregation operator of type yes/no: " + TimeUtils.getHMS() ); + if ( sumIntDataElementOperands.size() > 0 ) + { + count += dataElementDataMart.exportDataValues( sumIntDataElementOperands, periodIds, organisationUnitIds, sumIntAggregator ); + + log.info( "Exported values for data element operands with sum aggregation operator of type number (" + sumIntDataElementOperands.size() + "): " + TimeUtils.getHMS() ); + } + + if ( averageIntDataElementOperands.size() > 0 ) + { + count += dataElementDataMart.exportDataValues( averageIntDataElementOperands, periodIds, organisationUnitIds, averageIntAggregator ); + + log.info( "Exported values for data element operands with average aggregation operator of type number (" + averageIntDataElementOperands.size() + "): " + TimeUtils.getHMS() ); + } + + if ( averageIntDataElementOperands.size() > 0 ) + { + count += dataElementDataMart.exportDataValues( averageIntDataElementOperands, periodIds, organisationUnitIds, averageIntSingleValueAggregator ); + + log.info( "Exported values for data element operands with average aggregation operator with single value of type number (" + averageIntDataElementOperands.size() + "): " + TimeUtils.getHMS() ); + } + + if ( sumBoolDataElementOperands.size() > 0 ) + { + count += dataElementDataMart.exportDataValues( sumBoolDataElementOperands, periodIds, organisationUnitIds, sumBoolAggregator ); + + log.info( "Exported values for data element operands with sum aggregation operator of type yes/no (" + sumBoolDataElementOperands.size() + "): " + TimeUtils.getHMS() ); + } + + if ( averageBoolDataElementOperands.size() > 0 ) + { + count += dataElementDataMart.exportDataValues( averageBoolDataElementOperands, periodIds, organisationUnitIds, averageBoolAggregator ); + + log.info( "Exported values for data element operands with average aggregation operator of type yes/no (" + averageBoolDataElementOperands.size() + "): " + TimeUtils.getHMS() ); } state.setMessage( "exporting_data_for_indicators" ); @@ -321,7 +325,7 @@ { count += indicatorDataMart.exportIndicatorValues( indicatorIds, periodIds, organisationUnitIds, dataElementInIndicatorOperands ); - log.info( "Exported values for indicator: " + TimeUtils.getHMS() ); + log.info( "Exported values for indicators (" + indicatorIds.size() + "): " + TimeUtils.getHMS() ); } state.setMessage( "exporting_data_for_calculated_data_elements" ); @@ -436,13 +440,13 @@ /** * Filters the data element operands based on the value type. */ - private Collection filterOperands( Collection operands, String valueType ) + private Collection filterOperands( Collection operands, String valueType, String aggregationOperator ) { final Collection filtered = new ArrayList(); for ( DataElementOperand operand : operands ) { - if ( operand.getValueType().equals( valueType ) ) + if ( operand.getValueType().equals( valueType ) && operand.getAggregationOperator().equals( aggregationOperator ) ) { filtered.add( operand ); }