@Override public void beginTable(final Crosstab<?> crosstab, final List<CrosstabDimension> horizontalDimensions, final List<CrosstabDimension> verticalDimensions) { sb = new StringBuilder(); horizontalDimensionWidth = 0; for (final CrosstabDimension dimension : horizontalDimensions) { final List<String> categories = dimension.getCategories(); for (final String category : categories) { horizontalDimensionWidth = Math.max(horizontalDimensionWidth, category.length()); } } // minimum width = 6 horizontalDimensionWidth = Math.max(horizontalDimensionWidth, 6); if (ReflectionUtils.is(crosstab.getValueClass(), Number.class)) { leftAligned = false; } else { leftAligned = true; } }
/** * Builds the master crosstab, including all dimensions and categories that * will be included in the final result. * * By default this method will use the first result's crosstab dimensions * and categories, assuming that they are all the same. * * Subclasses can override this method to build the other dimensions. * * @param results * @return */ protected Crosstab<Serializable> createMasterCrosstab(final Collection<? extends R> results) { final R firstResult = results.iterator().next(); final Crosstab<?> firstCrosstab = firstResult.getCrosstab(); final Class<?> valueClass = firstCrosstab.getValueClass(); final CrosstabDimension dimension1 = firstCrosstab.getDimension(0); final CrosstabDimension dimension2 = firstCrosstab.getDimension(1); @SuppressWarnings({ "unchecked", "rawtypes" }) final Crosstab<Serializable> masterCrosstab = new Crosstab(valueClass, dimension1, dimension2); return masterCrosstab; }
@Override public R reduce(final Collection<? extends R> results) { final Crosstab<Serializable> masterCrosstab = createMasterCrosstab(results); final Class<?> valueClass = masterCrosstab.getValueClass(); final CrosstabDimension dimension1 = masterCrosstab.getDimension(0); final CrosstabDimension dimension2 = masterCrosstab.getDimension(1);
@Override protected Crosstab<Serializable> createMasterCrosstab(final Collection<? extends CrosstabResult> results) { final CrosstabResult firstResult = results.iterator().next(); final Class<?> valueClass = firstResult.getCrosstab().getValueClass(); final Set<String> categories1 = createColumnDimensionCategorySet(); final Set<String> categories2 = createMeasureDimensionCategorySet(); for (final CrosstabResult crosstabResult : results) { final Crosstab<?> crosstab = crosstabResult.getCrosstab(); categories1.addAll(crosstab.getDimension(0).getCategories()); categories2.addAll(crosstab.getDimension(1).getCategories()); } final CrosstabDimension dimension1 = new CrosstabDimension(firstResult.getCrosstab().getDimension(0).getName()); dimension1.addCategories(categories1); final CrosstabDimension dimension2 = new CrosstabDimension(firstResult.getCrosstab().getDimension(1).getName()); dimension2.addCategories(categories2); @SuppressWarnings({ "unchecked", "rawtypes" }) final Crosstab<Serializable> crosstab = new Crosstab(valueClass, dimension1, dimension2); return crosstab; }