📄 xmla_quaxuti.java
字号:
// 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 + -