org.pentaho.agilebi.modeler.ModelerWorkspaceIT.java Source code

Java tutorial

Introduction

Here is the source code for org.pentaho.agilebi.modeler.ModelerWorkspaceIT.java

Source

/*!
 * 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 (c) 2002-2013 Pentaho Corporation..  All rights reserved.
 */

package org.pentaho.agilebi.modeler;

import static junit.framework.Assert.*;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Locale;

import org.apache.commons.lang.StringUtils;
import org.junit.Test;
import org.pentaho.agilebi.modeler.nodes.AvailableTable;
import org.pentaho.agilebi.modeler.nodes.CategoryMetaData;
import org.pentaho.agilebi.modeler.nodes.DimensionMetaData;
import org.pentaho.agilebi.modeler.nodes.FieldMetaData;
import org.pentaho.agilebi.modeler.nodes.HierarchyMetaData;
import org.pentaho.agilebi.modeler.nodes.LevelMetaData;
import org.pentaho.agilebi.modeler.nodes.MeasureMetaData;
import org.pentaho.agilebi.modeler.util.ModelerWorkspaceHelper;
import org.pentaho.metadata.model.Domain;
import org.pentaho.metadata.model.IPhysicalColumn;
import org.pentaho.metadata.model.LogicalColumn;
import org.pentaho.metadata.model.LogicalModel;
import org.pentaho.metadata.model.LogicalTable;
import org.pentaho.metadata.util.MondrianModelExporter;
import org.pentaho.metadata.util.XmiParser;

/**
 * Created: 4/1/11
 *
 * @author rfellows
 */
public class ModelerWorkspaceIT extends AbstractModelerTest {

    @Test
    public void testUpConvertLegacyModel() throws Exception {
        XmiParser parser = new XmiParser();
        Domain d = parser.parseXmi(new FileInputStream("test-res/products.xmi"));
        LogicalModel model = d.getLogicalModels().get(0);

        assertEquals(1, model.getLogicalTables().size());
        // Up-Convert happens in the setDomain now
        workspace.setDomain(d, false);

        assertEquals(1, model.getLogicalTables().size());

    }

    @Test
    public void testUpConvert_v2() throws Exception {
        XmiParser parser = new XmiParser();
        Domain d = parser.parseXmi(new FileInputStream("test-res/multi-table-model-2.0.xmi"));
        LogicalModel model = d.getLogicalModels().get(0);

        assertEquals(6, model.getLogicalTables().size());
        // Up-Convert happens in the setDomain now
        workspace.setDomain(d, true);

        assertEquals(3, model.getLogicalTables().size());

        LogicalModel olapModel = workspace.getLogicalModel(ModelerPerspective.ANALYSIS);
        assertEquals(3, olapModel.getLogicalTables().size());
    }

    @Test
    public void testSetDomain_NeedsUpConverted() throws Exception {
        XmiParser parser = new XmiParser();
        Domain d = parser.parseXmi(new FileInputStream("test-res/products.xmi"));
        LogicalModel model = d.getLogicalModels().get(0);
        workspace.setDomain(d);

        assertEquals(1, model.getLogicalTables().size());
        assertEquals(2, d.getLogicalModels().size());

        model = workspace.getLogicalModel(ModelerPerspective.ANALYSIS);

        // verify the OLAP measures & dimensions get their logical columns set to the new OLAP table's columns
        for (DimensionMetaData dim : workspace.getModel().getDimensions()) {
            for (HierarchyMetaData hier : dim) {
                for (LevelMetaData level : hier) {
                    assertTrue(isColumnReferencedInAvailableFields(level.getLogicalColumn()));
                    assertTrue(isReferencedTableOlapVersion(level.getLogicalColumn()));
                    assertFalse(isReferencedTableReportingVersion(level.getLogicalColumn()));
                }
            }
        }

        for (MeasureMetaData measure : workspace.getModel().getMeasures()) {
            assertTrue(isColumnReferencedInAvailableFields(measure.getLogicalColumn()));
            assertTrue(isReferencedTableOlapVersion(measure.getLogicalColumn()));
            assertFalse(isReferencedTableReportingVersion(measure.getLogicalColumn()));
        }

        model = workspace.getLogicalModel(ModelerPerspective.REPORTING);
        // verify the reporting model is correct still
        for (CategoryMetaData cat : workspace.getRelationalModel().getCategories()) {
            for (FieldMetaData field : cat) {
                assertTrue(isColumnReferencedInAvailableFields(field.getLogicalColumn()));
                assertTrue(isReferencedTableReportingVersion(field.getLogicalColumn()));
            }
        }
    }

    private boolean isReferencedTableOlapVersion(LogicalColumn logicalColumn) {
        for (LogicalTable table : workspace.getLogicalModel(ModelerPerspective.ANALYSIS).getLogicalTables()) {
            if (table.getId().equals(logicalColumn.getLogicalTable().getId())) {
                return true;
            }
        }
        return false;
    }

    private boolean isReferencedTableReportingVersion(LogicalColumn logicalColumn) {
        for (LogicalTable table : workspace.getLogicalModel(ModelerPerspective.REPORTING).getLogicalTables()) {
            if (table.getId().equals(logicalColumn.getLogicalTable().getId())) {
                return true;
            }
        }
        return false;
    }

    private boolean isColumnReferencedInAvailableFields(LogicalColumn lc) {
        for (AvailableTable table : workspace.getAvailableTables().getAsAvailableTablesList()) {
            if (table.containsUnderlyingPhysicalColumn(lc.getPhysicalColumn())) {
                return true;
            }
        }
        return false;
    }

    @Test
    public void testMondrianExportAfterUpConvertOfModel() throws Exception {
        XmiParser parser = new XmiParser();
        Domain d = parser.parseXmi(new FileInputStream("test-res/products.xmi"));
        workspace.setDomain(d);
        LogicalModel model = d.getLogicalModels().get(1);

        MondrianModelExporter exporter = new MondrianModelExporter(model, Locale.getDefault().toString());
        String mondrianSchema = exporter.createMondrianModelXML();
        String mondrianXmlBeforeUpConvert = readFileAsString("test-res/products.mondrian.xml");

        // just ignore any differences in line separators
        mondrianSchema = mondrianSchema.replaceAll("\r", "");
        mondrianXmlBeforeUpConvert = mondrianXmlBeforeUpConvert.replaceAll("\r", "");

        String expected = StringUtils.deleteWhitespace(mondrianSchema);
        String actual = StringUtils.deleteWhitespace(mondrianXmlBeforeUpConvert);

        // assertTrue(StringUtils.deleteWhitespace(mondrianXmlBeforeUpConvert).equals(StringUtils.deleteWhitespace
        // (mondrianSchema)));
        assertEquals(actual, expected);
        System.out.println("after assert");

    }

    private static String readFileAsString(String filePath) throws java.io.IOException {
        byte[] buffer = new byte[(int) new File(filePath).length()];
        BufferedInputStream f = null;
        try {
            f = new BufferedInputStream(new FileInputStream(filePath));
            f.read(buffer);
        } finally {
            if (f != null) {
                try {
                    f.close();
                } catch (IOException ignored) {
                    // ignore
                }
            }
        }
        return new String(buffer);
    }

    @Test
    public void testFindLogicalColumn() throws Exception {
        generateTestDomain();
        ModelerWorkspaceHelper workspaceHelper = new ModelerWorkspaceHelper("en-US");
        workspaceHelper.autoModelFlat(workspace);
        workspaceHelper.autoModelRelationalFlat(workspace);

        LogicalColumn logicalColumn = workspace.getModel().getMeasures().get(0).getLogicalColumn();
        IPhysicalColumn physicalColumn = logicalColumn.getPhysicalColumn();

        LogicalColumn lCol = workspace.findLogicalColumn(physicalColumn, ModelerPerspective.ANALYSIS);
        assertSame(logicalColumn, lCol);

        lCol = workspace.findLogicalColumn(physicalColumn, ModelerPerspective.REPORTING);
        assertNotNull(lCol);
        assertEquals(physicalColumn, lCol.getPhysicalColumn());
        assertNotSame(logicalColumn, lCol);
    }

}