=== modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java 2013-09-11 20:04:18 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/AnalyticsService.java 2013-09-28 15:06:20 +0000 @@ -28,11 +28,13 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; import org.hisp.dhis.common.BaseAnalyticalObject; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.Grid; import org.hisp.dhis.i18n.I18nFormat; @@ -160,4 +162,24 @@ * @return a data query parameter object created based on the given BaseAnalyticalObject. */ DataQueryParams getFromAnalyticalObject( BaseAnalyticalObject object, I18nFormat format ); + + /** + * Returns a list of persisted DimensionalObjects generated from the given + * dimension identifier and list of dimension options. The dx dimension + * will be exploded into concrete in|de|ds object identifiers and returned + * as separate DimensionalObjects. + * + * For the pe dimension items, relative periods represented by enums will be + * replaced by real ISO periods relative to the current date. For the ou + * dimension items, the user organisation unit enums + * USER_ORG_UNIT|USER_ORG_UNIT_CHILDREN will be replaced by the persisted + * organisation units for the current user. + * + * @param dimension the dimension identifier. + * @param items the dimension items. + * @param relativePeriodDate the date to use for generating relative periods, can be null. + * @parma format the I18nFormat, can be null. + * @return list of DimensionalObjects. + */ + List getDimension( String dimension, List items, Date relativePeriodDate, I18nFormat format ); } === 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-08-23 16:05:01 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/DefaultAnalyticsService.java 2013-09-28 15:06:20 +0000 @@ -656,29 +656,7 @@ return params; } - // ------------------------------------------------------------------------- - // Supportive methods - // ------------------------------------------------------------------------- - - /** - * Returns a list of persisted DimensionalObjects generated from the given - * dimension identifier and list of dimension options. The dx dimension - * will be exploded into concrete in|de|ds object identifiers and returned - * as separate DimensionalObjects. - * - * For the pe dimension items, relative periods represented by enums will be - * replaced by real ISO periods relative to the current date. For the ou - * dimension items, the user organisation unit enums - * USER_ORG_UNIT|USER_ORG_UNIT_CHILDREN will be replaced by the persisted - * organisation units for the current user. - * - * @param dimension the dimension identifier. - * @param items the dimension items. - * @param relativePeriodDate the date to use for generating relative periods, can be null. - * @parma format the I18nFormat, can be null. - * @return list of DimensionalObjects. - */ - private List getDimension( String dimension, List items, Date relativePeriodDate, I18nFormat format ) + public List getDimension( String dimension, List items, Date relativePeriodDate, I18nFormat format ) { if ( DATA_X_DIM_ID.equals( dimension ) ) { @@ -918,7 +896,11 @@ throw new IllegalQueryException( "Dimension identifier does not reference any dimension: " + dimension ); } - + + // ------------------------------------------------------------------------- + // Supportive methods + // ------------------------------------------------------------------------- + private DataQueryParams replaceIndicatorsWithDataElements( DataQueryParams params, int indicatorIndex ) { List indicators = asTypedList( params.getIndicators() ); === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java 2013-08-23 16:05:01 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/data/MockAnalyticsService.java 2013-09-28 15:06:20 +0000 @@ -28,6 +28,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -37,6 +38,7 @@ import org.hisp.dhis.analytics.AnalyticsService; import org.hisp.dhis.analytics.DataQueryParams; import org.hisp.dhis.common.BaseAnalyticalObject; +import org.hisp.dhis.common.DimensionalObject; import org.hisp.dhis.common.Grid; import org.hisp.dhis.i18n.I18nFormat; @@ -89,4 +91,11 @@ { throw new NotImplementedException(); } + + @Override + public List getDimension( String dimension, List items, Date relativePeriodDate, + I18nFormat format ) + { + throw new NotImplementedException(); + } } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java 2013-09-27 18:32:05 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventAnalyticsService.java 2013-09-28 15:06:20 +0000 @@ -41,9 +41,9 @@ Grid getEvents( EventQueryParams params ); - EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, String ou, String ouMode, - Set item ); + EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, + Set dimension, String ouMode ); - EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, String ou, String ouMode, - Set item, Set asc, Set desc, Integer page, Integer pageSize ); + EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, + Set dimension, String ouMode, Set asc, Set desc, Integer page, Integer pageSize ); } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java 2013-09-27 18:32:05 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/EventQueryParams.java 2013-09-28 15:06:20 +0000 @@ -34,6 +34,11 @@ import java.util.List; import java.util.Set; +import org.hisp.dhis.common.BaseDimensionalObject; +import org.hisp.dhis.common.DimensionType; +import org.hisp.dhis.common.DimensionalObject; +import org.hisp.dhis.common.NameableObject; +import org.hisp.dhis.common.NameableObjectUtils; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.program.Program; import org.hisp.dhis.program.ProgramStage; @@ -56,13 +61,13 @@ private Date endDate; private List items = new ArrayList(); + + private List dimensions = new ArrayList(); private List asc = new ArrayList(); private List desc = new ArrayList(); - private List organisationUnits = new ArrayList(); - private String organisationUnitMode; private String tableName; @@ -94,9 +99,9 @@ this.startDate = params.getStartDate(); this.endDate = params.getEndDate(); this.items = new ArrayList( params.getItems() ); + this.dimensions = new ArrayList( params.getDimensions() ); this.asc = new ArrayList( params.getAsc() ); this.desc = new ArrayList( params.getDesc() ); - this.organisationUnits = new ArrayList( params.getOrganisationUnits() ); this.organisationUnitMode = params.getOrganisationUnitMode(); this.tableName = params.getTableName(); this.page = params.getPage(); @@ -113,12 +118,39 @@ { return organisationUnitMode != null && organisationUnitMode.equalsIgnoreCase( mode ); } + + public List getOrganisationUnits() + { + int index = dimensions.indexOf( new BaseDimensionalObject( DimensionalObject.ORGUNIT_DIM_ID ) ); + return NameableObjectUtils.asTypedList( dimensions.get( index ).getItems() ); + } + + public void setOrganisationUnits( List organisationUnits ) + { + setDimensionOptions( DimensionalObject.ORGUNIT_DIM_ID, DimensionType.ORGANISATIONUNIT, null, organisationUnits ); + } + + private EventQueryParams setDimensionOptions( String dimension, DimensionType type, String dimensionName, List options ) + { + int index = dimensions.indexOf( new BaseDimensionalObject( dimension ) ); + + if ( index != -1 ) + { + dimensions.set( index, new BaseDimensionalObject( dimension, type, dimensionName, options ) ); + } + else + { + dimensions.add( new BaseDimensionalObject( dimension, type, dimensionName, options ) ); + } + + return this; + } public Set getOrganisationUnitChildren() { Set children = new HashSet(); - for ( OrganisationUnit unit : organisationUnits ) + for ( OrganisationUnit unit : getOrganisationUnits() ) { children.addAll( unit.getChildren() ); } @@ -210,6 +242,16 @@ return asc; } + public List getDimensions() + { + return dimensions; + } + + public void setDimensions( List dimensions ) + { + this.dimensions = dimensions; + } + public void setAsc( List asc ) { this.asc = asc; @@ -225,16 +267,6 @@ this.desc = desc; } - public List getOrganisationUnits() - { - return organisationUnits; - } - - public void setOrganisationUnits( List organisationUnits ) - { - this.organisationUnits = organisationUnits; - } - public String getOrganisationUnitMode() { return organisationUnitMode; === 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-09-28 13:59:45 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/DefaultEventAnalyticsService.java 2013-09-28 15:06:20 +0000 @@ -39,6 +39,7 @@ import java.util.Set; import org.hisp.dhis.analytics.AnalyticsService; +import org.hisp.dhis.analytics.DataQueryParams; import org.hisp.dhis.analytics.IllegalQueryException; import org.hisp.dhis.analytics.event.EventAnalyticsManager; import org.hisp.dhis.analytics.event.EventAnalyticsService; @@ -100,6 +101,9 @@ @Autowired private EventAnalyticsManager analyticsManager; + + @Autowired + private AnalyticsService analyticsService; // ------------------------------------------------------------------------- // EventAnalyticsService implementation @@ -213,13 +217,13 @@ } public EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, - String ou, String ouMode, Set item ) + Set dimension, String ouMode ) { - return getFromUrl( program, stage, startDate, endDate, ou, ouMode, item, null, null, null, null ); + return getFromUrl( program, stage, startDate, endDate, dimension, ouMode, null, null, null, null ); } public EventQueryParams getFromUrl( String program, String stage, String startDate, String endDate, - String ou, String ouMode, Set item, Set asc, Set desc, Integer page, Integer pageSize ) + Set dimension, String ouMode, Set asc, Set desc, Integer page, Integer pageSize ) { EventQueryParams params = new EventQueryParams(); @@ -260,26 +264,35 @@ throw new IllegalQueryException( "Start date is after end date: " + startDate + " - " + endDate ); } - if ( item != null ) - { - for ( String it : item ) - { - if ( !it.contains( DIMENSION_NAME_SEP ) ) - { - params.getItems().add( getItem( pr, it, null, null ) ); - } - else // Filter - { - String[] split = it.split( DIMENSION_NAME_SEP ); - - if ( split == null || split.length != 3 ) - { - throw new IllegalQueryException( "Item filter has invalid format: " + it ); - } - - params.getItems().add( getItem( pr, split[0], split[1], split[2] ) ); - } - } + for ( String it : dimension ) + { + String dim = DataQueryParams.getDimensionFromParam( it ); + + if ( ORGUNIT_DIM_ID.equals( dim ) || PERIOD_DIM_ID.equals( dim ) ) + { + List items = DataQueryParams.getDimensionItemsFromParam( it ); + params.getDimensions().addAll( analyticsService.getDimension( dim, items, null, null ) ); + } + else if ( !it.contains( DIMENSION_NAME_SEP ) ) + { + params.getItems().add( getItem( pr, it, null, null ) ); + } + else // Filter + { + String[] split = it.split( DIMENSION_NAME_SEP ); + + if ( split == null || split.length != 3 ) + { + throw new IllegalQueryException( "Item filter has invalid format: " + it ); + } + + params.getItems().add( getItem( pr, split[0], split[1], split[2] ) ); + } + } + + for ( OrganisationUnit unit : params.getOrganisationUnits() ) + { + unit.setLevel( organisationUnitService.getLevelOfOrganisationUnit( unit.getUid() ) ); } if ( asc != null ) @@ -297,24 +310,7 @@ params.getDesc().add( getSortItem( sort, pr ) ); } } - - if ( ou != null ) - { - String[] split = ou.split( DIMENSION_NAME_SEP ); - - for ( String ouId : split ) - { - OrganisationUnit orgUnit = organisationUnitService.getOrganisationUnit( ouId ); - if ( orgUnit != null ) - { - orgUnit.setLevel( organisationUnitService.getLevelOfOrganisationUnit( orgUnit.getId() ) ); - - params.getOrganisationUnits().add( orgUnit ); - } - } - } - if ( params.getOrganisationUnits().isEmpty() ) { throw new IllegalQueryException( "At least one organisation unit must be specified" ); === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java' --- dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2013-09-28 11:32:11 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/main/java/org/hisp/dhis/analytics/event/data/JdbcEventAnalyticsManager.java 2013-09-28 15:06:20 +0000 @@ -35,6 +35,7 @@ import java.util.Arrays; +import org.hisp.dhis.analytics.DataQueryParams; import org.hisp.dhis.analytics.event.EventAnalyticsManager; import org.hisp.dhis.analytics.event.EventQueryParams; import org.hisp.dhis.analytics.event.QueryItem; @@ -279,7 +280,7 @@ } else if ( operator.equals( "in" ) ) { - String[] split = filter.split( ":" ); + String[] split = filter.split( DataQueryParams.OPTION_SEP ); return "(" + TextUtils.getQuotedCommaDelimitedString( Arrays.asList( split ) ) + ")"; } === modified file 'dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventQueryPlannerTest.java' --- dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventQueryPlannerTest.java 2013-09-27 18:32:05 +0000 +++ dhis-2/dhis-services/dhis-service-analytics/src/test/java/org/hisp/dhis/analytics/event/data/EventQueryPlannerTest.java 2013-09-28 15:06:20 +0000 @@ -71,7 +71,7 @@ params.setProgram( prA ); params.setStartDate( new Cal( 2010, 6, 1 ).time() ); params.setEndDate( new Cal( 2012, 3, 20 ).time() ); - params.getOrganisationUnits().add( ouA ); + params.setOrganisationUnits( Arrays.asList( ouA ) ); List queries = EventQueryPlanner.planQuery( params ); @@ -96,7 +96,7 @@ params.setProgram( prA ); params.setStartDate( new Cal( 2010, 3, 1 ).time() ); params.setEndDate( new Cal( 2010, 9, 20 ).time() ); - params.getOrganisationUnits().add( ouA ); + params.setOrganisationUnits( Arrays.asList( ouA ) ); List queries = EventQueryPlanner.planQuery( params ); @@ -106,8 +106,7 @@ assertEquals( new Cal( 2010, 9, 20 ).time(), queries.get( 0 ).getEndDate() ); assertEquals( "analytics_event_2010_programuidA", queries.get( 0 ).getTableName() ); - } - + } @Test public void testPlanQueryC() === modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java 2013-09-27 18:32:05 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/api/controller/EventAnalyticsController.java 2013-09-28 15:06:20 +0000 @@ -72,13 +72,12 @@ @RequestParam(required=false) String stage, @RequestParam String startDate, @RequestParam String endDate, - @RequestParam String ou, + @RequestParam Set dimension, @RequestParam(required=false) String ouMode, - @RequestParam Set item, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, ou, ouMode, item ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, ouMode ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_JSON, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -93,13 +92,12 @@ @RequestParam(required=false) String stage, @RequestParam String startDate, @RequestParam String endDate, - @RequestParam String ou, + @RequestParam Set dimension, @RequestParam(required=false) String ouMode, - @RequestParam Set item, Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, ou, ouMode, item ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, ouMode ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.xls", true ); Grid grid = analyticsService.getAggregatedEventData( params ); @@ -116,9 +114,8 @@ @RequestParam(required=false) String stage, @RequestParam String startDate, @RequestParam String endDate, - @RequestParam String ou, + @RequestParam Set dimension, @RequestParam(required=false) String ouMode, - @RequestParam Set item, @RequestParam(required=false) Set asc, @RequestParam(required=false) Set desc, @RequestParam(required=false) Integer page, @@ -126,7 +123,7 @@ Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, ou, ouMode, item, asc, desc, page, pageSize ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, ouMode, asc, desc, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_JSON, CacheStrategy.RESPECT_SYSTEM_SETTING ); Grid grid = analyticsService.getEvents( params ); @@ -141,9 +138,8 @@ @RequestParam(required=false) String stage, @RequestParam String startDate, @RequestParam String endDate, - @RequestParam String ou, + @RequestParam Set dimension, @RequestParam(required=false) String ouMode, - @RequestParam Set item, @RequestParam(required=false) Set asc, @RequestParam(required=false) Set desc, @RequestParam(required=false) Integer page, @@ -151,7 +147,7 @@ Model model, HttpServletResponse response ) throws Exception { - EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, ou, ouMode, item, asc, desc, page, pageSize ); + EventQueryParams params = analyticsService.getFromUrl( program, stage, startDate, endDate, dimension, ouMode, asc, desc, page, pageSize ); contextUtils.configureResponse( response, ContextUtils.CONTENT_TYPE_EXCEL, CacheStrategy.RESPECT_SYSTEM_SETTING, "events.xls", true ); Grid grid = analyticsService.getEvents( params ); === modified file 'dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js' --- dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js 2013-09-28 13:59:45 +0000 +++ dhis-2/dhis-web/dhis-web-caseentry/src/main/webapp/dhis-web-caseentry/app/app.js 2013-09-28 15:06:20 +0000 @@ -1892,16 +1892,22 @@ // Paging p.page = TR.state.currentPage; - - // organisation unit - - p.ou = ""; + + // Get searching values + + p.dimension = []; + + // Organisation unit + + var ou = "ou:"; for( var i in TR.state.orgunitIds){ - p.ou += TR.state.orgunitIds[i]; + ou += TR.state.orgunitIds[i]; if( i