package org.pentaho.test.platform.plugin; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.pentaho.commons.connection.IPentahoResultSet; import org.pentaho.metadata.model.Category; import org.pentaho.metadata.model.Domain; import org.pentaho.metadata.model.LogicalColumn; import org.pentaho.metadata.model.LogicalModel; import org.pentaho.metadata.model.LogicalTable; import org.pentaho.metadata.model.SqlDataSource; import org.pentaho.metadata.model.SqlPhysicalColumn; import org.pentaho.metadata.model.SqlPhysicalModel; import org.pentaho.metadata.model.SqlPhysicalTable; import org.pentaho.metadata.model.SqlDataSource.DataSourceType; import org.pentaho.metadata.model.concept.types.DataType; import org.pentaho.metadata.model.concept.types.LocalizedString; import org.pentaho.metadata.model.concept.types.TargetTableType; import org.pentaho.metadata.repository.IMetadataDomainRepository; import org.pentaho.metadata.repository.InMemoryMetadataDomainRepository; import org.pentaho.platform.api.data.IDatasourceService; import org.pentaho.platform.api.engine.ISolutionEngine; import org.pentaho.platform.api.engine.IPentahoDefinableObjectFactory.Scope; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.connection.datasource.dbcp.JndiDatasourceService; import org.pentaho.platform.engine.services.solution.SolutionEngine; import org.pentaho.platform.plugin.action.pentahometadata.MetadataQueryComponent; import org.pentaho.platform.plugin.services.connections.sql.SQLConnection; import org.pentaho.test.platform.engine.core.MicroPlatform; @SuppressWarnings("nls") public class MetadataQueryComponentTest { private MicroPlatform microPlatform; @Before public void init0() { microPlatform = new MicroPlatform("test-src/solution"); microPlatform.define(ISolutionEngine.class, SolutionEngine.class); microPlatform.define(IMetadataDomainRepository.class, InMemoryMetadataDomainRepository.class, Scope.GLOBAL); microPlatform.define("connection-SQL", SQLConnection.class); // TODO: need to define the IDatasourceService.class microPlatform.define(IDatasourceService.class, JndiDatasourceService.class, Scope.GLOBAL); try { IMetadataDomainRepository repo = PentahoSystem.get(IMetadataDomainRepository.class, null); Domain domain = getBasicDomain(); Domain domain2 = getJdbcDomain(); // System.out.println(new SerializationService().serializeDomain(domain)); Domain domain3 = getJdbcDomain(); domain3.setId("JDBCDOMAIN2"); domain3.getLogicalModels().get(0).setProperty("max_rows", new BigDecimal(10)); Domain domain4 = getBasicDomain(); ((SqlPhysicalModel)domain4.getPhysicalModels().get(0)).getDatasource().setDialectType("MYSQL"); Map<String, String> attributes = new HashMap<String, String>(); attributes.put("QUOTE_ALL_FIELDS", "Y"); ((SqlPhysicalModel)domain4.getPhysicalModels().get(0)).getDatasource().setAttributes(attributes); domain4.setId("MYSQL_DOMAIN"); repo.storeDomain(domain, true); repo.storeDomain(domain2, true); repo.storeDomain(domain3, true); repo.storeDomain(domain4, true); } catch (Exception e) { e.printStackTrace(); } // JNDI System.setProperty("java.naming.factory.initial", "org.osjava.sj.SimpleContextFactory"); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty("org.osjava.sj.root", "test-src/solution/system/simple-jndi"); //$NON-NLS-1$ //$NON-NLS-2$ System.setProperty("org.osjava.sj.delimiter", "/"); //$NON-NLS-1$ //$NON-NLS-2$ } @Test public void testParameters() { String mql = "<mql><domain_id>DOMAIN</domain_id><model_id>MODEL</model_id>" + "<parameters><parameter name=\"param1\" type=\"STRING\" defaultValue=\"A%\"/></parameters>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections>" + "<constraints>" + "<constraint><operator>AND</operator><condition>LIKE([CATEGORY.LC_CUSTOMERNAME];[param:param1])</condition></constraint>" + "</constraints>" + "</mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); component.setQuery(mql); component.execute(); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(16, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } component = new MetadataQueryComponent(); Map<String, Object> inputs = new HashMap<String, Object>(); inputs.put("param1", "B%"); component.setInputs(inputs); component.setQuery(mql); component.execute(); rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(5, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } } @Test public void testComponent() { String mql = "<mql><domain_id>DOMAIN</domain_id><model_id>MODEL</model_id>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections></mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); component.setQuery(mql); component.execute(); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(122, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } } @Test public void testMysqlComponent() { // first, test default behavior of forceDb = false String mql = "<mql><domain_id>MYSQL_DOMAIN</domain_id><model_id>MODEL</model_id>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections></mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); component.setQuery(mql); boolean result = component.execute(); Assert.assertTrue(result); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(122, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { if (rs != null) { rs.close(); rs.closeConnection(); } } // second, test with forceDb = true MetadataQueryComponent component2 = new MetadataQueryComponent(); component2.setQuery(mql); component2.setForceDbDialect(true); result = component2.execute(); Assert.assertFalse(result); Assert.assertNull(component2.getResultSet()); } @Test public void testJdbcComponent() { String mql = "<mql><domain_id>JDBCDOMAIN</domain_id><model_id>MODEL</model_id>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections></mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); component.setQuery(mql); component.execute(); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(122, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } } @Test public void testApplyTemplates() { String mql = "<mql><domain_id>{domain}</domain_id><model_id>MODEL</model_id>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections></mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); Map<String,Object> map = new HashMap<String,Object>(); map.put("domain", "JDBCDOMAIN"); component.setInputs(map); component.setQuery(mql); component.execute(); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(122, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } } @Test public void testJdbcComponentMaxRows() { String mql = "<mql><domain_id>JDBCDOMAIN2</domain_id><model_id>MODEL</model_id>" + "<selections><selection>" + "<view>CATEGORY</view>" + "<column>LC_CUSTOMERNAME</column>" + "</selection>" + "</selections></mql>"; MetadataQueryComponent component = new MetadataQueryComponent(); component.setQuery(mql); component.execute(); IPentahoResultSet rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(10, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } component = new MetadataQueryComponent(); component.setQuery(mql); component.setMaxRows(100); component.execute(); rs = component.getResultSet(); try { Assert.assertNotNull(rs); Assert.assertEquals(1, rs.getColumnCount()); Assert.assertEquals(100, rs.getRowCount()); Object obj[]; while ((obj = rs.next()) != null) { System.out.println(obj[0]); } } finally { rs.close(); rs.closeConnection(); } } public Domain getJdbcDomain() { Domain domain = getBasicDomain(); SqlDataSource dataSource = ((SqlPhysicalModel)domain.getPhysicalModels().get(0)).getDatasource(); dataSource.setType(DataSourceType.NATIVE); dataSource.setDatabaseName("file:test-src/solution/system/data/sampledata"); dataSource.setUsername("pentaho_user"); dataSource.setPort("0"); dataSource.setPassword("password"); domain.setId("JDBCDOMAIN"); return domain; } public Domain getBasicDomain() { SqlPhysicalModel model = new SqlPhysicalModel(); SqlDataSource dataSource = new SqlDataSource(); dataSource.setDatabaseName("SampleData"); dataSource.setDialectType("HYPERSONIC"); dataSource.setType(DataSourceType.JNDI); model.setDatasource(dataSource); SqlPhysicalTable table = new SqlPhysicalTable(model); table.setId("PT1"); model.getPhysicalTables().add(table); table.setTargetTableType(TargetTableType.INLINE_SQL); table.setTargetTable("select distinct customername from customers"); SqlPhysicalColumn column = new SqlPhysicalColumn(table); column.setId("PC1"); column.setTargetColumn("CUSTOMERNAME"); column.setName(new LocalizedString("en_US", "Customer Name")); column.setDescription(new LocalizedString("en_US", "Customer Name Desc")); column.setDataType(DataType.STRING); table.getPhysicalColumns().add(column); LogicalModel logicalModel = new LogicalModel(); logicalModel.setPhysicalModel(model); logicalModel.setId("MODEL"); logicalModel.setName(new LocalizedString("en_US", "My Model")); logicalModel.setDescription(new LocalizedString("en_US", "A Description of the Model")); LogicalTable logicalTable = new LogicalTable(); logicalTable.setId("LT"); logicalTable.setPhysicalTable(table); logicalModel.getLogicalTables().add(logicalTable); LogicalColumn logicalColumn = new LogicalColumn(); logicalColumn.setId("LC_CUSTOMERNAME"); logicalColumn.setPhysicalColumn(column); logicalColumn.setLogicalTable(logicalTable); logicalTable.addLogicalColumn(logicalColumn); Category mainCategory = new Category(); mainCategory.setId("CATEGORY"); mainCategory.setName(new LocalizedString("en_US", "Category")); mainCategory.addLogicalColumn(logicalColumn); logicalModel.getCategories().add(mainCategory); Domain domain = new Domain(); domain.setId("DOMAIN"); domain.addPhysicalModel(model); domain.addLogicalModel(logicalModel); return domain; } // TODO: Write test for inline ETL }