=== modified file 'dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java'
--- dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java	2010-09-18 12:12:39 +0000
+++ dhis-2/dhis-services/dhis-service-administration/src/main/java/org/hisp/dhis/databrowser/jdbc/StatementManagerDataBrowserStore.java	2010-11-15 05:50:24 +0000
@@ -529,14 +529,29 @@
 
         Integer numResults = 0;
         StringBuffer sqlsbDescentdants = new StringBuffer();
-
-        dropView( "view_count_descentdants" );
-
+        Boolean dropViewSuccess = false;
+       
+        
+        
+        //Try and drop the view
+        try
+        {
+         dropViewSuccess = dropView( "view_count_descentdants" );
+        }
+        catch (Exception e)
+        {
+          throw new RuntimeException( "Failed to delete view_count_descentadants", e );
+        }
+        //Only try this part if we could drop the view
+        if  ( dropViewSuccess )
+                 {
         sqlsbDescentdants.append( "CREATE VIEW view_count_descentdants AS " );
         setUpQueryForDrillDownDescendants( sqlsbDescentdants, orgUnitParent, betweenPeriodIds );
 
-        try
+        try 
         {
+
+
             TimeUtils.start();
             
             holder.getStatement().executeUpdate( sqlsbDescentdants.toString() );
@@ -553,7 +568,7 @@
             
             TimeUtils.stop();
         }
-        catch ( SQLException e )
+        catch ( Exception e )
         {
             throw new RuntimeException( "Failed to get aggregated data value", e );
         }
@@ -562,6 +577,8 @@
             holder.close();
         }
 
+        }
+
         return numResults;
     }
 
@@ -581,7 +598,6 @@
             sqlsb.append( "(SELECT de.dataelementid, de.name AS DataElement, Count(dv.value) AS counts_of_aggregated_values, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
             sqlsb.append( "FROM dataelement AS de " );
             sqlsb.append( "INNER JOIN datavalue AS dv ON (de.dataelementid = dv.dataelementid) " );
-            sqlsb.append( "INNER JOIN datasetmembers AS dsm ON (de.dataelementid = dsm.dataelementid) " );
             sqlsb.append( "INNER JOIN organisationunit As o ON (dv.sourceid = o.organisationunitid) " );
             sqlsb.append( "JOIN period p ON (dv.periodid = p.periodid) " );
             sqlsb.append( "WHERE o.organisationunitid = '" + orgUnitId + "' " );
@@ -660,66 +676,64 @@
         return stm.getResultSet();
     }
 
-    private void setUpQueryForDrillDownDescendants( StringBuffer sb, Integer orgUnitSelected,
+    private String setUpQueryForDrillDownDescendants( StringBuffer sb, Integer orgUnitSelected,
         List<Integer> betweenPeriodIds )
     {
-        int i = 0;
-        int loopSize = betweenPeriodIds.size();
+
         int curLevel = organisationUnitService.getLevelOfOrganisationUnit( orgUnitSelected );
         int maxLevel = organisationUnitService.getNumberOfOrganisationalLevels();
         int diffLevel = maxLevel - curLevel;
-        String orgIndex = this.getTableIndexByDiffLevel( diffLevel );
-
-        for ( Integer periodid : betweenPeriodIds )
-        {
-            i++;
-
-            /**
-             * The current organization unit
-             */
-            sb.append( "SELECT DISTINCT o.organisationunitid AS parentid, o.name AS OrganisationUnit, COUNT(value) as countdv_descendants, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
-            sb.append( "FROM organisationunit o " );
-            sb.append( "JOIN datavalue dv ON ( dv.sourceid = o.organisationunitid ) " );
-            sb.append( "JOIN period p ON ( p.periodid = dv.periodid ) " );
-            sb.append( "WHERE o.parentid = '" + orgUnitSelected + "' " );
-            sb.append( "AND dv.periodid = '" + periodid + "' " );
-            sb.append( "GROUP BY o.organisationunitid, OrganisationUnit, p.periodid, p.startdate " );
-            sb.append( "UNION " );
-
-            /**
-             * All descendant levels of selected organization unit
-             */
-            sb.append( "SELECT DISTINCT ou" + orgIndex + ".organisationunitid AS parentid, ou" + orgIndex + ".name AS OrganisationUnit, COUNT(value) as countdv_descendants, p.periodid AS PeriodId, p.startDate AS ColumnHeader " );
-            sb.append( "FROM datavalue dv " );
-            sb.append( "JOIN organisationunit ou ON ( ou.organisationunitid = dv.sourceid ) " );
-            this.setUpQueryForJOINTable( sb, diffLevel );
-            sb.append( "JOIN period p ON ( p.periodid = dv.periodid ) " );
-            sb.append( "WHERE dv.periodid = '" + periodid + "' " );
-            sb.append( "AND dv.sourceid IN " );
-            sb.append( "( " );
+        
+            /**
+             * Get all descendant level data for all orgunits under the selected, grouped
+             * by the next immediate children of the selected orgunit
+             */
+            sb.append("SELECT a.parentid, ou.name as organisationunit, COUNT(dv.value) as countdv_descendants, p.periodid, p.startdate as columnheader ");
+            sb.append(" FROM datavalue dv ");
+            sb.append(" INNER JOIN ( ");
             sb.append( this.setUpQueryGetDescendants( curLevel, maxLevel, orgUnitSelected ) );
-            sb.append( " ) " );
-            sb.append( "GROUP BY ou" + orgIndex + ".organisationunitid, OrganisationUnit, p.periodid, p.startDate " );
-            
-            sb.append( i < loopSize ? "UNION " : "" );
-           
-        }
+            sb.append(" ) a");
+            sb.append(" on a.childid = dv.sourceid ");
+            sb.append(" INNER JOIN organisationunit ou ON a.parentid = ou.organisationunitid ");
+            sb.append(" INNER JOIN (SELECT periodid, startdate from period where periodid in ");
+            sb.append( splitListHelper( betweenPeriodIds ) );
+            sb.append(" ) p on p.periodid = dv.periodid");
+            sb.append(" WHERE dv.periodid IN  ");
+            sb.append( splitListHelper( betweenPeriodIds ) );
+            sb.append(" GROUP BY a.parentid, ou.name, p.periodid, p.startdate ");
+            return sb.toString();
     }
 
     private String setUpQueryGetDescendants( int curLevel, int maxLevel, Integer orgUnitSelected )
     {
-        int j = curLevel;
+        Integer j = curLevel;
+        Integer nextLevel = j +1;
+        Integer parentLevel = curLevel;
 
-        String oldSQL = "SELECT DISTINCT idlevel" + (j + 1) + " FROM _orgunitstructure os WHERE os.idlevel" + (j)
-            + " = '" + orgUnitSelected + "'";
+        StringBuilder desc_query = new StringBuilder( "SELECT DISTINCT idlevel");
+        desc_query.append(nextLevel.toString());
+        desc_query.append( "  as parentid, idlevel");
+        desc_query.append(nextLevel.toString());
+        desc_query.append( " as childid from _orgunitstructure where idlevel");
+        desc_query.append(parentLevel.toString());
+        desc_query.append( " = '");
+        desc_query.append(orgUnitSelected.toString());
+        desc_query.append("'");
 
         for ( j++; j < (maxLevel); j++ )
-        {
-            oldSQL = "SELECT DISTINCT idlevel" + (j + 1) + " as descendant FROM _orgunitstructure os WHERE idlevel"
-                + (j) + " IN ( " + oldSQL + " ) ";
+        {   desc_query.append( " UNION " );
+            desc_query.append( "SELECT DISTINCT idlevel");
+            desc_query.append(nextLevel.toString());
+            desc_query.append( "  as parentid, idlevel");
+            desc_query.append(j.toString());
+            desc_query.append( " as childid from _orgunitstructure where idlevel");
+            desc_query.append(parentLevel.toString());
+            desc_query.append( " = '");
+            desc_query.append(orgUnitSelected.toString());
+            desc_query.append("'");
         }
-
-        return oldSQL;
+         
+        return desc_query.toString();
     }
 
     private void setUpQueryForDrillDownViewTable( StringBuffer sb )
@@ -753,21 +767,28 @@
         return (index == 0) ? "" : index + "";
     }
 
-    private void dropView( String view )
+    private boolean dropView( String view )
     {
+        boolean return_value = false;
+
         final StatementHolder holder = statementManager.getHolder();
 
         try
         {
             holder.getStatement().executeUpdate( "DROP VIEW IF EXISTS " + view );
+            return_value = true;
         }
-        catch ( SQLException ex )
+        catch ( Exception ex )
         {
+            return_value = false;
             throw new RuntimeException( "Failed to drop view: " + view, ex );
+            
         }
         finally
+
         {
             holder.close();
         }
+        return return_value;
     }
 }

