.getErrorString( "MondrianModel.ERROR_0004_CUBE_NOT_SPECIFIED",
connection.getConnectString() ) ); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
Cube cube = null;
if ( cubes.length == 1 ) {
cube = cubes[ 0 ];
} else {
for ( Cube element : cubes ) {
if ( element.getName().equals( cubeName ) ) {
cube = element;
break;
}
}
}
if ( cube == null ) {
Logger
.error(
"MondrianModelComponent", Messages.getInstance()
.getErrorString( "MondrianModel.ERROR_0005_CUBE_NOT_FOUND", cubeName,
connection.getConnectString() ) ); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
// If we have any whereConditions block, we need to find which hierarchies they are in
// and not include them in the rows
HashSet<Hierarchy> whereHierarchies = new HashSet<Hierarchy>();
if ( catalogComplementInfo != null && catalogComplementInfo.getWhereCondition( cube.getName() ) != null
&& !catalogComplementInfo.getWhereCondition( cube.getName() ).equals( "" ) ) { //$NON-NLS-1$
final String rawString = catalogComplementInfo.getWhereCondition( cube.getName() );
// Caveat - It's possible that we have in the where condition a hierarchy that we don't have access
// permissions; In this case, we'll ditch the where condition at all. Same for any error that
// we find here
try {
// According to Julian, the better way to resolve the names is to build a query
final String queryStr =
"select " + rawString + " on columns, {} on rows from " + cube.getName(); //$NON-NLS-1$ //$NON-NLS-2$
final Query query = connection.parseQuery( queryStr );
final Hierarchy[] hierarchies = query.getMdxHierarchiesOnAxis( AxisOrdinal.StandardAxisOrdinal.COLUMNS );
boolean isWhereValid = true;
for ( int i = 0; i < hierarchies.length && isWhereValid; i++ ) {
final Hierarchy hierarchy = hierarchies[ i ];
if ( connection.getRole().canAccess( hierarchy ) ) {
whereHierarchies.add( hierarchy );
} else {
isWhereValid = false;
whereHierarchies.clear();
}
}
if ( isWhereValid ) {
whereMdx = " WHERE " + rawString; //$NON-NLS-1$
}
} catch ( Exception e ) {
// We found an error in the where slicer, so we'll just act like it wasn't here
whereHierarchies.clear();
}
}
Dimension[] dimensions = cube.getDimensions();
if ( ( dimensions == null ) || ( dimensions.length == 0 ) ) {
Logger
.error(
"MondrianModelComponent", Messages.getInstance()
.getErrorString( "MondrianModel.ERROR_0006_NO_DIMENSIONS", cubeName,
connection.getConnectString() ) ); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
for ( Dimension element : dimensions ) {
final Hierarchy hierarchy = element.getHierarchy();
if ( hierarchy == null ) {
Logger
.error(
"MondrianModelComponent", Messages.getInstance()
.getErrorString( "MondrianModel.ERROR_0007_NO_HIERARCHIES", element.getName(), cubeName,
connection.getConnectString() ) ); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
if ( !connection.getRole().canAccess( hierarchy ) ) {
// We can't access this element
continue;
}
if ( whereHierarchies.contains( hierarchy ) ) {
// We have it on the where condition - skip it
continue;
}
Member member =
Locus.execute( (RolapConnection) connection, "Retrieving default members in plugin",
new Locus.Action<Member>() {
public Member execute() {
return connection.getSchemaReader().getHierarchyDefaultMember( hierarchy );
}
} );
if ( member == null ) {
Logger
.error(
"MondrianModelComponent", Messages.getInstance()
.getErrorString( "MondrianModel.ERROR_0008_NO_DEFAULT_MEMBER", element.getName(), cubeName,
connection.getConnectString() ) ); //$NON-NLS-1$ //$NON-NLS-2$
return null;
}
if ( element.isMeasures() ) {
// measuresMdx = "with member "+ member.getUniqueName();
// //$NON-NLS-1$
measuresMdx = ""; //$NON-NLS-1$
columnsMdx = " select NON EMPTY {" + member.getUniqueName() + "} ON columns, "; //$NON-NLS-1$ //$NON-NLS-2$
} else {
if ( rowsMdx.length() > 0 ) {
rowsMdx.append( ", " ); //$NON-NLS-1$
}
rowsMdx.append( member.getUniqueName() );
}
}
if ( ( measuresMdx != null ) && ( columnsMdx != null ) && ( rowsMdx.length() > 0 ) ) {
StringBuffer result = new StringBuffer( measuresMdx.length() + columnsMdx.length() + rowsMdx.length() + 50 );
result.append( measuresMdx ).append( columnsMdx ).append( "NON EMPTY {(" ) //$NON-NLS-1$
.append( rowsMdx ).append( ")} ON rows " ) //$NON-NLS-1$
.append( "from [" + cube.getName() + "]" ) //$NON-NLS-1$ //$NON-NLS-2$
.append( whereMdx );
return result.toString();
}