⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mondrianquaxuti.java

📁 OLAP 的客户端代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
   *
   * @param exp
   * @return hierarchy
   */
  public Hierarchy hierForExp(Object oExp) throws CannotHandleException {
    if (oExp instanceof mondrian.olap.Member)
      return model.lookupHierarchy(((mondrian.olap.Member) oExp).getHierarchy().getUniqueName());
    else if (oExp instanceof SetExp) {
      // set expression generated by CalcSet extension
      SetExp set = (SetExp) oExp;
      return set.getHier();
    }

    // must be FunCall
    FunCall f = (FunCall) oExp;
    if (f.isCallTo("Children")) {
      mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(0);
      return model.lookupHierarchy(m.getHierarchy().getUniqueName());
    } else if (f.isCallTo("Descendants")) {
      mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(0);
      return model.lookupHierarchy(m.getHierarchy().getUniqueName());
    } else if (f.isCallTo("Members")) {
      mondrian.olap.Level lev = (mondrian.olap.Level) f.getArg(0);
      return model.lookupHierarchy(lev.getHierarchy().getUniqueName());
    } else if (f.isCallTo("Union")) {
      // continue with first set
      return hierForExp(f.getArg(0));
    } else if (f.isCallTo("{}")) {
      mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(0);
      return model.lookupHierarchy(m.getHierarchy().getUniqueName());
    } else if (f.isCallTo("TopCount") || f.isCallTo("BottomCount") || f.isCallTo("TopPercent")
        || f.isCallTo("BottomPercent") || f.isCallTo("Filter")) {
      // continue with base set of top bottom function
      return hierForExp(f.getArg(0));
    }
    throw new Quax.CannotHandleException(f.getFunName());
  }

  /**
   * @return the depth of a member's level
   * @see QuaxUti#levelDepthForMember(java.lang.Object)
   */
  public int levelDepthForMember(Object oExp) {
    mondrian.olap.Member m = (mondrian.olap.Member) oExp;
    mondrian.olap.Level level = m.getLevel();
    return level.getDepth();
  }

  /**
   * @return an Expression Object for the top level members of an hierarchy
   * @see QuaxUti#topLevelMembers(com.tonbeller.jpivot.olap.model.Hierarchy)
   */
  public Object topLevelMembers(Hierarchy hier, boolean expandAllMember) {
    return MondrianUtil.topLevelMembers(((MondrianHierarchy) hier).getMonHierarchy(),
        expandAllMember, scr);
  }

  /**
   * @return the parent level of a given level
   * @see QuaxUti#getParentLevel(com.tonbeller.jpivot.olap.model.Level)
   */
  public Level getParentLevel(Level level) {
    mondrian.olap.Level monLevel = ((MondrianLevel) level).getMonLevel();
    mondrian.olap.Level monParentLevel = monLevel.getParentLevel();
    return model.lookupLevel(monParentLevel.getUniqueName());
  }

  /**
   * @param oExp
   *          expression
   * @return true, if exp is member
   * @see QuaxUti#isMember(java.lang.Object)
   */
  public boolean isMember(Object oExp) {
    return (oExp instanceof mondrian.olap.Member);
  }

  /**
   * @see com.tonbeller.jpivot.olap.query.QuaxUti#isFunCall
   */
  public boolean isFunCall(Object oExp) {
    return (oExp instanceof FunCall);
  }

  /**
   * check level and add a member's parents children to list
   *
   * @param m
   */
  public void addMemberSiblings(List list, Member member, int[] maxLevel) {
    mondrian.olap.Member m = ((MondrianMember) member).getMonMember();
    int level = m.getLevel().getDepth();
    if (level < maxLevel[0])
      return;
    if (level > maxLevel[0]) {
      maxLevel[0] = level;
      list.clear();
    }
    AddSiblings: if (level > 0) {
      mondrian.olap.Member parent = m.getParentMember();
      // do nothing if already on List
      for (Iterator iter = list.iterator(); iter.hasNext();) {
        Exp exp = (Exp) iter.next();
        if (exp instanceof FunCall) {
          FunCall f = (FunCall) exp;
          if (f.isCallTo("Children") && ((mondrian.olap.Member) f.getArg(0)).equals(parent)) {
            break AddSiblings;
          }
        }
      }
      FunCall fSiblings = new FunCall("Children", Syntax.Property, new Exp[] { parent});
      /*
       * // remove all existing children of parent from worklist; for (Iterator iter =
       * workList.iterator(); iter.hasNext();) { Exp exp = (Exp) iter.next(); if (exp instanceof
       * mondrian.olap.Member && ((mondrian.olap.Member) exp).getParentMember().equals(parent))
       * iter.remove(); }
       */
      list.add(fSiblings);
    } // AddSiblings
  }

  /**
   * check level and add a member to list
   *
   * @param m
   */
  public void addMemberChildren(List list, Member member, int[] maxLevel) {
    mondrian.olap.Member m = ((MondrianMember) member).getMonMember();
    int childLevel = m.getLevel().getDepth() + 1;
    if (childLevel < maxLevel[0])
      return;
    if (childLevel > maxLevel[0]) {
      maxLevel[0] = childLevel;
      list.clear();
    }
    AddChildren: if (childLevel > 0) {
      // do nothing if already on List
      for (Iterator iter = list.iterator(); iter.hasNext();) {
        Exp exp = (Exp) iter.next();
        if (exp instanceof FunCall) {
          FunCall f = (FunCall) exp;
          if (f.isCallTo("Children") && ((mondrian.olap.Member) f.getArg(0)).equals(m)) {
            break AddChildren;
          }
        }
      }
      FunCall fChildren = new FunCall("Children", Syntax.Property, new Exp[] { m});
      /*
       * // remove all existing children of m from worklist; for (Iterator iter =
       * workList.iterator(); iter.hasNext();) { Exp exp = (Exp) iter.next(); if (exp instanceof
       * mondrian.olap.Member && ((mondrian.olap.Member) exp).getParentMember().equals(m))
       * iter.remove(); }
       */
      list.add(fChildren);
    } // AddChildren
  }

  /**
   * check level and add a member's uncles to list
   *
   * @param m
   */
  public void addMemberUncles(List list, Member member, int[] maxLevel) {
    mondrian.olap.Member m = ((MondrianMember) member).getMonMember();
    int parentLevel = m.getLevel().getDepth() - 1;
    if (parentLevel < maxLevel[0])
      return;
    if (parentLevel > maxLevel[0]) {
      maxLevel[0] = parentLevel;
      list.clear();
    }
    AddUncels: if (parentLevel > 0) {
      mondrian.olap.Member parent = m.getParentMember();
      mondrian.olap.Member grandPa = parent.getParentMember();

      // do nothing if already on List
      for (Iterator iter = list.iterator(); iter.hasNext();) {
        Exp exp = (Exp) iter.next();
        if (exp instanceof FunCall) {
          FunCall f = (FunCall) exp;
          if (f.isCallTo("Children") && ((mondrian.olap.Member) f.getArg(0)).equals(grandPa)) {
            break AddUncels; // already there
          }
        }
      }
      FunCall fUncles = new FunCall("Children", Syntax.Property, new Exp[] { grandPa});
      /*
       * // remove all existing children of grandPa from worklist; for (Iterator iter =
       * workList.iterator(); iter.hasNext();) { Exp exp = (Exp) iter.next(); if (exp instanceof
       * mondrian.olap.Member && ((mondrian.olap.Member) exp).getParentMember().equals(grandPa))
       * iter.remove(); }
       */
      list.add(fUncles);
    } // AddUncels
  }

  /**
   * @return a members unique name
   * @see QuaxUti#getMemberUniqueName(java.lang.Object)
   */
  public String getMemberUniqueName(Object oExp) {
    mondrian.olap.Member m = (mondrian.olap.Member) oExp;
    return m.getUniqueName();
  }

  /**
   * create String representation for FunCall
   *
   * @param f
   * @return
   */
  public StringBuffer funString(Object oFun) {
    FunCall f = (FunCall) oFun;
    StringBuffer buf = new StringBuffer();
    if (f.isCallTo("Children")) {
      mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(0);
      buf.append(m.getUniqueName());
      buf.append(".children");
    } else if (f.isCallTo("Descendants")) {
      mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(0);
      mondrian.olap.Level lev = (mondrian.olap.Level) f.getArg(1);
      buf.append("Descendants(");
      buf.append(m.getUniqueName());
      buf.append(",");
      buf.append(lev.getUniqueName());
      buf.append(")");
    } else if (f.isCallTo("members")) {
      mondrian.olap.Level lev = (mondrian.olap.Level) f.getArg(0);
      buf.append(lev.getUniqueName());
      buf.append(".Members");
    } else if (f.isCallTo("Union")) {
      buf.append("Union(");
      FunCall f1 = (FunCall) f.getArg(0);
      buf.append(funString(f1));
      buf.append(",");
      FunCall f2 = (FunCall) f.getArg(1);
      buf.append(funString(f2));
      buf.append(")");
    } else if (f.isCallTo("{}")) {
      buf.append("{");
      for (int i = 0; i < f.getArgs().length; i++) {
        if (i > 0)
          buf.append(",");
        mondrian.olap.Member m = (mondrian.olap.Member) f.getArg(i);
        buf.append(m.getUniqueName());
      }
      buf.append("}");
    } else if (f.isCallTo("TopCount") || f.isCallTo("BottomCount") || f.isCallTo("TopPercent")
        || f.isCallTo("BottomPercent")) {
      // just generate Topcount(set)
      buf.append(f.getFunName());
      buf.append("(");
      FunCall f1 = (FunCall) f.getArg(0);
      buf.append(funString(f1));
      buf.append(")");
    }
    return buf;
  }

  /**
   * display member array for debugging purposes
   *
   * @param member
   * @return
   */
  public String memberString(Member[] mPath) {
    if (mPath == null || mPath.length == 0)
      return "";
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mPath.length; i++) {
      if (i > 0)
        sb.append(" ");
      mondrian.olap.Member m = ((MondrianMember) mPath[i]).getMonMember();
      sb.append(m.getUniqueName());
    }
    return sb.toString();
  }

  /**
   * @param oExp
   *          expression
   * @return true if expression equals member
   * @see QuaxUti#equalMember(java.lang.Object, com.tonbeller.jpivot.olap.model.Member)
   */
  public boolean equalMember(Object oExp, Member member) {
    mondrian.olap.Member m = ((MondrianMember) member).getMonMember();
    return (m.equals(oExp));
  }

  /**
   * check an expression whether we can handle it (expand, collapse) currently we can basically
   * handle following FunCalls member.children, member.descendants, level.members
   *
   * @see com.tonbeller.jpivot.olap.query.QuaxUti#canHandle(java.lang.Object)
   */
  public boolean canHandle(Object oExp) {

    if (isMember(oExp))
      return true;
    FunCall f = (FunCall) oExp;
    if (f.isCallTo("children"))
      return true;
    if (f.isCallTo("descendants"))
      return true;
    if (f.isCallTo("members"))
      return true;
    if (f.isCallTo("{}"))
      return true;
    if (f.isCallTo("union")) {
      for (int i = 0; i < f.getArgs().length; i++) {
        if (!canHandle(f.getArg(i)))
          return false;
      }
      return true;
    }

    return false;
  }

  /**
   * @return member children
   * @see com.tonbeller.jpivot.olap.query.QuaxUti#getChildren(java.lang.Object)
   */
  public Object[] getChildren(Object oMember) {
    mondrian.olap.Member[] members = scr.getMemberChildren((mondrian.olap.Member) oMember);
    return members;
  }

  /**
   * @return members of level
   */
  public Object[] getLevelMembers(Level level) {
    mondrian.olap.Level monLevel = ((MondrianLevel) level).getMonLevel();
    mondrian.olap.Member[] members = scr.getLevelMembers(monLevel);
    return members;
  }

} //MondrianQuaxUti

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -