Skip to content

Commit

Permalink
mondrian: follow up to change 9156. Supporting table alias when NECJ …
Browse files Browse the repository at this point in the history
…has member list as input. Also fix bug 1711865 logged in sourceforge.

[git-p4: depot-paths = "//open/mondrian/": change = 9244]
  • Loading branch information
Rushan Chen committed May 11, 2007
1 parent 5897d08 commit 03968dc
Show file tree
Hide file tree
Showing 13 changed files with 138 additions and 29 deletions.
6 changes: 5 additions & 1 deletion src/main/mondrian/rolap/DefaultMemberChildrenConstraint.java
Expand Up @@ -37,22 +37,26 @@ protected DefaultMemberChildrenConstraint() {
public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
RolapMember parent)
{
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, aggStar, parent, true);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
aggStar, parent, true);
}

public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
List<RolapMember> parents)
{
SqlConstraintUtils.addMemberConstraint(
sqlQuery,
levelToColumnMap,
relationNamesToStarTableMap,
aggStar,
parents,
true,
Expand Down
3 changes: 2 additions & 1 deletion src/main/mondrian/rolap/DefaultTupleConstraint.java
Expand Up @@ -33,7 +33,8 @@ protected DefaultTupleConstraint() {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
}

public void addLevelConstraint(
Expand Down
6 changes: 4 additions & 2 deletions src/main/mondrian/rolap/DescendantsConstraint.java
Expand Up @@ -46,13 +46,15 @@ public DescendantsConstraint(

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap)
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap)
{
if (levelToColumnMap == null) {
levelToColumnMap = Collections.emptyMap();
}
mcc.addMemberConstraint(
sqlQuery, levelToColumnMap, null, parentMembers);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
null, parentMembers);
}

public void addLevelConstraint(
Expand Down
5 changes: 3 additions & 2 deletions src/main/mondrian/rolap/RolapNativeFilter.java
Expand Up @@ -53,9 +53,10 @@ protected boolean isJoinRequired() {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
sqlQuery.addHaving(filterExpr);
super.addConstraint(sqlQuery, levelToColumnMap);
super.addConstraint(sqlQuery, levelToColumnMap, relationNamesToStarTableMap);
}

public Object getCacheKey() {
Expand Down
25 changes: 16 additions & 9 deletions src/main/mondrian/rolap/RolapNativeSet.java
Expand Up @@ -76,16 +76,19 @@ protected boolean isJoinRequired() {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
super.addConstraint(sqlQuery, levelToColumnMap);
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
super.addConstraint(sqlQuery, levelToColumnMap,
relationNamesToStarTableMap);
for (CrossJoinArg arg : args) {
// if the cross join argument has calculated members in its
// enumerated set, ignore the constraint since we won't
// produce that set through the native sql and instead
// will simply enumerate through the members in the set
if (!(arg instanceof MemberListCrossJoinArg) ||
!((MemberListCrossJoinArg) arg).hasCalcMembers()) {
arg.addConstraint(sqlQuery, levelToColumnMap);
arg.addConstraint(sqlQuery, levelToColumnMap,
relationNamesToStarTableMap);
}
}
}
Expand Down Expand Up @@ -294,7 +297,8 @@ protected interface CrossJoinArg {

void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap);
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap);

boolean isPreferInterpreter();
}
Expand Down Expand Up @@ -362,10 +366,12 @@ public int hashCode() {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
if (member != null) {
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, null, member, true);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
null, member, true);
}
}
}
Expand Down Expand Up @@ -478,10 +484,11 @@ public boolean equals(Object obj) {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, null, Arrays.asList(members),
strict, true);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap, null,
Arrays.asList(members), strict, true);
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/main/mondrian/rolap/RolapNativeTopCount.java
Expand Up @@ -54,7 +54,8 @@ protected boolean isJoinRequired() {

public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
if (orderByExpr != null) {
Dialect dialect = sqlQuery.getDialect();
if (dialect.requiresOrderByAlias()) {
Expand All @@ -66,7 +67,8 @@ public void addConstraint(
sqlQuery.addOrderBy(orderByExpr, ascending, true, false);
}
}
super.addConstraint(sqlQuery, levelToColumnMap);
super.addConstraint(sqlQuery, levelToColumnMap,
relationNamesToStarTableMap);
}

public Object getCacheKey() {
Expand Down
8 changes: 4 additions & 4 deletions src/main/mondrian/rolap/RolapStar.java
Expand Up @@ -1625,11 +1625,11 @@ synchronized Table addJoin(
if (this.children.isEmpty()) {
this.children = new ArrayList<Table>();
}
this.children.add(starTable);

// Register table aliases
registerTableAlias(cube, relation, starTable);
this.children.add(starTable);
}
// Register table aliases
registerTableAlias(cube, relation, starTable);

return starTable;

} else if (relation instanceof MondrianDef.Join) {
Expand Down
18 changes: 16 additions & 2 deletions src/main/mondrian/rolap/SqlConstraintUtils.java
Expand Up @@ -216,13 +216,15 @@ public static void joinLevelTableToFactTable(
public static void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
RolapMember parent,
boolean strict)
{
List<RolapMember> list = Collections.singletonList(parent);
addMemberConstraint(
sqlQuery, levelToColumnMap, aggStar, list, strict, false);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
aggStar, list, strict, false);
}

/**
Expand Down Expand Up @@ -250,6 +252,7 @@ public static void addMemberConstraint(
public static void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
List<RolapMember> parents,
boolean strict,
Expand Down Expand Up @@ -287,13 +290,24 @@ public static void addMemberConstraint(
}
RolapLevel level = m.getLevel();
RolapHierarchy hierarchy = level.getHierarchy();
hierarchy.addToFrom(sqlQuery, level.getKeyExp());

String q =
level.getExpressionWithAlias(
sqlQuery, levelToColumnMap, level.getKeyExp());
RolapStar.Column column = levelToColumnMap.get(level);
StarColumnPredicate cc = getColumnPredicates(column, c);

if (column != null &&
relationNamesToStarTableMap != null) {
RolapStar.Table targetTable = column.getTable();
hierarchy.addToFrom(
sqlQuery,
relationNamesToStarTableMap,
targetTable);
} else {
hierarchy.addToFrom(sqlQuery, level.getKeyExp());
}

if (!strict &&
cc instanceof ListColumnPredicate &&
((ListColumnPredicate) cc).getPredicates().size() >=
Expand Down
13 changes: 9 additions & 4 deletions src/main/mondrian/rolap/SqlContextConstraint.java
Expand Up @@ -221,6 +221,7 @@ private static void findMeasures(
public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
RolapMember parent)
{
Expand All @@ -230,27 +231,31 @@ public void addMemberConstraint(
Evaluator e = evaluator.push(parent);
SqlConstraintUtils.addContextConstraint(sqlQuery, aggStar, e, strict);
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, aggStar, parent, true);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
aggStar, parent, true);
}

public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
List<RolapMember> parents)
{
SqlConstraintUtils.addContextConstraint(
sqlQuery, aggStar, evaluator, strict);
SqlConstraintUtils.addMemberConstraint(
sqlQuery, levelToColumnMap, aggStar, parents, true, false);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
aggStar, parents, true, false);
}

/**
* Called from LevelMembers: restricts the SQL resultset to the current
* context.
*/
public void addConstraint(
SqlQuery sqlQuery, Map<RolapLevel, RolapStar.Column> levelToColumnMap) {
SqlQuery sqlQuery, Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap) {
SqlConstraintUtils.addContextConstraint(
sqlQuery, null, evaluator, strict);
}
Expand Down
6 changes: 5 additions & 1 deletion src/main/mondrian/rolap/SqlMemberSource.java
Expand Up @@ -482,18 +482,22 @@ String makeChildMemberSql(
// Create the condition, which is either the parent member or
// the full context (non empty).
final Map<RolapLevel, RolapStar.Column> levelToColumnMap;
final Map<String, RolapStar.Table> relationNamesToStarTableMap;
if (constraint instanceof SqlContextConstraint) {
SqlContextConstraint contextConstraint =
(SqlContextConstraint) constraint;
Evaluator evaluator = contextConstraint.getEvaluator();
RolapCube cube = (RolapCube) evaluator.getCube();
RolapStar star = cube.getStar();
levelToColumnMap = star.getLevelToColumnMap(cube);
relationNamesToStarTableMap = star.getRelationNamesToStarTableMap(cube);
} else {
levelToColumnMap = Collections.emptyMap();
relationNamesToStarTableMap = Collections.emptyMap();
}
constraint.addMemberConstraint(
sqlQuery, levelToColumnMap, aggStar, member);
sqlQuery, levelToColumnMap, relationNamesToStarTableMap,
aggStar, member);

RolapLevel level = (RolapLevel) member.getLevel().getChildLevel();
hierarchy.addToFrom(sqlQuery, level.getKeyExp());
Expand Down
2 changes: 2 additions & 0 deletions src/main/mondrian/rolap/sql/MemberChildrenConstraint.java
Expand Up @@ -40,6 +40,7 @@ public interface MemberChildrenConstraint extends SqlConstraint {
public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
RolapMember parent);

Expand All @@ -56,6 +57,7 @@ public void addMemberConstraint(
public void addMemberConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap,
AggStar aggStar,
List<RolapMember> parents);

Expand Down
3 changes: 2 additions & 1 deletion src/main/mondrian/rolap/sql/TupleConstraint.java
Expand Up @@ -38,7 +38,8 @@ public interface TupleConstraint extends SqlConstraint {
*/
public void addConstraint(
SqlQuery sqlQuery,
Map<RolapLevel, RolapStar.Column> levelToColumnMap);
Map<RolapLevel, RolapStar.Column> levelToColumnMap,
Map<String, RolapStar.Table> relationNamesToStarTableMap);

/**
* Will be called multiple times for every "group by" level in
Expand Down
66 changes: 66 additions & 0 deletions testsrc/main/mondrian/rolap/SharedDimensionTest.java
Expand Up @@ -113,6 +113,16 @@ public class SharedDimensionTest extends FoodMartTestCase {
"select [*BASE_MEMBERS_Measures] ON COLUMNS,\n" +
"Generate([*NATIVE_CJ_SET], {[Store Type].CurrentMember}) on rows from [Store]";

public static String queryNECJMemberList =
"select {[Measures].[Employee Store Sales]} on columns,\n" +
"NonEmptyCrossJoin([Store Type].[Store Type].Members,\n" +
"{[Employee].[All Employees].[Middle Management],\n" +
"[Employee].[All Employees].[Store Management]})\n" +
"on rows from [Employee Store Analysis B]";

public static String querySF1711865 =
"select NON EMPTY {[Product].[Product Family].Members} ON COLUMNS from [Sales 2]";

public static String resultCubeA =
"Axis #0:\n" +
"{}\n" +
Expand Down Expand Up @@ -242,6 +252,34 @@ public class SharedDimensionTest extends FoodMartTestCase {
"Row #3: 109,343\n" +
"Row #4: 75,281\n" +
"Row #5: 193,480\n";

public static String resultNECJMemberList =
"Axis #0:\n" +
"{}\n" +
"Axis #1:\n" +
"{[Measures].[Employee Store Sales]}\n" +
"Axis #2:\n" +
"{[Store Type].[All Store Types].[Deluxe Supermarket], [Employee].[All Employees].[Store Management]}\n" +
"{[Store Type].[All Store Types].[Gourmet Supermarket], [Employee].[All Employees].[Store Management]}\n" +
"{[Store Type].[All Store Types].[Mid-Size Grocery], [Employee].[All Employees].[Store Management]}\n" +
"{[Store Type].[All Store Types].[Small Grocery], [Employee].[All Employees].[Store Management]}\n" +
"{[Store Type].[All Store Types].[Supermarket], [Employee].[All Employees].[Store Management]}\n" +
"Row #0: $61,860\n" +
"Row #1: $10,156\n" +
"Row #2: $10,212\n" +
"Row #3: $5,932\n" +
"Row #4: $108,610\n";

public static String resultSF1711865 =
"Axis #0:\n" +
"{}\n" +
"Axis #1:\n" +
"{[Product].[All Products].[Drink]}\n" +
"{[Product].[All Products].[Food]}\n" +
"{[Product].[All Products].[Non-Consumable]}\n" +
"Row #0: 7,978\n" +
"Row #0: 62,445\n" +
"Row #0: 16,414\n";

public SharedDimensionTest() {
}
Expand Down Expand Up @@ -293,6 +331,34 @@ public void testVirtualCube() {
testContext.assertQueryReturns(queryVirtualCube, fold(resultVirtualCube));
}

public void testNECJMemberList() {
// Schema has two cubes sharing a dimension.
// Query from the second cube.
TestContext testContext =
TestContext.create(
sharedDimension,
cubeA + "\n" + cubeB,
null,
null,
null);

testContext.assertQueryReturns(queryNECJMemberList, fold(resultNECJMemberList));
}

public void testSF1711865() {
// Test for sourceforge.net bug 1711865
// Use the default FoodMart schema
TestContext testContext =
TestContext.create(
null,
null,
null,
null,
null);

testContext.assertQueryReturns(querySF1711865, fold(resultSF1711865));
}

public void testStoreCube() {
// Use the default FoodMart schema
TestContext testContext =
Expand Down

0 comments on commit 03968dc

Please sign in to comment.