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

📄 xmla_quaxuti.java

📁 OLAP 的客户端代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
        // should not occur
        logger.error("?", e);
        return;
      }

      // 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") && ((XMLA_Member) f.getArgs()[0]).equals(grandPa)) {
            break AddUncels; // already there
          }
        }
      }
      FunCall fUncles = new FunCall("Children", new Exp[] { grandPa}, FunCall.TypeProperty);
      /*
       // remove all existing children of grandPa from worklist;
       for (Iterator iter = workList.iterator(); iter.hasNext();) {
       Exp exp = (Exp) iter.next();
       if (exp instanceof XMLA_Member
       && ((XMLA_Member) exp).getParentMember().equals(grandPa))
       iter.remove();
       }
       */
      list.add(fUncles);
    } // AddUncels
  }

  /**
   * check level and add a member's parents children to list 
   * @param m
   */
  public void addMemberSiblings(List list, Member m, int[] maxLevel) {
    XMLA_Member xm = (XMLA_Member) m;
    int level = ((XMLA_Level) xm.getLevel()).getDepth();
    if (level < maxLevel[0])
      return;
    if (level > maxLevel[0]) {
      maxLevel[0] = level;
      list.clear();
    }
    AddSiblings: if (level > 0) {
      XMLA_Member parent;
      try {
        parent = (XMLA_Member) xm.getParent();
      } catch (OlapException e) {
        // should not occur
        logger.error("?", e);
        return;
      }
      // 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") && ((XMLA_Member) f.getArgs()[0]).equals(parent)) {
            break AddSiblings;
          }
        }
      }
      FunCall fSiblings = new FunCall("Children", new Exp[] { parent}, FunCall.TypeProperty);
      /*      
       // remove all existing children of parent from worklist;
       for (Iterator iter = workList.iterator(); iter.hasNext();) {
       Exp exp = (Exp) iter.next();
       if (exp instanceof XMLA_Member
       && ((XMLA_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 m, int[] maxLevel) {
    XMLA_Member xm = (XMLA_Member) m;
    int childLevel = ((XMLA_Level) xm.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") && ((XMLA_Member) f.getArgs()[0]).equals(xm)) {
            break AddChildren;
          }
        }
      }
      FunCall fChildren = new FunCall("Children", new Exp[] { xm}, FunCall.TypeProperty);
      /*
       // remove all existing children of m from worklist;
       for (Iterator iter = workList.iterator(); iter.hasNext();) {
       Exp exp = (Exp) iter.next();
       if (exp instanceof XMLA_Member
       && ((XMLA_Member) exp).getParentMember().equals(m))
       iter.remove();
       }
       */
      list.add(fChildren);
    } // AddChildren
  }

  /**
   * check level and add a members descendatns to list 
   * @param m
   */
  public void addMemberDescendants(List list, Member m, Level lev, int[] maxLevel) {
    XMLA_Member xm = (XMLA_Member) m;
    int parentLevel = ((XMLA_Level) xm.getLevel()).getDepth() - 1;

    if (parentLevel < maxLevel[0])
      return;
    if (parentLevel > maxLevel[0]) {
      maxLevel[0] = parentLevel;
      list.clear();
    }
    AddDescendants: if (parentLevel > 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("Descendants") && ((XMLA_Member) f.getArgs()[0]).equals(m)) {
            break AddDescendants;
          }
        }
      }
      FunCall fChildren = new FunCall("Descendants", new Exp[] { xm, (XMLA_Level) lev},
          FunCall.TypeFunction);
      /*
       // remove all existing Descendants of m from worklist
       for (Iterator iter = workList.iterator(); iter.hasNext();) {
       Exp exp = (Exp) iter.next();
       if (exp instanceof XMLA_Member
       && ((XMLA_Member) exp).isChildOrEqualTo(m))
       iter.remove();
       }
       */
      list.add(fChildren);
    } // AddDescendants
  }

  /**
   * check level and add a levels members to list 
   * @param m
   */
  public void addLevelMembers(List list, Level lev, int[] maxLevel) {

    int level = ((XMLA_Level) lev).getDepth();
    if (level < maxLevel[0])
      return;
    if (level > maxLevel[0]) {
      maxLevel[0] = level;
      list.clear();
    }
    AddMembers: if (level > 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("Members")) {
            break AddMembers;
          }
        }
      }
      FunCall fMembers = new FunCall("Members", new Exp[] { (XMLA_Level) lev}, FunCall.TypeProperty);
      /*
       // remove all existing level members from worklist
       for (Iterator iter = workList.iterator(); iter.hasNext();) {
       Exp exp = (Exp) iter.next();
       if (exp instanceof XMLA_Member
       && ((XMLA_Member) exp).getLevel().equals(lev))
       iter.remove();
       }
       */
      list.add(fMembers);
    } // AddDescendants
  }

  /**
   * 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")) {
      XMLA_Member m = (XMLA_Member) f.getArgs()[0];
      buf.append(m.getUniqueName());
      buf.append(".children");
    } else if (f.isCallTo("Descendants")) {
      XMLA_Member m = (XMLA_Member) f.getArgs()[0];
      XMLA_Level lev = (XMLA_Level) f.getArgs()[1];
      buf.append("Descendants(");
      buf.append(m.getUniqueName());
      buf.append(",");
      buf.append(lev.getUniqueName());
      buf.append(")");
    } else if (f.isCallTo("members")) {
      XMLA_Level lev = (XMLA_Level) f.getArgs()[0];
      buf.append(lev.getUniqueName());
      buf.append(".Members");
    } else if (f.isCallTo("Union")) {
      buf.append("Union(");
      FunCall f1 = (FunCall) f.getArgs()[0];
      buf.append(funString(f1));
      buf.append(",");
      FunCall f2 = (FunCall) f.getArgs()[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(",");
        XMLA_Member m = (XMLA_Member) f.getArgs()[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.getFunction());
      buf.append("(");
      FunCall f1 = (FunCall) f.getArgs()[0];
      buf.append(funString(f1));
      buf.append(")");
    }
    return buf;
  }

  /**
   * determine hierarchy for Exp
   * @param exp
   * @return hierarchy
   */
  public Hierarchy hierForExp(Object oExp) throws CannotHandleException {
    if (oExp instanceof XMLA_Member)
      return ((XMLA_Member) oExp).getHierarchy();
    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")) {
      XMLA_Member m = (XMLA_Member) f.getArgs()[0];
      return m.getHierarchy();
    } else if (f.isCallTo("Descendants")) {
      XMLA_Member m = (XMLA_Member) f.getArgs()[0];
      return m.getHierarchy();
    } else if (f.isCallTo("Members")) {
      XMLA_Level lev = (XMLA_Level) f.getArgs()[0];
      return lev.getHierarchy();
    } else if (f.isCallTo("Union")) {
      // continue with first set
      return hierForExp(f.getArgs()[0]);
    } else if (f.isCallTo("{}")) {
      XMLA_Member m = (XMLA_Member) f.getArgs()[0];
      return m.getHierarchy();
    } 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.getArgs()[0]);
    }
    throw new Quax.CannotHandleException(f.getFunction());
  }

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

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

  /**
   * @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) {
    return ((XMLA_Member) member).equals(oExp);
  }

  /**
   * @see QuaxUti#getParentMember(java.lang.Object)
   */
  public Member getParentMember(Object oExp) {
    try {
      return ((XMLA_Member) oExp).getParent();
    } catch (OlapException e) {
      // should not occur
      logger.error("?", e);
      return null;
    }
  }

  /**
   * create Children FunCall
   * @see QuaxUti#funChildren(com.tonbeller.jpivot.olap.model.Member)
   */
  public Object funCallChildren(Member member) {
    return new FunCall("Children", new Exp[] { (XMLA_Member) member}, FunCall.TypeProperty);
  }

  /** 

⌨️ 快捷键说明

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