package org.teiid.eclipselink.platform;
import static org.junit.Assert.*;
import java.io.File;
import java.io.FileInputStream;
import java.net.InetSocketAddress;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import javax.resource.cci.ConnectionFactory;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.teiid.resource.adapter.file.FileManagedConnectionFactory;
import org.teiid.runtime.EmbeddedConfiguration;
import org.teiid.runtime.EmbeddedServer;
import org.teiid.runtime.EmbeddedServer.ConnectionFactoryProvider;
import org.teiid.translator.file.FileExecutionFactory;
import org.teiid.transport.SocketConfiguration;
import org.teiid.transport.WireProtocol;
public class TestTeiidServerQuery {
static EmbeddedServer server;
private static Connection conn;
@BeforeClass
public static void setUp() throws Exception {
SocketConfiguration s = new SocketConfiguration();
InetSocketAddress addr = new InetSocketAddress("localhost", 31000);
s.setBindAddress(addr.getHostName());
s.setPortNumber(addr.getPort());
s.setProtocol(WireProtocol.teiid);
EmbeddedConfiguration config = new EmbeddedConfiguration();
config.addTransport(s);
server = new EmbeddedServer();
FileExecutionFactory executionFactory = new FileExecutionFactory();
server.addTranslator("file", executionFactory);
FileManagedConnectionFactory fileManagedconnectionFactory = new FileManagedConnectionFactory();
fileManagedconnectionFactory.setParentDirectory("src/file");
ConnectionFactory connectionFactory = fileManagedconnectionFactory.createConnectionFactory();
ConnectionFactoryProvider<ConnectionFactory> connectionFactoryProvider = new EmbeddedServer.SimpleConnectionFactoryProvider<ConnectionFactory>(connectionFactory);
server.addConnectionFactoryProvider("java:/marketdata-file", connectionFactoryProvider);
server.start(config);
server.deployVDB(new FileInputStream(new File("src/vdb/marketdata-vdb.xml")));
conn = JDBCUtil.getDriverConnection("org.teiid.jdbc.TeiidDriver", "jdbc:teiid:Marketdata@mm://localhost:31000;version=1", "", "");
}
@Test
public void testConnection(){
assertNotNull(conn);
}
@Test
public void testSchema() {
assertNotNull(server.getSchemaDdl("Marketdata", "Stocks"));
assertNotNull(server.getSchemaDdl("Marketdata", "pg_catalog"));
assertNotNull(server.getSchemaDdl("Marketdata", "SYS"));
assertNotNull(server.getSchemaDdl("Marketdata", "SYSADMIN"));
}
@Test
public void testQuery() throws SQLException {
String query = "SELECT * FROM Marketdata";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData metadata = rs.getMetaData();
assertEquals("symbol", metadata.getColumnName(1));
assertEquals("price", metadata.getColumnName(2));
assertNotNull(rs.next());
JDBCUtil.close(rs, stmt);
query = "SELECT * FROM SYMBOLS";
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
metadata = rs.getMetaData();
assertEquals(1, metadata.getColumnCount());
assertNotNull(rs.next());
JDBCUtil.close(rs, stmt);
query = "SELECT * FROM HelloWorld";
stmt = conn.createStatement();
rs = stmt.executeQuery(query);
assertNotNull(rs.next());
assertEquals("HELLO WORLD", rs.getString(1));
JDBCUtil.close(rs, stmt);
}
/**
* 1. view can be created explicitly via the metadata supplied to Teiid at deploy time
* 2. Teiid DO NOT support create view via JDBC
* 3. Teiid support alter view via JDBC
*/
@Test
public void testDDLAlterView() throws Exception {
assertEquals(10, JDBCUtil.countResults(conn, "SELECT * FROM SYMBOLS"));
JDBCUtil.executeUpdate(conn, "ALTER VIEW SYMBOLS AS SELECT Marketdata.symbol FROM Marketdata WHERE Marketdata.symbol = 'RHT'");
assertEquals(1, JDBCUtil.countResults(conn, "SELECT * FROM SYMBOLS"));
JDBCUtil.executeUpdate(conn, "ALTER VIEW SYMBOLS AS SELECT Marketdata.symbol FROM Marketdata");
assertEquals("HELLO WORLD", JDBCUtil.query(conn, "SELECT * FROM HelloWorld"));
JDBCUtil.executeUpdate(conn, "ALTER VIEW HelloWorld as SELECT 'ABCDEFGH'");
assertEquals("ABCDEFGH", JDBCUtil.query(conn, "SELECT * FROM HelloWorld"));
JDBCUtil.executeUpdate(conn, "ALTER VIEW HelloWorld as SELECT 'HELLO WORLD'");
// JDBCUtil.executeUpdate(conn, "INSERT INTO Marketdata (symbol, price) VALUES('KS', 29.5)");
}
/**
* Local Temporary Tables only support created in runtime via JDBC
*
*/
@Test
public void testDDLTempTables() throws Exception {
assertTrue(JDBCUtil.executeUpdate(conn, "CREATE LOCAL TEMPORARY TABLE TEMP (id SERIAL NOT NULL, name string, PRIMARY KEY (id))"));
for(int i = 0 ; i < 3 ; i ++) {
JDBCUtil.executeUpdate(conn, "INSERT INTO TEMP (name) VALUES ('test-name-" + i + "')");
}
assertTrue(JDBCUtil.executeUpdate(conn, "DELETE FROM TEMP WHERE id = 2"));
assertTrue(JDBCUtil.executeUpdate(conn, "UPDATE TEMP SET name = 'Kylin Soong' WHERE id = 3"));
assertEquals("Kylin Soong", JDBCUtil.query(conn, "SELECT name FROM TEMP WHERE id = 3"));
assertTrue(JDBCUtil.executeUpdate(conn, "DROP TABLE TEMP"));
}
/**
* Global Temporary Tables only support create via the metadata supplied to Teiid at deploy time, cannot be created at runtime.
*
*/
@Test
public void testDDLGlobalTemporaryTables() throws Exception {
// try {
// JDBCUtil.executeUpdate(conn, "INSERT INTO GTEMP (name) VALUES ('Global Temporary Tables ')");
// } catch (Exception e) {
// assertNotNull(e);
// }
}
@Test
public void testDDLForeignTable() throws Exception {
// JDBCUtil.executeUpdate(conn, "CREATE FOREIGN TEMPORARY TABLE Customer (id integer PRIMARY KEY, firstname varchar(25), lastname varchar(25));");
}
@Test
public void testDDLCreateTrigger() {
}
@AfterClass
public static void tearDown() throws Exception {
conn.close();
server.stop();
}
/**
*
*/
}