Skip to content

Commit

Permalink
MONDRIAN: Anatoly's fixes for Derby; bug 1379182. (Do not include an …
Browse files Browse the repository at this point in the history
…item in the SELECT clause if it is also in HAVING clause.)

[git-p4: depot-paths = "//open/mondrian/": change = 4738]
  • Loading branch information
julianhyde committed Dec 16, 2005
1 parent 8aff641 commit 4bb9de7
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 37 deletions.
26 changes: 11 additions & 15 deletions src/main/mondrian/rolap/RolapNativeFilter.java
@@ -1,11 +1,13 @@
/*
//This software is subject to the terms of the Common Public License
//Agreement, available at the following URL:
//http://www.opensource.org/licenses/cpl.html.
//Copyright (C) 2004-2005 TONBELLER AG
//All Rights Reserved.
//You must accept the terms of that agreement to use this software.
*/
// $Id$
// This software is subject to the terms of the Common Public License
// Agreement, available at the following URL:
// http://www.opensource.org/licenses/cpl.html.
// Copyright (C) 2005-2005 Julian Hyde
// Copyright (C) 2004-2005 TONBELLER AG
// All Rights Reserved.
// You must accept the terms of that agreement to use this software.
*/
package mondrian.rolap;

import java.sql.Connection;
Expand Down Expand Up @@ -93,14 +95,6 @@ NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args
try {
con = ds.getConnection();

// Disable filters against Derby, because its HAVING support is
// crippled. See bug 1379182.
final SqlQuery.Dialect dialect =
SqlQuery.Dialect.create(con.getMetaData());
if (dialect.isDerby()) {
return null;
}

// generate the WHERE condition
SqlQuery sqlQuery = SqlTupleReader.newQuery(con, "NativeFilter");
RolapNativeSql sql = new RolapNativeSql(sqlQuery);
Expand All @@ -126,3 +120,5 @@ NativeEvaluator createEvaluator(RolapEvaluator evaluator, FunDef fun, Exp[] args
}

}

// End RolapNativeFilter.java
10 changes: 5 additions & 5 deletions src/main/mondrian/rolap/SqlMemberSource.java
Expand Up @@ -240,7 +240,7 @@ private String makeLevelMemberCountSql(
}
if (mustCount[0]) {
sqlQuery.addSelect(columnList);
sqlQuery.addOrderBy(columnList);
sqlQuery.addOrderBy(columnList, true, false);
} else {
sqlQuery.addSelect("count(DISTINCT " + columnList + ")");
}
Expand Down Expand Up @@ -417,7 +417,7 @@ private String makeKeysSql(Connection jdbcConnection) {
exp = level.getOrdinalExp();
hierarchy.addToFrom(sqlQuery, exp);
expString = exp.getExpression(sqlQuery);
sqlQuery.addOrderBy(expString);
sqlQuery.addOrderBy(expString, true, false);
sqlQuery.addGroupBy(expString);

RolapProperty[] properties = level.getRolapProperties();
Expand Down Expand Up @@ -561,7 +561,7 @@ String makeChildMemberSql(

hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy);
sqlQuery.addOrderBy(orderBy, true, false);
if (!orderBy.equals(q)) {
sqlQuery.addGroupBy(orderBy);
}
Expand Down Expand Up @@ -859,7 +859,7 @@ private String makeChildMemberSql_PCRoot(RolapMember member,
sqlQuery.addGroupBy(childId);
hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy);
sqlQuery.addOrderBy(orderBy, true, false);
if (!orderBy.equals(childId)) {
sqlQuery.addGroupBy(orderBy);
}
Expand Down Expand Up @@ -910,7 +910,7 @@ private String makeChildMemberSqlPC(
sqlQuery.addGroupBy(childId);
hierarchy.addToFrom(sqlQuery, level.getOrdinalExp());
String orderBy = level.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addOrderBy(orderBy);
sqlQuery.addOrderBy(orderBy, true, false);
if (!orderBy.equals(childId)) {
sqlQuery.addGroupBy(orderBy);
}
Expand Down
4 changes: 3 additions & 1 deletion src/main/mondrian/rolap/SqlTupleReader.java
Expand Up @@ -17,6 +17,8 @@

import javax.sql.DataSource;

import org.apache.log4j.Logger;

import mondrian.olap.MondrianDef;
import mondrian.olap.MondrianProperties;
import mondrian.olap.Util;
Expand Down Expand Up @@ -388,7 +390,7 @@ void addLevelMemberSql(SqlQuery sqlQuery, RolapLevel level) {

String ordinalSql = level2.getOrdinalExp().getExpression(sqlQuery);
sqlQuery.addGroupBy(ordinalSql);
sqlQuery.addOrderBy(ordinalSql);
sqlQuery.addOrderBy(ordinalSql, true, false);
RolapProperty[] properties = level2.getRolapProperties();
for (int j = 0; j < properties.length; j++) {
RolapProperty property = properties[j];
Expand Down
38 changes: 22 additions & 16 deletions src/main/mondrian/rolap/sql/SqlQuery.java
Expand Up @@ -339,9 +339,10 @@ public boolean addFrom(final MondrianDef.Relation relation,
* column alias.
*/
public void addSelect(final String expression) {
// some DB2 versions (AS/400) throw an error, if a column alias is
// *not* used in a subsequent order by (Group by)
if (dialect.isAS400()) {
// Some DB2 versions (AS/400) throw an error if a column alias is
// *not* used in a subsequent order by (Group by).
// Derby fails on 'SELECT... HAVING' if column has alias.
if (dialect.isAS400() || dialect.isDerby()) {
addSelect(expression, null);
} else {
addSelect(expression, nextColumnAlias());
Expand Down Expand Up @@ -407,20 +408,23 @@ public void addOrderBy(final String expression)
}

/**
* creates an ORDER BY
* Adds an item to the ORDER BY clause.
*
* @param expr the expr to order by
* @param ascending sort direction
* @param prepend true = prepend to the current list of order by elements.
*/
public void addOrderBy(String expr, boolean ascending, boolean prepend) {
if (ascending)
if (ascending) {
expr = expr + " ASC";
else
} else {
expr = expr + " DESC";
if (prepend)
}
if (prepend) {
orderBy.add(0, expr);
else
} else {
orderBy.add(expr);
}
}

public String toString()
Expand Down Expand Up @@ -660,17 +664,17 @@ private String getBestName() {
}
return best;
}

/**
* @return SQL syntax that converts <code>expr</code>
* @return SQL syntax that converts <code>expr</code>
* into upper case.
*/
public String toUpper(String expr) {
if (isDB2() || isAccess())
return "UCASE(" + expr + ")";
return "UPPER(" + expr + ")";
}

public String caseWhenElse(String cond, String thenExpr, String elseExpr) {
if (isAccess())
return "IIF(" + cond + "," + thenExpr + "," + elseExpr + ")";
Expand Down Expand Up @@ -888,9 +892,9 @@ public boolean allowsCountDistinct() {
}

/**
* Chooses the variant within an array of {@link
* mondrian.olap.MondrianDef.SQL} which best matches the current SQL
* dialect.
* Chooses the variant within an array of
* {@link mondrian.olap.MondrianDef.SQL} which best matches the current
* SQL dialect.
*/
public String chooseQuery(final MondrianDef.SQL[] sqls) {
String best = getBestName();
Expand All @@ -914,15 +918,17 @@ public String chooseQuery(final MondrianDef.SQL[] sqls) {
}

/**
* quotes a value so it may be used in SQL
* Quotes a value so it may be used in SQL.
*
* @throws NumberFormatException if numeric == true and value can not
* be parsed as a number
*/
public String quote(boolean numeric, Object value) throws NumberFormatException {
String string = String.valueOf(value);
if (numeric) {
if (value instanceof Number)
if (value instanceof Number) {
return string;
}
// make sure it can be parsed as a Number
Double.valueOf(string);
return string;
Expand Down

0 comments on commit 4bb9de7

Please sign in to comment.