/** * Generates a mapping where the key represents the dimensional item identifiers * concatenated by {@link DimensionalObject#DIMENSION_SEP} and the value is * the corresponding aggregated data value based on the given grid. Assumes * that the value column is the last column in the grid. * * @param grid the grid. * @return a mapping between item identifiers and aggregated values. */ public static Map<String, Object> getAggregatedDataValueMapping( Grid grid ) { Map<String, Object> map = new HashMap<>(); int metaCols = grid.getWidth() - 1; int valueIndex = grid.getWidth() - 1; for ( List<Object> row : grid.getRows() ) { StringBuilder key = new StringBuilder(); for ( int index = 0; index < metaCols; index++ ) { key.append( row.get( index ) ).append( DIMENSION_SEP ); } key.deleteCharAt( key.length() - 1 ); Object value = row.get( valueIndex ); map.put( key.toString(), value ); } return map; }
/** * Get event data mapping for values. * * @param grid the grid to collect data from * @return map with key and values */ public static Map<String, Object> getAggregatedEventDataMapping( Grid grid ) { Map<String, Object> map = new HashMap<>(); int metaCols = grid.getWidth() - 1; int valueIndex = grid.getWidth() - 1; for ( List<Object> row : grid.getRows() ) { List<String> ids = new ArrayList<>(); for ( int index = 0; index < metaCols; index++ ) { Object id = row.get( index ); if ( id != null ) { ids.add( (String) row.get( index ) ); } } Collections.sort( ids ); String key = StringUtils.join( ids, DIMENSION_SEP ); Object value = row.get( valueIndex ); map.put( key, value ); } return map; }
@Override public JFreeChart getOrganisationUnitDistributionChart( OrganisationUnitGroupSet groupSet, OrganisationUnit organisationUnit ) { Map<String, Double> categoryValues = new HashMap<>(); Grid grid = getOrganisationUnitDistribution( groupSet, organisationUnit, true ); if ( grid == null || grid.getHeight() != 1 ) { return null; } for ( int i = 1; i < grid.getWidth() - 2; i++ ) // Skip name, none and total column { categoryValues.put( grid.getHeaders().get( i ).getName(), Double.valueOf( String.valueOf( grid.getRow( 0 ).get( i ) ) ) ); } String title = groupSet.getName() + TITLE_SEP + organisationUnit.getName(); JFreeChart chart = chartService.getJFreeChart( title, PlotOrientation.VERTICAL, CategoryLabelPositions.DOWN_45, categoryValues ); return chart; }
int ouInx = grid.getIndexOfHeader( DimensionalObject.ORGUNIT_DIM_ID ); int aoInx = hasAttributeOptions ? grid.getIndexOfHeader( DimensionalObject.ATTRIBUTEOPTIONCOMBO_DIM_ID ) : 0; int vlInx = grid.getWidth() - 1;
int vlInx = grid.getWidth() - 1;
int ouInx = grid.getIndexOfHeader( DimensionalObject.ORGUNIT_DIM_ID ); int aoInx = hasAttributeOptions ? grid.getIndexOfHeader( DimensionalObject.ATTRIBUTEOPTIONCOMBO_DIM_ID ) : 0; int vlInx = grid.getWidth() - 1;
int coInx = grid.getIndexOfHeader( CATEGORYOPTIONCOMBO_DIM_ID ); int aoInx = grid.getIndexOfHeader( ATTRIBUTEOPTIONCOMBO_DIM_ID ); int vlInx = grid.getWidth() - 1;
/** * Returns a mapping between dimension items and values for the given data * query and list of indicators. The dimensional items part of the indicator * numerators and denominators are used as dimensional item for the aggregated * values being retrieved. * * @param params the {@link DataQueryParams}. * @param indicators the list of indicators. * @return a dimensional items to aggregate values map. */ private Map<String, Double> getAggregatedDataValueMap( DataQueryParams params, List<Indicator> indicators ) { List<DimensionalItemObject> items = Lists.newArrayList( expressionParserService.getIndicatorDimensionalItemObjects( indicators ) ); items = DimensionalObjectUtils.replaceOperandTotalsWithDataElements( items ); DimensionalObject dimension = new BaseDimensionalObject( DimensionalObject.DATA_X_DIM_ID, DimensionType.DATA_X, null, DISPLAY_NAME_DATA_X, items ); DataQueryParams dataSourceParams = DataQueryParams.newBuilder( params ) .replaceDimension( dimension ) .withMeasureCriteria( new HashMap<>() ) .withIncludeNumDen( false ) .withSkipHeaders( true ) .withSkipMeta( true ).build(); Grid grid = getAggregatedDataValueGridInternal( dataSourceParams ); return grid.getAsMap( grid.getWidth() - 1, DimensionalObject.DIMENSION_SEP ); }
/** * Writes an XML representation of the given Grid to the given OutputStream. */ public static void toXml( Grid grid, OutputStream out ) { XMLWriter writer = XMLFactory.getXMLWriter( out ); writer.openDocument(); writer.openElement( ATTR_GRID, ATTR_TITLE, grid.getTitle(), ATTR_SUBTITLE, grid.getSubtitle(), ATTR_WIDTH, String.valueOf( grid.getWidth() ), ATTR_HEIGHT, String.valueOf( grid.getHeight() ) ); writer.openElement( ATTR_HEADERS ); for ( GridHeader header : grid.getHeaders() ) { writer.writeElement( ATTR_HEADER, null, ATTR_NAME, header.getName(), ATTR_COLUMN, header.getColumn(), ATTR_TYPE, header.getType(), ATTR_HIDDEN, String.valueOf( header.isHidden() ), ATTR_META, String.valueOf( header.isMeta() ) ); } writer.closeElement(); writer.openElement( ATTR_ROWS ); for ( List<Object> row : grid.getRows() ) { writer.openElement( ATTR_ROW ); for ( Object field : row ) { writer.writeElement( ATTR_FIELD, field != null ? String.valueOf( field ) : EMPTY ); } writer.closeElement(); } writer.closeElement(); writer.closeElement(); writer.closeDocument(); }
grid.sortGrid( grid.getWidth(), sortOrder );
valueMap = GridUtils.getMetaValueMapping( grid, ( grid.getWidth() - 1 ) );