Skip to content

Commit

Permalink
MONDRIAN: Change SqlQuery APIs so you have to specify a type when you…
Browse files Browse the repository at this point in the history
… add a

    column to the select clause.

[git-p4: depot-paths = "//open/mondrian/": change = 14261]
  • Loading branch information
julianhyde committed May 11, 2011
1 parent 79f502a commit 0f27527
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 105 deletions.
3 changes: 1 addition & 2 deletions src/main/mondrian/rolap/RolapNativeTopCount.java
Expand Up @@ -75,8 +75,7 @@ public void addConstraint(
if (dialect.requiresOrderByAlias()) {
String alias = sqlQuery.nextColumnAlias();
alias = dialect.quoteIdentifier(alias);
sqlQuery.addSelect(orderBySql, alias);
sqlQuery.addType(null);
sqlQuery.addSelect(orderBySql, null, alias);
sqlQuery.addOrderBy(alias, ascending, true, nullable);
} else {
sqlQuery.addOrderBy(orderBySql, ascending, true, nullable);
Expand Down
12 changes: 6 additions & 6 deletions src/main/mondrian/rolap/RolapStar.java
Expand Up @@ -10,7 +10,6 @@
//
// jhyde, 12 August, 2001
*/

package mondrian.rolap;

import mondrian.olap.*;
Expand Down Expand Up @@ -957,7 +956,7 @@ public String generateSql(
columnExpr = measure.getAggregator().getExpression(columnExpr);
}
final String columnName = columnNameList.get(k);
String alias = query.addSelect(columnExpr, columnName);
String alias = query.addSelect(columnExpr, null, columnName);
if (!(column instanceof Measure)) {
query.addGroupBy(columnExpr, alias);
}
Expand Down Expand Up @@ -1252,7 +1251,8 @@ private int getCardinality(DataSource dataSource) {
// e.g. "select count(distinct product_id) from product"
sqlQuery.addSelect(
"count(distinct "
+ generateExprString(sqlQuery) + ")");
+ generateExprString(sqlQuery) + ")",
null);

// no need to join fact table here
table.addToFrom(sqlQuery, true, false);
Expand All @@ -1262,11 +1262,11 @@ private int getCardinality(DataSource dataSource) {
// product_id from product)"
SqlQuery inner = sqlQuery.cloneEmpty();
inner.setDistinct(true);
inner.addSelect(generateExprString(inner));
inner.addSelect(generateExprString(inner), null);
boolean failIfExists = true,
joinToParent = false;
table.addToFrom(inner, failIfExists, joinToParent);
sqlQuery.addSelect("count(*)");
sqlQuery.addSelect("count(*)", null);
sqlQuery.addFrom(inner, "init", failIfExists);
} else {
throw Util.newInternal(
Expand Down Expand Up @@ -1382,7 +1382,7 @@ public String getDatatypeString(Dialect dialect) {
table.star.factTable.relation, table.star.factTable.alias,
false);
query.addFrom(table.relation, table.alias, false);
query.addSelect(expression.getExpression(query));
query.addSelect(expression.getExpression(query), null);
final String sql = query.toString();
Connection jdbcConnection = null;
try {
Expand Down
53 changes: 22 additions & 31 deletions src/main/mondrian/rolap/SqlMemberSource.java
Expand Up @@ -180,7 +180,7 @@ private String makeLevelMemberCountSql(
RolapLevel[] levels = (RolapLevel[]) hierarchy.getLevels();
if (levelDepth == levels.length) {
// "select count(*) from schema.customer"
sqlQuery.addSelect("count(*)");
sqlQuery.addSelect("count(*)", null);
hierarchy.addToFrom(sqlQuery, level.getKeyExp());
return sqlQuery.toString();
}
Expand Down Expand Up @@ -244,10 +244,11 @@ private String makeLevelMemberCountSql(
++columnCount;
}
if (mustCount[0]) {
sqlQuery.addSelect(columnList);
sqlQuery.addSelect(columnList, null);
sqlQuery.addOrderBy(columnList, true, false, true);
} else {
sqlQuery.addSelect("count(DISTINCT " + columnList + ")");
sqlQuery.addSelect(
"count(DISTINCT " + columnList + ")", null);
}
return sqlQuery.toString();

Expand All @@ -258,8 +259,9 @@ private String makeLevelMemberCountSql(
if (level2.isAll()) {
continue;
}
hierarchy.addToFrom(sqlQuery, level2.getKeyExp());
sqlQuery.addSelect(level2.getKeyExp().getExpression(sqlQuery));
MondrianDef.Expression keyExp = level2.getKeyExp();
hierarchy.addToFrom(sqlQuery, keyExp);
sqlQuery.addSelect(keyExp.getExpression(sqlQuery), null);
if (level2.isUnique()) {
break; // no further qualification needed
}
Expand All @@ -269,7 +271,7 @@ private String makeLevelMemberCountSql(
dataSource,
"while generating query to count members in level "
+ level);
outerQuery.addSelect("count(*)");
outerQuery.addSelect("count(*)", null);
// Note: the "init" is for Postgres, which requires
// FROM-queries to have an alias
boolean failIfExists = true;
Expand Down Expand Up @@ -421,21 +423,21 @@ private Pair<String, List<SqlStatement.Type>> makeKeysSql(
MondrianDef.Expression exp = level.getKeyExp();
hierarchy.addToFrom(sqlQuery, exp);
String expString = exp.getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(expString);
sqlQuery.addSelectGroupBy(expString, null);
exp = level.getOrdinalExp();
hierarchy.addToFrom(sqlQuery, exp);
expString = exp.getExpression(sqlQuery);
sqlQuery.addOrderBy(expString, true, false, true);
if (!exp.equals(level.getKeyExp())) {
sqlQuery.addSelect(expString);
sqlQuery.addSelect(expString, null);
}

RolapProperty[] properties = level.getProperties();
for (RolapProperty property : properties) {
exp = property.getExp();
hierarchy.addToFrom(sqlQuery, exp);
expString = exp.getExpression(sqlQuery);
String alias = sqlQuery.addSelect(expString);
String alias = sqlQuery.addSelect(expString, null);
// Some dialects allow us to eliminate properties from the
// group by that are functionally dependent on the level value
if (!sqlQuery.getDialect().allowsSelectNotInGroupBy()
Expand Down Expand Up @@ -559,17 +561,15 @@ Pair<String, List<SqlStatement.Type>> makeChildMemberSql(
int bitPos = starColumn.getBitPosition();
AggStar.Table.Column aggColumn = aggStar.lookupColumn(bitPos);
String q = aggColumn.generateExprString(sqlQuery);
sqlQuery.addSelectGroupBy(q);
sqlQuery.addType(starColumn.getInternalType());
sqlQuery.addSelectGroupBy(q, starColumn.getInternalType());
sqlQuery.addOrderBy(q, true, false, true);
aggColumn.getTable().addToFrom(sqlQuery, false, true);
return sqlQuery.toSqlAndTypes();
}

hierarchy.addToFrom(sqlQuery, level.getKeyExp());
String q = level.getKeyExp().getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(q);
sqlQuery.addType(level.getInternalType());
sqlQuery.addSelectGroupBy(q, level.getInternalType());

// in non empty mode the level table must be joined to the fact
// table
Expand Down Expand Up @@ -611,17 +611,15 @@ Pair<String, List<SqlStatement.Type>> makeChildMemberSql(
hierarchy.addToFrom(sqlQuery, captionExp);
}
String captionSql = captionExp.getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(captionSql);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(captionSql, null);
}
if (!levelCollapsed) {
hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
}
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy, true, false, true);
if (!orderBy.equals(q)) {
sqlQuery.addSelectGroupBy(orderBy);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(orderBy, null);
}

RolapProperty[] properties = level.getProperties();
Expand All @@ -631,8 +629,7 @@ Pair<String, List<SqlStatement.Type>> makeChildMemberSql(
hierarchy.addToFrom(sqlQuery, exp);
}
final String s = exp.getExpression(sqlQuery);
String alias = sqlQuery.addSelect(s);
sqlQuery.addType(null);
String alias = sqlQuery.addSelect(s, null, null);
// Some dialects allow us to eliminate properties from the
// group by that are functionally dependent on the level value
if (!sqlQuery.getDialect().allowsSelectNotInGroupBy()
Expand Down Expand Up @@ -1112,29 +1109,26 @@ private Pair<String, List<SqlStatement.Type>> makeChildMemberSql_PCRoot(
sqlQuery.addWhere(condition.toString());
hierarchy.addToFrom(sqlQuery, level.getKeyExp());
String childId = level.getKeyExp().getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(childId);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(childId, null);
hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy, true, false, true);
if (!orderBy.equals(childId)) {
sqlQuery.addSelectGroupBy(orderBy);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(orderBy, null);
}

RolapProperty[] properties = level.getProperties();
for (RolapProperty property : properties) {
final MondrianDef.Expression exp = property.getExp();
hierarchy.addToFrom(sqlQuery, exp);
final String s = exp.getExpression(sqlQuery);
String alias = sqlQuery.addSelect(s);
String alias = sqlQuery.addSelect(s, null);
// Some dialects allow us to eliminate properties from the group by
// that are functionally dependent on the level value
if (!sqlQuery.getDialect().allowsSelectNotInGroupBy()
|| !property.dependsOnLevelValue())
{
sqlQuery.addGroupBy(s, alias);
sqlQuery.addType(null);
}
}
return sqlQuery.toSqlAndTypes();
Expand Down Expand Up @@ -1177,23 +1171,20 @@ private Pair<String, List<SqlStatement.Type>> makeChildMemberSqlPC(

hierarchy.addToFrom(sqlQuery, level.getKeyExp());
String childId = level.getKeyExp().getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(childId);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(childId, null);
hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy, true, false, true);
if (!orderBy.equals(childId)) {
sqlQuery.addSelectGroupBy(orderBy);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(orderBy, null);
}

RolapProperty[] properties = level.getProperties();
for (RolapProperty property : properties) {
final MondrianDef.Expression exp = property.getExp();
hierarchy.addToFrom(sqlQuery, exp);
final String s = exp.getExpression(sqlQuery);
String alias = sqlQuery.addSelect(s);
sqlQuery.addType(null);
String alias = sqlQuery.addSelect(s, null);
// Some dialects allow us to eliminate properties from the group by
// that are functionally dependent on the level value
if (!sqlQuery.getDialect().allowsSelectNotInGroupBy()
Expand Down
22 changes: 8 additions & 14 deletions src/main/mondrian/rolap/SqlTupleReader.java
Expand Up @@ -762,8 +762,7 @@ Pair<String, List<SqlStatement.Type>> sqlForEmptyTuple(
final Collection<RolapCube> baseCubes)
{
final SqlQuery sqlQuery = SqlQuery.newQuery(dataSource, null);
sqlQuery.addSelect("0");
sqlQuery.addType(null);
sqlQuery.addSelect("0", null);
sqlQuery.addFrom(baseCubes.iterator().next().getFact(), null, true);
sqlQuery.addWhere("1 = 0");
return sqlQuery.toSqlAndTypes();
Expand Down Expand Up @@ -959,8 +958,7 @@ protected void addLevelMemberSql(
int bitPos = starColumn.getBitPosition();
AggStar.Table.Column aggColumn = aggStar.lookupColumn(bitPos);
String q = aggColumn.generateExprString(sqlQuery);
sqlQuery.addSelectGroupBy(q);
sqlQuery.addType(starColumn.getInternalType());
sqlQuery.addSelectGroupBy(q, starColumn.getInternalType());
sqlQuery.addOrderBy(q, true, false, true);
aggColumn.getTable().addToFrom(sqlQuery, false, true);
continue;
Expand All @@ -976,8 +974,7 @@ protected void addLevelMemberSql(
hierarchy.addToFrom(sqlQuery, parentExp);
}
String parentSql = parentExp.getExpression(sqlQuery);
sqlQuery.addSelectGroupBy(parentSql);
sqlQuery.addType(null);
sqlQuery.addSelectGroupBy(parentSql, null);
if (whichSelect == WhichSelect.LAST
|| whichSelect == WhichSelect.ONLY)
{
Expand All @@ -1000,26 +997,24 @@ protected void addLevelMemberSql(
}
}

String alias = sqlQuery.addSelect(keySql);
String alias =
sqlQuery.addSelect(keySql, currLevel.getInternalType());
if (needsGroupBy) {
sqlQuery.addGroupBy(keySql, alias);
}
sqlQuery.addType(currLevel.getInternalType());

if (!ordinalSql.equals(keySql)) {
alias = sqlQuery.addSelect(ordinalSql);
alias = sqlQuery.addSelect(ordinalSql, null);
if (needsGroupBy) {
sqlQuery.addGroupBy(ordinalSql, alias);
}
sqlQuery.addType(null);
}

if (captionSql != null) {
alias = sqlQuery.addSelect(captionSql);
alias = sqlQuery.addSelect(captionSql, null);
if (needsGroupBy) {
sqlQuery.addGroupBy(captionSql, alias);
}
sqlQuery.addType(null);
}

constraint.addLevelConstraint(
Expand Down Expand Up @@ -1075,8 +1070,7 @@ protected void addLevelMemberSql(
RolapProperty[] properties = currLevel.getProperties();
for (RolapProperty property : properties) {
String propSql = property.getExp().getExpression(sqlQuery);
alias = sqlQuery.addSelect(propSql);
sqlQuery.addType(null);
alias = sqlQuery.addSelect(propSql, null);
if (needsGroupBy) {
// Certain dialects allow us to eliminate properties
// from the group by that are functionally dependent
Expand Down
28 changes: 15 additions & 13 deletions src/main/mondrian/rolap/agg/AbstractQuerySpec.java
Expand Up @@ -72,8 +72,10 @@ protected void addMeasure(final int i, final SqlQuery sqlQuery) {
? "*"
: measure.generateExprString(sqlQuery);
String exprOuter = measure.getAggregator().getExpression(exprInner);
sqlQuery.addSelect(exprOuter, getMeasureAlias(i));
sqlQuery.addType(measure.getInternalType());
sqlQuery.addSelect(
exprOuter,
measure.getInternalType(),
getMeasureAlias(i));
}

protected abstract boolean isAggregate();
Expand All @@ -84,8 +86,7 @@ protected void nonDistinctGenerateSql(SqlQuery sqlQuery)
RolapStar.Column[] columns = getColumns();
int arity = columns.length;
if (countOnly) {
sqlQuery.addSelect("count(*)");
sqlQuery.addType(SqlStatement.Type.INT);
sqlQuery.addSelect("count(*)", SqlStatement.Type.INT);
}
for (int i = 0; i < arity; i++) {
RolapStar.Column column = columns[i];
Expand Down Expand Up @@ -119,11 +120,13 @@ protected void nonDistinctGenerateSql(SqlQuery sqlQuery)
final Dialect.DatabaseProduct databaseProduct =
dialect.getDatabaseProduct();
if (databaseProduct == Dialect.DatabaseProduct.DB2_AS400) {
alias = sqlQuery.addSelect(expr, null);
alias =
sqlQuery.addSelect(expr, column.getInternalType(), null);
} else {
alias = sqlQuery.addSelect(expr, getColumnAlias(i));
alias =
sqlQuery.addSelect(
expr, column.getInternalType(), getColumnAlias(i));
}
sqlQuery.addType(column.getInternalType());

if (isAggregate()) {
sqlQuery.addGroupBy(expr, alias);
Expand Down Expand Up @@ -267,13 +270,12 @@ protected void distinctGenerateSql(
continue;
}
final String alias = "d" + i;
innerSqlQuery.addSelect(expr, alias);
innerSqlQuery.addSelect(expr, null, alias);
if (databaseProduct == Dialect.DatabaseProduct.GREENPLUM) {
innerSqlQuery.addGroupBy(expr, alias);
}
final String quotedAlias = dialect.quoteIdentifier(alias);
outerSqlQuery.addSelectGroupBy(quotedAlias);
outerSqlQuery.addType(null);
outerSqlQuery.addSelectGroupBy(quotedAlias, null);
}

// add predicates not associated with columns
Expand All @@ -288,14 +290,14 @@ protected void distinctGenerateSql(

String alias = getMeasureAlias(i);
String expr = measure.generateExprString(outerSqlQuery);
innerSqlQuery.addSelect(expr, alias);
innerSqlQuery.addSelect(expr, null, alias);
if (databaseProduct == Dialect.DatabaseProduct.GREENPLUM) {
innerSqlQuery.addGroupBy(expr, alias);
}
outerSqlQuery.addSelect(
measure.getAggregator().getNonDistinctAggregator()
.getExpression(dialect.quoteIdentifier(alias)));
outerSqlQuery.addType(null);
.getExpression(dialect.quoteIdentifier(alias)),
null);
}
outerSqlQuery.addFrom(innerSqlQuery, "dummyname", true);
}
Expand Down

0 comments on commit 0f27527

Please sign in to comment.