Skip to content

Commit

Permalink
Update the getReferencedLevelsForLinkedCube API
Browse files Browse the repository at this point in the history
  • Loading branch information
lzhang authored and mwu committed Mar 27, 2013
1 parent 652c554 commit 006b59c
Showing 1 changed file with 108 additions and 6 deletions.
Expand Up @@ -22,6 +22,7 @@
import org.eclipse.birt.data.engine.core.DataException;
import org.eclipse.birt.data.engine.olap.api.query.ICubeQueryDefinition;
import org.eclipse.birt.report.data.adapter.i18n.ResourceConstants;
import org.eclipse.birt.report.model.api.util.CubeUtil;
import org.mozilla.javascript.CompilerEnvirons;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Node;
Expand Down Expand Up @@ -143,7 +144,7 @@ public static List getReferencedLevelsForLinkedCube( String targetLevel,
try
{
List result = new ArrayList( );
DimensionLevel target = getTargetDimLevel( targetLevel );
DimensionLevel target = getTargetDimLevelForLinkedCube( targetLevel );
String bindingName = getReferencedScriptObject( bindingExpr, "data" );
if ( bindingName == null )
return result;
Expand Down Expand Up @@ -177,7 +178,7 @@ public static List getReferencedLevelsForLinkedCube( String targetLevel,
}
}

int candidateEdge = getAxisQualifierEdgeType( rowEdgeExprList,
int candidateEdge = getAxisQualifierEdgeTypeForLinkedCube( rowEdgeExprList,
columnEdgeExprList,
target );

Expand All @@ -189,10 +190,10 @@ public static List getReferencedLevelsForLinkedCube( String targetLevel,
switch ( candidateEdge )
{
case ICubeQueryDefinition.ROW_EDGE :
populateLevels( rowEdgeExprList, result );
populateLevelsForLinkedCube( rowEdgeExprList, result );
break;
case ICubeQueryDefinition.COLUMN_EDGE :
populateLevels( columnEdgeExprList, result );
populateLevelsForLinkedCube( columnEdgeExprList, result );
break;
}
}
Expand All @@ -201,10 +202,10 @@ public static List getReferencedLevelsForLinkedCube( String targetLevel,
switch ( candidateEdge )
{
case ICubeQueryDefinition.ROW_EDGE :
populateAxisLevels( aggrOns, rowEdgeExprList, result );
populateAxisLevelsForLinkedCube( aggrOns, rowEdgeExprList, result );
break;
case ICubeQueryDefinition.COLUMN_EDGE :
populateAxisLevels( aggrOns, columnEdgeExprList, result );
populateAxisLevelsForLinkedCube( aggrOns, columnEdgeExprList, result );
break;
}
}
Expand Down Expand Up @@ -264,6 +265,28 @@ private static void populateAxisLevels( List aggrOns, List edgeExprList,
}
}
}

/**
* Populate axis levels to the <code>result</code> for the aggregate on
* levels only if they are on the specified level.
*
* @param aggrOns
* @param edgeExprList
* @param result
* @throws AdapterException
*/
private static void populateAxisLevelsForLinkedCube( List aggrOns, List edgeExprList,
List result ) throws AdapterException
{
for ( int i = 0; i < aggrOns.size( ); i++ )
{
final String levelExpr = aggrOns.get( i ).toString( );
if ( isAxisQualifierLevelForLinkedCube( levelExpr, edgeExprList ) )
{
result.add( getTargetDimLevelForLinkedCube( levelExpr ) );
}
}
}

/**
*
Expand All @@ -282,6 +305,19 @@ private static boolean isAxisQualifierLevel( String levelExpr,
}
return false;
}

private static boolean isAxisQualifierLevelForLinkedCube( String levelExpr,
List rowEdgeExprList )
{
for ( Iterator i = rowEdgeExprList.iterator( ); i.hasNext( ); )
{
String expr = (String) i.next( );
String[] target = CubeUtil.splitLevelName( expr );
if ( target[0].equals( levelExpr ) )
return true;
}
return false;
}

/**
*
Expand All @@ -298,6 +334,22 @@ private static void populateLevels( List levelExprList, List result )
result.add( getTargetDimLevel( levelExpr ) );
}
}

/**
*
* @param levelExprList
* @param result
* @throws AdapterException
*/
private static void populateLevelsForLinkedCube( List levelExprList, List result )
throws AdapterException
{
for ( Iterator i = levelExprList.iterator( ); i.hasNext( ); )
{
String levelExpr = (String) i.next( );
result.add( getTargetDimLevelForLinkedCube( levelExpr ) );
}
}

/**
*
Expand Down Expand Up @@ -338,6 +390,46 @@ private static int getAxisQualifierEdgeType( List rowEdgeList,
}
return -1;
}

/**
*
* @param rowEdgeList
* @param columnEdgeList
* @param target
* @return
* @throws AdapterException
*/
private static int getAxisQualifierEdgeTypeForLinkedCube( List rowEdgeList,
List columnEdgeList, DimensionLevel target ) throws AdapterException
{
if ( rowEdgeList != null )
{
for ( Iterator i = rowEdgeList.iterator( ); i.hasNext( ); )
{
String levelExpr = (String) i.next( );
DimensionLevel level = getTargetDimLevelForLinkedCube( levelExpr );
if ( target.getDimensionName( )
.equals( level.getDimensionName( ) ) )
{
return ICubeQueryDefinition.COLUMN_EDGE;
}
}
}
if ( columnEdgeList != null )
{
for ( Iterator i = columnEdgeList.iterator( ); i.hasNext( ); )
{
String levelExpr = (String) i.next( );
DimensionLevel level = getTargetDimLevelForLinkedCube( levelExpr );
if ( target.getDimensionName( )
.equals( level.getDimensionName( ) ) )
{
return ICubeQueryDefinition.ROW_EDGE;
}
}
}
return -1;
}

/**
* Get referenced Script Object (dimension, data, measure, etc) according to
Expand Down Expand Up @@ -482,4 +574,14 @@ private static DimensionLevel getTargetDimLevel( String expr )
}
return new DimensionLevel( target[0], target[1] );
}

private static DimensionLevel getTargetDimLevelForLinkedCube( String expr ) throws AdapterException
{
final String[] target = CubeUtil.splitLevelName( expr );
if ( target == null || target.length < 2 )
{
throw new AdapterException( ResourceConstants.INVALID_LEVEL_EXPRESSION, expr );
}
return new DimensionLevel( target[0], target[1] );
}
}

0 comments on commit 006b59c

Please sign in to comment.