You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2013/07/22 10:10:17 UTC
[04/64] [partial] Hard rename of all 'org/eobjects' folders to
'org/apache'.
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/MysqlQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/MysqlQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/MysqlQueryRewriter.java
deleted file mode 100644
index 88757be..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/MysqlQueryRewriter.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-
-/**
- * Query rewriter for MySQL
- */
-public class MysqlQueryRewriter extends LimitOffsetQueryRewriter implements IQueryRewriter {
-
- public MysqlQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public String escapeQuotes(String filterItemOperand) {
- return filterItemOperand.replaceAll("\\'", "\\\\'");
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
deleted file mode 100644
index d303c50..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/PostgresqlQueryRewriter.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.FromItem;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.schema.ColumnType;
-import org.eobjects.metamodel.schema.Schema;
-import org.eobjects.metamodel.schema.Table;
-
-/**
- * Query rewriter for PostgreSQL
- */
-public class PostgresqlQueryRewriter extends LimitOffsetQueryRewriter implements IQueryRewriter {
-
- public PostgresqlQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public ColumnType getColumnType(int jdbcType, String nativeType, Integer columnSize) {
- if ("bool".equals(nativeType)) {
- // override the normal behaviour of postgresql which maps "bool" to
- // a BIT.
- return ColumnType.BOOLEAN;
- }
- return super.getColumnType(jdbcType, nativeType, columnSize);
- }
-
- @Override
- public String rewriteColumnType(ColumnType columnType) {
- if (columnType == ColumnType.BLOB) {
- return "bytea";
- }
- return super.rewriteColumnType(columnType);
- }
-
- @Override
- protected String rewriteFromItem(Query query, FromItem item) {
- String result = super.rewriteFromItem(query, item);
- Table table = item.getTable();
- if (table != null) {
- Schema schema = table.getSchema();
- if (schema != null) {
- String schemaName = schema.getName();
- if (schemaName != null) {
- result = result.replaceFirst(schemaName, '\"' + schema.getName() + '\"');
- }
- }
- }
- return result;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/SQLServerQueryRewriter.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
deleted file mode 100644
index 732ec34..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.eobjects.metamodel.jdbc.dialects;
-
-import org.eobjects.metamodel.jdbc.JdbcDataContext;
-import org.eobjects.metamodel.query.Query;
-import org.eobjects.metamodel.query.SelectClause;
-
-public class SQLServerQueryRewriter extends DefaultQueryRewriter {
-
- public SQLServerQueryRewriter(JdbcDataContext dataContext) {
- super(dataContext);
- }
-
- @Override
- public boolean isMaxRowsSupported() {
- return true;
- }
-
- /**
- * SQL server expects the fully qualified column name, including schema, in
- * select items.
- */
- @Override
- public boolean isSchemaIncludedInColumnPaths() {
- return true;
- }
-
- @Override
- protected String rewriteSelectClause(Query query, SelectClause selectClause) {
- String result = super.rewriteSelectClause(query, selectClause);
-
- Integer maxRows = query.getMaxRows();
- if (maxRows != null) {
- result = "SELECT TOP " + maxRows + " " + result.substring(7);
- }
-
- return result;
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/package-info.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/package-info.java b/jdbc/src/main/java/org/eobjects/metamodel/jdbc/package-info.java
deleted file mode 100644
index b7a311b..0000000
--- a/jdbc/src/main/java/org/eobjects/metamodel/jdbc/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-/**
- * Module package for JDBC compliant databases
- */
-package org.eobjects.metamodel.jdbc;
-
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/test/integrationtests/org/apache/metamodel/DB2Test.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/integrationtests/org/apache/metamodel/DB2Test.java b/jdbc/src/test/integrationtests/org/apache/metamodel/DB2Test.java
new file mode 100644
index 0000000..13cc501
--- /dev/null
+++ b/jdbc/src/test/integrationtests/org/apache/metamodel/DB2Test.java
@@ -0,0 +1,107 @@
+package org.eobjects.metamodel;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.Arrays;
+
+import junit.framework.TestCase;
+
+import org.eobjects.metamodel.data.DataSet;
+import org.eobjects.metamodel.jdbc.JdbcDataContext;
+import org.eobjects.metamodel.jdbc.JdbcTestTemplates;
+import org.eobjects.metamodel.query.Query;
+import org.eobjects.metamodel.schema.Schema;
+import org.eobjects.metamodel.schema.Table;
+
+/**
+ * DB2 integration test. This is a read-only integration test, meant to be
+ * modified for whatever server is available (even within Human Inference).
+ */
+public class DB2Test extends TestCase {
+
+ private static final String URL = "jdbc:db2://TODO:50000/TODO";
+
+ private static final String USERNAME = "TODO";
+ private static final String PASSWORD = "TODO";
+ private Connection _connection;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Class.forName("com.ibm.db2.jcc.DB2Driver");
+ _connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ _connection.close();
+ }
+
+
+ public void testInterpretationOfNull() throws Exception {
+ JdbcTestTemplates.interpretationOfNulls(_connection);
+ }
+
+ public void testDefaultSchema() throws Exception {
+ JdbcDataContext dc = new JdbcDataContext(_connection);
+ Schema schema = dc.getDefaultSchema();
+ assertEquals(USERNAME.toUpperCase(), schema.getName());
+
+ Table countryTable = schema.getTableByName("COUNTRY");
+ assertNotNull(countryTable);
+
+ DataSet ds = dc.query().from(countryTable).selectCount().execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[1008]]", ds.getRow().toString());
+ assertFalse(ds.next());
+ ds.close();
+ }
+
+ public void testMaxRowsOnly() throws Exception {
+ JdbcDataContext dc = new JdbcDataContext(_connection);
+ Schema schema = dc.getDefaultSchema();
+ String[] tableNames = schema.getTableNames();
+ System.out.println("Tables: " + Arrays.toString(tableNames));
+
+ Table countryTable = schema.getTableByName("COUNTRY");
+ assertNotNull(countryTable);
+
+ Query query = dc.query().from(countryTable).select("COUNTRYCODE").limit(200).toQuery();
+ assertEquals("SELECT DB2INST1.\"COUNTRY\".\"COUNTRYCODE\" FROM DB2INST1.\"COUNTRY\" "
+ + "FETCH FIRST 200 ROWS ONLY", dc.getQueryRewriter().rewriteQuery(query));
+
+ DataSet ds = dc.executeQuery(query);
+ for (int i = 0; i < 200; i++) {
+ assertTrue(ds.next());
+ assertEquals(1, ds.getRow().getValues().length);
+ }
+ assertFalse(ds.next());
+ ds.close();
+ }
+
+ public void testMaxRowsAndOffset() throws Exception {
+ JdbcDataContext dc = new JdbcDataContext(_connection);
+ Schema schema = dc.getDefaultSchema();
+ String[] tableNames = schema.getTableNames();
+ System.out.println("Tables: " + Arrays.toString(tableNames));
+
+ Table countryTable = schema.getTableByName("COUNTRY");
+ assertNotNull(countryTable);
+
+ Query query = dc.query().from(countryTable).select("COUNTRYCODE").limit(200).offset(200).toQuery();
+ assertEquals(
+ "SELECT metamodel_subquery.\"COUNTRYCODE\" FROM ("
+ + "SELECT DB2INST1.\"COUNTRY\".\"COUNTRYCODE\", ROW_NUMBER() OVER() AS metamodel_row_number FROM DB2INST1.\"COUNTRY\""
+ + ") metamodel_subquery WHERE metamodel_row_number BETWEEN 201 AND 400", dc.getQueryRewriter()
+ .rewriteQuery(query));
+
+ DataSet ds = dc.executeQuery(query);
+ for (int i = 0; i < 200; i++) {
+ assertTrue(ds.next());
+ assertEquals(1, ds.getRow().getValues().length);
+ }
+ assertFalse(ds.next());
+ ds.close();
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/test/integrationtests/org/apache/metamodel/FirebirdTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/integrationtests/org/apache/metamodel/FirebirdTest.java b/jdbc/src/test/integrationtests/org/apache/metamodel/FirebirdTest.java
new file mode 100644
index 0000000..ec1ba32
--- /dev/null
+++ b/jdbc/src/test/integrationtests/org/apache/metamodel/FirebirdTest.java
@@ -0,0 +1,115 @@
+package org.eobjects.metamodel;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+
+import javax.swing.table.TableModel;
+
+import junit.framework.TestCase;
+
+import org.eobjects.metamodel.data.DataSet;
+import org.eobjects.metamodel.data.DataSetTableModel;
+import org.eobjects.metamodel.jdbc.JdbcDataContext;
+import org.eobjects.metamodel.query.FromItem;
+import org.eobjects.metamodel.query.JoinType;
+import org.eobjects.metamodel.query.Query;
+import org.eobjects.metamodel.query.SelectItem;
+import org.eobjects.metamodel.schema.Schema;
+import org.eobjects.metamodel.schema.Table;
+
+/**
+ * Integrationtests for Firebird SQL.
+ *
+ * This test uses the "employee" sampledata shipped with Firebird. The JDBC
+ * driver ("jaybird") is not available in the Maven repository so you will have
+ * to download and attach it to the eclipse project yourself.
+ *
+ * @see http://www.firebirdsql.org/manual/qsg10-connecting.html
+ * @see http://www.firebirdsql.org/index.php?op=files&id=jaybird
+ */
+public class FirebirdTest extends TestCase {
+
+ private static final String CONNECTION_STRING = "jdbc:firebirdsql:127.0.0.1:employee.fdb";
+ private static final String USERNAME = "SYSDBA";
+ private static final String PASSWORD = "eobjects";
+ private Connection _connection;
+ private DataContext _dataContext;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Class.forName("org.firebirdsql.jdbc.FBDriver");
+ _connection = DriverManager.getConnection(CONNECTION_STRING, USERNAME, PASSWORD);
+ _connection.setReadOnly(true);
+ _dataContext = new JdbcDataContext(_connection);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ _connection.close();
+ }
+
+ public void testGetSchemas() throws Exception {
+ Schema[] schemas = _dataContext.getSchemas();
+ assertEquals(1, schemas.length);
+ Schema schema = _dataContext.getDefaultSchema();
+ assertEquals("{JdbcTable[name=COUNTRY,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=CUSTOMER,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=DEPARTMENT,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=EMPLOYEE,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=EMPLOYEE_PROJECT,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=JOB,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=PHONE_LIST,type=VIEW,remarks=<null>],"
+ + "JdbcTable[name=PROJECT,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=PROJ_DEPT_BUDGET,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=SALARY_HISTORY,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=SALES,type=TABLE,remarks=<null>]}", Arrays.toString(schema.getTables()));
+
+ assertEquals(
+ "{Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=CUSTOMER,foreignColumns={COUNTRY}],"
+ + "Relationship[primaryTable=COUNTRY,primaryColumns={COUNTRY},foreignTable=JOB,foreignColumns={JOB_COUNTRY}],"
+ + "Relationship[primaryTable=CUSTOMER,primaryColumns={CUST_NO},foreignTable=SALES,foreignColumns={CUST_NO}],"
+ + "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=DEPARTMENT,foreignColumns={HEAD_DEPT}],"
+ + "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=EMPLOYEE,foreignColumns={DEPT_NO}],"
+ + "Relationship[primaryTable=DEPARTMENT,primaryColumns={DEPT_NO},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={DEPT_NO}],"
+ + "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=DEPARTMENT,foreignColumns={MNGR_NO}],"
+ + "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=EMPLOYEE_PROJECT,foreignColumns={EMP_NO}],"
+ + "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=PROJECT,foreignColumns={TEAM_LEADER}],"
+ + "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALARY_HISTORY,foreignColumns={EMP_NO}],"
+ + "Relationship[primaryTable=EMPLOYEE,primaryColumns={EMP_NO},foreignTable=SALES,foreignColumns={SALES_REP}],"
+ + "Relationship[primaryTable=JOB,primaryColumns={JOB_CODE},foreignTable=EMPLOYEE,foreignColumns={JOB_CODE}],"
+ + "Relationship[primaryTable=JOB,primaryColumns={JOB_GRADE},foreignTable=EMPLOYEE,foreignColumns={JOB_GRADE}],"
+ + "Relationship[primaryTable=JOB,primaryColumns={JOB_COUNTRY},foreignTable=EMPLOYEE,foreignColumns={JOB_COUNTRY}],"
+ + "Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=EMPLOYEE_PROJECT,foreignColumns={PROJ_ID}],"
+ + "Relationship[primaryTable=PROJECT,primaryColumns={PROJ_ID},foreignTable=PROJ_DEPT_BUDGET,foreignColumns={PROJ_ID}]}",
+ Arrays.toString(schema.getRelationships()));
+ }
+
+ public void testExecuteQuery() throws Exception {
+ Schema schema = _dataContext.getDefaultSchema();
+ Table departmentTable = schema.getTableByName("DEPARTMENT");
+ Table employeeTable = schema.getTableByName("EMPLOYEE");
+ Query q = new Query().from(new FromItem(JoinType.INNER, departmentTable.getRelationships(employeeTable)[0]));
+ q.select(departmentTable.getColumns()[1]);
+ q.select(new SelectItem(employeeTable.getColumns()[4]).setAlias("hire-date"));
+ assertEquals(
+ "SELECT \"DEPARTMENT\".\"DEPARTMENT\", \"EMPLOYEE\".\"HIRE_DATE\" AS hire-date FROM \"EMPLOYEE\" INNER JOIN \"DEPARTMENT\" ON \"EMPLOYEE\".\"EMP_NO\" = \"DEPARTMENT\".\"MNGR_NO\"",
+ q.toString());
+
+ DataSet data = _dataContext.executeQuery(q);
+ assertNotNull(data);
+
+ TableModel tableModel = new DataSetTableModel(data);
+ assertEquals(2, tableModel.getColumnCount());
+ assertEquals(17, tableModel.getRowCount());
+ assertEquals("Quality Assurance", tableModel.getValueAt(4, 0).toString());
+
+ Date date = (Date) tableModel.getValueAt(4, 1);
+ assertEquals("1989-04-17 00:00:00.000000", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS").format(date));
+
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/test/integrationtests/org/apache/metamodel/MysqlTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/integrationtests/org/apache/metamodel/MysqlTest.java b/jdbc/src/test/integrationtests/org/apache/metamodel/MysqlTest.java
new file mode 100644
index 0000000..4bd814d
--- /dev/null
+++ b/jdbc/src/test/integrationtests/org/apache/metamodel/MysqlTest.java
@@ -0,0 +1,334 @@
+package org.eobjects.metamodel;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.table.TableModel;
+
+import junit.framework.TestCase;
+
+import org.eobjects.metamodel.data.DataSet;
+import org.eobjects.metamodel.data.DataSetTableModel;
+import org.eobjects.metamodel.jdbc.JdbcDataContext;
+import org.eobjects.metamodel.jdbc.JdbcTestTemplates;
+import org.eobjects.metamodel.jdbc.QuerySplitter;
+import org.eobjects.metamodel.jdbc.dialects.MysqlQueryRewriter;
+import org.eobjects.metamodel.query.FilterItem;
+import org.eobjects.metamodel.query.FromItem;
+import org.eobjects.metamodel.query.OperatorType;
+import org.eobjects.metamodel.query.Query;
+import org.eobjects.metamodel.schema.Column;
+import org.eobjects.metamodel.schema.ColumnType;
+import org.eobjects.metamodel.schema.Schema;
+import org.eobjects.metamodel.schema.Table;
+import org.eobjects.metamodel.schema.TableType;
+
+/**
+ * Test case that tests mysql interaction. The test requires the "sakila" sample
+ * database that can be found at dev.mysql.com.
+ *
+ * @see http://dev.mysql.com/doc/sakila/en/sakila.html#sakila-installation
+ */
+public class MysqlTest extends TestCase {
+
+ private static final String CONNECTION_STRING = "jdbc:mysql://localhost/sakila?defaultFetchSize=" + Integer.MIN_VALUE;
+ private static final String USERNAME = "eobjects";
+ private static final String PASSWORD = "eobjects";
+ private Connection _connection;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Class.forName("com.mysql.jdbc.Driver");
+ _connection = DriverManager.getConnection(CONNECTION_STRING, USERNAME, PASSWORD);
+ }
+
+ public void testInterpretationOfNull() throws Exception {
+ JdbcTestTemplates.interpretationOfNulls(_connection);
+ }
+
+ public void testDatabaseProductName() throws Exception {
+ String databaseProductName = _connection.getMetaData().getDatabaseProductName();
+ assertEquals(JdbcDataContext.DATABASE_PRODUCT_MYSQL, databaseProductName);
+ }
+
+ public void testAutomaticConversionWhenInsertingString() throws Exception {
+ assertNotNull(_connection);
+
+ Statement st = _connection.createStatement();
+ try {
+ // clean up, if nescesary
+ st.execute("DROP TABLE test_table");
+ st.close();
+ } catch (SQLException e) {
+ // do nothing
+ }
+
+ assertFalse(_connection.isReadOnly());
+
+ JdbcDataContext dc = new JdbcDataContext(_connection);
+ final Schema schema = dc.getDefaultSchema();
+ assertEquals("sakila", schema.getName());
+
+ dc.executeUpdate(new UpdateScript() {
+ @Override
+ public void run(UpdateCallback cb) {
+ Table table = cb.createTable(schema, "test_table").withColumn("id").ofType(ColumnType.INTEGER)
+ .asPrimaryKey().withColumn("birthdate").ofType(ColumnType.DATE).execute();
+
+ cb.insertInto(table).value("id", "1").execute();
+ cb.insertInto(table).value("id", 2).value("birthdate", "2011-12-21").execute();
+ }
+ });
+
+ assertTrue(dc.getColumnByQualifiedLabel("test_table.id").isPrimaryKey());
+ assertFalse(dc.getColumnByQualifiedLabel("test_table.birthdate").isPrimaryKey());
+
+ DataSet ds = dc.query().from("test_table").select("id").and("birthdate").execute();
+ assertTrue(ds.next());
+ assertEquals("Row[values=[1, null]]", ds.getRow().toString());
+ assertEquals("java.lang.Integer", ds.getRow().getValue(0).getClass().getName());
+ assertTrue(ds.next());
+ assertEquals("Row[values=[2, 2011-12-21]]", ds.getRow().toString());
+ assertEquals("java.sql.Date", ds.getRow().getValue(1).getClass().getName());
+ assertFalse(ds.next());
+ ds.close();
+
+ dc.executeUpdate(new UpdateScript() {
+ @Override
+ public void run(UpdateCallback callback) {
+ callback.dropTable("test_table").execute();
+ }
+ });
+ }
+
+ public void testCharOfSizeOne() throws Exception {
+ JdbcTestTemplates.meaningOfOneSizeChar(_connection);
+ }
+
+ public void testAlternativeConnectionString() throws Exception {
+ _connection = DriverManager.getConnection("jdbc:mysql://localhost", USERNAME, PASSWORD);
+ DataContext dc = new JdbcDataContext(_connection, TableType.DEFAULT_TABLE_TYPES, "sakila");
+ Schema[] schemas = dc.getSchemas();
+ assertEquals("[Schema[name=mysql], Schema[name=performance_schema], Schema[name=portal], "
+ + "Schema[name=sakila], Schema[name=world]]", Arrays.toString(schemas));
+
+ Table table = dc.getSchemaByName("sakila").getTableByName("film");
+ Query q = new Query().from(table).select(table.getColumns());
+ DataSet data = dc.executeQuery(q);
+ TableModel tableModel = new DataSetTableModel(data);
+ assertEquals(13, tableModel.getColumnCount());
+ assertEquals(1000, tableModel.getRowCount());
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ _connection.close();
+ }
+
+ public void testGetCatalogNames() throws Exception {
+ JdbcDataContext strategy = new JdbcDataContext(_connection);
+ assertTrue(strategy.getQueryRewriter() instanceof MysqlQueryRewriter);
+ String[] catalogNames = strategy.getCatalogNames();
+ assertEquals("[information_schema, mysql, performance_schema, portal, sakila, world]",
+ Arrays.toString(catalogNames));
+ }
+
+ public void testGetDefaultSchema() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection);
+ Schema schema = dc.getDefaultSchema();
+ assertEquals("sakila", schema.getName());
+ }
+
+ public void testExecuteQuery() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection);
+ Schema schema = dc.getDefaultSchema();
+ Table actorTable = schema.getTableByName("actor");
+ assertEquals(
+ "[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=first_name,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_name,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=45], Column[name=last_update,columnNumber=3,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+ Arrays.toString(actorTable.getColumns()));
+ Table filmTable = schema.getTableByName("film");
+ assertEquals(
+ "[Column[name=film_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=title,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=255], Column[name=description,columnNumber=2,type=LONGVARCHAR,nullable=true,nativeType=TEXT,columnSize=65535], Column[name=release_year,columnNumber=3,type=DATE,nullable=true,nativeType=YEAR,columnSize=0], Column[name=language_id,columnNumber=4,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=original_language_id,columnNumber=5,type=TINYINT,nullable=true,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_duration,columnNumber=6,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], Column[name=rental_rate,columnNumber=7,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=4], Column[name=length,columnNumber=8,type=SMALLINT,nullable=true,nativeType=SMALLINT UNSIGNED,columnSize=5], Column[name=replacement_cost,columnNu
mber=9,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=5], Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+ Arrays.toString(filmTable.getColumns()));
+ Table filmActorJoinTable = schema.getTableByName("film_actor");
+ assertEquals(
+ "[Column[name=actor_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+ + "Column[name=film_id,columnNumber=1,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+ + "Column[name=last_update,columnNumber=2,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+ Arrays.toString(filmActorJoinTable.getColumns()));
+
+ Query q = new Query();
+ q.from(new FromItem(actorTable).setAlias("a"));
+ q.select(actorTable.getColumns());
+ q.getSelectClause().getItem(0).setAlias("foo-bar");
+ assertEquals(
+ "SELECT a.`actor_id` AS foo-bar, a.`first_name`, a.`last_name`, a.`last_update` FROM sakila.`actor` a",
+ q.toString());
+ FilterItem f1 = new FilterItem(q.getSelectClause().getItem(0), OperatorType.EQUALS_TO, 5);
+ FilterItem f2 = new FilterItem(q.getSelectClause().getItem(0), OperatorType.EQUALS_TO, 8);
+ q.where(new FilterItem(f1, f2));
+
+ DataSet dataSet = dc.executeQuery(q);
+ TableModel tableModel = new DataSetTableModel(dataSet);
+ assertEquals(4, tableModel.getColumnCount());
+ assertEquals(2, tableModel.getRowCount());
+ assertEquals("LOLLOBRIGIDA", tableModel.getValueAt(0, 2));
+
+ q.setMaxRows(1);
+ dataSet = dc.executeQuery(q);
+ tableModel = new DataSetTableModel(dataSet);
+ assertEquals(4, tableModel.getColumnCount());
+ assertEquals(1, tableModel.getRowCount());
+ assertEquals("LOLLOBRIGIDA", tableModel.getValueAt(0, 2));
+
+ q.setMaxRows(1);
+ q.setFirstRow(2);
+ dataSet = dc.executeQuery(q);
+ tableModel = new DataSetTableModel(dataSet);
+ assertEquals(4, tableModel.getColumnCount());
+ assertEquals(1, tableModel.getRowCount());
+ assertEquals("JOHANSSON", tableModel.getValueAt(0, 2));
+
+ q.getWhereClause().removeItems();
+ q.setMaxRows(25);
+ q.setFirstRow(1);
+ dataSet = dc.executeQuery(q);
+ tableModel = new DataSetTableModel(dataSet);
+ assertEquals(4, tableModel.getColumnCount());
+ assertEquals(25, tableModel.getRowCount());
+ assertEquals("GUINESS", tableModel.getValueAt(0, 2).toString());
+ }
+
+ // Test to query the film table (caused troubles in DataCleaner)
+ public void testFilmQuery() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection);
+ Table table = dc.getDefaultSchema().getTableByName("film");
+ Query q = new Query().select(table.getColumns()).from(table).setMaxRows(400);
+ dc.executeQuery(q);
+ }
+
+ public void testGetSchema() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection);
+ Schema[] schemas = dc.getSchemas();
+ assertEquals(5, schemas.length);
+ Schema schema = dc.getDefaultSchema();
+
+ assertEquals("[Table[name=actor,type=TABLE,remarks=], " + "Table[name=address,type=TABLE,remarks=], "
+ + "Table[name=category,type=TABLE,remarks=], " + "Table[name=city,type=TABLE,remarks=], "
+ + "Table[name=country,type=TABLE,remarks=], " + "Table[name=customer,type=TABLE,remarks=], "
+ + "Table[name=film,type=TABLE,remarks=], " + "Table[name=film_actor,type=TABLE,remarks=], "
+ + "Table[name=film_category,type=TABLE,remarks=], " + "Table[name=film_text,type=TABLE,remarks=], "
+ + "Table[name=inventory,type=TABLE,remarks=], " + "Table[name=language,type=TABLE,remarks=], "
+ + "Table[name=payment,type=TABLE,remarks=], " + "Table[name=rental,type=TABLE,remarks=], "
+ + "Table[name=staff,type=TABLE,remarks=], " + "Table[name=store,type=TABLE,remarks=], "
+ + "Table[name=actor_info,type=VIEW,remarks=], " + "Table[name=customer_list,type=VIEW,remarks=], "
+ + "Table[name=film_list,type=VIEW,remarks=], "
+ + "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
+ + "Table[name=sales_by_film_category,type=VIEW,remarks=], "
+ + "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
+ Arrays.toString(schema.getTables()));
+
+ Table filmTable = schema.getTableByName("film");
+ assertEquals(
+ "[Column[name=film_id,columnNumber=0,type=SMALLINT,nullable=false,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+ + "Column[name=title,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=255], "
+ + "Column[name=description,columnNumber=2,type=LONGVARCHAR,nullable=true,nativeType=TEXT,columnSize=65535], "
+ + "Column[name=release_year,columnNumber=3,type=DATE,nullable=true,nativeType=YEAR,columnSize=0], "
+ + "Column[name=language_id,columnNumber=4,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+ + "Column[name=original_language_id,columnNumber=5,type=TINYINT,nullable=true,nativeType=TINYINT UNSIGNED,columnSize=3], "
+ + "Column[name=rental_duration,columnNumber=6,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+ + "Column[name=rental_rate,columnNumber=7,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=4], "
+ + "Column[name=length,columnNumber=8,type=SMALLINT,nullable=true,nativeType=SMALLINT UNSIGNED,columnSize=5], "
+ + "Column[name=replacement_cost,columnNumber=9,type=DECIMAL,nullable=false,nativeType=DECIMAL,columnSize=5], "
+ + "Column[name=rating,columnNumber=10,type=CHAR,nullable=true,nativeType=ENUM,columnSize=5], "
+ + "Column[name=special_features,columnNumber=11,type=CHAR,nullable=true,nativeType=SET,columnSize=54], "
+ + "Column[name=last_update,columnNumber=12,type=TIMESTAMP,nullable=false,nativeType=TIMESTAMP,columnSize=19]]",
+ Arrays.toString(filmTable.getColumns()));
+ assertEquals(
+ "[Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[language_id]], Relationship[primaryTable=language,primaryColumns=[language_id],foreignTable=film,foreignColumns=[original_language_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_actor,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=film_category,foreignColumns=[film_id]], Relationship[primaryTable=film,primaryColumns=[film_id],foreignTable=inventory,foreignColumns=[film_id]]]",
+ Arrays.toString(filmTable.getRelationships()));
+
+ dc = new JdbcDataContext(_connection, TableType.DEFAULT_TABLE_TYPES, "sakila");
+ schemas = dc.getSchemas();
+ assertEquals(6, schemas.length);
+ assertEquals("[Table[name=actor,type=TABLE,remarks=], " + "Table[name=address,type=TABLE,remarks=], "
+ + "Table[name=category,type=TABLE,remarks=], " + "Table[name=city,type=TABLE,remarks=], "
+ + "Table[name=country,type=TABLE,remarks=], " + "Table[name=customer,type=TABLE,remarks=], "
+ + "Table[name=film,type=TABLE,remarks=], " + "Table[name=film_actor,type=TABLE,remarks=], "
+ + "Table[name=film_category,type=TABLE,remarks=], " + "Table[name=film_text,type=TABLE,remarks=], "
+ + "Table[name=inventory,type=TABLE,remarks=], " + "Table[name=language,type=TABLE,remarks=], "
+ + "Table[name=payment,type=TABLE,remarks=], " + "Table[name=rental,type=TABLE,remarks=], "
+ + "Table[name=staff,type=TABLE,remarks=], " + "Table[name=store,type=TABLE,remarks=], "
+ + "Table[name=actor_info,type=VIEW,remarks=], " + "Table[name=customer_list,type=VIEW,remarks=], "
+ + "Table[name=film_list,type=VIEW,remarks=], "
+ + "Table[name=nicer_but_slower_film_list,type=VIEW,remarks=], "
+ + "Table[name=sales_by_film_category,type=VIEW,remarks=], "
+ + "Table[name=sales_by_store,type=VIEW,remarks=], " + "Table[name=staff_list,type=VIEW,remarks=]]",
+ Arrays.toString(schema.getTables()));
+
+ Table staffView = schema.getTableByName("staff_list");
+ assertEquals(
+ "[Column[name=ID,columnNumber=0,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3], "
+ + "Column[name=name,columnNumber=1,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=91], "
+ + "Column[name=address,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ + "Column[name=zip code,columnNumber=3,type=VARCHAR,nullable=true,nativeType=VARCHAR,columnSize=10], "
+ + "Column[name=phone,columnNumber=4,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=20], "
+ + "Column[name=city,columnNumber=5,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ + "Column[name=country,columnNumber=6,type=VARCHAR,nullable=false,nativeType=VARCHAR,columnSize=50], "
+ + "Column[name=SID,columnNumber=7,type=TINYINT,nullable=false,nativeType=TINYINT UNSIGNED,columnSize=3]]",
+ Arrays.toString(staffView.getColumns()));
+ }
+
+ public void testSplitQuery() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection, TableType.DEFAULT_TABLE_TYPES, "sakila");
+ Schema schema = dc.getSchemaByName("sakila");
+ Table staffListTable = schema.getTableByName("staff_list");
+ assertNotNull(staffListTable);
+ Table paymentTable = schema.getTableByName("payment");
+ assertNotNull(paymentTable);
+ Column countryColumn = staffListTable.getColumnByName("country");
+ assertNotNull(countryColumn);
+ Column paymentColumn = paymentTable.getColumns()[0];
+ assertNotNull(paymentColumn);
+ Query q = new Query().from(staffListTable, "sl").from(paymentTable, "e").select(countryColumn, paymentColumn);
+ assertEquals("SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e",
+ q.toString());
+
+ QuerySplitter qs = new QuerySplitter(dc, q);
+ assertEquals(32098, qs.getRowCount());
+ List<Query> splitQueries = qs.setMaxRows(8000).splitQuery();
+ assertEquals(7, splitQueries.size());
+ assertEquals(
+ "[SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` < 4013 OR e.`rental_id` IS NULL) AND (e.`customer_id` < 300 OR e.`customer_id` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` < 4013 OR e.`rental_id` IS NULL) AND (e.`customer_id` > 300 OR e.`customer_id` = 300), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 4013 OR e.`rental_id` = 4013) AND (e.`rental_id` < 8025 OR e.`rental_id` = 4013) AND (e.`payment_id` < 8025 OR e.`payment_id` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 4013 OR e.`rental_id` = 4013) AND (e.`rental_id` < 8025 OR e.`rental_id` = 4013) AND (e.`payment_id` > 8025 OR e.`payment_id` = 8025), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 8025 OR e.`re
ntal_id` = 8025) AND (e.`rental_id` < 12037 OR e.`rental_id` = 8025) AND (e.`amount` < 6 OR e.`amount` IS NULL), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 8025 OR e.`rental_id` = 8025) AND (e.`rental_id` < 12037 OR e.`rental_id` = 8025) AND (e.`amount` > 6 OR e.`amount` = 6), SELECT sl.`country`, e.`payment_id` FROM sakila.`staff_list` sl, sakila.`payment` e WHERE (e.`rental_id` > 12037 OR e.`rental_id` = 12037)]",
+ Arrays.toString(splitQueries.toArray()));
+
+ DataSet data = qs.executeQueries();
+ int count = 0;
+ while (data.next()) {
+ count++;
+ }
+ data.close();
+ assertEquals(32098, count);
+ }
+
+ public void testQueryWithSingleQuote() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection, TableType.DEFAULT_TABLE_TYPES, "sakila");
+ Query q = dc.query().from("category").selectCount().where("name").eq("kasper's horror movies").toQuery();
+ DataSet ds = dc.executeQuery(q);
+ assertTrue(ds.next());
+ assertEquals(0, ((Number) ds.getRow().getValue(0)).intValue());
+ assertFalse(ds.next());
+ }
+
+ public void testWhiteSpaceColumns() throws Exception {
+ DatabaseMetaData metaData = _connection.getMetaData();
+ assertEquals("`", metaData.getIdentifierQuoteString());
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/e2e2b37a/jdbc/src/test/integrationtests/org/apache/metamodel/OracleTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/integrationtests/org/apache/metamodel/OracleTest.java b/jdbc/src/test/integrationtests/org/apache/metamodel/OracleTest.java
new file mode 100644
index 0000000..4717873
--- /dev/null
+++ b/jdbc/src/test/integrationtests/org/apache/metamodel/OracleTest.java
@@ -0,0 +1,222 @@
+package org.eobjects.metamodel;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.util.Arrays;
+
+import javax.swing.table.TableModel;
+
+import junit.framework.TestCase;
+
+import org.eobjects.metamodel.data.DataSet;
+import org.eobjects.metamodel.data.DataSetTableModel;
+import org.eobjects.metamodel.jdbc.JdbcDataContext;
+import org.eobjects.metamodel.query.FromItem;
+import org.eobjects.metamodel.query.JoinType;
+import org.eobjects.metamodel.query.Query;
+import org.eobjects.metamodel.schema.Relationship;
+import org.eobjects.metamodel.schema.Schema;
+import org.eobjects.metamodel.schema.Table;
+import org.eobjects.metamodel.schema.TableType;
+
+/**
+ * Test case that tests oracle interaction. An express edition of the oracle
+ * database can be used to run these tests.
+ *
+ * The test requires the "human resources" schema that is provided ass a sample
+ * schema for Oracle default installations.
+ *
+ * The script for installing it can be found in:
+ *
+ * <pre>
+ * $ORACLE_HOME / demo / schema / human_resources / hr_main.sql
+ * </pre>
+ *
+ * Install with something like:
+ *
+ * <pre>
+ * $ORACLE_HOME/bin/sqlplus -S "/ as sysdba" @hr_main.sql
+ * </pre>
+ *
+ * The JDBC driver is not available in the Maven repository so you will have to
+ * download and attach it to the eclipse project yourself.
+ *
+ * @see http://www.oracle.com/technology/products/bi/samples
+ * @see http
+ * ://www.oracle.com/technology/software/products/database/xe/index.html
+ */
+public class OracleTest extends TestCase {
+
+ private static final String CONNECTION_STRING = "jdbc:oracle:thin:@localhost:1521:XE";
+ private static final String USERNAME = "HR";
+ private static final String PASSWORD = "eobjects";
+ private Connection _connection;
+ private DataContext _dataContext;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Class.forName("oracle.jdbc.OracleDriver");
+ _connection = DriverManager.getConnection(CONNECTION_STRING, USERNAME,
+ PASSWORD);
+ _connection.setReadOnly(true);
+ _dataContext = new JdbcDataContext(_connection);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ _connection.close();
+ }
+
+ /**
+ * Ticket #170: getIndexInfo causes SQLException. We test that resultsets
+ * are closed properly.
+ */
+ public void testIndexInfo() throws Exception {
+ Schema schema = new JdbcDataContext(_connection,
+ new TableType[] { TableType.TABLE }, null)
+ .getSchemaByName("SYS");
+ assertEquals(12, schema.getTableCount());
+ }
+
+ public void testGetSchemaNames() throws Exception {
+ DataContext dc = new JdbcDataContext(_connection);
+ String[] schemaNames = dc.getSchemaNames();
+
+ String concatSchemas = Arrays.toString(schemaNames);
+
+ // In order to allow the database to be used for other purposes than
+ // this integration test, we will not make an exact assertion as to
+ // which schema names exist, but just assert that HR and the default
+ // oracle schemas exist.
+ assertTrue(concatSchemas.indexOf("foobar_schema_that_does_not_exist") == -1);
+ assertTrue(concatSchemas.indexOf("HR") != -1);
+ assertTrue(concatSchemas.indexOf("SYSTEM") != -1);
+ assertTrue(concatSchemas.indexOf("XDB") != -1);
+ assertTrue(schemaNames.length > 8);
+
+ Schema schema = dc.getDefaultSchema();
+ assertEquals("HR", schema.getName());
+ }
+
+ /**
+ * Really only tests the JDBC implementation, used to help localize the
+ * cause for Ticket #144
+ */
+ public void testGetImportedKeys() throws Exception {
+ ResultSet rs = _connection.getMetaData().getImportedKeys(null, "HR",
+ "EMPLOYEES");
+ int count = 0;
+ while (rs.next()) {
+ count++;
+ assertEquals("HR", rs.getString(2));
+ String pkTableName = rs.getString(3);
+ String pkColumnName = rs.getString(4);
+ String fkTableName = rs.getString(7);
+ assertEquals("EMPLOYEES", fkTableName);
+ String fkColumnName = rs.getString(8);
+ System.out.println("Found primary key relation: pkTableName="
+ + pkTableName + ",pkColumnName=" + pkColumnName
+ + ",fkTableName=" + fkTableName + ",fkColumnName="
+ + fkColumnName);
+ }
+ rs.close();
+ assertEquals(3, count);
+
+ rs = _connection.getMetaData().getImportedKeys(null, "HR",
+ "DEPARTMENTS");
+ count = 0;
+ while (rs.next()) {
+ count++;
+ assertEquals("HR", rs.getString(2));
+ String pkTableName = rs.getString(3);
+ String pkColumnName = rs.getString(4);
+ String fkTableName = rs.getString(7);
+ assertEquals("DEPARTMENTS", fkTableName);
+ String fkColumnName = rs.getString(8);
+ System.out.println("Found primary key relation: pkTableName="
+ + pkTableName + ",pkColumnName=" + pkColumnName
+ + ",fkTableName=" + fkTableName + ",fkColumnName="
+ + fkColumnName);
+ }
+ rs.close();
+ assertEquals(2, count);
+ }
+
+ public void testGetSchema() throws Exception {
+ Schema schema = _dataContext.getSchemaByName("HR");
+ assertNotNull(schema);
+ assertEquals(
+ "{JdbcTable[name=COUNTRIES,type=TABLE,remarks=<null>],"
+ + "JdbcTable[name=DEPARTMENTS,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=EMPLOYEES,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=JOBS,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=JOB_HISTORY,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=LOCATIONS,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=REGIONS,type=TABLE,remarks=<null>]"
+ + ",JdbcTable[name=EMP_DETAILS_VIEW,type=VIEW,remarks=<null>]}",
+ Arrays.toString(schema.getTables()));
+
+ Relationship[] employeeRelationships = schema.getTableByName(
+ "EMPLOYEES").getRelationships();
+ assertEquals(
+ "{Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}],"
+ + "Relationship[primaryTable=DEPARTMENTS,primaryColumns={DEPARTMENT_ID},foreignTable=EMPLOYEES,foreignColumns={DEPARTMENT_ID}],"
+ + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=EMPLOYEES,foreignColumns={MANAGER_ID}],"
+ + "Relationship[primaryTable=JOBS,primaryColumns={JOB_ID},foreignTable=EMPLOYEES,foreignColumns={JOB_ID}],"
+ + "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=JOB_HISTORY,foreignColumns={EMPLOYEE_ID}]}",
+ Arrays.toString(employeeRelationships));
+
+ assertEquals(
+ "{JdbcColumn[name=EMPLOYEE_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=6],"
+ + "JdbcColumn[name=FIRST_NAME,columnNumber=1,type=VARCHAR,nullable=true,nativeType=VARCHAR2,columnSize=20],"
+ + "JdbcColumn[name=LAST_NAME,columnNumber=2,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=25],"
+ + "JdbcColumn[name=EMAIL,columnNumber=3,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=25],"
+ + "JdbcColumn[name=PHONE_NUMBER,columnNumber=4,type=VARCHAR,nullable=true,nativeType=VARCHAR2,columnSize=20],"
+ + "JdbcColumn[name=HIRE_DATE,columnNumber=5,type=DATE,nullable=false,nativeType=DATE,columnSize=7],"
+ + "JdbcColumn[name=JOB_ID,columnNumber=6,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=10],"
+ + "JdbcColumn[name=SALARY,columnNumber=7,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=8],"
+ + "JdbcColumn[name=COMMISSION_PCT,columnNumber=8,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=2],"
+ + "JdbcColumn[name=MANAGER_ID,columnNumber=9,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
+ + "JdbcColumn[name=DEPARTMENT_ID,columnNumber=10,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
+ Arrays.toString(schema.getTableByName("EMPLOYEES").getColumns()));
+
+ assertEquals(
+ "{JdbcColumn[name=DEPARTMENT_ID,columnNumber=0,type=DECIMAL,nullable=false,nativeType=NUMBER,columnSize=4],"
+ + "JdbcColumn[name=DEPARTMENT_NAME,columnNumber=1,type=VARCHAR,nullable=false,nativeType=VARCHAR2,columnSize=30],"
+ + "JdbcColumn[name=MANAGER_ID,columnNumber=2,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=6],"
+ + "JdbcColumn[name=LOCATION_ID,columnNumber=3,type=DECIMAL,nullable=true,nativeType=NUMBER,columnSize=4]}",
+ Arrays.toString(schema.getTableByName("DEPARTMENTS")
+ .getColumns()));
+ }
+
+ public void testExecuteQuery() throws Exception {
+ Schema schema = _dataContext.getSchemaByName("HR");
+ Table employeeTable = schema.getTableByName("EMPLOYEES");
+ Table departmentsTable = schema.getTableByName("DEPARTMENTS");
+ Relationship relationship = employeeTable
+ .getRelationships(departmentsTable)[0];
+ assertEquals(
+ "Relationship[primaryTable=EMPLOYEES,primaryColumns={EMPLOYEE_ID},foreignTable=DEPARTMENTS,foreignColumns={MANAGER_ID}]",
+ relationship.toString());
+
+ Query q = new Query().from(new FromItem(JoinType.INNER, relationship))
+ .select(employeeTable.getColumnByName("EMAIL"),
+ departmentsTable.getColumnByName("DEPARTMENT_NAME"));
+ q.getSelectClause().getItem(0).setAlias("e-mail");
+
+ assertEquals(
+ "SELECT \"EMPLOYEES\".\"EMAIL\" AS e-mail, \"DEPARTMENTS\".\"DEPARTMENT_NAME\" FROM HR.\"EMPLOYEES\" INNER JOIN HR.\"DEPARTMENTS\" ON \"EMPLOYEES\".\"EMPLOYEE_ID\" = \"DEPARTMENTS\".\"MANAGER_ID\"",
+ q.toString());
+
+ DataSet data = _dataContext.executeQuery(q);
+ assertNotNull(data);
+ TableModel tableModel = new DataSetTableModel(data);
+ assertEquals(2, tableModel.getColumnCount());
+ assertEquals(11, tableModel.getRowCount());
+ assertEquals("JWHALEN", tableModel.getValueAt(0, 0).toString());
+ assertEquals("Administration", tableModel.getValueAt(0, 1).toString());
+ }
+}
\ No newline at end of file