Package org.pentaho.platform.plugin.services.connections.mondrian

Source Code of org.pentaho.platform.plugin.services.connections.mondrian.MDXMetaDataTest

/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright 2013 Pentaho Corporation. All rights reserved.
*/

package org.pentaho.platform.plugin.services.connections.mondrian;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import mondrian.olap.Axis;
import mondrian.olap.Dimension;
import mondrian.olap.Hierarchy;
import mondrian.olap.Level;
import mondrian.olap.Member;
import mondrian.olap.Result;

import org.apache.commons.collections.ListUtils;
import org.apache.commons.lang.StringUtils;
import org.junit.Test;

public class MDXMetaDataTest {

  private static final int COLUMN_SIZE = 3;
  private static final int ROW_SIZE = 2;

  private static final String HIERARCHY_NAME = "hierarchy";
  private static final String LEVEL_NAME = "level";
  private static final String DIMENSION_NAME = "dimension";
  private static final String MEMBER_NAME = "member name";
  private static final String MEMBER_CAPTION = "member caption";

  @Test
  public void testMetadataFromEmptyAxis() {
    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    checkEmptyResult( metadata );
  }

  @Test
  public void testMetadataFromNullAxis() {
    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { null, null } );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    checkEmptyResult( metadata );
  }

  @Test
  public void testMetadataForNullPositions() {
    Axis axColumn = mockAxis( null );
    Axis axRow = mockAxis( null );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    checkEmptyResult( metadata );
  }

  @Test
  public void testMetadataForEmptyPositions() {
    Axis axColumn = mockAxis( ListUtils.EMPTY_LIST );
    Axis axRow = mockAxis( ListUtils.EMPTY_LIST );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    checkEmptyResult( metadata );
  }

  @Test
  @SuppressWarnings( { "rawtypes", "unchecked" } )
  public void testMetadataExtendedColumnNames() {
    List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );

    Axis axColumn = mockAxis( positions );
    Axis axRow = mockAxis( positions );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet, true );

    checkColumnHeaders( positions, metadata.getColumnHeaders() );
    checkRowHeaders( positions, metadata.getRowHeaders() );
    checkRowHeaderNames( positions, metadata.getRowHeaderNames() );
  }

  @Test
  @SuppressWarnings( { "rawtypes", "unchecked" } )
  public void testMetadataWithoutExtendedColumnNames() {
    List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );

    Axis axColumn = mockAxis( positions );
    Axis axRow = mockAxis( positions );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );
    Object[][] columnHeaders = metadata.getColumnHeaders();

    checkExtendedColumnHeaders( positions, columnHeaders );
    checkExtendedRowHeaders( positions, metadata.getRowHeaders() );
    checkExtendedRowHeaderNames( positions, metadata.getRowHeaderNames() );
  }

  @Test
  public void testGetEmptyColumnName() {
    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    String columnName = metadata.getColumnName( -1 );
    assertEquals( StringUtils.EMPTY, columnName );

    columnName = metadata.getColumnName( metadata.getRowHeaderNames().length + 1 );
    assertEquals( StringUtils.EMPTY, columnName );
  }

  @Test
  @SuppressWarnings( "rawtypes" )
  public void testGetColumnName() {
    List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );

    Axis axColumn = mockAxis( positions );
    Axis axRow = mockAxis( positions );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    String columnName = metadata.getColumnName( 0 );
    assertEquals( metadata.getRowHeaderNames()[0], columnName );
  }

  @Test
  @SuppressWarnings( "rawtypes" )
  public void testGetColumnCount() {
    List positions = mockPositions( COLUMN_SIZE, ROW_SIZE );

    Axis axColumn = mockAxis( positions );
    Axis axRow = mockAxis( positions );
    Axis[] axes = new Axis[] { axColumn, axRow };

    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( axes );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    int columnCount = metadata.getColumnCount();
    assertEquals( positions.size(), columnCount );
  }

  @Test
  public void testGetZeroColumnCount() {
    Result nativeResultSet = mock( Result.class );
    when( nativeResultSet.getAxes() ).thenReturn( new Axis[0] );

    MDXMetaData metadata = new MDXMetaData( nativeResultSet );

    int columnCount = metadata.getColumnCount();
    assertEquals( 0, columnCount );

    when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { null } );

    metadata = new MDXMetaData( nativeResultSet );

    columnCount = metadata.getColumnCount();
    assertEquals( 0, columnCount );

    Axis axColumn = mockAxis( null );
    when( nativeResultSet.getAxes() ).thenReturn( new Axis[] { axColumn } );

    metadata = new MDXMetaData( nativeResultSet );

    columnCount = metadata.getColumnCount();
    assertEquals( 0, columnCount );
  }

  private void checkEmptyResult( MDXMetaData metadata ) {
    assertEquals( 0, metadata.getColumnHeaders().length );
    assertEquals( 0, metadata.getRowHeaders().length );
    assertEquals( 0, metadata.getRowHeaderNames().length );
  }

  @SuppressWarnings( "unchecked" )
  private void checkColumnHeaders( List<Member> positions, Object[][] columnHeaders ) {
    assertNotNull( columnHeaders );
    assertTrue( columnHeaders.length > 0 );
    for ( int i = 0; i < columnHeaders.length; i++ ) {
      for ( int j = 0; j < columnHeaders[i].length; j++ ) {
        List<Member> row = (List<Member>) positions.get( j );
        Member memberExpected = (Member) row.get( i );
        assertEquals( memberExpected.getCaption(), columnHeaders[i][j] );
      }
    }
  }

  @SuppressWarnings( "unchecked" )
  private void checkExtendedColumnHeaders( List<Member> positions, Object[][] columnHeaders ) {
    assertNotNull( columnHeaders );
    assertTrue( columnHeaders.length > 0 );
    for ( int i = 0; i < columnHeaders.length; i++ ) {
      for ( int j = 0; j < columnHeaders[i].length; j++ ) {
        List<Member> row = (List<Member>) positions.get( j );
        String expectedValue;
        if ( ( i == columnHeaders.length - 1 ) ) {
          Member memberExpected = (Member) row.get( i - 1 );
          expectedValue = memberExpected.getHierarchy().getCaption();
        } else {
          Member memberExpected = (Member) row.get( i );
          expectedValue = memberExpected.getCaption();
        }
        assertEquals( expectedValue, columnHeaders[i][j] );
      }
    }
  }

  @SuppressWarnings( "unchecked" )
  private void checkRowHeaders( List<Member> positions, Object[][] rowHeaders ) {
    assertNotNull( rowHeaders );
    assertTrue( rowHeaders.length > 0 );
    for ( int i = 0; i < rowHeaders.length; i++ ) {
      for ( int j = 0; j < rowHeaders[i].length; j++ ) {
        List<Member> row = (List<Member>) positions.get( i );
        Member memberExpected = (Member) row.get( j );
        assertEquals( memberExpected.getCaption(), rowHeaders[i][j] );
      }
    }
  }

  @SuppressWarnings( "unchecked" )
  private void checkExtendedRowHeaders( List<Member> positions, Object[][] rowHeaders ) {
    assertNotNull( rowHeaders );
    assertTrue( rowHeaders.length > 0 );
    for ( int i = 0; i < rowHeaders.length; i++ ) {
      for ( int j = 0; j < rowHeaders[i].length; j++ ) {
        List<Member> row = (List<Member>) positions.get( i );
        String expectedValue;
        if ( ( j == rowHeaders.length - 1 ) ) {
          Member memberExpected = (Member) row.get( j - 1 );
          expectedValue = memberExpected.getHierarchy().getCaption();
        } else {
          Member memberExpected = (Member) row.get( j );
          expectedValue = memberExpected.getCaption();
        }
        assertEquals( expectedValue, rowHeaders[i][j] );
      }
    }
  }

  @SuppressWarnings( "unchecked" )
  private void checkRowHeaderNames( List<Member> positions, String[] names ) {
    assertNotNull( names );
    assertTrue( names.length > 0 );
    for ( int i = 0; i < names.length; i++ ) {
      List<Member> row = (List<Member>) positions.get( 0 );
      Member member = (Member) row.get( i );
      String expectedName =
        "[" + member.getDimension().getName() + "].[" + member.getHierarchy().getName() + "].["
          + member.getLevel().getName() + "]";
      assertEquals( expectedName, names[i] );
    }
  }

  @SuppressWarnings( "unchecked" )
  private void checkExtendedRowHeaderNames( List<Member> positions, String[] names ) {
    assertNotNull( names );
    assertTrue( names.length > 0 );
    for ( int i = 0; i < names.length; i++ ) {
      String expectedValue;
      List<Member> row = (List<Member>) positions.get( 0 );
      if ( ( i == row.size() ) ) {
        Member member = (Member) row.get( row.size() - 1 );
        expectedValue = member.getHierarchy().getName() + "{" + i + "}";
      } else {
        Member member = (Member) row.get( i );
        expectedValue = member.getHierarchy().getCaption();
      }
      assertEquals( expectedValue, names[i] );
    }
  }

  @SuppressWarnings( { "unchecked", "rawtypes" } )
  private Axis mockAxis( List positions ) {
    Axis ax = mock( Axis.class );
    when( ax.getPositions() ).thenReturn( positions );
    return ax;
  }

  private Hierarchy mockHierarchy( String name, String caption ) {
    String hierarchyCaption = HIERARCHY_NAME + caption;
    String hierarchyName = HIERARCHY_NAME + name;
    Hierarchy hierarchy = mock( Hierarchy.class );
    when( hierarchy.getCaption() ).thenReturn( hierarchyCaption );
    when( hierarchy.getName() ).thenReturn( hierarchyName );
    return hierarchy;
  }

  private Level mockLevel( String name ) {
    Level level = mock( Level.class );
    when( level.getName() ).thenReturn( LEVEL_NAME + name );
    return level;
  }

  private Dimension mockDimension( String name ) {
    Dimension dimension = mock( Dimension.class );
    when( dimension.getName() ).thenReturn( DIMENSION_NAME + name );
    return dimension;
  }

  private Member mockMember( String caption, String name ) {
    Level level = mockLevel( name );
    Dimension dimension = mockDimension( name );
    Hierarchy hierarchy = mockHierarchy( name, caption );

    Member member = mock( Member.class );
    when( member.getCaption() ).thenReturn( caption );
    when( member.getHierarchy() ).thenReturn( hierarchy );
    when( member.getDimension() ).thenReturn( dimension );
    when( member.getLevel() ).thenReturn( level );
    return member;
  }

  private List<Member> mockRow( int rowSize, String additionalName ) {
    List<Member> rows = new ArrayList<Member>( rowSize );
    for ( int i = 0; i < rowSize; i++ ) {
      rows.add( mockMember( MEMBER_CAPTION + i + additionalName, MEMBER_NAME + i + additionalName ) );
    }
    return rows;
  }

  private List<List<Member>> mockPositions( int positionsSize, int rowSize ) {
    List<List<Member>> positions = new ArrayList<List<Member>>( positionsSize );
    for ( int i = 0; i < positionsSize; i++ ) {
      positions.add( mockRow( rowSize, String.valueOf( i ) ) );
    }
    return positions;
  }
}
TOP

Related Classes of org.pentaho.platform.plugin.services.connections.mondrian.MDXMetaDataTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.