← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 10350: Analytics, query planner, best effort at detecting aggregation type when request contains data el...

 

------------------------------------------------------------
revno: 10350
committer: Lars Helge Øverland <larshelge@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2013-03-20 13:40:07 +0100
message:
  Analytics, query planner, best effort at detecting aggregation type when request contains data element group sets but not data elements
modified:
  dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java
  dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java
  dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java
  dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml
  dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Timer.java
  dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DateUtilsTest.java
  resources/sql/div.sql


--
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/DataElementGroupSet.java'
--- dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java	2013-02-13 03:57:52 +0000
+++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/dataelement/DataElementGroupSet.java	2013-03-20 12:40:07 +0000
@@ -27,12 +27,11 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.annotation.JsonView;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
-import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
 import org.hisp.dhis.common.BaseIdentifiableObject;
 import org.hisp.dhis.common.DxfNamespaces;
 import org.hisp.dhis.common.IdentifiableObject;
@@ -41,10 +40,12 @@
 import org.hisp.dhis.common.view.DetailedView;
 import org.hisp.dhis.common.view.ExportView;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
+import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
 
 /**
  * DataElementGroupSet is a set of DataElementGroups. It is by default

=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java'
--- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java	2013-03-14 13:07:10 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java	2013-03-20 12:40:07 +0000
@@ -1009,7 +1009,13 @@
             }
         }
         
-        //TODO filters?
+        for ( Dimension filter : filters )
+        {
+            if ( DimensionType.DATAELEMENT_GROUPSET.equals( filter.getType() ) )
+            {
+                list.add( filter );
+            }
+        }
         
         return list;
     }

=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java'
--- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java	2013-03-20 09:35:04 +0000
+++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultQueryPlanner.java	2013-03-20 12:40:07 +0000
@@ -31,9 +31,12 @@
 import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT;
 import static org.hisp.dhis.analytics.AggregationType.AVERAGE_INT_DISAGGREGATION;
 import static org.hisp.dhis.analytics.AggregationType.SUM;
-import static org.hisp.dhis.analytics.DataQueryParams.*;
+import static org.hisp.dhis.analytics.DataQueryParams.CATEGORYOPTIONCOMBO_DIM_ID;
 import static org.hisp.dhis.analytics.DataQueryParams.INDICATOR_DIM_ID;
+import static org.hisp.dhis.analytics.DataQueryParams.LEVEL_PREFIX;
 import static org.hisp.dhis.analytics.DataQueryParams.MAX_DIM_OPT_PERM;
+import static org.hisp.dhis.analytics.DataQueryParams.ORGUNIT_DIM_ID;
+import static org.hisp.dhis.analytics.DataQueryParams.PERIOD_DIM_ID;
 import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_AVERAGE;
 import static org.hisp.dhis.dataelement.DataElement.AGGREGATION_OPERATOR_SUM;
 import static org.hisp.dhis.dataelement.DataElement.VALUE_TYPE_BOOL;
@@ -42,8 +45,8 @@
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.commons.logging.Log;
 import org.hisp.dhis.analytics.AggregationType;
 import org.hisp.dhis.analytics.DataQueryParams;
 import org.hisp.dhis.analytics.Dimension;
@@ -54,6 +57,7 @@
 import org.hisp.dhis.common.IdentifiableObject;
 import org.hisp.dhis.common.ListMap;
 import org.hisp.dhis.dataelement.DataElement;
+import org.hisp.dhis.dataelement.DataElementGroup;
 import org.hisp.dhis.organisationunit.OrganisationUnit;
 import org.hisp.dhis.organisationunit.OrganisationUnitService;
 import org.hisp.dhis.period.Period;
@@ -418,20 +422,24 @@
      * aggregation period type. Average bool means that the data elements have the
      * average aggregation operator and the bool value type.
      * 
+     * If no data elements are present, the aggregation type will be determined
+     * based on the first data element in the first data element group in the 
+     * first data element group set in the query.
+     * 
      * If the aggregation type is already set/overridden in the request, the
-     * query will be returned unchanged. If there are no dimension items specified
-     * the aggregation type will fall back to sum.
+     * query will be returned unchanged. If there are no data elements or data
+     * element group sets specified the aggregation type will fall back to sum.
      */
     private List<DataQueryParams> groupByAggregationType( DataQueryParams params )
     {
         List<DataQueryParams> queries = new ArrayList<DataQueryParams>();
-     
+        
         if ( params.getAggregationType() != null )
         {
             queries.add( new DataQueryParams( params ) );
             return queries;
         }
-
+        
         if ( params.getDataElements() != null && !params.getDataElements().isEmpty() )
         {
             PeriodType periodType = PeriodType.getPeriodTypeByName( params.getPeriodType() );
@@ -446,6 +454,25 @@
                 queries.add( query );
             }
         }
+        else if ( params.getDataElementGroupSets() != null && !params.getDataElementGroupSets().isEmpty() )
+        {
+            Dimension degs = params.getDataElementGroupSets().get( 0 );
+            DataElementGroup deg = (DataElementGroup) ( degs.hasItems() ? degs.getItems().get( 0 ) : null );
+            
+            DataQueryParams query = new DataQueryParams( params );
+            
+            if ( deg != null && !deg.getMembers().isEmpty() )
+            {
+                PeriodType periodType = PeriodType.getPeriodTypeByName( params.getPeriodType() );                
+                query.setAggregationType( getAggregationType( deg.getValueType(), deg.getAggregationOperator(), periodType, deg.getPeriodType() ) );
+            }
+            else
+            {
+                query.setAggregationType( SUM );
+            }
+            
+            queries.add( query );
+        }
         else
         {
             DataQueryParams query = new DataQueryParams( params );
@@ -534,7 +561,7 @@
         {
             DataElement de = (DataElement) element;
 
-            AggregationType aggregationType = getAggregationType( de, de.getType(), de.getAggregationOperator(), aggregationPeriodType, de.getPeriodType() );
+            AggregationType aggregationType = getAggregationType( de.getType(), de.getAggregationOperator(), aggregationPeriodType, de.getPeriodType() );
             
             map.putValue( aggregationType, de );
         }
@@ -546,7 +573,7 @@
      * Puts the given element into the map according to the value type, aggregation
      * operator, aggregation period type and data period type.
      */
-    private AggregationType getAggregationType( IdentifiableObject element, String valueType, String aggregationOperator, 
+    private AggregationType getAggregationType( String valueType, String aggregationOperator, 
         PeriodType aggregationPeriodType, PeriodType dataPeriodType )
     {
         AggregationType aggregationType = null;

=== modified file 'dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml'
--- dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml	2013-02-05 10:03:40 +0000
+++ dhis-2/dhis-support/dhis-support-hibernate/src/main/resources/ehcache.xml	2013-03-20 12:40:07 +0000
@@ -132,17 +132,17 @@
 
   <cache name="org.hisp.dhis.dataelement.DataElementGroup.members" maxElementsInMemory="3000" />
 
-  <cache name="org.hisp.dhis.dataelement.DataElementGroupSet.members" maxElementsInMemory="400" />
+  <cache name="org.hisp.dhis.dataelement.DataElementGroupSet.members" maxElementsInMemory="500" />
 
-  <cache name="org.hisp.dhis.indicator.Indicator.groups" maxElementsInMemory="400" />
+  <cache name="org.hisp.dhis.indicator.Indicator.groups" maxElementsInMemory="500" />
 
   <cache name="org.hisp.dhis.indicator.Indicator.dataSets" maxElementsInMemory="400" />
 
   <cache name="org.hisp.dhis.indicator.Indicator.attributeValues" maxElementsInMemory="1000" />
 
-  <cache name="org.hisp.dhis.indicator.IndicatorGroup.members" maxElementsInMemory="400" />
+  <cache name="org.hisp.dhis.indicator.IndicatorGroup.members" maxElementsInMemory="500" />
 
-  <cache name="org.hisp.dhis.indicator.IndicatorGroupSet.members" maxElementsInMemory="400" />
+  <cache name="org.hisp.dhis.indicator.IndicatorGroupSet.members" maxElementsInMemory="500" />
 
   <cache name="org.hisp.dhis.dataset.Section.dataElements" maxElementsInMemory="4000" />
 
@@ -162,7 +162,7 @@
 
   <cache name="org.hisp.dhis.organisationunit.OrganisationUnitGroup.members" maxElementsInMemory="20000" />
 
-  <cache name="org.hisp.dhis.organisationunit.OrganisationUnitGroupSet.organisationUnitGroups" maxElementsInMemory="400" />
+  <cache name="org.hisp.dhis.organisationunit.OrganisationUnitGroupSet.organisationUnitGroups" maxElementsInMemory="500" />
 
   <cache name="org.hisp.dhis.reporttable.ReportTable.dataElements" maxElementsInMemory="1500" />
 

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Timer.java'
--- dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Timer.java	2012-08-29 10:00:16 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/main/java/org/hisp/dhis/system/util/Timer.java	2013-03-20 12:40:07 +0000
@@ -55,12 +55,7 @@
         long endTime = System.nanoTime();
         
         long time = ( endTime - startTime ) / 1000;
-     
-        if ( !printDisabled )
-        {
-            System.out.println( msg  + ": " + time + " micros" );
-        }
-        
+             
         return time;
     }
 

=== modified file 'dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DateUtilsTest.java'
--- dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DateUtilsTest.java	2012-12-21 12:59:39 +0000
+++ dhis-2/dhis-support/dhis-support-system/src/test/java/org/hisp/dhis/system/util/DateUtilsTest.java	2013-03-20 12:40:07 +0000
@@ -58,10 +58,4 @@
         assertEquals( "10 mar 2010", convertDate( "2010-03-10" ).toLowerCase() );
         assertEquals( "Invalid", convertDate( "Invalid" ) );
     }
-    
-    @Test
-    public void testGetSecondsUntilTomorrow()
-    {
-        System.out.println( DateUtils.getSecondsUntilTomorrow( 3 ) );
-    }
 }

=== modified file 'resources/sql/div.sql'
--- resources/sql/div.sql	2013-02-07 13:00:56 +0000
+++ resources/sql/div.sql	2013-03-20 12:40:07 +0000
@@ -119,6 +119,27 @@
   or cast(substring(coordinates from '\[(.+?\..+?),.+?\..+?\]') as double precision) > 43
 );
 
+-- Identify empty groups
+
+select 'Data element group' as type, o.name as name
+from dataelementgroup o
+where not exists (
+  select * from dataelementgroupmembers
+  where dataelementgroupid=o.dataelementgroupid)
+union all
+select 'Indicator group' as type, o.name as name
+from indicatorgroup o
+where not exists (
+  select * from indicatorgroupmembers
+  where indicatorgroupid=o.indicatorgroupid)
+union all
+select 'Organisation unit group' as type, o.name as name
+from orgunitgroup o
+where not exists (
+  select * from orgunitgroupmembers
+  where orgunitgroupid=o.orgunitgroupid)
+order by type,name;
+
 -- Populate dashboards for all users (7666 is userinfoid for target dashboard, replace with preferred id)
 
 insert into usersetting (userinfoid, name, value)