📄 mondrianquaxuti.java
字号:
*
* @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 + -