CompiledExpression compileDirectColRefExpr( Node parent, Node refNode,
protected CompiledExpression compileDirectColRefExpr( Node parent, Node refNode,
	CompiledExpression compileDirectColRefExpr( Node parent, Node refNode,			Node grandFather, boolean customerChecked, Context context )			throws DataException	{		// if it's a GETPROP or GETELEM with row on the left side,		// and either a STRING or NUMBER on the right side, then it's		// a direct column reference		assert ( refNode.getType( ) == Token.GETPROP || refNode.getType( ) == Token.GETELEM );		Node rowName = refNode.getFirstChild( );		assert ( rowName != null );		if ( rowName.getType( ) != Token.NAME )			return null;		String str = rowName.getString( );		assert ( str != null );		if ( !str.equals( rowIndicator ) )			return null;		Node rowColumn = rowName.getNext( );		assert ( rowColumn != null );		if ( refNode.getType( ) == Token.GETPROP				&& rowColumn.getType( ) == Token.STRING )		{			if ( "_outer".equals( rowColumn.getString( ) )					|| "__rownum".equals( rowColumn.getString( ) )					|| "0".equals( rowColumn.getString( ) ) )				return null;			return new ColumnReferenceExpression( getDataSetMode( )					? STRING_ROW : STRING_DATASETROW, rowColumn.getString( ) );		}		if ( refNode.getType( ) == Token.GETELEM )		{			if ( rowColumn.getType( ) == Token.NUMBER )			{				if ( 0 == rowColumn.getDouble( ) )					return null;				return new ColumnReferenceExpression( getDataSetMode( )						? STRING_ROW : STRING_DATASETROW,						(int) rowColumn.getDouble( ) );			}			else if ( rowColumn.getType( ) == Token.STRING )			{				if ( "_rownum".equals( rowColumn.getString( ) ) )					return null;				return new ColumnReferenceExpression( getDataSetMode( )						? STRING_ROW : STRING_DATASETROW, rowColumn.getString( ) );			}		}		// right side is not a STRING or a NUMBER, which is what is needed for		// a direct column reference. so it could be something		// like row[getColumnIndex()] and that would be a complex expression		return null;	}