------------------------------------------------------------ revno: 2679 committer: Lars Helge Overland <larshe...@gmail.com> branch nick: dhis2 timestamp: Thu 2011-01-20 22:08:24 +0100 message: Simplification in datamart modified: 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/DefaultCrossTabService.java dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java
-- lp:dhis2 https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk Your team DHIS 2 developers is subscribed to branch lp:dhis2. To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== 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-10 15:53:32 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/CrossTabService.java 2011-01-20 21:08:24 +0000 @@ -41,6 +41,15 @@ String ID = CrossTabService.class.getName(); /** + * Filters and returns the DataElementOperands with data from the given + * collection of DataElementOperands. + * + * @param operands the DataElementOperands. + * @return the DataElementOperands with data. + */ + Collection<DataElementOperand> getOperandsWithData( Collection<DataElementOperand> operands ); + + /** * Creates and populates the crosstab table. Operands without data will be * removed from the operands argument collection. * @@ -58,13 +67,6 @@ void dropCrossTabTable( String key ); /** - * Trims the crosstab table. - * - * @param operands the DataElementOperands with data. - */ - void trimCrossTabTable( Collection<DataElementOperand> operands, String key ); - - /** * Gets all CrossTabDataValues for the given collection of period ids and source ids. * * @param dataElementIds the dataelement identifiers. === 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-20 19:55:28 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/DefaultCrossTabService.java 2011-01-20 21:08:24 +0000 @@ -29,10 +29,8 @@ import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import org.amplecode.quick.BatchHandler; import org.amplecode.quick.BatchHandlerFactory; @@ -86,13 +84,16 @@ // CrossTabService implementation // ------------------------------------------------------------------------- + public Collection<DataElementOperand> getOperandsWithData( Collection<DataElementOperand> operands ) + { + return crossTabStore.getOperandsWithData( operands ); + } + public List<String> populateCrossTabTable( final Collection<DataElementOperand> operands, final Collection<Integer> periodIds, final Collection<Integer> organisationUnitIds ) { if ( validate( operands, periodIds, organisationUnitIds ) ) { - final Set<DataElementOperand> operandsWithData = new HashSet<DataElementOperand>(); - final PaginatedList<DataElementOperand> operandList = new PaginatedList<DataElementOperand>( operands, MAX_COLUMNS ); final List<String> crossTabTableKeys = new ArrayList<String>(); @@ -105,17 +106,13 @@ crossTabTableKeys.add( key ); - final Set<DataElementOperand> operandsWithDataInPage = new HashSet<DataElementOperand>(); - crossTabStore.dropCrossTabTable( key ); crossTabStore.createCrossTabTable( operandPage, key ); - - log.debug( "Created crosstab table for key: " + key ); - + final BatchHandler<Object> batchHandler = batchHandlerFactory.createBatchHandler( GenericBatchHandler.class ); batchHandler.setTableName( CrossTabStore.TABLE_NAME + key ); batchHandler.init(); - + for ( final Integer periodId : periodIds ) { for ( final Integer sourceId : organisationUnitIds ) @@ -142,8 +139,6 @@ if ( value != null ) { hasValues = true; - operandsWithData.add( operand ); - operandsWithDataInPage.add( operand ); } valueList.add( value ); @@ -158,14 +153,9 @@ batchHandler.flush(); - trimCrossTabTable( operandsWithDataInPage, key ); - - log.info( "Populated crosstab table for key: " + key ); - + log.info( "Populated crosstab table for key: " + key ); } - operands.retainAll( operandsWithData ); // Remove operands without data - return crossTabTableKeys; } @@ -177,21 +167,6 @@ crossTabStore.dropCrossTabTable( key ); } - public void trimCrossTabTable( Collection<DataElementOperand> operands, String key ) - { - // TODO use H2 in-memory table for datavaluecrosstab table ? - // TODO optimize retrieval by dividing up based on agg operator / type? - - if ( operands != null && key != null ) - { - crossTabStore.createTrimmedCrossTabTable( operands, key ); - - crossTabStore.dropCrossTabTable( key ); - - crossTabStore.renameTrimmedCrossTabTable( key ); - } - } - public Collection<CrossTabDataValue> getCrossTabDataValues( Collection<DataElementOperand> operands, Collection<Integer> periodIds, Collection<Integer> sourceIds, List<String> keys ) { === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java 2011-01-10 15:53:32 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/CrossTabStore.java 2011-01-20 21:08:24 +0000 @@ -44,6 +44,15 @@ final String TABLE_NAME_TRIMMED = "datavaluecrosstabtrimmed_"; /** + * Filters and returns the DataElementOperands with data from the given + * collection of DataElementOperands. + * + * @param operands the DataElementOperands. + * @return the DataElementOperands with data. + */ + Collection<DataElementOperand> getOperandsWithData( Collection<DataElementOperand> operands ); + + /** * Creates a crosstab table where the first column is the period identifier, * the second column is the source identifer, and each subsequent column * corresponds to an operand. @@ -58,19 +67,6 @@ void dropCrossTabTable( String key ); /** - * Renames the trimmed crosstab table to the regular crosstab table. - */ - void renameTrimmedCrossTabTable( String key ); - - /** - * Creates a trimmed crosstab table based on the regular crosstab table. - * Trimming implies removing columns without data. - * - * @param operands the DataElementOperands with data. - */ - void createTrimmedCrossTabTable( Collection<DataElementOperand> operands, String key ); - - /** * Gets all CrossTabDataValues for the given collection of period ids and source ids. * * @param dataElementIds the dataelement identifiers. === modified file 'dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java' --- dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java 2011-01-10 15:53:32 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/crosstab/jdbc/JDBCCrossTabStore.java 2011-01-20 21:08:24 +0000 @@ -64,6 +64,30 @@ // CrossTabStore implementation // ------------------------------------------------------------------------- + public Collection<DataElementOperand> getOperandsWithData( Collection<DataElementOperand> operands ) + { + final Collection<DataElementOperand> operandsWithData = new ArrayList<DataElementOperand>(); + + final StatementHolder holder = statementManager.getHolder(); + + for ( DataElementOperand operand : operands ) + { + final String sql = + "SELECT COUNT(*) FROM datavalue " + + "WHERE dataelementid=" + operand.getDataElementId() + " " + + "AND categoryoptioncomboid=" + operand.getOptionComboId(); + + Integer count = holder.queryForInteger( sql ); + + if ( count != null && count > 0 ) + { + operandsWithData.add( operand ); + } + } + + return operandsWithData; + } + public void createCrossTabTable( final List<DataElementOperand> operands, String key ) { final StatementHolder holder = statementManager.getHolder(); @@ -113,59 +137,6 @@ holder.close(); } } - - public void renameTrimmedCrossTabTable( String key ) - { - final StatementHolder holder = statementManager.getHolder(); - - try - { - final String sql = "ALTER TABLE " + TABLE_NAME_TRIMMED + key + " RENAME TO " + TABLE_NAME + key; - - holder.getStatement().executeUpdate( sql ); - } - catch ( SQLException ex ) - { - throw new RuntimeException( "Failed to rename trimmed crosstab table", ex ); - } - finally - { - holder.close(); - } - } - - public void createTrimmedCrossTabTable( Collection<DataElementOperand> operands, String key ) - { - final StatementHolder holder = statementManager.getHolder(); - - try - { - final StringBuffer buffer = new StringBuffer( "CREATE TABLE " + TABLE_NAME_TRIMMED + key + " AS SELECT periodid, sourceid, " ); - - for ( final DataElementOperand operand : operands ) - { - buffer.append( operand.getColumnName() ).append( ", " ); - } - - if ( buffer.length() > 1 ) - { - buffer.deleteCharAt( buffer.length() - 1 ); - buffer.deleteCharAt( buffer.length() - 1 ); - } - - buffer.append( " FROM " + TABLE_NAME + key ); - - holder.getStatement().executeUpdate( buffer.toString() ); - } - catch ( SQLException ex ) - { - throw new RuntimeException( "Failed to get crosstab table columns", ex ); - } - finally - { - holder.close(); - } - } // ------------------------------------------------------------------------- // CrossTabDataValue === 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-20 08:46:49 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java 2011-01-20 21:08:24 +0000 @@ -239,6 +239,18 @@ log.info( "Filtered data elements, number of operands: " + allOperands.size() + ", " + TimeUtils.getHMS() ); // --------------------------------------------------------------------- + // Remove operands without data + // --------------------------------------------------------------------- + + allOperands = new HashSet<DataElementOperand>( crossTabService.getOperandsWithData( allOperands ) ); + + nonCalculatedOperands.retainAll( allOperands ); + indicatorOperands.retainAll( allOperands ); + calculatedOperands.retainAll( allOperands ); + + log.info( "Number of operands with data: " + allOperands.size() + ", "+ TimeUtils.getHMS() ); + + // --------------------------------------------------------------------- // Create and trim crosstabtable // --------------------------------------------------------------------- @@ -254,15 +266,7 @@ return 0; } - log.info( "Number of crosstab tables: " + keys.size() + ", number of operands with data: " + allOperands.size() + ", " + TimeUtils.getHMS() ); - - // --------------------------------------------------------------------- - // Remove operands without data - // --------------------------------------------------------------------- - - nonCalculatedOperands.retainAll( allOperands ); - indicatorOperands.retainAll( allOperands ); - calculatedOperands.retainAll( allOperands ); + log.info( "Number of crosstab tables: " + keys.size() + ", " + TimeUtils.getHMS() ); // --------------------------------------------------------------------- // Delete existing aggregated data
_______________________________________________ Mailing list: https://launchpad.net/~dhis2-devs Post to : dhis2-devs@lists.launchpad.net Unsubscribe : https://launchpad.net/~dhis2-devs More help : https://help.launchpad.net/ListHelp