Skip to content

Commit

Permalink
MONDRIAN: Native SQL Optimization does not work with Virtual Cubes - …
Browse files Browse the repository at this point in the history
…so these are disabled for now.

[git-p4: depot-paths = "//open/mondrian/": change = 5733]
  • Loading branch information
Andreas Voss committed Mar 8, 2006
1 parent c47c34f commit cd230a4
Show file tree
Hide file tree
Showing 7 changed files with 43 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/main/mondrian/rolap/RolapNativeCrossJoin.java
Expand Up @@ -64,6 +64,8 @@ protected boolean isStrict() {
NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args) {
if (!isEnabled())
return null;
if (!NonEmptyCrossJoinConstraint.isValidContext(evaluator))
return null;

// join with fact table will always filter out those members
// that dont have a row in the fact table
Expand Down
3 changes: 3 additions & 0 deletions src/main/mondrian/rolap/RolapNativeFilter.java
Expand Up @@ -71,6 +71,9 @@ NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args
if (!isEnabled()) {
return null;
}
if (!FilterConstraint.isValidContext(evaluator)) {
return null;
}
// is this "Filter(<set>, <numeric expr>)"
String funName = fun.getName();
if (!"Filter".equalsIgnoreCase(funName)) {
Expand Down
4 changes: 4 additions & 0 deletions src/main/mondrian/rolap/RolapNativeTopCount.java
Expand Up @@ -82,6 +82,10 @@ protected boolean isStrict() {
NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args) {
if (!isEnabled())
return null;
if (!TopCountConstraint.isValidContext(evaluator)) {
return null;
}

// is this "TopCount(<set>, <count>, [<numeric expr>])"
String funName = fun.getName();
if ("TopCount".equalsIgnoreCase(funName)) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/mondrian/rolap/SqlConstraintFactory.java
Expand Up @@ -36,13 +36,13 @@ public static final SqlConstraintFactory instance() {
}

public MemberChildrenConstraint getMemberChildrenConstraint(Evaluator context) {
if (!enabled || context == null)
if (!enabled || !SqlContextConstraint.isValidContext(context))
return DefaultMemberChildrenConstraint.instance();
return new SqlContextConstraint((RolapEvaluator) context, false);
}

public TupleConstraint getLevelMembersConstraint(Evaluator context) {
if (!enabled || context == null)
if (!enabled || !SqlContextConstraint.isValidContext(context))
return DefaultTupleConstraint.instance();
return new SqlContextConstraint((RolapEvaluator) context, false);
}
Expand Down
7 changes: 6 additions & 1 deletion src/main/mondrian/rolap/SqlConstraintUtils.java
Expand Up @@ -64,6 +64,7 @@ public static void addContextConstraint(
CellRequest request =
RolapAggregationManager.makeRequest(members, false);
if (request == null) {
assert !strict : "CellRequest is null - why?";
// One or more of the members was null or calculated, so the
// request is impossible to satisfy.
return;
Expand Down Expand Up @@ -107,12 +108,16 @@ private static boolean containsCalculatedMember(Member[] members) {
/**
* Ensures that the table of <code>level</code> is joined to the fact table
*/
public static void joinLevelTableToFactTable(SqlQuery sqlQuery, RolapCube cube,
public static void joinLevelTableToFactTable(SqlQuery sqlQuery, Evaluator e,
RolapLevel level) {
RolapCube cube = (RolapCube) e.getCube();
Util.assertTrue(!cube.isVirtual());
RolapStar star = cube.getStar();
Map mapLevelToColumnMap = star.getMapLevelToColumn(cube);
RolapStar.Column starColumn = (RolapStar.Column) mapLevelToColumnMap.get(level);
Util.assertTrue(starColumn != null);
RolapStar.Table table = starColumn.getTable();
Util.assertTrue(table != null);
table.addToFrom(sqlQuery, false, true);
}

Expand Down
15 changes: 13 additions & 2 deletions src/main/mondrian/rolap/SqlContextConstraint.java
Expand Up @@ -43,6 +43,18 @@ public class SqlContextConstraint implements MemberChildrenConstraint,
private Evaluator evaluator;
private boolean strict;

/**
* @return false if this contstraint will not work for the current context
*/
public static boolean isValidContext(Evaluator context) {
if (context == null)
return false;
RolapCube cube = (RolapCube) context.getCube();
if (cube.isVirtual())
return false;
return true;
}

/**
* @param strict defines the behaviour if the evaluator context
* contains calculated members. If true, an exception is thrown,
Expand Down Expand Up @@ -105,8 +117,7 @@ protected boolean isJoinRequired() {
public void addLevelConstraint(SqlQuery sqlQuery, RolapLevel level) {
if (!isJoinRequired())
return;
RolapCube cube = (RolapCube) evaluator.getCube();
SqlConstraintUtils.joinLevelTableToFactTable(sqlQuery, cube, level);
SqlConstraintUtils.joinLevelTableToFactTable(sqlQuery, evaluator, level);
}

public MemberChildrenConstraint getMemberChildrenConstraint(RolapMember parent) {
Expand Down
13 changes: 13 additions & 0 deletions testsrc/main/mondrian/rolap/NonEmptyTest.java
Expand Up @@ -47,6 +47,19 @@ public class NonEmptyTest extends FoodMartTestCase {
private static Logger logger = Logger.getLogger(NonEmptyTest.class);
SqlConstraintFactory scf = SqlConstraintFactory.instance();

/**
* must not use native sql optimization because it chooses the wrong RolapStar
* in SqlContextConstraint/SqlConstraintUtils.
* Test ensures that no exception is thrown.
*/
public void testVirtualCube() throws Exception {
TestCase c = new TestCase(99, 3,
"select NON EMPTY {[Measures].[Unit Sales], [Measures].[Warehouse Sales]} ON COLUMNS, " +
"NON EMPTY [Product].[All Products].Children ON ROWS " +
"from [Warehouse and Sales]");
c.run();
}

public void testNativeFilter() {
if (!MondrianProperties.instance().EnableNativeFilter.get()) {
return;
Expand Down

0 comments on commit cd230a4

Please sign in to comment.