Search in sources :

Example 1 with ArraySortedSet

use of mondrian.util.ArraySortedSet in project mondrian by pentaho.

the class CacheControlImpl method findAxisValues.

public static SegmentColumn[] findAxisValues(CellRegion region) {
    final List<SegmentColumn> list = new ArrayList<SegmentColumn>();
    final CellRegionVisitor visitor = new CellRegionVisitorImpl() {

        public void visit(MemberCellRegion region) {
            if (region.dimension.isMeasures()) {
                return;
            }
            final Map<String, Set<Comparable>> levels = new HashMap<String, Set<Comparable>>();
            for (Member member : region.memberList) {
                while (true) {
                    if (member == null || member.isAll()) {
                        break;
                    }
                    final String ccName = ((RolapLevel) member.getLevel()).getKeyExp().getGenericExpression();
                    if (!levels.containsKey(ccName)) {
                        levels.put(ccName, new HashSet<Comparable>());
                    }
                    levels.get(ccName).add((Comparable) ((RolapMember) member).getKey());
                    member = member.getParentMember();
                }
            }
            for (Entry<String, Set<Comparable>> entry : levels.entrySet()) {
                // Now sort and convert to an ArraySortedSet.
                final Comparable[] keys = entry.getValue().toArray(new Comparable[entry.getValue().size()]);
                if (keys.length == 1 && keys[0].equals(true)) {
                    list.add(new SegmentColumn(entry.getKey(), -1, null));
                } else {
                    Arrays.sort(keys, Util.SqlNullSafeComparator.instance);
                    // noinspection unchecked
                    list.add(new SegmentColumn(entry.getKey(), -1, new ArraySortedSet(keys)));
                }
            }
        }

        public void visit(MemberRangeCellRegion region) {
            // We translate all ranges into wildcards.
            // FIXME Optimize this by resolving the list of members
            // into an actual list of values for ConstrainedColumn
            list.add(new SegmentColumn(region.level.getKeyExp().getGenericExpression(), -1, null));
        }
    };
    ((CellRegionImpl) region).accept(visitor);
    return list.toArray(new SegmentColumn[list.size()]);
}
Also used : ArraySortedSet(mondrian.util.ArraySortedSet) ArraySortedSet(mondrian.util.ArraySortedSet) SegmentColumn(mondrian.spi.SegmentColumn)

Aggregations

SegmentColumn (mondrian.spi.SegmentColumn)1 ArraySortedSet (mondrian.util.ArraySortedSet)1