package com.ca.chorus.server.translator.hints; import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.Random; import javax.naming.NamingException; import javax.naming.Reference; import javax.resource.ResourceException; import javax.resource.cci.ConnectionSpec; import javax.resource.cci.RecordFactory; import javax.resource.cci.ResourceAdapterMetaData; import javax.sql.DataSource; import org.apache.log4j.ConsoleAppender; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.PatternLayout; import org.h2.jdbcx.JdbcDataSource; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.teiid.adminapi.impl.ModelMetaData; import org.teiid.jdbc.BaseDataSource; import org.teiid.jdbc.TeiidDriver; import org.teiid.runtime.EmbeddedConfiguration; import org.teiid.runtime.EmbeddedServer; import org.teiid.translator.ExecutionFactory; import org.teiid.translator.TranslatorException; import org.teiid.translator.jdbc.h2.H2ExecutionFactory; import com.ca.chorus.db.DbExecutor; import com.ca.chorus.server.translator.async.RandomExecutionFactory; import com.google.inject.Provider; public class SysviewHintsExecutionTest { public static int NUM_OBJECTS = 20; // 100 // is // max // supported // in // metadata, // see // src\test\resources\data\metadata-property.txt public static int NUM_POLICIES = 1000; private static Provider teiidDbExecutorProvider; private static EmbeddedServer server; private static final Logger logger = Logger.getLogger(SysviewHintsExecutionTest.class); static { final PatternLayout layout = new PatternLayout(); logger.addAppender(new ConsoleAppender(layout)); } private static EmbeddedServer.ConnectionFactoryProvider jdbcProvider; @BeforeClass public static void oneTimeSetUp() throws Exception { initH2Database(); final EmbeddedConfiguration ec = new EmbeddedConfiguration(); ec.setUserRequestSourceConcurrency(1); ec.setUseDisk(true); server = new EmbeddedServer(); server.start(ec); teiidDbExecutorProvider = new Provider() { @Override public DbExecutor get() { try { return new DbExecutor(server.getDriver() .connect("jdbc:teiid:Chorus", null)); } catch (final SQLException e) { throw new RuntimeException(e); } } }; server.addConnectionFactoryProvider("source-teiid", new EmbeddedServer.ConnectionFactoryProvider() { @Override public DataSource getConnectionFactory() throws TranslatorException { return new MyTeiidDataSource(server); } }); server.addConnectionFactoryProvider("void", new EmbeddedServer.ConnectionFactoryProvider() { @Override public Object getConnectionFactory() throws TranslatorException { return new javax.resource.cci.ConnectionFactory() { @Override public Reference getReference() throws NamingException { // TODO // Auto-generated // method stub return null; } @Override public void setReference(final Reference reference) { // TODO // Auto-generated // method stub } @Override public RecordFactory getRecordFactory() throws ResourceException { // TODO // Auto-generated // method stub return null; } @Override public ResourceAdapterMetaData getMetaData() throws ResourceException { // TODO // Auto-generated // method stub return null; } @Override public javax.resource.cci.Connection getConnection(final ConnectionSpec properties) throws ResourceException { // TODO // Auto-generated // method stub return null; } @Override public javax.resource.cci.Connection getConnection() throws ResourceException { // TODO // Auto-generated // method stub return null; } }; } }); server.addTranslator(new HintsExecutionFactory()); server.addConnectionFactoryProvider("source-jdbc", jdbcProvider); final ExecutionFactory factory = new H2ExecutionFactory(); factory.start(); server.addTranslator(new RandomExecutionFactory()); server.addTranslator(factory); buildDeployVDB(server); } private static void buildDeployVDB(final EmbeddedServer teiidServer) throws Exception { final ModelMetaData hintsModel = new ModelMetaData(); hintsModel.setName("hintsexec"); hintsModel.setSchemaSourceType("native"); hintsModel.addSourceMapping("hintsexec", "hintsexec", ""); final ModelMetaData randomModel = new ModelMetaData(); randomModel.setName("random"); randomModel.setSchemaSourceType("native"); randomModel.addSourceMapping("random", "random", ""); teiidServer.deployVDB("Chorus", hintsModel, randomModel); } private static void initH2Database() throws Exception { final Random random = new Random(); final Path path = FileSystems.getDefault().getPath("target", "db", "stats.h2.db"); Files.deleteIfExists(path); final DataSource h2ds = new JdbcDataSource(); ((JdbcDataSource) h2ds).setURL("jdbc:h2:target/db/stats"); jdbcProvider = new EmbeddedServer.ConnectionFactoryProvider() { @Override public DataSource getConnectionFactory() throws TranslatorException { return h2ds; } }; } @AfterClass public static void oneTimeTearDown() throws Exception { server.stop(); } @Test public void testTeiidHintsDuringUnion() throws Exception { final TeiidDriver td = server.getDriver(); final Connection c = td.connect("jdbc:teiid:Chorus", null); final DbExecutor dbExecutor = new DbExecutor(c); dbExecutor.gatherResults("select * from hintsexec.random_hintsview"); dbExecutor.gatherResults("select * from hintsexec.random_hintsview"); dbExecutor.gatherResults("select * from hintsexec.random_hintsview union select 0"); c.close(); } static class MyTeiidDataSource extends BaseDataSource { private static final long serialVersionUID = -6137366936521510693L; private final EmbeddedServer server; public MyTeiidDataSource(final EmbeddedServer server) { this.server = server; } @Override public Connection getConnection(final String username, final String password) throws SQLException { return this.server.getDriver().connect("jdbc:teiid:Chorus", null); } @Override public java.util.logging.Logger getParentLogger() throws SQLFeatureNotSupportedException { // TODO Auto-generated method stub return null; } } static { System.setProperty("log.cpu.time", Boolean.TRUE.toString()); final Logger logger = Logger.getRootLogger(); logger.addAppender(new ConsoleAppender(new PatternLayout("%-6r [%p] %c - %m%n"))); logger.setLevel(Level.TRACE); } }