builtinfuntable.java
来自「数据仓库展示程序」· Java 代码 · 共 1,452 行 · 第 1/5 页
JAVA
1,452 行
/*
// $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#88 $
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// Copyright (C) 2002-2005 Kana Software, Inc. and others.
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
//
// jhyde, 26 February, 2002
*/
package mondrian.olap.fun;
import mondrian.olap.*;
import mondrian.olap.DimensionType;
import mondrian.olap.LevelType;
import mondrian.olap.type.*;
import mondrian.util.Format;
import mondrian.resource.MondrianResource;
import java.util.*;
import java.io.PrintWriter;
/**
* <code>BuiltinFunTable</code> contains a list of all built-in MDX functions.
*
* <p>Note: Boolean expressions return {@link Boolean#TRUE},
* {@link Boolean#FALSE} or null. null is returned if the expression can not be
* evaluated because some values have not been loaded from database yet.</p>
*
* @author jhyde
* @since 26 February, 2002
* @version $Id: //open/mondrian/src/main/mondrian/olap/fun/BuiltinFunTable.java#88 $
**/
public class BuiltinFunTable extends FunTableImpl {
/** the singleton **/
private static BuiltinFunTable instance;
/**
* Creates a function table containing all of the builtin MDX functions.
* This method should only be called from {@link BuiltinFunTable#instance}.
*/
private BuiltinFunTable() {
super();
}
protected void defineFunctions() {
defineReserved("NULL");
// first char: p=Property, m=Method, i=Infix, P=Prefix
// 2nd:
// ARRAY FUNCTIONS
if (false) define(new FunDefBase(
"SetToArray",
"SetToArray(<Set>[, <Set>]...[, <Numeric Expression>])",
"Converts one or more sets to an array for use in a user-defined function.",
"fa*"));
//
// DIMENSION FUNCTIONS
define(new FunDefBase(
"Dimension",
"<Hierarchy>.Dimension",
"Returns the dimension that contains a specified hierarchy.",
"pdh") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Hierarchy hierarchy = getHierarchyArg(evaluator, args, 0, true);
return hierarchy.getDimension();
}
});
//??Had to add this to get <Hierarchy>.Dimension to work?
define(new FunDefBase(
"Dimension",
"<Dimension>.Dimension",
"Returns the dimension that contains a specified hierarchy.",
"pdd") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Dimension dimension = getDimensionArg(evaluator, args, 0, true);
return dimension;
}
});
define(new FunDefBase(
"Dimension",
"<Level>.Dimension",
"Returns the dimension that contains a specified level.",
"pdl") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Level level = getLevelArg(evaluator, args, 0, true);
return level.getDimension();
}
});
define(new FunDefBase(
"Dimension",
"<Member>.Dimension",
"Returns the dimension that contains a specified member.",
"pdm") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Member member = getMemberArg(evaluator, args, 0, true);
return member.getDimension();
}
});
define(new FunDefBase(
"Dimensions",
"Dimensions(<Numeric Expression>)",
"Returns the dimension whose zero-based position within the cube is specified by a numeric expression.",
"fdn") {
public Type getResultType(Validator validator, Exp[] args) {
return new mondrian.olap.type.DimensionType(null);
}
public Object evaluate(Evaluator evaluator, Exp[] args) {
Cube cube = evaluator.getCube();
Dimension[] dimensions = cube.getDimensions();
int n = getIntArg(evaluator, args, 0);
if ((n > dimensions.length) || (n < 1)) {
throw newEvalException(
this, "Index '" + n + "' out of bounds");
}
return dimensions[n - 1];
}
});
define(new FunDefBase(
"Dimensions",
"Dimensions(<String Expression>)",
"Returns the dimension whose name is specified by a string.",
"fdS") {
public Type getResultType(Validator validator, Exp[] args) {
return new mondrian.olap.type.DimensionType(null);
}
public Object evaluate(Evaluator evaluator, Exp[] args) {
String defValue = "Default Value";
String s = getStringArg(evaluator, args, 0, defValue);
if (s.indexOf("[") == -1) {
s = Util.quoteMdxIdentifier(s);
}
OlapElement o = evaluator.getSchemaReader().lookupCompound(
evaluator.getCube(),
explode(s),
false,
Category.Dimension);
if (o instanceof Dimension) {
return (Dimension) o;
} else if (o == null) {
throw newEvalException(this, "Dimension '" + s + "' not found");
} else {
throw newEvalException(this, "Dimensions(" + s + ") found " + o);
}
}
});
//
// HIERARCHY FUNCTIONS
define(new FunDefBase(
"Hierarchy",
"<Level>.Hierarchy",
"Returns a level's hierarchy.",
"phl") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Level level = getLevelArg(evaluator, args, 0, true);
return level.getHierarchy();
}
});
define(new FunDefBase(
"Hierarchy",
"<Member>.Hierarchy",
"Returns a member's hierarchy.",
"phm") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Member member = getMemberArg(evaluator, args, 0, true);
return member.getHierarchy();
}
});
//
// LEVEL FUNCTIONS
define(new FunDefBase(
"Level",
"<Member>.Level",
"Returns a member's level.",
"plm") {
public Type getResultType(Validator validator, Exp[] args) {
final Type argType = args[0].getTypeX();
return new mondrian.olap.type.LevelType(argType.getHierarchy(),
argType.getLevel());
}
public Object evaluate(Evaluator evaluator, Exp[] args) {
Member member = getMemberArg(evaluator, args, 0, true);
return member.getLevel();
}
});
define(new FunDefBase(
"Levels",
"<Hierarchy>.Levels(<Numeric Expression>)",
"Returns the level whose position in a hierarchy is specified by a numeric expression.",
"mlhn") {
public Type getResultType(Validator validator, Exp[] args) {
final Type argType = args[0].getTypeX();
return new mondrian.olap.type.LevelType(argType.getHierarchy(),
argType.getLevel());
}
public Object evaluate(Evaluator evaluator, Exp[] args) {
Hierarchy hierarchy = getHierarchyArg(evaluator, args, 0, true);
Level[] levels = hierarchy.getLevels();
int n = getIntArg(evaluator, args, 1);
if ((n >= levels.length) || (n < 0)) {
throw newEvalException(
this, "Index '" + n + "' out of bounds");
}
return levels[n];
}
});
define(new FunDefBase(
"Levels",
"Levels(<String Expression>)",
"Returns the level whose name is specified by a string expression.",
"flS") {
public Type getResultType(Validator validator, Exp[] args) {
final Type argType = args[0].getTypeX();
return new mondrian.olap.type.LevelType(argType.getHierarchy(),
argType.getLevel());
}
public Object evaluate(Evaluator evaluator, Exp[] args) {
String s = getStringArg(evaluator, args, 0, null);
Cube cube = evaluator.getCube();
OlapElement o = (s.startsWith("[")) ?
evaluator.getSchemaReader().lookupCompound(
cube,
explode(s),
false,
Category.Level) :
// lookupCompound barfs if "s" doesn't have matching
// brackets, so don't even try
null;
if (o instanceof Level) {
return (Level) o;
} else if (o == null) {
throw newEvalException(this, "Level '" + s + "' not found");
} else {
throw newEvalException(this, "Levels('" + s + "') found " + o);
}
}
});
//
// LOGICAL FUNCTIONS
define(new MultiResolver(
"IsEmpty",
"IsEmpty(<Value Expression>)",
"Determines if an expression evaluates to the empty cell value.",
new String[] {"fbS", "fbn"}) {
protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
return new FunDefBase(dummyFunDef) {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Object o = getScalarArg(evaluator, args, 0);
return Boolean.valueOf(o == Util.nullValue);
}
};
}
});
define(new FunDefBase(
"IS NULL",
"<Member> IS NULL",
"Returns whether a member is null.",
"pbm") {
public Object evaluate(Evaluator evaluator, Exp[] args) {
Member member = getMemberArg(evaluator, args, 0, true);
return Boolean.valueOf(member.isNull());
}
});
define(new MultiResolver(
"IS",
"<Expression> IS <Expression>",
"Returns whether two objects are the same (idempotent)",
new String[] {"ibmm", "ibll", "ibhh", "ibdd"}) {
protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
return new FunDefBase(dummyFunDef) {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?