Skip to content

Commit

Permalink
MONDRIAN: [MONDRIAN-945] Fixes a bug in the grouping sets SQL generat…
Browse files Browse the repository at this point in the history
…ion where the proper aliases were not used in the grouping sets list. This was causing Greenplum grouping sets queries to fail.

[git-p4: depot-paths = "//open/mondrian/": change = 14381]
  • Loading branch information
lucboudreau committed Jun 15, 2011
1 parent 16477b6 commit 5605ade
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 10 deletions.
34 changes: 26 additions & 8 deletions src/main/mondrian/rolap/agg/AbstractQuerySpec.java
Expand Up @@ -80,7 +80,7 @@ protected void addMeasure(final int i, final SqlQuery sqlQuery) {

protected abstract boolean isAggregate();

protected void nonDistinctGenerateSql(SqlQuery sqlQuery)
protected Map<String, String> nonDistinctGenerateSql(SqlQuery sqlQuery)
{
// add constraining dimensions
RolapStar.Column[] columns = getColumns();
Expand Down Expand Up @@ -146,6 +146,8 @@ protected void nonDistinctGenerateSql(SqlQuery sqlQuery)
for (int i = 0, count = getMeasureCount(); i < count; i++) {
addMeasure(i, sqlQuery);
}

return Collections.emptyMap();
}

/**
Expand All @@ -164,16 +166,19 @@ public Pair<String, List<SqlStatement.Type>> generateSqlQuery() {

int k = getDistinctMeasureCount();
final Dialect dialect = sqlQuery.getDialect();
final Map<String, String> groupingSetsAliases;
if (!dialect.allowsCountDistinct() && k > 0
|| !dialect.allowsMultipleCountDistinct() && k > 1)
{
distinctGenerateSql(sqlQuery, countOnly);
groupingSetsAliases =
distinctGenerateSql(sqlQuery, countOnly);
} else {
nonDistinctGenerateSql(sqlQuery);
groupingSetsAliases =
nonDistinctGenerateSql(sqlQuery);
}
if (!countOnly) {
addGroupingFunction(sqlQuery);
addGroupingSets(sqlQuery);
addGroupingSets(sqlQuery, groupingSetsAliases);
}
return sqlQuery.toSqlAndTypes();
}
Expand All @@ -182,7 +187,10 @@ protected void addGroupingFunction(SqlQuery sqlQuery) {
throw new UnsupportedOperationException();
}

protected void addGroupingSets(SqlQuery sqlQuery) {
protected void addGroupingSets(
SqlQuery sqlQuery,
Map<String, String> groupingSetsAliases)
{
throw new UnsupportedOperationException();
}

Expand Down Expand Up @@ -212,14 +220,18 @@ protected int getDistinctMeasureCount() {
* @param countOnly If true, only generate a single row: no need to
* generate a GROUP BY clause or put any constraining columns in the
* SELECT clause
* @return A map of aliases used in the inner query if grouping sets
* were enabled.
*/
protected void distinctGenerateSql(
protected Map<String, String> distinctGenerateSql(
final SqlQuery outerSqlQuery,
boolean countOnly)
{
final Dialect dialect = outerSqlQuery.getDialect();
final Dialect.DatabaseProduct databaseProduct =
dialect.getDatabaseProduct();
final Map<String, String> groupingSetsAliases =
new HashMap<String, String>();
// Generate something like
//
// select d0, d1, count(m0)
Expand Down Expand Up @@ -269,13 +281,18 @@ protected void distinctGenerateSql(
if (countOnly) {
continue;
}
final String alias = "d" + i;
innerSqlQuery.addSelect(expr, null, alias);
String alias = "d" + i;
alias = innerSqlQuery.addSelect(expr, null, alias);
if (databaseProduct == Dialect.DatabaseProduct.GREENPLUM) {
innerSqlQuery.addGroupBy(expr, alias);
}
final String quotedAlias = dialect.quoteIdentifier(alias);
outerSqlQuery.addSelectGroupBy(quotedAlias, null);
// Add this alias to the map of grouping sets aliases
groupingSetsAliases.put(
expr,
dialect.quoteIdentifier(
"dummyname." + alias));
}

// add predicates not associated with columns
Expand All @@ -300,6 +317,7 @@ protected void distinctGenerateSql(
null);
}
outerSqlQuery.addFrom(innerSqlQuery, "dummyname", true);
return groupingSetsAliases;
}

/**
Expand Down
14 changes: 12 additions & 2 deletions src/main/mondrian/rolap/agg/SegmentArrayQuerySpec.java
Expand Up @@ -17,6 +17,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
* Provides the information necessary to generate a SQL statement to
Expand Down Expand Up @@ -134,13 +135,22 @@ protected void addGroupingFunction(SqlQuery sqlQuery) {
}
}

protected void addGroupingSets(SqlQuery sqlQuery) {
protected void addGroupingSets(
SqlQuery sqlQuery,
Map<String, String> groupingSetsAliases)
{
List<RolapStar.Column[]> groupingSetsColumns =
groupingSetsList.getGroupingSetsColumns();
for (RolapStar.Column[] groupingSetsColumn : groupingSetsColumns) {
ArrayList<String> groupingColumnsExpr = new ArrayList<String>();
for (RolapStar.Column aColumn : groupingSetsColumn) {
groupingColumnsExpr.add(aColumn.generateExprString(sqlQuery));
final String columnExpr = aColumn.generateExprString(sqlQuery);
if (groupingSetsAliases.containsKey(columnExpr)) {
groupingColumnsExpr.add(
groupingSetsAliases.get(columnExpr));
} else {
groupingColumnsExpr.add(columnExpr);
}
}
sqlQuery.addGroupingSet(groupingColumnsExpr);
}
Expand Down

0 comments on commit 5605ade

Please sign in to comment.