if(!fixedOrder) Collections.sort(choices, new SelectionChoiceComparator(true));
	public Collection getSelectionChoicesForCascadingGroup(			String parameterGroupName, Object[] groupKeyValues )	{		CascadingParameterGroupHandle parameterGroup = getCascadingParameterGroup( parameterGroupName );		if ( parameterGroup == null )			return null;		IResultIterator iter = (IResultIterator) dataCache.get( parameterGroup				.getName( ) );		if ( iter == null )			return null;		SlotHandle slotHandle = parameterGroup.getParameters( );		assert ( groupKeyValues.length < slotHandle.getCount( ) );		int skipLevel = groupKeyValues.length + 1;		ScalarParameterHandle requestedParam = (ScalarParameterHandle) slotHandle				.get( groupKeyValues.length ); // The parameters in												// parameterGroup must be scalar												// parameters.		int listLimit = requestedParam.getListlimit( );		String valueType = requestedParam.getDataType( );		// We need to cache the expression object in function evaluateQuery and		// use the cached object here instead of creating a new one because		// according to DtE API for IResultIterator.getString,		// the expression object must be the same object created at the time of		// preparation.		// Actually, the prepare process will modify the expression object ,		// only after which		// the expression object can be used to get the real value from the		// result set.		// If we create a new expression object here, it won't work.		ScriptExpression labelExpr = (ScriptExpression) labelMap				.get( parameterGroup.getName( ) + "_"						+ requestedParam.getName( ) );		ScriptExpression valueExpr = (ScriptExpression) valueMap				.get( parameterGroup.getName( ) + "_"						+ requestedParam.getName( ) );		ArrayList choices = new ArrayList( );		try		{			if ( skipLevel > 1 )				iter.findGroup( groupKeyValues );			int count = 0;			while ( iter.next( ) )			{				String label = iter.getString( labelExpr );				Object value = iter.getValue( valueExpr );				value = convertToType( value, valueType );				choices.add( new SelectionChoice( label, value ) );				count++;				if ( ( listLimit != 0 ) && ( count >= listLimit ) )					break;				iter.skipToEnd( skipLevel );			}		}		catch ( BirtException e )		{			e.printStackTrace( );		}		return choices;	}