Package org.pentaho.reporting.engine.classic.extensions.datasources.mondrian.util

Source Code of org.pentaho.reporting.engine.classic.extensions.datasources.mondrian.util.SortedMemberAddingStrategy

/*
* This program is free software; you can redistribute it and/or modify it under the
*  terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
*  Foundation.
*
*  You should have received a copy of the GNU Lesser General Public License along with this
*  program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
*  or from the Free Software Foundation, Inc.,
*  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*  This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
*  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*  See the GNU Lesser General Public License for more details.
*
*  Copyright (c) 2006 - 2009 Pentaho Corporation..  All rights reserved.
*/

package org.pentaho.reporting.engine.classic.extensions.datasources.mondrian.util;

import java.util.Collection;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

import mondrian.olap.Dimension;
import mondrian.olap.Hierarchy;
import mondrian.olap.Level;
import mondrian.olap.Member;
import mondrian.olap.Position;

public class SortedMemberAddingStrategy implements MemberAddingStrategy
{
  private static class MemberComparator implements Comparator<Member>
  {
    private Map<Dimension, Integer> dimensionOrder;

    public MemberComparator(final List<Position> positions)
    {
      LinkedHashSet<Dimension> dimensionInOrder = new LinkedHashSet<Dimension>();
      for (final Position position : positions)
      {
        for (final Member member : position)
        {
          dimensionInOrder.add(member.getDimension());
        }
      }

      dimensionOrder = new HashMap<Dimension, Integer>();
      for (final Dimension dimension : dimensionInOrder)
      {
        dimensionOrder.put(dimension, dimensionOrder.size());
      }
    }

    private int getDimensionPositionOnAxis(final Dimension d)
    {
      Integer integer = dimensionOrder.get(d);
      if (integer != null)
      {
        return integer.intValue();
      }
      return -1;
    }

    public int compare(final Member o1, final Member o2)
    {
      Dimension d1 = o1.getLevel().getDimension();
      Dimension d2 = o2.getLevel().getDimension();
      int dimOrder = Integer.compare(getDimensionPositionOnAxis(d1), getDimensionPositionOnAxis(d2));
      if (dimOrder != 0)
      {
        return dimOrder;
      }

      Hierarchy h1 = o1.getHierarchy();
      Hierarchy h2 = o2.getHierarchy();
      int hierarchyOrder = h1.getName().compareTo(h2.getName());
      if (hierarchyOrder != 0)
      {
        return hierarchyOrder;
      }

      Level level1 = o1.getLevel();
      Level level2 = o2.getLevel();
      int levelOrder = Integer.compare(level1.getDepth(), level2.getDepth());
      if (levelOrder != 0)
      {
        return levelOrder;
      }
      return o1.getLevel().getUniqueName().compareTo(o2.getLevel().getUniqueName());
    }
  }

  private TreeSet<Member> set;

  public SortedMemberAddingStrategy(final List<Position> positions)
  {
    this.set = new TreeSet<Member>(new MemberComparator(positions));
  }

  public void add(final Member m)
  {
    this.set.add(m);
  }

  public Collection<Member> values()
  {
    return set;
  }
}
TOP

Related Classes of org.pentaho.reporting.engine.classic.extensions.datasources.mondrian.util.SortedMemberAddingStrategy

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.