protected void fillHeaders( byte dimension, HeaderCell[][] headers, int level, int col, CollectedList list, List vals) { if (level == buckets[dimension].length) { return; } for (Iterator it = list.iterator(); it.hasNext(); ) { CollectedList subList = (CollectedList) it.next(); vals.add(subList.key); int depthSpan = subList.key.isTotal() ? buckets[dimension].length - level : 1; Bucket[] values = new Bucket[buckets[dimension].length]; vals.toArray(values); headers[level][col] = new HeaderCell(values, subList.span, depthSpan); if (!subList.key.isTotal()) { fillHeaders(dimension, headers, level + 1, col, subList, vals); } col += subList.span; vals.remove(vals.size() - 1); } }
protected CollectedList createHeadersList( byte dimension, BucketMap bucketMap, int level, boolean total) { CollectedList headers = new CollectedList(); for (Iterator it = bucketMap.entryIterator(); it.hasNext(); ) { Map.Entry entry = (Map.Entry) it.next(); Bucket bucketValue = (Bucket) entry.getKey(); boolean totalBucket = bucketValue.isTotal(); byte totalPosition = allBuckets[bucketMap.level].getTotalPosition(); boolean createHeader = !totalBucket || total || totalPosition != BucketDefinition.TOTAL_POSITION_NONE; if (createHeader) { CollectedList nextHeaders; if (level + 1 < buckets[dimension].length) { BucketMap nextMap = (BucketMap) entry.getValue(); nextHeaders = createHeadersList(dimension, nextMap, level + 1, total || totalBucket); } else { nextHeaders = new CollectedList(); nextHeaders.span = 1; } nextHeaders.key = bucketValue; if (totalBucket) { if (totalPosition == BucketDefinition.TOTAL_POSITION_START) { headers.addFirst(nextHeaders); } else { headers.add(nextHeaders); } } else { headers.add(nextHeaders); } } } if (headers.span == 0) { headers.span = 1; } return headers; }
protected void fillCells( CollectedList[] collectedHeaders, BucketMap bucketMap, int level, int[] pos, List vals, List bucketMaps) { bucketMaps.add(bucketMap); byte dimension = level < rowBucketCount ? DIMENSION_ROW : DIMENSION_COLUMN; boolean last = level == allBuckets.length - 1; CollectedList[] nextCollected = null; if (!last) { nextCollected = new CollectedList[DIMENSIONS]; for (int d = 0; d < DIMENSIONS; ++d) { if (d != dimension) { nextCollected[d] = collectedHeaders[d]; } } } boolean incrementRow = level == buckets[BucketingService.DIMENSION_ROW].length - 1; CollectedList collectedList = collectedHeaders[dimension]; Iterator bucketIt = bucketMap == null ? null : bucketMap.entryIterator(); Map.Entry bucketItEntry = bucketIt != null && bucketIt.hasNext() ? (Map.Entry) bucketIt.next() : null; for (Iterator it = collectedList.iterator(); it.hasNext(); ) { CollectedList list = (CollectedList) it.next(); Map.Entry bucketEntry = null; if (list.key.isTotal()) { if (bucketMap != null) { bucketEntry = bucketMap.getTotalEntry(); } } else { if (bucketItEntry != null && bucketItEntry.getKey().equals(list.key)) { bucketEntry = bucketItEntry; bucketItEntry = bucketIt.hasNext() ? (Map.Entry) bucketIt.next() : null; } } vals.add(list.key); if (last) { fillCell(pos, vals, bucketMaps, bucketEntry); } else { nextCollected[dimension] = list; BucketMap nextMap = bucketEntry == null ? null : (BucketMap) bucketEntry.getValue(); fillCells(nextCollected, nextMap, level + 1, pos, vals, bucketMaps); } vals.remove(vals.size() - 1); if (incrementRow) { ++pos[0]; pos[1] = 0; } } bucketMaps.remove(bucketMaps.size() - 1); }