diff --git a/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/CubeQueryExecutor.java b/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/CubeQueryExecutor.java index bb13e48743a..8897efaec9b 100644 --- a/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/CubeQueryExecutor.java +++ b/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/CubeQueryExecutor.java @@ -431,29 +431,27 @@ public int getFilterType( IFilterDefinition filter, Set dimLevelInCube return CubeQueryExecutor.DIMENSION_FILTER; } - if ( !filter.updateAggregation( ) ) + + List derivedBindingNameList = new ArrayList( ); + for ( int i = 0; i < bindingName.size( ); i++ ) { - List derivedBindingNameList = new ArrayList( ); - for ( int i = 0; i < bindingName.size( ); i++ ) - { - IBinding binding = getBinding( bindingName.get( i ) - .toString( ), this.defn.getBindings( ) ); - if ( binding != null ) - { - List temp = ExpressionCompilerUtil.extractColumnExpression( binding.getExpression( ), - ScriptConstants.DATA_BINDING_SCRIPTABLE ); - if ( temp != null && temp.size( ) > 0 ) - derivedBindingNameList.addAll( temp ); - } - } - if ( derivedBindingNameList.size( ) > 0 ) + IBinding binding = getBinding( bindingName.get( i ) + .toString( ), this.defn.getBindings( ) ); + if ( binding != null ) { - if ( existAggregationBinding( derivedBindingNameList, - this.defn.getBindings( ) ) ) - return CubeQueryExecutor.AGGR_MEASURE_FILTER; + List temp = ExpressionCompilerUtil.extractColumnExpression( binding.getExpression( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ); + if ( temp != null && temp.size( ) > 0 ) + derivedBindingNameList.addAll( temp ); } } - + if ( derivedBindingNameList.size( ) > 0 ) + { + if ( existAggregationBinding( derivedBindingNameList, + this.defn.getBindings( ) ) ) + return CubeQueryExecutor.AGGR_MEASURE_FILTER; + } + return CubeQueryExecutor.FACTTABLE_FILTER; } else diff --git a/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/PreparedCubeQueryDefinition.java b/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/PreparedCubeQueryDefinition.java index fec0ad96d3e..090af93a480 100644 --- a/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/PreparedCubeQueryDefinition.java +++ b/data/org.eclipse.birt.data/src/org/eclipse/birt/data/engine/olap/impl/query/PreparedCubeQueryDefinition.java @@ -27,6 +27,7 @@ import org.eclipse.birt.data.engine.api.IFilterDefinition; import org.eclipse.birt.data.engine.api.ISortDefinition; import org.eclipse.birt.data.engine.api.querydefn.Binding; +import org.eclipse.birt.data.engine.api.querydefn.ConditionalExpression; import org.eclipse.birt.data.engine.api.querydefn.ScriptExpression; import org.eclipse.birt.data.engine.core.DataException; import org.eclipse.birt.data.engine.expression.ExpressionCompilerUtil; @@ -44,6 +45,7 @@ import org.eclipse.birt.data.engine.olap.api.query.IMeasureDefinition; import org.eclipse.birt.data.engine.olap.data.api.DimLevel; import org.eclipse.birt.data.engine.olap.util.OlapExpressionUtil; +import org.eclipse.birt.data.engine.script.ScriptConstants; /** @@ -105,6 +107,11 @@ public PreparedCubeQueryDefinition( ICubeQueryDefinition cqd ) throws DataExcept List all = new ArrayList( Arrays.asList( cqd.getCubeOperations( ))); all.addAll( convertedCubeOperations ); realCubeOperations = all.toArray( new ICubeOperation[0] ); + + for( int i = 0 ; i < cqd.getFilters( ).size( ) ; i++ ) + { + replaceFilterTextOnCalculateMeasures( ( IFilterDefinition ) cqd.getFilters( ).get( i ), realBindings ); + } } private String getRollUpAggregationFunctionName( String function ) @@ -118,6 +125,75 @@ private String getRollUpAggregationFunctionName( String function ) return function; } + private IBinding getBinding( String bindingName, List bindings ) throws DataException + { + for( int j = 0; j < bindings.size( ); j++ ) + { + IBinding binding = (IBinding) bindings.get( j ); + if( bindingName.equals( binding.getBindingName( ) ) ) + { + return binding; + } + } + return null; + } + + private void replaceFilterTextOnCalculateMeasures( IFilterDefinition filter, List bindings ) throws DataException + { + if( filter.getExpression( ) instanceof ConditionalExpression ) + { + ConditionalExpression filterExpr = (ConditionalExpression) filter.getExpression( ); + List referenceBindingName = ExpressionCompilerUtil.extractColumnExpression( filterExpr.getExpression( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ); + if ( referenceBindingName.size( ) > 0 ) + { + for ( int i = 0; i < referenceBindingName.size( ); i++ ) + { + IBinding binding = getBinding( referenceBindingName.get( i ) + .toString( ), bindings ); + if ( binding != null && ExpressionCompilerUtil.extractColumnExpression( binding.getExpression( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ).size()>0 ) + { + ( (ScriptExpression) filterExpr.getExpression( ) ).setText( ( (ScriptExpression) binding.getExpression( ) ).getText( ) ); + } + } + + } + + referenceBindingName = ExpressionCompilerUtil.extractColumnExpression( filterExpr.getOperand1( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ); + if ( referenceBindingName.size( ) > 0 ) + { + for ( int i = 0; i < referenceBindingName.size( ); i++ ) + { + IBinding binding = getBinding( referenceBindingName.get( i ) + .toString( ), bindings ); + if ( binding != null && ExpressionCompilerUtil.extractColumnExpression( binding.getExpression( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ).size()>0 ) + { + ( (ScriptExpression) filterExpr.getOperand1( ) ).setText( ( (ScriptExpression) binding.getExpression( ) ).getText( ) ); + } + } + } + + referenceBindingName = ExpressionCompilerUtil.extractColumnExpression( filterExpr.getOperand2( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ); + if ( referenceBindingName.size( ) > 0 ) + { + for ( int i = 0; i < referenceBindingName.size( ); i++ ) + { + IBinding binding = getBinding( referenceBindingName.get( i ) + .toString( ), bindings ); + if ( binding != null && ExpressionCompilerUtil.extractColumnExpression( binding.getExpression( ), + ScriptConstants.DATA_BINDING_SCRIPTABLE ).size()>0 ) + { + ( (ScriptExpression) filterExpr.getOperand2( ) ).setText( ( (ScriptExpression) binding.getExpression( ) ).getText( ) ); + } + } + } + } + } + private IBinding getSameBindingInQuery( IBinding binding, List bindings ) throws DataException { for ( int i = 0; i < bindings.size( ); i++ )