=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchy.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchy.java 2011-12-26 10:07:59 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchy.java 2012-04-24 12:14:22 +0000 @@ -45,6 +45,9 @@ */ public class OrganisationUnitHierarchy { + /** + * Contains mappings between parent and immediate children. + */ private Map> relationships = new HashMap>(); private Map> subTrees = new HashMap>(); @@ -148,7 +151,7 @@ List children = new ArrayList(); - children.add( 0, parentId ); + children.add( 0, parentId ); // Adds parent id to beginning of list int childCounter = 1; @@ -169,8 +172,10 @@ public Set getChildren( Collection parentIds ) { - Set children = new HashSet(); + int capacity = parentIds.size() + 5; + Set children = new HashSet( Math.max( capacity, 16 ) ); + for ( Integer id : parentIds ) { children.addAll( getChildren( id ) ); @@ -218,7 +223,9 @@ return getChildren( parentIds ); } - Set children = new HashSet(); + int capacity = ( parentIds.size() * groups.size() ) + 5; + + Set children = new HashSet( Math.max( capacity, 16 ) ); for ( Integer id : parentIds ) { === modified file 'dhis-2/dhis-api/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchyTest.java' --- dhis-2/dhis-api/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchyTest.java 2011-12-26 10:07:59 +0000 +++ dhis-2/dhis-api/src/test/java/org/hisp/dhis/organisationunit/OrganisationUnitHierarchyTest.java 2012-04-24 12:14:22 +0000 @@ -30,6 +30,7 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; +import static junit.framework.Assert.assertNotNull; import java.util.ArrayList; import java.util.HashMap; @@ -112,6 +113,35 @@ } @Test + public void testGetChildren() + { + Set parentIds = new HashSet(); + + List relations = new ArrayList(); + + int parentMax = 1000; // Increase to stress-test + int childMax = 4; + int childId = 0; + + for ( int parentId = 0; parentId < parentMax; parentId++ ) + { + parentIds.add( parentId ); + + for ( int j = 0; j < childMax; j++ ) + { + relations.add( new OrganisationUnitRelationship( parentId, ++childId ) ); + } + } + + OrganisationUnitHierarchy hierarchy = new OrganisationUnitHierarchy( relations ); + + Set children = hierarchy.getChildren( parentIds ); + + assertNotNull( children ); + assertEquals( ( parentMax * childMax ) + 1, children.size() ); + } + + @Test public void testGetChildrenA() { List relationships = new ArrayList(); === 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 2012-04-12 12:39:47 +0000 +++ dhis-2/dhis-services/dhis-service-datamart-default/src/main/java/org/hisp/dhis/datamart/engine/DefaultDataMartEngine.java 2012-04-24 12:14:22 +0000 @@ -217,6 +217,8 @@ organisationUnitIds = organisationUnitIds != null ? organisationUnitIds : new ArrayList(); organisationUnitGroupIds = organisationUnitGroupIds != null ? organisationUnitGroupIds : new ArrayList(); + clock.logTime( "Data elements: " + dataElementIds.size() + ", indicators: " + indicatorIds.size() + ", periods: " + periodIds.size() + ", org units: " + organisationUnitIds.size() ); + // --------------------------------------------------------------------- // Get objects // ---------------------------------------------------------------------