Skip to content

Commit

Permalink
MONDRIAN
Browse files Browse the repository at this point in the history
       Bug 1403223 : added LastPeriods function and tests.

[git-p4: depot-paths = "//open/mondrian/": change = 5042]
  • Loading branch information
Richard Emberson committed Jan 11, 2006
1 parent 5f9d57a commit 759b141
Show file tree
Hide file tree
Showing 2 changed files with 188 additions and 5 deletions.
105 changes: 100 additions & 5 deletions src/main/mondrian/olap/fun/BuiltinFunTable.java
Expand Up @@ -769,6 +769,7 @@ Member parallelPeriod(
}
});


define(new FunDefBase(
"Parent",
"<Member>.Parent",
Expand Down Expand Up @@ -2191,13 +2192,107 @@ protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
}
});

if (false) define(new FunDefBase(
define(new MultiResolver(
"LastPeriods",
"LastPeriods(<Index>[, <Member>])",
"LastPeriods(<Index> [, <Member>])",
"Returns a set of members prior to and including a specified member.",
"fx*") {
public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
throw new UnsupportedOperationException();
new String[] {"fxn", "fxnm"}) {
protected FunDef createFunDef(Exp[] args, FunDef dummyFunDef) {
return new FunDefBase(dummyFunDef) {
public Type getResultType(Validator validator, Exp[] args) {
if (args.length == 1) {
// If Member is not specified,
// it is Time.CurrentMember.
Hierarchy hierarchy = validator.getQuery()
.getCube().getTimeDimension()
.getHierarchy();
return new SetType(MemberType.forHierarchy(hierarchy));
} else {
Type type = args[1].getType();
Type memberType =
TypeUtil.toMemberOrTupleType(type);
return new SetType(memberType);
}
}

public Calc compileCall(ResolvedFunCall call, ExpCompiler compiler) {
// Member defaults to [Time].currentmember
Exp[] args = call.getArgs();
final MemberCalc memberCalc;
if (args.length == 1) {
Dimension timeDimension =
compiler.getEvaluator().getCube()
.getTimeDimension();
memberCalc = new DimensionCurrentMemberCalc(
timeDimension);
} else {
memberCalc = compiler.compileMember(args[1]);
}

// Numeric Expression.
final IntegerCalc indexValueCalc =
compiler.compileInteger(args[0]);

return new AbstractListCalc(call, new Calc[] {memberCalc, indexValueCalc}) {
public List evaluateList(Evaluator evaluator) {
Member member = memberCalc.evaluateMember(
evaluator);
int indexValue = indexValueCalc.evaluateInteger(
evaluator);

return lastPeriods(member,
evaluator, indexValue);
}
};
}

/*
If Index is positive, returns the set of Index
members ending with Member and starting with the
member lagging Index - 1 from Member.
If Index is negative, returns the set of (- Index)
members starting with Member and ending with the
member leading (- Index - 1) from Member.
If Index is zero, the empty set is returned.
*/
List lastPeriods(
Member member,
Evaluator evaluator,
int indexValue) {
// empty set
if (indexValue == 0) {
return Collections.EMPTY_LIST;
}
List list = new ArrayList();

// set with just member
if ((indexValue == 1) || (indexValue == -1)) {
list.add(member);
return list;
}

Member startMember;
Member endMember;
if (indexValue > 0) {
startMember = evaluator.getSchemaReader()
.getLeadMember(member, -(indexValue-1));
endMember = member;
} else {
startMember = member;
endMember = evaluator.getSchemaReader()
.getLeadMember(member, -(indexValue+1));
}

evaluator.getSchemaReader().
getMemberRange(member.getLevel(),
startMember,
endMember,
list);
return list;
}
};
}
});

Expand Down
88 changes: 88 additions & 0 deletions testsrc/main/mondrian/olap/fun/FunctionTest.java
Expand Up @@ -131,6 +131,12 @@ public void testNumericLiteral() {
assertExprDependsOn("1.5", "{}");
}

public FunctionTest() {
}
public FunctionTest(String s) {
super(s);
}

public void testStringLiteral() {
// single-quoted string
if (false) {
Expand Down Expand Up @@ -3246,6 +3252,88 @@ public void testOpeningPeriod() throws Exception {
+ "the member was from '[Time]'.");
}

public void testLastPeriods() throws Exception {
assertAxisReturns("LastPeriods(0, [Time].[1998])",
"");
assertAxisReturns("LastPeriods(1, [Time].[1998])",
"[Time].[1998]");
assertAxisReturns("LastPeriods(-1, [Time].[1998])",
"[Time].[1998]");
assertAxisReturns("LastPeriods(2, [Time].[1998])",
fold(new String[] {
"[Time].[1997]",
"[Time].[1998]"
}));
assertAxisReturns("LastPeriods(-2, [Time].[1997])",
fold(new String[] {
"[Time].[1997]",
"[Time].[1998]"
}));
assertAxisReturns("LastPeriods(2, [Time].[1998].[Q2])",
fold(new String[] {
"[Time].[1998].[Q1]",
"[Time].[1998].[Q2]"
}));
assertAxisReturns("LastPeriods(4, [Time].[1998].[Q2])",
fold(new String[] {
"[Time].[1997].[Q3]",
"[Time].[1997].[Q4]",
"[Time].[1998].[Q1]",
"[Time].[1998].[Q2]"
}));
assertAxisReturns("LastPeriods(-2, [Time].[1997].[Q2])",
fold(new String[] {
"[Time].[1997].[Q2]",
"[Time].[1997].[Q3]"
}));
assertAxisReturns("LastPeriods(-4, [Time].[1997].[Q2])",
fold(new String[] {
"[Time].[1997].[Q2]",
"[Time].[1997].[Q3]",
"[Time].[1997].[Q4]",
"[Time].[1998].[Q1]"
}));
assertAxisReturns("LastPeriods(2, [Time].[1998].[Q2].[5])",
fold(new String[] {
"[Time].[1998].[Q2].[4]",
"[Time].[1998].[Q2].[5]"
}));
assertAxisReturns("LastPeriods(12, [Time].[1998].[Q2].[5])",
fold(new String[] {
"[Time].[1997].[Q2].[6]",
"[Time].[1997].[Q3].[7]",
"[Time].[1997].[Q3].[8]",
"[Time].[1997].[Q3].[9]",
"[Time].[1997].[Q4].[10]",
"[Time].[1997].[Q4].[11]",
"[Time].[1997].[Q4].[12]",
"[Time].[1998].[Q1].[1]",
"[Time].[1998].[Q1].[2]",
"[Time].[1998].[Q1].[3]",
"[Time].[1998].[Q2].[4]",
"[Time].[1998].[Q2].[5]"
}));
assertAxisReturns("LastPeriods(-2, [Time].[1998].[Q2].[4])",
fold(new String[] {
"[Time].[1998].[Q2].[4]",
"[Time].[1998].[Q2].[5]"
}));
assertAxisReturns("LastPeriods(-12, [Time].[1997].[Q2].[6])",
fold(new String[] {
"[Time].[1997].[Q2].[6]",
"[Time].[1997].[Q3].[7]",
"[Time].[1997].[Q3].[8]",
"[Time].[1997].[Q3].[9]",
"[Time].[1997].[Q4].[10]",
"[Time].[1997].[Q4].[11]",
"[Time].[1997].[Q4].[12]",
"[Time].[1998].[Q1].[1]",
"[Time].[1998].[Q1].[2]",
"[Time].[1998].[Q1].[3]",
"[Time].[1998].[Q2].[4]",
"[Time].[1998].[Q2].[5]"
}));
}
public void testParallelPeriod() throws Exception {
assertAxisReturns("parallelperiod([Time].[Quarter], 1, [Time].[1998].[Q1])",
"[Time].[1997].[Q4]");
Expand Down

0 comments on commit 759b141

Please sign in to comment.