combineColumnPath(tableInfo.getRootPath( ),columnXpath), originalColumnXpath));
tableInfo.getRootPath( ), columnXpath, originalColumnXpath));
	private void initialize( String relationString ) throws OdaException	{		if( relationString == null|| relationString.length() == 0)			throw new OdaException( Messages.getString("RelationInformation.InputStringCannotBeNull"));				String[] tables = relationString.split( CONST_TABLE_DELIMITER );		for ( int i = 0; i < tables.length; i++ )		{			String[] temp = tables[i].trim( )					.split( CONST_TABLE_COLUMN_DELIMITER );			assert ( temp.length == 3 );			// //////////////////////////////			TableInfo tableInfo = new TableInfo( temp[0].trim( ),					temp[1].substring( 1, temp[1].length( ) - 1 ).trim( ) );			// ////////////////////////////////			String[] columns = temp[2].trim( ).split( CONST_COLUMN_DELIMITER );						for ( int j = 0; j < columns.length; j++ )			{				String trimedColumn = columns[j].trim( );				// remove column info delimiter "{" and "}"							String[] columnInfos = trimedColumn.substring( 1,						trimedColumn.length( ) - 1 )						.split( CONST_COLUMN_METAINFO_DELIMITER );								//columnInfos[0]: column name				//columnInfos[1]: column type				//columnInfos[2]: column XPath				String columnXpath = null;				if( columnInfos.length == 3 )				{					columnXpath = columnInfos[2];				}else				{					columnXpath = "";				}				for ( int m = 0; m < columnInfos.length; m++ )					columnInfos[m] = columnInfos[m].trim( );				String originalColumnXpath = columnXpath;				//if it is a filter expression				if ( columnXpath.matches( ".*\\Q[@\\E.*\\Q=\\E.*" ) )				{					//get the filter value					String value = columnXpath.replaceAll( ".*\\Q[@\\E.*\\Q=\\E",							"" )							.trim( );					value = value.substring( 1, value.length( ) - 2 );									//add it to filter					tableInfo.addFilter( columnInfos[0], value );										columnXpath = columnXpath.replaceAll( "\\Q=\\E.*",							"]" );				}				tableInfo.addColumn( new ColumnInfo( j + 1,						columnInfos[0],						columnInfos[1],						combineColumnPath(tableInfo.getRootPath( ),columnXpath), originalColumnXpath));			}			this.tableInfos.put( temp[0].trim( ), tableInfo );		}	}