← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 5145: Improved performance when loading large numbers of indicators in data entry

 

------------------------------------------------------------
revno: 5145
committer: Lars Helge Overland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Fri 2011-11-11 21:29:33 +0100
message:
  Improved performance when loading large numbers of indicators in data entry
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java
  dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java
  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/resources/META-INF/dhis/beans.xml


--
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-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java	2011-10-05 10:06:16 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementService.java	2011-11-11 20:29:33 +0000
@@ -30,6 +30,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.hisp.dhis.dataset.DataSet;
 import org.hisp.dhis.hierarchy.HierarchyViolationException;
@@ -288,6 +289,8 @@
     int getDataElementCount();
 
     int getDataElementCountByName( String name );
+    
+    Map<Integer, Set<Integer>> getDataElementCategoryOptionCombos();
 
     // -------------------------------------------------------------------------
     // DataElementGroup

=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java	2011-09-10 08:40:27 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementStore.java	2011-11-11 20:29:33 +0000
@@ -28,6 +28,8 @@
  */
 
 import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
 
 import org.hisp.dhis.dataset.DataSet;
 import org.hisp.dhis.hierarchy.HierarchyViolationException;
@@ -261,6 +263,8 @@
     
     int getDataElementCountByName( String name );
     
+    Map<Integer, Set<Integer>> getDataElementCategoryOptionCombos();
+    
     // -------------------------------------------------------------------------
     // DataElementOperand
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java	2011-11-09 07:51:55 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/DefaultDataElementService.java	2011-11-11 20:29:33 +0000
@@ -349,6 +349,11 @@
         return i18n( i18nService, dataElementStore.getDataElementsByDataSets( dataSets ) );
     }
 
+    public Map<Integer, Set<Integer>> getDataElementCategoryOptionCombos()
+    {
+        return dataElementStore.getDataElementCategoryOptionCombos();
+    }
+    
     // -------------------------------------------------------------------------
     // DataElementGroup
     // -------------------------------------------------------------------------

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java'
--- dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java	2011-11-11 13:25:30 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/dataelement/hibernate/HibernateDataElementStore.java	2011-11-11 20:29:33 +0000
@@ -30,7 +30,9 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Map;
 import java.util.Set;
 
 import org.amplecode.quick.StatementManager;
@@ -49,6 +51,7 @@
 import org.hisp.dhis.system.objectmapper.DataElementOperandMapper;
 import org.hisp.dhis.system.util.ConversionUtils;
 import org.hisp.dhis.system.util.TextUtils;
+import org.springframework.jdbc.core.RowCallbackHandler;
 
 /**
  * @author Torgeir Lorange Ostby
@@ -69,7 +72,7 @@
     {
         this.statementManager = statementManager;
     }
-
+    
     // -------------------------------------------------------------------------
     // DataElement
     // -------------------------------------------------------------------------
@@ -350,6 +353,32 @@
     {
         return getCountByName( name );
     }
+    
+    public Map<Integer, Set<Integer>> getDataElementCategoryOptionCombos()
+    {
+        final String sql = "select de.dataelementid, coc.categoryoptioncomboid from dataelement de " +
+            "join categorycombos_optioncombos coc on de.categorycomboid=coc.categorycomboid";
+        
+        final Map<Integer, Set<Integer>> sets = new HashMap<Integer, Set<Integer>>();
+        
+        jdbcTemplate.query( sql, new RowCallbackHandler()
+        {
+            @Override
+            public void processRow( ResultSet rs )
+                throws SQLException
+            {
+                int dataElementId = rs.getInt( 1 );
+                int categoryOptionComboId = rs.getInt( 2 );
+                
+                Set<Integer> set = sets.get( dataElementId ) != null ? sets.get( dataElementId ) : new HashSet<Integer>();
+                
+                set.add( categoryOptionComboId );                
+                sets.put( dataElementId, set );
+            }
+        } );
+        
+        return sets;
+    }
 
     // -------------------------------------------------------------------------
     // DataElementOperand

=== 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	2011-09-24 12:01:19 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/java/org/hisp/dhis/expression/DefaultExpressionService.java	2011-11-11 20:29:33 +0000
@@ -449,21 +449,59 @@
 
     public void explodeAndSubstituteExpressions( Collection<Indicator> indicators, Integer days )
     {
-        if ( indicators != null )
-        {            
+        if ( indicators != null && !indicators.isEmpty() )
+        {
             for ( Indicator indicator : indicators )
             {
                 indicator.setExplodedNumerator( substituteExpression( indicator.getNumerator(), days ) );
                 indicator.setExplodedDenominator( substituteExpression( indicator.getDenominator(), days ) );
             }
+
+            final Map<Integer, Set<Integer>> dataElementMap = dataElementService.getDataElementCategoryOptionCombos();
             
             for ( Indicator indicator : indicators )
             {
-                indicator.setExplodedNumerator( explodeExpression( indicator.getExplodedNumerator() ) );
-                indicator.setExplodedDenominator( explodeExpression( indicator.getExplodedDenominator() ) );
+                indicator.setExplodedNumerator( explodeExpression( indicator.getExplodedNumerator(), dataElementMap ) );
+                indicator.setExplodedDenominator( explodeExpression( indicator.getExplodedDenominator(), dataElementMap ) );
             }     
         }
     }
+
+    private String explodeExpression( String expression, Map<Integer, Set<Integer>> dataElementMap )
+    {
+        StringBuffer buffer = null;
+
+        if ( expression != null )
+        {
+            final Matcher matcher = OPERAND_PATTERN.matcher( expression );
+
+            buffer = new StringBuffer();
+
+            while ( matcher.find() )
+            {
+                final DataElementOperand operand = DataElementOperand.getOperand( matcher.group() );
+                
+                if ( operand.isTotal() )
+                {
+                    final StringBuilder replace = new StringBuilder( PAR_OPEN );
+                    
+                    for ( Integer categoryOptionCombo : dataElementMap.get( operand.getDataElementId() ) )
+                    {
+                        replace.append( EXP_OPEN ).append( operand.getDataElementId() ).append( SEPARATOR ).append(
+                            categoryOptionCombo ).append( EXP_CLOSE ).append( "+" );
+                    }
+
+                    replace.deleteCharAt( replace.length() - 1 ).append( PAR_CLOSE );
+
+                    matcher.appendReplacement( buffer, replace.toString() );
+                }
+            }
+
+            matcher.appendTail( buffer );
+        }
+
+        return buffer != null ? buffer.toString() : null;
+    }
     
     public String explodeExpression( String expression )
     {
@@ -478,7 +516,7 @@
             while ( matcher.find() )
             {
                 final DataElementOperand operand = DataElementOperand.getOperand( matcher.group() );
-
+                
                 if ( operand.isTotal() )
                 {
                     final StringBuilder replace = new StringBuilder( PAR_OPEN );

=== modified file 'dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml'
--- dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2011-11-03 14:27:18 +0000
+++ dhis-2/dhis-services/dhis-service-core/src/main/resources/META-INF/dhis/beans.xml	2011-11-11 20:29:33 +0000
@@ -22,6 +22,7 @@
     <property name="clazz" value="org.hisp.dhis.dataelement.DataElement" />
     <property name="sessionFactory" ref="sessionFactory" />
     <property name="statementManager" ref="statementManager" />
+	<property name="jdbcTemplate" ref="jdbcTemplate" />
     <property name="cacheable" value="true" />
   </bean>