=== modified file 'dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java' --- dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java 2013-10-03 13:24:21 +0000 +++ dhis-2/dhis-api/src/main/java/org/hisp/dhis/organisationunit/OrganisationUnit.java 2013-10-04 12:27:33 +0000 @@ -616,7 +616,7 @@ * Returns a mapping between the uid and the uid parent graph of the given * organisation units. */ - public static Map getParentGrapMap( List organisationUnits ) + public static Map getParentGraphMap( List organisationUnits ) { Map map = new HashMap(); === 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-10-03 08:22:21 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/DataQueryParams.java 2013-10-04 12:27:33 +0000 @@ -68,6 +68,7 @@ import org.hisp.dhis.dataelement.DataElementGroupSet; import org.hisp.dhis.dataelement.DataElementOperand; import org.hisp.dhis.dataset.DataSet; +import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.organisationunit.OrganisationUnitGroupSet; import org.hisp.dhis.period.Period; import org.hisp.dhis.period.PeriodType; @@ -102,7 +103,7 @@ private static final DimensionItem[] DIM_OPT_ARR = new DimensionItem[0]; private static final DimensionItem[][] DIM_OPT_2D_ARR = new DimensionItem[0][]; - + protected List dimensions = new ArrayList(); protected List filters = new ArrayList(); @@ -111,24 +112,54 @@ private Map measureCriteria = new HashMap(); + /** + * Indicates if the meta data part of the query response should be omitted. + */ private boolean skipMeta; + /** + * Indicates i) if the names of all ancestors of the organisation units part + * of the query should be included in the "names" key and ii) if the hierarchy + * path of all organisation units part of the query should be included as a + * "ouHierarchy" key in the meta-data part of the response. + */ private boolean hierarchyMeta; + /** + * Indicates whether the maximum number of records to include the response + * should be ignored. + */ private boolean ignoreLimit; // ------------------------------------------------------------------------- // Transient properties // ------------------------------------------------------------------------- + /** + * The partitions containing data relevant to this query. + */ protected transient Partitions partitions; + /** + * The aggregation period type for this query. + */ protected transient String periodType; - + + /** + * The period type of the data values to query. + */ private transient PeriodType dataPeriodType; + /** + * Indicates whether to skip partitioning during query planning. + */ private transient boolean skipPartitioning; + /** + * Organisation units which were explicitly part of the original request. + */ + private List organisationUnits = new ArrayList(); + // ------------------------------------------------------------------------- // Constructors // ------------------------------------------------------------------------- @@ -153,6 +184,7 @@ params.periodType = this.periodType; params.dataPeriodType = this.dataPeriodType; params.skipPartitioning = this.skipPartitioning; + params.organisationUnits = new ArrayList( this.organisationUnits ); return params; } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-10-04 10:59:00 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-10-04 12:27:33 +0000 @@ -55,7 +55,7 @@ import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT; import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT_CHILDREN; import static org.hisp.dhis.organisationunit.OrganisationUnit.KEY_USER_ORGUNIT_GRANDCHILDREN; -import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentGrapMap; +import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentGraphMap; import static org.hisp.dhis.period.PeriodType.getPeriodTypeFromIsoString; import static org.hisp.dhis.reporttable.ReportTable.IRT2D; import static org.hisp.dhis.reporttable.ReportTable.addIfEmpty; @@ -249,24 +249,26 @@ Map valueMap = permutationOperandValueMap.get( permKey ); - if ( valueMap != null ) - { - Period period = filterPeriod != null ? filterPeriod : (Period) DimensionItem.getPeriodItem( options ); - - int days = daysBetween( period.getStartDate(), period.getEndDate() ); - - Double value = expressionService.getIndicatorValue( indicator, period, valueMap, constantMap, days ); - - if ( value != null ) - { - List row = new ArrayList( options ); - - row.add( indicatorIndex, new DimensionItem( INDICATOR_DIM_ID, indicator ) ); - - grid.addRow(); - grid.addValues( DimensionItem.getItemIdentifiers( row ) ); - grid.addValue( MathUtils.getRounded( value ) ); - } + if ( valueMap == null ) + { + continue; + } + + Period period = filterPeriod != null ? filterPeriod : (Period) DimensionItem.getPeriodItem( options ); + + int days = daysBetween( period.getStartDate(), period.getEndDate() ); + + Double value = expressionService.getIndicatorValue( indicator, period, valueMap, constantMap, days ); + + if ( value != null ) + { + List row = new ArrayList( options ); + + row.add( indicatorIndex, new DimensionItem( INDICATOR_DIM_ID, indicator ) ); + + grid.addRow(); + grid.addValues( DimensionItem.getItemIdentifiers( row ) ); + grid.addValue( MathUtils.getRounded( value ) ); } } } @@ -386,19 +388,17 @@ Map metaData = new HashMap(); Map uidNameMap = getUidNameMap( params ); - Map cocNameMap = getCocNameMap( grid, cocIndex ); - Map ouParentGraphMap = getParentGrapMap( asTypedList( - params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ); - + Map cocNameMap = getCocNameMap( grid, cocIndex ); uidNameMap.putAll( cocNameMap ); metaData.put( NAMES_META_KEY, uidNameMap ); metaData.put( PERIOD_DIM_ID, getUids( params.getDimensionOrFilter( PERIOD_DIM_ID ) ) ); - metaData.put( ORGUNIT_DIM_ID, ouParentGraphMap ); + metaData.put( ORGUNIT_DIM_ID, getUids( params.getDimensionOrFilter( ORGUNIT_DIM_ID ) ) ); + metaData.put( CATEGORYOPTIONCOMBO_DIM_ID, cocNameMap.keySet() ); - if ( cocIndex != null ) + if ( params.isHierarchyMeta() ) { - metaData.put( CATEGORYOPTIONCOMBO_DIM_ID, cocNameMap.keySet() ); + metaData.put( OU_HIERARCHY_KEY, getParentGraphMap( asTypedList( params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ) ); } grid.setMetaData( metaData ); @@ -988,6 +988,11 @@ return map; } + /** + * Returns a mapping between the category option combo identifiers and names + * in the given grid. Returns an empty map if the grid or cocIndex parameters + * are null. + */ private Map getCocNameMap( Grid grid, Integer cocIndex ) { Map metaData = new HashMap(); === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java 2013-10-04 10:59:00 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java 2013-10-04 12:27:33 +0000 @@ -33,7 +33,7 @@ import static org.hisp.dhis.common.DimensionalObject.ORGUNIT_DIM_ID; import static org.hisp.dhis.common.DimensionalObject.PERIOD_DIM_ID; import static org.hisp.dhis.common.NameableObjectUtils.asTypedList; -import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentGrapMap; +import static org.hisp.dhis.organisationunit.OrganisationUnit.getParentGraphMap; import java.util.ArrayList; import java.util.Date; @@ -168,11 +168,13 @@ Map metaData = new HashMap(); Map uidNameMap = getUidNameMap( params ); - Map ouParentGraphMap = getParentGrapMap( asTypedList( - params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ); metaData.put( NAMES_META_KEY, uidNameMap ); - metaData.put( ORGUNIT_DIM_ID, ouParentGraphMap ); + + if ( params.isHierarchyMeta() ) + { + metaData.put( ORGUNIT_DIM_ID, getParentGraphMap( asTypedList( params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ) ); + } grid.setMetaData( metaData ); @@ -234,11 +236,13 @@ Map metaData = new HashMap(); Map uidNameMap = getUidNameMap( params ); - Map ouParentGraphMap = getParentGrapMap( asTypedList( - params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ); metaData.put( NAMES_META_KEY, uidNameMap ); - metaData.put( ORGUNIT_DIM_ID, ouParentGraphMap ); + + if ( params.isHierarchyMeta() ) + { + metaData.put( ORGUNIT_DIM_ID, getParentGraphMap( asTypedList( params.getDimensionOrFilter( ORGUNIT_DIM_ID ), OrganisationUnit.class ) ) ); + } if ( params.isPaging() ) {