rolapevaluator.java
来自「数据仓库展示程序」· Java 代码 · 共 517 行 · 第 1/2 页
JAVA
517 行
int maxSolve = Integer.MIN_VALUE;
Member maxSolveMember = null;
for (int i = 0, count = currentMembers.length; i < count; i++) {
final Member currentMember = currentMembers[i];
// more than one usage
if (currentMember == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug(
"RolapEvaluator.getMinSolveMember: member == null "
+ " , count=" + i);
}
continue;
}
if (currentMember.isCalculated()) {
int solve = currentMember.getSolveOrder();
if (solve > maxSolve) {
maxSolve = solve;
maxSolveMember = currentMember;
}
}
}
return maxSolveMember;
}
private void setExpanding(Member member) {
expandingMember = member;
int memberCount = currentMembers.length;
if (depth > memberCount) {
if (depth % memberCount == 0) {
checkRecursion((RolapEvaluator) parent);
}
}
}
/**
* Makes sure that there is no evaluator with identical context on the
* stack.
*
* @throws mondrian.olap.fun.MondrianEvaluationException if there is a loop
*/
private static void checkRecursion(RolapEvaluator eval) {
// Find the nearest ancestor which is expanding a calculated member.
// (The starting evaluator has just been pushed, so may not have the
// state it will have when recursion happens.)
while (true) {
if (eval == null) {
return;
}
if (eval.expandingMember != null) {
break;
}
eval = (RolapEvaluator) eval.getParent();
}
outer:
for (RolapEvaluator eval2 = (RolapEvaluator) eval.getParent();
eval2 != null;
eval2 = (RolapEvaluator) eval2.getParent()) {
if (eval2.expandingMember != eval.expandingMember) {
continue;
}
for (int i = 0; i < eval.currentMembers.length; i++) {
Member member = eval2.currentMembers[i];
// more than one usage
if (member == null) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(
"RolapEvaluator.checkRecursion: member == null "
+ " , count=" + i);
}
continue;
}
Member parentMember = eval.getContext(member.getDimension());
if (member != parentMember) {
continue outer;
}
}
throw FunUtil.newEvalException(null,
"Infinite loop while evaluating calculated member '" +
eval.expandingMember + "'; context stack is " +
eval.getContextString());
}
}
private String getContextString() {
boolean skipDefaultMembers = true;
StringBuffer sb = new StringBuffer("{");
int frameCount = 0;
for (RolapEvaluator eval = this; eval != null;
eval = (RolapEvaluator) eval.getParent()) {
if (eval.expandingMember == null) {
continue;
}
if (frameCount++ > 0) {
sb.append(", ");
}
sb.append("(");
int memberCount = 0;
for (int j = 0; j < eval.currentMembers.length; j++) {
Member m = eval.currentMembers[j];
if (skipDefaultMembers &&
m == m.getHierarchy().getDefaultMember()) {
continue;
}
if (memberCount++ > 0) {
sb.append(", ");
}
sb.append(m.getUniqueName());
}
sb.append(")");
}
sb.append("}");
return sb.toString();
}
public Object getProperty(String name, Object defaultValue) {
Object o = defaultValue;
int maxSolve = Integer.MIN_VALUE;
for (int i = 0; i < currentMembers.length; i++) {
Member member = currentMembers[i];
// more than one usage
if (member == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug(
"RolapEvaluator.getProperty: member == null "
+ " , count=" + i);
}
continue;
}
Object p = member.getPropertyValue(name);
if (p != null) {
int solve = member.getSolveOrder();
if (solve > maxSolve) {
o = p;
maxSolve = solve;
}
}
}
return o;
}
/**
* Returns the format string for this cell. This is computed by evaluating
* the format expression in the current context, and therefore different
* cells may have different format strings.
*
* @post return != null
*/
String getFormatString() {
Exp formatExp = (Exp) getProperty(Property.FORMAT_EXP.name, null);
if (formatExp == null) {
return "Standard";
}
Object o = formatExp.evaluate(this);
return o.toString();
}
private Format getFormat() {
String formatString = getFormatString();
return Format.get(formatString, root.connection.getLocale());
}
/**
* Converts a value of this member into a string according to this member's
* format specification.
**/
String format(Evaluator evaluator, Object o) {
return getFormat().format(o);
}
public String format(Object o) {
if (o == Util.nullValue) {
Format format = getFormat();
return format.format(null);
} else if (o instanceof Throwable) {
return "#ERR: " + o.toString();
} else if (o instanceof String) {
return (String) o;
} else {
Format format = getFormat();
return format.format(o);
}
}
/**
* Creates a key which uniquely identifes an expression and its
* context. The context includes members of dimensions which the
* expression is dependent upon.
*/
private Object getExpResultCacheKey(ExpCacheDescriptor descriptor) {
List key = new ArrayList();
key.add(descriptor.getExp());
int[] dimensionOrdinals = descriptor.getDependentDimensionOrdinals();
for (int i = 0; i < dimensionOrdinals.length; i++) {
int dimensionOrdinal = dimensionOrdinals[i];
Member member = currentMembers[dimensionOrdinal];
// more than one usage
if (member == null) {
getLogger().debug(
"RolapEvaluator.getExpResultCacheKey: " +
"member == null; dimensionOrdinal=" + i);
continue;
}
key.add(member);
}
return key;
}
public Object getCachedResult(ExpCacheDescriptor cacheDescriptor) {
// Look up a cached result, and if not present, compute one and add to
// cache. Use a dummy value to represent nulls.
Object key = getExpResultCacheKey(cacheDescriptor);
Object result = root.expResultCache.get(key);
if (result == null) {
result = cacheDescriptor.getExp().evaluate(this);
root.expResultCache.put(key, result == null ? nullResult : result);
} else if (result == nullResult) {
result = null;
}
return result;
}
public void clearExpResultCache() {
root.expResultCache.clear();
}
public boolean isNonEmpty() {
return nonEmpty;
}
public void setNonEmpty(boolean nonEmpty) {
this.nonEmpty = nonEmpty;
}
public RuntimeException newEvalException(Object context, String s) {
return FunUtil.newEvalException((FunDef) context, s);
}
public Object evaluateNamedSet(String name, Exp exp) {
return root.result.evaluateNamedSet(name, exp);
}
public Member[] getMembers() {
return currentMembers;
}
}
// End RolapEvaluator.java
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?