Package biz.smart.mdx.modeltomdx

Source Code of biz.smart.mdx.modeltomdx.ModelToMdxUtil

/*
Copyright (c) 2012 Marcin Stepien, http://smart.biz.pl/

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package biz.smart.mdx.modeltomdx;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import biz.smart.mdx.Axis;
import biz.smart.mdx.RangeResolver;
import biz.smart.mdx.olap.OLAPNamedStructure;
import biz.smart.mdx.olap.data.BracketName;
import biz.smart.mdx.olap.data.MdxRangeResolvable;
import biz.smart.mdx.olap.data.MdxSet;
import biz.smart.mdx.olap.data.MdxValueExpression;
import biz.smart.mdx.olap.data.Member;
import biz.smart.mdx.olap.function.Crossjoin;
import biz.smart.mdx.olap.function.Head;
import biz.smart.mdx.olap.function.Order;
import biz.smart.mdx.olap.function.Order.SortDirection;
import biz.smart.mdx.olap.function.Sum;
import biz.smart.mdx.olap.function.Union;
import biz.smart.mdx.olap.model.Hierarchy;
import biz.smart.mdx.olap.model.Measure;
import biz.smart.mdx.olap.model.RangeResolvableHierarchy;
import biz.smart.mdx.valuegenerators.ParentShareValueGenerator;

/**
* implementations for ModelToMdx objects
*
*/
@SuppressWarnings("unchecked")
public class ModelToMdxUtil {
 
  public static final String LABEL_SUMMARY = "Podsumowanie";
 
  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary TODO
   * @param direction
   * @param count
   * @param values
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersSimple(
      Measure measure,
      Hierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      List<String>values){
   
    if(isSelectAll){
      MdxSet<Member<H>> set =
        getOrder(hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    if(values.size()==0){
      MdxSet<Member<H>> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    MdxSet<Member<H>> set = getOrder(hierarchy.getSetByValues(values), measure, direction, count);
    return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
  }
 
  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary TODO
   * @param direction
   * @param count
   * @param values
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersLabeled(
      Measure measure,
      Hierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count, Map<String,String>values){
   
    if(isSelectAll){
      MdxSet<Member<H>> set =
        getOrder(hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    if(values.size()==0){
      MdxSet<Member<H>> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    MdxSet<Member<H>> set = getOrder(hierarchy.getSetByLabeledValues(values), measure, direction, count);
    return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
   
  }
 
  /**
   * @param measure
   * @param hierarchy  - hierarchy of first  level value tree
   * @param hierarchy2 - hierarchy of second level value tree
   * @param summary TODO
   * @param direction
   * @param count
   * @param selectedMap
   * @param selectAll - if true selects all values for 1st level/hierarchy, [Hierarchy2].[All Members] for 2nd hierarchy
   *         (but NOT or all values from 1st and 2nd level if any value provided on 2nd level
   *          as there is 2 different hierarchies)
   * @return MdxSet based on Union
   * @doc example query: 1.3.1
   *
    select {[Measures].[Measure]} ON COLUMNS,
      Union(
      Crossjoin(
        {[Dimension1.Hierarchy].[MemberValue]},
        {[Dimension2.Hierarchy].[MemberValue], [Dimension2.Hierarchy].[MemberValue]}),
      Crossjoin(
        {[Dimension1.Hierarchy].[MemberValue]},
        {[Dimension2.Hierarchy].[All Dimension2.Hierarchys]})
      ) ON ROWS
    from [CubeName]
   */
  public static
  <H1 extends Hierarchy, H2 extends Hierarchy> MdxSet<?> getMdxMembersDoubleHierarchy(
      Measure measure,
      H1 hierarchy,
      H2 hierarchy2,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      Map<String,
      List<String>> selectedMap) {
   
    if(isSelectAll){
      MdxSet<?> set = getOrder(
          hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return getSummary(hierarchy, set, summary);
    }
   
    if(selectedMap.size()==0){
      MdxSet<?> set =  hierarchy.getHierarchyAll();
      return getSummary(hierarchy, set, summary);
    }

    List<Hierarchy>hierarchies=new ArrayList<Hierarchy>();
    hierarchies.add(hierarchy);
    hierarchies.add(hierarchy2);
   
    List<MdxSet<?>> crossjoins = new ArrayList<MdxSet<?>>();
    for(String l1value : selectedMap.keySet()){
     
      MdxSet<Member<H2>> hierarchy2Members = null;
      List<String> l2values = selectedMap.get(l1value);
     
      if(l2values==null)
        hierarchy2Members = hierarchy2.getHierarchyAll();
      else if(l2values.size()==0)
        hierarchy2Members = hierarchy2.getHierarchyAll();
      else{
        hierarchy2Members = hierarchy2.getSetByValues(selectedMap.get(l1value));
      }
     
      Crossjoin crossjoin = new Crossjoin(
          new MdxSet<Member<?>>(hierarchy.getMemberExpression(l1value)),
          hierarchy2Members
      );
      crossjoins.add(new MdxSet(crossjoin.getReturn().toString(), hierarchies));
    }
   
    @SuppressWarnings({ "rawtypes", "unchecked" })
    Union union = new Union(crossjoins);
   
    MdxSet<Member<?>> set = union.getReturn();
    return getSummary(hierarchy, getOrder(set, measure, direction, count), summary);
 
 
  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary TODO
   * @param direction
   * @param count
   * @param intervals
   * @param rangeResolver
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersRanged(
      Measure measure,
      RangeResolvableHierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      List<Interval>intervals, RangeResolver rangeResolver){
   
//    if(selectAll) DO NOTHING
//      return hierarchy.getHierarchyAllChildren();
   
    if(intervals.size()==0){
      MdxSet<?> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    List<MdxRangeResolvable<?>> ranges = new ArrayList<MdxRangeResolvable<?>>();
    for(Interval interval : intervals){
      ranges.add(
          new MdxRangeResolvable(hierarchy, interval)
      );
    }
   
   
    MdxSet<Member<?>> set = MdxRangeResolvable.getSums(ranges, rangeResolver);
    return (MdxSet<Member<H>>) getSummary(hierarchy, getOrder(set, measure, direction, count), summary);
  }

  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary
   * @param direction
   * @param count
   * @param valuesMap
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersBy2LevelValues(
      Measure measure,
      Hierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      LinkedHashMap<String,List<String>> valuesMap) {
   
    if(isSelectAll){
      MdxSet<?> set = getOrder(hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    if(valuesMap.size()==0){
      MdxSet<?> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
    MdxSet<Member<?>> set = hierarchy.getSetBy2LevelValues(valuesMap);
    return (MdxSet<Member<H>>) getSummary(hierarchy, getOrder(set, measure, direction, count), summary);
  }
 
  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary TODO
   * @param direction
   * @param count
   * @param valuesMap
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersBy3LevelValues(
      Measure measure,
      Hierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      LinkedHashMap<String,LinkedHashMap<String,List<String>>> valuesMap) {
   
    if(isSelectAll){
      MdxSet<?> set = getOrder(hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }

    if(valuesMap.size()==0){
      MdxSet<?> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }

   
    MdxSet<Member<?>> set = hierarchy.getSetBy3LevelValues(valuesMap);
    return (MdxSet<Member<H>>) getSummary(hierarchy, getOrder(set, measure, direction, count), summary);
  }

  /**
   * @param measure
   * @param hierarchy
   * @param isSelectAll
   * @param summary TODO
   * @param direction
   * @param count
   * @param valuesMap
   * @return
   */
  public static <H extends Hierarchy> MdxSet<Member<H>> getMdxMembersBy4LevelValues(
      Measure measure,
      Hierarchy hierarchy,
      boolean isSelectAll,
      SummaryPosition summary,
      SortDirection direction,
      int count,
      LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, List<String>>>> valuesMap) {
   
    if(isSelectAll){
      MdxSet<?> set = getOrder(hierarchy.getHierarchyAllChildren(), measure, direction, count);
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }

    if(valuesMap.size()==0){
      MdxSet<?> set = hierarchy.getHierarchyAll();
      return (MdxSet<Member<H>>) getSummary(hierarchy, set, summary);
    }
   
   
    MdxSet<Member<?>> set = hierarchy.getSetBy4LevelValues(valuesMap);
    return (MdxSet<Member<H>>) getSummary(hierarchy, getOrder(set, measure, direction, count), summary);
  }
 
  public static <H extends HShare> MdxSet<Member<H>> getShare(H shareHierarchy, Axis shareAxis){
    BracketName name = shareHierarchy.getMemberExpression(shareHierarchy.getCaption()).getDefinition();
    Member<?> sectionWithMember =
      new Member<H>(shareHierarchy,
          name,
          new ParentShareValueGenerator(shareHierarchy.getCaption(), shareAxis)
      );
    MdxSet<Member<H>> set = new MdxSet<Member<H>>(sectionWithMember);
    return set;
  }
//  /**
//   * converts List of MdxRange to MdxSet
//   * calls provided Range resolver
//   * may include server side operations
//   * @param mdxRanges
//   * @return
//   */
//  public static MdxSet<Member> getMdxMembers(List<MdxRange<MdxSet<Member>>>mdxRanges, RangeResolver rangeResolver){
//    for(MdxRange<MdxSet<Member>> mdxRange : mdxRanges){
//      mdxRange.getSet(rangeResolver);
//    }
//  }

//  public static MdxSet<Member> getMdxMembersByResolver(Hierarchy hierarchy, boolean selectAll, List<String>keysToResolve, KeyToValueResolver resolver){
//    if(selectAll)
//      return hierarchy.getHierarchyAllChildren();
//   
//    List<String>values = new ArrayList<String>();
//    for(String keyToResolve : keysToResolve){
//      values.add(resolver.resolve(keyToResolve));
//    }
//   
//    return hierarchy.getSetByValues(values);
//  }
 
  private static <H extends Hierarchy> MdxSet<Member<H>>
    getOrder(MdxSet set, Measure measure, SortDirection direction, int count){
   
    if(direction!=null){
      Order orderF = new Order<OLAPNamedStructure>(set, measure, direction);
      set = orderF.getReturn();
    }
   
    if(count>0){
      Head headF = new Head<OLAPNamedStructure>(set, count);
      set = headF.getReturn();
    }
    return set;
  }
 
  private static <H extends Hierarchy> MdxSet<?> getSummary(
      H hierarchy, MdxSet<?> set, SummaryPosition position){
    if(null==position || position==SummaryPosition.NONE)
      return set;
   
    BracketName sumName = hierarchy.getMemberExpression(LABEL_SUMMARY).getDefinition();
    Member<H> sumMember =
      new Member<H>(hierarchy, new Sum<H>(set).getReturn().setName(sumName));
   
    //#doc: 1.2.3-1.2.6
    set = position==SummaryPosition.TOP ?
        new Union<H>(new MdxSet<Member<H>>(sumMember), set).getReturn()
        :
        new Union<H>(set, new MdxSet<Member<H>>(sumMember)).getReturn();

    return set;
  }
 
  public static <H extends Hierarchy> MdxSet<?> getSummaryTest(H hierarchy, MdxSet<?> set, SummaryPosition position){
    return getSummary(hierarchy, set, position);
  }
 
}
TOP

Related Classes of biz.smart.mdx.modeltomdx.ModelToMdxUtil

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.