Skip to content

Commit

Permalink
MONDRIAN: Filter function working for high cardinality dimensions
Browse files Browse the repository at this point in the history
[git-p4: depot-paths = "//open/mondrian/": change = 11223]
  • Loading branch information
Luis F. Canals committed Jun 28, 2008
1 parent 016b72e commit 5c3071e
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 72 deletions.
73 changes: 3 additions & 70 deletions src/main/mondrian/olap/fun/FilterFunDef.java
Expand Up @@ -397,7 +397,9 @@ public List evaluateList(Evaluator evaluator) {
call.getFunDef(), call.getArgs(), evaluator, this);
if (nativeEvaluator != null) {
return (List) nativeEvaluator.execute(
ResultStyle.MUTABLE_LIST);
ResultStyle.ITERABLE);
// return (List) nativeEvaluator.execute(
// ResultStyle.MUTABLE_LIST);
} else {
return makeList(evaluator);
}
Expand Down Expand Up @@ -508,75 +510,6 @@ protected List makeList(Evaluator evaluator) {
return result;
}
}

/*
TODO: Previous code, remove if new code passes code review
public Calc compileCall(final ResolvedFunCall call, ExpCompiler compiler) {
final ListCalc listCalc = compiler.compileList(call.getArg(0));
final BooleanCalc calc = compiler.compileBoolean(call.getArg(1));
if (((SetType) listCalc.getType()).getElementType() instanceof MemberType) {
return new AbstractListCalc(call, new Calc[] {listCalc, calc}) {
public List evaluateList(Evaluator evaluator) {
// Use a native evaluator, if more efficient.
// TODO: Figure this out at compile time.
SchemaReader schemaReader = evaluator.getSchemaReader();
NativeEvaluator nativeEvaluator =
schemaReader.getNativeSetEvaluator(
call.getFunDef(), call.getArgs(), evaluator, this);
if (nativeEvaluator != null) {
return (List) nativeEvaluator.execute();
}
List members = listCalc.evaluateList(evaluator);
List result = new ArrayList();
Evaluator evaluator2 = evaluator.push();
for (int i = 0, count = members.size(); i < count; i++) {
Member member = (Member) members.get(i);
evaluator2.setContext(member);
if (calc.evaluateBoolean(evaluator2)) {
result.add(member);
}
}
return result;
}
public boolean dependsOn(Dimension dimension) {
return anyDependsButFirst(getCalcs(), dimension);
}
};
} else {
return new AbstractListCalc(call, new Calc[] {listCalc, calc}) {
public List evaluateList(Evaluator evaluator) {
// Use a native evaluator, if more efficient.
// TODO: Figure this out at compile time.
SchemaReader schemaReader = evaluator.getSchemaReader();
NativeEvaluator nativeEvaluator =
schemaReader.getNativeSetEvaluator(
call.getFunDef(), call.getArgs(), evaluator, this);
if (nativeEvaluator != null) {
return (List) nativeEvaluator.execute();
}
List tupleList = listCalc.evaluateList(evaluator);
List result = new ArrayList();
Evaluator evaluator2 = evaluator.push();
for (int i = 0, count = tupleList.size(); i < count; i++) {
Member[] members = (Member []) tupleList.get(i);
evaluator2.setContext(members);
if (calc.evaluateBoolean(evaluator2)) {
result.add(members);
}
}
return result;
}
public boolean dependsOn(Dimension dimension) {
return anyDependsButFirst(getCalcs(), dimension);
}
};
}
}
*/
}

// End FilterFunDef.java
1 change: 1 addition & 0 deletions src/main/mondrian/rolap/RolapAggregationManager.java
Expand Up @@ -204,6 +204,7 @@ private static CellRequest makeCellRequest(
}
} else {
for (int i = 1; i < members.length; i++) {
if(!(members[i] instanceof RolapCubeMember)) continue;
RolapCubeMember member = (RolapCubeMember) members[i];
final RolapCubeLevel level = member.getLevel();
final boolean needToReturnNull =
Expand Down
35 changes: 33 additions & 2 deletions testsrc/main/mondrian/rolap/HighDimensionsTest.java
Expand Up @@ -45,6 +45,19 @@ public HighDimensionsTest(String name) {
super(name);
}

/*
public void testDelme() throws Exception {
final Connection connection = TestContext.instance()
.getFoodMartConnection();
final Query query = connection.parseQuery("select {[Measures].[Unit Sales]} on columns, {filter([Promotions].[Promotion Name].Members, [Measures].[Unit Sales]>4000)} on rows from [Sales Ragged]");
Result result = connection.execute(query);
int i=0;
for(final Position o : result.getAxes()[1].getPositions()) {
System.out.println(o.get(0));
}
}
*/

public void testBug1971406() throws Exception {
final Connection connection = TestContext.instance()
.getFoodMartConnection();
Expand Down Expand Up @@ -89,6 +102,20 @@ public void testNonEmpty() throws Exception {
}


public void testFilter() throws Exception {
execHighCardTest("select {[Measures].[Unit Sales]} on columns, "
+ "{filter([Promotions].[Promotion Name].Members, "
+ "[Measures].[Unit Sales]>0)} "
+ "on rows from [Sales Ragged]", 1, "Promotions",
nonEmptyHighCardResults);
execHighCardTest("select {[Measures].[Unit Sales]} on columns, "
+ "{filter([Promotions].[Promotion Name].Members, "
+ "[Measures].[Unit Sales]>4000)} "
+ "on rows from [Sales Ragged]", 1, "Promotions",
moreThan4000highCardResults);
}





Expand Down Expand Up @@ -150,11 +177,11 @@ private void execHighCardTest(final String queryString, final int axisIndex,
}
System.gc();

for(int i=5; i<10; i++) {
for(int i=4; i<ii-40; i++) {
assertNull(softReferences.get(i).get());
}

for(int i=0; i<10; i++) {
for(int i=5; i<10 && i<ii; i++) {
try {
result.getAxes()[axisIndex].getPositions().get(0).get(0);
assert false;
Expand Down Expand Up @@ -314,4 +341,8 @@ private void execHighCardTest(final String queryString, final int axisIndex,
+ "[Promotions].[All Promotions].[Weekend Markdown]"
+ "[Promotions].[All Promotions].[You Save Days]";

private static final String moreThan4000highCardResults =
"[Promotions].[All Promotions].[Cash Register Lottery]"
+ "[Promotions].[All Promotions].[No Promotion]"
+ "[Promotions].[All Promotions].[Price Savers]";
}

0 comments on commit 5c3071e

Please sign in to comment.