=== added file 'dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceOrgUnitTest.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceOrgUnitTest.java 1970-01-01 00:00:00 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceOrgUnitTest.java 2011-12-19 21:44:03 +0000 @@ -0,0 +1,526 @@ +package org.hisp.dhis.datamart; + +/* + * Copyright (c) 2004-2010, University of Oslo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * * Neither the name of the HISP project nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +import static junit.framework.Assert.assertEquals; + +import java.util.Collection; +import java.util.Date; +import java.util.HashSet; + +import org.hisp.dhis.DhisTest; +import org.hisp.dhis.aggregation.AggregatedOrgUnitDataValueService; +import org.hisp.dhis.dataelement.DataElement; +import org.hisp.dhis.dataelement.DataElementCategoryCombo; +import org.hisp.dhis.dataelement.DataElementCategoryOptionCombo; +import org.hisp.dhis.dataelement.DataElementCategoryService; +import org.hisp.dhis.dataelement.DataElementService; +import org.hisp.dhis.dataset.DataSet; +import org.hisp.dhis.dataset.DataSetService; +import org.hisp.dhis.datavalue.DataValueService; +import org.hisp.dhis.expression.ExpressionService; +import org.hisp.dhis.indicator.Indicator; +import org.hisp.dhis.indicator.IndicatorService; +import org.hisp.dhis.indicator.IndicatorType; +import org.hisp.dhis.organisationunit.OrganisationUnit; +import org.hisp.dhis.organisationunit.OrganisationUnitGroup; +import org.hisp.dhis.organisationunit.OrganisationUnitGroupService; +import org.hisp.dhis.organisationunit.OrganisationUnitService; +import org.hisp.dhis.period.MonthlyPeriodType; +import org.hisp.dhis.period.Period; +import org.hisp.dhis.period.PeriodService; +import org.hisp.dhis.period.PeriodType; +import org.hisp.dhis.period.QuarterlyPeriodType; +import org.junit.Test; + +/** + * Note: Test using the default org unit level for org unit data mart which is 2. + * + * @author Lars Helge Overland + * @version $Id: DataMartServiceTest.java 5519 2008-08-05 09:00:31Z larshelg $ + */ +public class DataMartServiceOrgUnitTest + extends DhisTest +{ + private final String T = "true"; + private final String F = "false"; + + private DataMartService dataMartService; + + private DataElementCategoryCombo categoryCombo; + + private DataElementCategoryOptionCombo categoryOptionCombo; + + private Collection dataElementIds; + private Collection indicatorIds; + private Collection periodIds; + private Collection organisationUnitIds; + private Collection organisationUnitGroupIds; + + private DataElement dataElementA; + private DataElement dataElementB; + + private DataSet dataSet; + + private Period periodA; + private Period periodB; + private Period periodC; + private Period periodD; + + private OrganisationUnit unitA; + private OrganisationUnit unitB; + private OrganisationUnit unitC; + private OrganisationUnit unitD; + private OrganisationUnit unitE; + private OrganisationUnit unitF; + private OrganisationUnit unitG; + private OrganisationUnit unitH; + private OrganisationUnit unitI; + private OrganisationUnit unitJ; + private OrganisationUnit unitK; + private OrganisationUnit unitL; + + private OrganisationUnitGroup groupA; + private OrganisationUnitGroup groupB; + + @Override + public void setUpTest() + { + dataMartService = (DataMartService) getBean( DataMartService.ID ); + + aggregatedOrgUnitDataValueService = (AggregatedOrgUnitDataValueService) getBean( AggregatedOrgUnitDataValueService.ID ); + + categoryService = (DataElementCategoryService) getBean( DataElementCategoryService.ID ); + + dataElementService = (DataElementService) getBean( DataElementService.ID ); + + indicatorService = (IndicatorService) getBean( IndicatorService.ID ); + + dataSetService = (DataSetService) getBean( DataSetService.ID ); + + periodService = (PeriodService) getBean( PeriodService.ID ); + + organisationUnitService = (OrganisationUnitService) getBean( OrganisationUnitService.ID ); + + organisationUnitGroupService = (OrganisationUnitGroupService) getBean( OrganisationUnitGroupService.ID ); + + dataValueService = (DataValueService) getBean( DataValueService.ID ); + + expressionService = (ExpressionService) getBean( ExpressionService.ID ); + + categoryCombo = categoryService.getDataElementCategoryComboByName( DataElementCategoryCombo.DEFAULT_CATEGORY_COMBO_NAME ); + + categoryOptionCombo = categoryService.getDefaultDataElementCategoryOptionCombo(); + + // --------------------------------------------------------------------- + // Setup identifier Collections + // --------------------------------------------------------------------- + + dataElementIds = new HashSet(); + indicatorIds = new HashSet(); + periodIds = new HashSet(); + organisationUnitIds = new HashSet(); + organisationUnitGroupIds = new HashSet(); + + // --------------------------------------------------------------------- + // Setup DataElements + // --------------------------------------------------------------------- + + dataElementA = createDataElement( 'A', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo ); + dataElementB = createDataElement( 'B', DataElement.VALUE_TYPE_BOOL, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo ); + + dataElementIds.add( dataElementService.addDataElement( dataElementA ) ); + dataElementIds.add( dataElementService.addDataElement( dataElementB ) ); + + // --------------------------------------------------------------------- + // Setup DataSets (to get correct PeriodType for DataElements) + // --------------------------------------------------------------------- + + dataSet = createDataSet( 'A', new MonthlyPeriodType() ); + dataSet.getDataElements().add( dataElementA ); + dataSet.getDataElements().add( dataElementB ); + dataSetService.addDataSet( dataSet ); + dataElementA.getDataSets().add( dataSet ); + dataElementB.getDataSets().add( dataSet ); + dataElementService.updateDataElement( dataElementA ); + dataElementService.updateDataElement( dataElementB ); + + // --------------------------------------------------------------------- + // Setup Periods + // --------------------------------------------------------------------- + + PeriodType monthly = new MonthlyPeriodType(); + PeriodType quarterly = new QuarterlyPeriodType(); + + Date mar01 = getDate( 2005, 3, 1 ); + Date mar31 = getDate( 2005, 3, 31 ); + Date apr01 = getDate( 2005, 4, 1 ); + Date apr30 = getDate( 2005, 4, 30 ); + Date may01 = getDate( 2005, 5, 1 ); + Date may31 = getDate( 2005, 5, 31 ); + + periodA = createPeriod( monthly, mar01, mar31 ); + periodB = createPeriod( monthly, apr01, apr30 ); + periodC = createPeriod( monthly, may01, may31 ); + periodD = createPeriod( quarterly, mar01, may31 ); + + periodIds.add( periodService.addPeriod( periodA ) ); + periodIds.add( periodService.addPeriod( periodB ) ); + periodIds.add( periodService.addPeriod( periodC ) ); + periodIds.add( periodService.addPeriod( periodD ) ); + + // --------------------------------------------------------------------- + // Setup OrganisationUnits + // --------------------------------------------------------------------- + + unitA = createOrganisationUnit( 'A' ); + unitB = createOrganisationUnit( 'B', unitA ); + unitC = createOrganisationUnit( 'C', unitA ); + unitD = createOrganisationUnit( 'D', unitB ); + unitE = createOrganisationUnit( 'E', unitB ); + unitF = createOrganisationUnit( 'F', unitB ); + unitG = createOrganisationUnit( 'G', unitD); + unitH = createOrganisationUnit( 'H', unitD ); + unitI = createOrganisationUnit( 'I', unitE ); + unitJ = createOrganisationUnit( 'J', unitE ); + unitK = createOrganisationUnit( 'K', unitF ); + unitL = createOrganisationUnit( 'L', unitF ); + + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitA ) ); + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitB ) ); + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitC ) ); + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitD ) ); + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitE ) ); + organisationUnitIds.add( organisationUnitService.addOrganisationUnit( unitF ) ); + organisationUnitService.addOrganisationUnit( unitG ); + organisationUnitService.addOrganisationUnit( unitH ); + organisationUnitService.addOrganisationUnit( unitI ); + organisationUnitService.addOrganisationUnit( unitJ ); + organisationUnitService.addOrganisationUnit( unitK ); + organisationUnitService.addOrganisationUnit( unitL ); + + // --------------------------------------------------------------------- + // Setup OrganisationUnitGroups + // --------------------------------------------------------------------- + + groupA = createOrganisationUnitGroup( 'A' ); + groupB = createOrganisationUnitGroup( 'B' ); + + groupA.getMembers().add( unitG ); + groupA.getMembers().add( unitI ); + groupA.getMembers().add( unitK ); + + groupB.getMembers().add( unitH ); + groupB.getMembers().add( unitJ ); + groupB.getMembers().add( unitL ); + + organisationUnitGroupIds.add( organisationUnitGroupService.addOrganisationUnitGroup( groupA ) ); + organisationUnitGroupIds.add( organisationUnitGroupService.addOrganisationUnitGroup( groupB ) ); + + // --------------------------------------------------------------------- + // Setup DataValues + // --------------------------------------------------------------------- + + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitG, "90", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitH, "10", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitI, "35", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitJ, "25", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitK, "20", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitL, "60", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitG, "70", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitH, "40", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitI, "65", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitJ, "55", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitK, "20", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitL, "15", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitG, "95", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitH, "40", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitI, "45", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitJ, "30", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitK, "50", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodC, unitL, "70", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitG, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitH, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitI, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitJ, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitK, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodA, unitL, T, categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitG, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitH, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitI, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitJ, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitK, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodB, unitL, T, categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitG, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitH, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitI, F, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitJ, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitK, T, categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementB, periodC, unitL, T, categoryOptionCombo ) ); + } + + @Override + public boolean emptyDatabaseAfterTest() + { + return true; + } + + @Test + public void testSumIntDataElementDataMart() + { + dataElementA.setAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + dataElementService.updateDataElement( dataElementA ); + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds, organisationUnitGroupIds, null, false ); + + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitA, groupA ) ); + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitB, groupA ) ); + assertEquals( 90.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitD, groupA ) ); + assertEquals( 35.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitE, groupA ) ); + assertEquals( 20.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitF, groupA ) ); + + assertEquals( 95.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitA, groupB ) ); + assertEquals( 95.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitB, groupB ) ); + assertEquals( 10.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitD, groupB ) ); + assertEquals( 25.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitE, groupB ) ); + assertEquals( 60.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitF, groupB ) ); + + assertEquals( 490.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitA, groupA ) ); + assertEquals( 490.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitB, groupA ) ); + assertEquals( 255.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitD, groupA ) ); + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitE, groupA ) ); + assertEquals( 90.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitF, groupA ) ); + + assertEquals( 345.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitA, groupB ) ); + assertEquals( 345.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitB, groupB ) ); + assertEquals( 90.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitD, groupB ) ); + assertEquals( 110.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitE, groupB ) ); + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitF, groupB ) ); + } + + @Test + public void testAverageIntDataElementDataMart() + { + dataElementA.setAggregationOperator( DataElement.AGGREGATION_OPERATOR_AVERAGE ); + + dataElementService.updateDataElement( dataElementA ); + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds, organisationUnitGroupIds, null, false ); + + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitA, groupA ) ); + assertEquals( 145.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitB, groupA ) ); + assertEquals( 90.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitD, groupA ) ); + assertEquals( 35.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitE, groupA ) ); + assertEquals( 20.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitF, groupA ) ); + + assertEquals( 95.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitA, groupB ) ); + assertEquals( 95.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitB, groupB ) ); + assertEquals( 10.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitD, groupB ) ); + assertEquals( 25.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitE, groupB ) ); + assertEquals( 60.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodA, unitF, groupB ) ); + + assertEquals( 163.6, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitA, groupA ), 0.5 ); + assertEquals( 163.6, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitB, groupA ), 0.5 ); + assertEquals( 85.1, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitD, groupA ), 0.5 ); + assertEquals( 48.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitE, groupA ), 0.5 ); + assertEquals( 30.2, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitF, groupA ), 0.5 ); + + assertEquals( 115.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitA, groupB ), 0.5 ); + assertEquals( 115.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitB, groupB ), 0.5 ); + assertEquals( 30.1, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitD, groupB ), 0.5 ); + assertEquals( 36.6, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitE, groupB ), 0.5 ); + assertEquals( 48.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementA, categoryOptionCombo, periodD, unitF, groupB ), 0.5 ); + } + + @Test + public void testSumBoolDataElementDataMart() + { + dataElementB.setAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + dataElementService.updateDataElement( dataElementB ); + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds, organisationUnitGroupIds, null, false ); + + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitA, groupA ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitB, groupA ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitD, groupA ) ); + assertEquals( 0.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitE, groupA ) ); + assertEquals( 0.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitF, groupA ) ); + + assertEquals( 3.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitA, groupB ) ); + assertEquals( 3.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitB, groupB ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitD, groupB ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitE, groupB ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitF, groupB ) ); + + assertEquals( 4.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitA, groupA ) ); + assertEquals( 4.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitB, groupA ) ); + assertEquals( 2.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitD, groupA ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitE, groupA ) ); + assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitF, groupA ) ); + + assertEquals( 8.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitA, groupB ) ); + assertEquals( 8.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitB, groupB ) ); + assertEquals( 2.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitD, groupB ) ); + assertEquals( 3.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitE, groupB ) ); + assertEquals( 3.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitF, groupB ) ); + } + + @Test + public void testAverageBoolDataElementDataMart() + { + dataElementB.setAggregationOperator( DataElement.AGGREGATION_OPERATOR_AVERAGE ); + + dataElementService.updateDataElement( dataElementB ); + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds, organisationUnitGroupIds, null, false ); + + assertEquals( 33.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitA, groupA ) ); + assertEquals( 33.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitB, groupA ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitD, groupA ) ); + assertEquals( 0.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitE, groupA ) ); + assertEquals( 0.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitF, groupA ) ); + + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitA, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitB, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitD, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitE, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodA, unitF, groupB ) ); + + assertEquals( 44.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitA, groupA ) ); + assertEquals( 44.3, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitB, groupA ) ); + assertEquals( 65.9, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitD, groupA ) ); + assertEquals( 33.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitE, groupA ) ); + assertEquals( 34.1, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitF, groupA ) ); + + assertEquals( 89.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitA, groupB ) ); + assertEquals( 89.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitB, groupB ) ); + assertEquals( 67.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitD, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitE, groupB ) ); + assertEquals( 100.0, aggregatedOrgUnitDataValueService.getAggregatedValue( dataElementB, categoryOptionCombo, periodD, unitF, groupB ) ); + } + + @Test + public void testIndicatorDataMart() + { + // --------------------------------------------------------------------- + // Setup DataElements + // --------------------------------------------------------------------- + + DataElement dataElementC = createDataElement( 'C', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo ); + DataElement dataElementD = createDataElement( 'D', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_SUM, categoryCombo ); + DataElement dataElementE = createDataElement( 'E', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_AVERAGE, categoryCombo ); + DataElement dataElementF = createDataElement( 'F', DataElement.VALUE_TYPE_INT, DataElement.AGGREGATION_OPERATOR_AVERAGE, categoryCombo ); + + int idC = dataElementService.addDataElement( dataElementC ); + int idD = dataElementService.addDataElement( dataElementD ); + int idE = dataElementService.addDataElement( dataElementE ); + int idF = dataElementService.addDataElement( dataElementF ); + + dataSet.getDataElements().add( dataElementC ); + dataSet.getDataElements().add( dataElementD ); + dataSet.getDataElements().add( dataElementE ); + dataSet.getDataElements().add( dataElementF ); + dataSetService.updateDataSet( dataSet ); + dataElementC.getDataSets().add( dataSet ); + dataElementD.getDataSets().add( dataSet ); + dataElementE.getDataSets().add( dataSet ); + dataElementF.getDataSets().add( dataSet ); + dataElementService.updateDataElement( dataElementC ); + dataElementService.updateDataElement( dataElementD ); + dataElementService.updateDataElement( dataElementE ); + dataElementService.updateDataElement( dataElementF ); + + // --------------------------------------------------------------------- + // Setup DataValues + // --------------------------------------------------------------------- + + dataValueService.addDataValue( createDataValue( dataElementC, periodA, unitG, "10", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementC, periodA, unitH, "75", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementC, periodB, unitG, "10", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementC, periodB, unitH, "75", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementC, periodC, unitG, "10", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementC, periodC, unitH, "70", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementD, periodA, unitG, "90", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementD, periodA, unitH, "25", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementD, periodB, unitG, "55", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementD, periodB, unitH, "85", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementD, periodC, unitG, "15", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementD, periodC, unitH, "25", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementE, periodA, unitG, "5500", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementE, periodA, unitH, "4500", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementE, periodB, unitG, "7000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementE, periodB, unitH, "2000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementE, periodC, unitG, "5000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementE, periodC, unitH, "3500", categoryOptionCombo ) ); + + dataValueService.addDataValue( createDataValue( dataElementF, periodA, unitG, "3500", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementF, periodA, unitH, "4000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementF, periodB, unitG, "1000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementF, periodB, unitH, "3000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementF, periodC, unitG, "6000", categoryOptionCombo ) ); + dataValueService.addDataValue( createDataValue( dataElementF, periodC, unitH, "1500", categoryOptionCombo ) ); + + // --------------------------------------------------------------------- + // Setup Indicators + // --------------------------------------------------------------------- + + IndicatorType indicatorType = createIndicatorType( 'A' ); // Factor = 100 + + indicatorService.addIndicatorType( indicatorType ); + + Indicator indicatorA = createIndicator( 'A', indicatorType ); + + String suffix = "." + categoryOptionCombo.getId(); + + indicatorA.setNumerator( "[" + idC + suffix + "]*[" + idD + suffix + "]" ); + + indicatorA.setDenominator( "[" + idE + suffix + "]+[" + idF + suffix + "]" ); + + indicatorIds.add( indicatorService.addIndicator( indicatorA ) ); + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds, organisationUnitGroupIds, null, false ); + + // --------------------------------------------------------------------- + // Assert + // --------------------------------------------------------------------- + + assertEquals( 10.0, aggregatedOrgUnitDataValueService.getAggregatedIndicatorValue( indicatorA, periodA, unitD, groupA ) ); + //assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedIndicatorValue( indicatorA, periodA, unitD, groupB ) ); + //assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedIndicatorValue( indicatorA, periodD, unitD, groupA ) ); + //assertEquals( 1.0, aggregatedOrgUnitDataValueService.getAggregatedIndicatorValue( indicatorA, periodD, unitD, groupB ) ); + } +}