=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryCombo.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryCombo.java 2010-09-27 09:24:45 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryCombo.java 2010-12-07 17:02:27 +0000 @@ -111,6 +111,15 @@ } // ------------------------------------------------------------------------- + // Logic + // ------------------------------------------------------------------------- + + public boolean isDefault() + { + return name.equals( DEFAULT_CATEGORY_COMBO_NAME ); + } + + // ------------------------------------------------------------------------- // hashCode, equals and toString // ------------------------------------------------------------------------- === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryService.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryService.java 2010-12-04 00:03:38 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementCategoryService.java 2010-12-07 17:02:27 +0000 @@ -330,6 +330,15 @@ * @return the Operands for the given Collection of DataElements. */ Collection getOperands( Collection dataElements ); + + /** + * Gets the Operands for the given Collection of DataElements. + * + * @param dataElements the Collection of DataElements. + * @param includeTotals whether to include DataElement totals in the Collection of Operands. + * @return the Operands for the given Collection of DataElements. + */ + Collection getOperands( Collection dataElements, boolean includeTotals ); /** * Gets the Operands for the given Collection of DataElements. Operands will contain DataElement and CategoryOptionCombo object === modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java 2010-12-05 19:34:52 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementOperand.java 2010-12-07 17:02:27 +0000 @@ -45,11 +45,12 @@ implements Serializable, Comparable { public static final String SEPARATOR = "."; + public static final String NAME_TOTAL = "(Total)"; private static final String TYPE_VALUE = "value"; private static final String TYPE_TOTAL = "total"; - private static final String SPACE = ""; + private static final String SPACE = " "; private static final String COLUMN_PREFIX = "de"; private static final String COLUMN_SEPARATOR = "_"; @@ -208,11 +209,16 @@ */ public String getPrettyName( DataElement dataElement, DataElementCategoryOptionCombo categoryOptionCombo ) { - if ( dataElement == null || categoryOptionCombo == null ) + if ( dataElement == null ) // Invalid { return null; } + if ( categoryOptionCombo == null ) // Total + { + return dataElement.getName() + SPACE + NAME_TOTAL; + } + return categoryOptionCombo.isDefault() ? dataElement.getName() : dataElement.getName() + SPACE + categoryOptionCombo.getName(); } @@ -245,6 +251,23 @@ } /** + * Updates all transient properties. + * + * @param dataElement + * @param categoryOptionCombo + */ + public void updateProperties( DataElement dataElement ) + { + this.dataElementId = dataElement.getId(); + this.operandId = String.valueOf( dataElement.getId() ); + this.operandName = dataElement.getName() + SPACE + NAME_TOTAL; + this.aggregationOperator = dataElement.getAggregationOperator(); + this.frequencyOrder = dataElement.getFrequencyOrder(); + this.aggregationLevels = new ArrayList( dataElement.getAggregationLevels() ); + this.valueType = dataElement.getType(); + } + + /** * Generates a DataElementOperand based on the given formula. The formula * needs to be on the form "[,]". * === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementCategoryService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementCategoryService.java 2010-12-04 00:03:38 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementCategoryService.java 2010-12-07 17:02:27 +0000 @@ -401,22 +401,35 @@ return operands; } + public Collection getOperands( Collection dataElements, boolean includeTotals ) + { + Collection operands = new ArrayList(); + + for ( DataElement dataElement : dataElements ) + { + if ( !dataElement.getCategoryCombo().isDefault() && includeTotals ) + { + DataElementOperand operand = new DataElementOperand(); + operand.updateProperties( dataElement ); + + operands.add( operand ); + } + + for ( DataElementCategoryOptionCombo categoryOptionCombo : dataElement.getCategoryCombo().getOptionCombos() ) + { + DataElementOperand operand = new DataElementOperand(); + operand.updateProperties( dataElement, categoryOptionCombo ); + + operands.add( operand ); + } + } + + return operands; + } + public Collection getOperands( Collection dataElements ) { - Collection operands = new ArrayList(); - - for ( DataElement dataElement : dataElements ) - { - for ( DataElementCategoryOptionCombo categoryOptionCombo : dataElement.getCategoryCombo().getOptionCombos() ) - { - DataElementOperand operand = new DataElementOperand(); - operand.updateProperties( dataElement, categoryOptionCombo ); - - operands.add( operand ); - } - } - - return operands; + return getOperands( dataElements, false ); } public Collection getFullOperands( Collection dataElements ) === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java 2010-12-06 21:06:40 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java 2010-12-07 17:02:27 +0000 @@ -322,13 +322,8 @@ + operand.getOptionComboId() ); } - match = dataElement.getName(); + match = operand.getPrettyName( dataElement, categoryOptionCombo ); - if ( !categoryOptionCombo.isDefault() ) - { - match += SPACE + categoryOptionCombo.getName(); - } - matcher.appendReplacement( buffer, match ); } === modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java' --- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java 2010-12-06 14:13:48 +0000 +++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/user/hibernate/HibernateUserStore.java 2010-12-07 17:02:27 +0000 @@ -39,7 +39,6 @@ import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hisp.dhis.common.GenericIdentifiableObjectStore; -import org.hisp.dhis.datadictionary.DataDictionary; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.system.util.AuditLogLevel; import org.hisp.dhis.system.util.AuditLogUtil; @@ -388,6 +387,7 @@ return rs != null ? rs.intValue() : 0; } + @SuppressWarnings("unchecked") public Collection getUsersBetween( int first, int max ) { Session session = sessionFactory.getCurrentSession(); @@ -395,6 +395,7 @@ return session.createQuery( "from UserCredentials" ).setFirstResult( first ).setMaxResults( max ).list(); } + @SuppressWarnings("unchecked") public Collection getUsersBetweenByName( String name, int first, int max ) { Session session = sessionFactory.getCurrentSession(); === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceMultiDimensionTest.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceMultiDimensionTest.java 2010-08-31 05:47:11 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/test/java/org/hisp/dhis/datamart/DataMartServiceMultiDimensionTest.java 2010-12-07 17:02:27 +0000 @@ -212,6 +212,11 @@ // Setup OrganisationUnits // --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // A + // B C + // --------------------------------------------------------------------- + unitA = createOrganisationUnit( 'A' ); unitB = createOrganisationUnit( 'B', unitA ); unitC = createOrganisationUnit( 'C', unitA ); @@ -507,6 +512,89 @@ @Ignore @Test + public void testIndicatorTotal() + { + dataElementA.setType( DataElement.VALUE_TYPE_INT ); + dataElementA.setAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + dataElementService.updateDataElement( dataElementA ); + + // --------------------------------------------------------------------- + // Setup DataValues + // --------------------------------------------------------------------- + + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitB, "9", categoryOptionComboA ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitB, "3", categoryOptionComboB ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitC, "1", categoryOptionComboA ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodA, unitC, "5", categoryOptionComboB ) ); + + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitB, "3", categoryOptionComboA ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitB, "2", categoryOptionComboB ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitC, "7", categoryOptionComboA ) ); + dataValueService.addDataValue( createDataValue( dataElementA, periodB, unitC, "9", categoryOptionComboB ) ); + + // --------------------------------------------------------------------- + // Setup Indicators + // --------------------------------------------------------------------- + + IndicatorType indicatorType = createIndicatorType( 'A' ); // Factor = 100 + + indicatorService.addIndicatorType( indicatorType ); + + Indicator indicatorA = createIndicator( 'A', indicatorType ); + + String suffixA = Expression.SEPARATOR + categoryOptionComboA.getId(); + String suffixB = Expression.SEPARATOR + categoryOptionComboB.getId(); + + indicatorA.setNumerator( "[" + dataElementA.getId() + suffixA + "]+[" + dataElementA.getId() + suffixB + "]" ); + indicatorA.setNumeratorAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + indicatorA.setDenominator( "100" ); + indicatorA.setDenominatorAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + Indicator indicatorB = createIndicator( 'B', indicatorType ); + + indicatorB.setNumerator( "[" + dataElementA.getId() + "]" ); + indicatorB.setNumeratorAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + indicatorB.setDenominator( "100" ); + indicatorB.setDenominatorAggregationOperator( DataElement.AGGREGATION_OPERATOR_SUM ); + + indicatorIds.add( indicatorService.addIndicator( indicatorA ) ); + indicatorIds.add( indicatorService.addIndicator( indicatorB ) ); + + // --------------------------------------------------------------------- + // Test + // --------------------------------------------------------------------- + + dataMartService.export( dataElementIds, indicatorIds, periodIds, organisationUnitIds ); + + assertEquals( 12.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitB ) ); + assertEquals( 5.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitB ) ); + assertEquals( 17.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitB ) ); + + assertEquals( 6.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitC ) ); + assertEquals( 16.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitC ) ); + assertEquals( 22.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitC ) ); + + assertEquals( 18.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitA ) ); + assertEquals( 21.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitA ) ); + assertEquals( 39.0, aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitA ) ); + + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitB ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodA, unitB ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitB ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodB, unitB ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitB ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodC, unitB ) ); + + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitC ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodA, unitC ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitC ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodB, unitC ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitC ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodC, unitC ) ); + + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodA, unitA ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodA, unitA ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodB, unitA ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodB, unitA ) ); + assertEquals( aggregatedDataValueService.getAggregatedValue( indicatorB, periodC, unitA ), aggregatedDataValueService.getAggregatedValue( indicatorA, periodC, unitA ) ); + } + + @Ignore + @Test public void testAnnualizedIndicator() { dataElementA.setType( DataElement.VALUE_TYPE_INT ); === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/security/login.html' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/security/login.html 2010-11-22 20:47:01 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/security/login.html 2010-12-07 17:02:27 +0000 @@ -2,7 +2,7 @@ DHIS 2 - + +