dhis2-devs team mailing list archive
-
dhis2-devs team
-
Mailing list archive
-
Message #14829
[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>