Changeset: 321a9e37d96b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=321a9e37d96b Added Files: java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedJDBCTest.java Modified Files: java/embedded/pom.xml java/embedded/src/main/java/nl/cwi/monetdb/jdbc/MonetDBResultSet.java java/embedded/src/main/java/org/monetdb/embedded/result/EmbeddedQueryResult.java java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java java/pom.xml java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java Branch: embedded-java Log Message:
Initial JDBC result set override Added a unit test as well. Ignore the separte unit test class for now - it will later together with shutdown support. diffs (truncated from 307 to 300 lines): diff --git a/java/embedded/pom.xml b/java/embedded/pom.xml --- a/java/embedded/pom.xml +++ b/java/embedded/pom.xml @@ -38,7 +38,7 @@ MonetDB is an analytical database design <dependency> <groupId>monetdb</groupId> <artifactId>monetdb-jdbc</artifactId> - <version>2.18</version> + <version>2.19</version> </dependency> <dependency> <groupId>junit</groupId> diff --git a/java/embedded/src/main/java/nl/cwi/monetdb/jdbc/MonetDBResultSet.java b/java/embedded/src/main/java/nl/cwi/monetdb/jdbc/MonetDBResultSet.java --- a/java/embedded/src/main/java/nl/cwi/monetdb/jdbc/MonetDBResultSet.java +++ b/java/embedded/src/main/java/nl/cwi/monetdb/jdbc/MonetDBResultSet.java @@ -8,12 +8,38 @@ package nl.cwi.monetdb.jdbc; +import java.io.IOException; +import java.sql.SQLException; + +import org.monetdb.embedded.result.EmbeddedQueryResult; + /** - * This class serves only to expose the {@link nl.cwi.monetdb.jdbc.MonetResultSet} constructor - * outside the {@code nl.cwi.monetdb.jdbc}. + * This class overrides {@link nl.cwi.monetdb.jdbc.MonetResultSet} to allow for handling embedded query results. + * It needs to be in the {@code nl.cwi.monetdb.jdbc} module to access the constructor. */ public class MonetDBResultSet extends MonetResultSet { - public MonetDBResultSet(String[] columnNames, String[] columnTypes, int numberOfRows) { - super(columnNames, columnTypes, numberOfRows); + private final EmbeddedQueryResult resultSet; + + public MonetDBResultSet(EmbeddedQueryResult resultSet) { + super(resultSet.getColumnNames(), resultSet.getColumnTypes(), resultSet.getNumberOfColumns()); + this.resultSet = resultSet; + } + + @Override + public String getString(int columnIndex) throws SQLException { + String ret = resultSet.getColumn(columnIndex).getValue(curRow).toString(); +// String ret = tlp.values[columnIndex - 1]; + lastColumnRead = columnIndex - 1; + return ret; + } + + @Override + public void close() { + try { + resultSet.close(); + } catch (IOException e) { + // can't throw an exception now + } + super.close(); } } diff --git a/java/embedded/src/main/java/org/monetdb/embedded/result/EmbeddedQueryResult.java b/java/embedded/src/main/java/org/monetdb/embedded/result/EmbeddedQueryResult.java --- a/java/embedded/src/main/java/org/monetdb/embedded/result/EmbeddedQueryResult.java +++ b/java/embedded/src/main/java/org/monetdb/embedded/result/EmbeddedQueryResult.java @@ -101,6 +101,24 @@ public class EmbeddedQueryResult impleme } /** + * Get the column names as a string array. + * + * @return The column names array + */ + public String[] getColumnNames() { + return columnNames; + } + + /** + * Get the column types as a string array. + * + * @return The column types array + */ + public String[] getColumnTypes() { + return columnTypes; + } + + /** * A native C function that returns a {@code Column} object. * * @param resultPointerWrapper Pointer to the C-level result structure @@ -109,8 +127,13 @@ public class EmbeddedQueryResult impleme */ private native Column<?> getColumnWrapper(long resultPointerWrapper, int index); + /** + * Get the results set as a JDBC ({@link nl.cwi.monetdb.jdbc.MonetDBResultSet}) results set. + * + * @return The result set + */ public MonetResultSet getJDBCResultSet() { - return new MonetDBResultSet(columnNames, columnTypes, numberOfRows); + return new MonetDBResultSet(this); } @Override diff --git a/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedJDBCTest.java b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedJDBCTest.java new file mode 100644 --- /dev/null +++ b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedJDBCTest.java @@ -0,0 +1,86 @@ +package org.monetdb.embedded.test; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.sql.SQLException; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.monetdb.embedded.MonetDBEmbedded; +import org.monetdb.embedded.result.EmbeddedQueryResult; + +public class EmbeddedJDBCTest { + static File datbaseDirectory; + static MonetDBEmbedded db; + + static Integer[][] testValues = {{Integer.valueOf(0), Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)}, + {Integer.valueOf(10), Integer.valueOf(20), Integer.valueOf(30), null}}; + + static Object[] numbericTypeTestValues = new Object[]{ + Byte.valueOf((byte)12), + Short.valueOf((short)23), + Integer.valueOf(34), + Long.valueOf(45l), + Float.valueOf(5.6f), + Double.valueOf(6.7) + }; + + static Object[] charTypeTestValues = new Object[]{ + "a string" + }; + + static Object[] booleanTypeTestValues = new Object[]{ + Boolean.valueOf(true), + Boolean.valueOf(false) + }; + +// @BeforeClass +// public static void createTestDB() throws IOException, SQLException, InterruptedException { +// final Path directoryPath = Files.createTempDirectory("monetdbtest"); +// datbaseDirectory = directoryPath.toFile(); +// +// db = new MonetDBEmbedded(datbaseDirectory); +// // TimeUnit.SECONDS.sleep(15); +// db.start(); +// +// db.query("CREATE TABLE test (id integer, val integer);"); +// db.query("INSERT INTO test VALUES (" + testValues[0][0] + ", " + testValues[1][0] + "), (" + testValues[0][1] + ", " + testValues[1][1] + +// "), (" + testValues[0][2] + ", " + testValues[1][2] + "), (" + testValues[0][3] + ", " + testValues[1][3] + ");"); +// +// db.query("CREATE TABLE numeric_types_test (fbyte tinyint, fshort smallint, fint integer, flong bigint, freal real, fdouble double);"); +// db.query("INSERT INTO numeric_types_test VALUES (" + numbericTypeTestValues[0] + ", " + numbericTypeTestValues[1] + ", " + numbericTypeTestValues[2] + ", " +// + numbericTypeTestValues[3] + ", " + numbericTypeTestValues[4] + ", " + numbericTypeTestValues[5] + ");"); +// db.query("INSERT INTO numeric_types_test VALUES (null, null, null, null, null, null);"); +// +// db.query("CREATE TABLE char_types_test (fstring string, fvarchar varchar(10));"); +// db.query("INSERT INTO char_types_test VALUES ('" + charTypeTestValues[0] + "', '" + charTypeTestValues[0] + "');"); +// db.query("INSERT INTO char_types_test VALUES (null, null);"); +// +// db.query("CREATE TABLE boolean_types_test (fboolean boolean);"); +// db.query("INSERT INTO boolean_types_test VALUES (" + booleanTypeTestValues[0] + ");"); +// db.query("INSERT INTO boolean_types_test VALUES (" + booleanTypeTestValues[1] + ");"); +// db.query("INSERT INTO boolean_types_test VALUES (null);"); +// } +// +// @Test +// public void simpleTest() throws IOException, SQLException { +// try (EmbeddedQueryResult result = db.query("SELECT * FROM test;")) { +// assertEquals(4, result.getColumn(1).columnSize()); +// assertEquals(Integer.valueOf(10), result.getColumn(1).getValue(0)); +// assertEquals(10, result.getJDBCResultSet().getInt(1)); +// } +// } +// +// @AfterClass +// public static void cleanup() throws SQLException { +// db.query("DROP TABLE test"); +// db.query("DROP TABLE numeric_types_test"); +// db.query("DROP TABLE char_types_test"); +// db.query("DROP TABLE boolean_types_test"); +// } +} diff --git a/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java --- a/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java +++ b/java/embedded/src/test/java/org/monetdb/embedded/test/EmbeddedTest.java @@ -16,10 +16,9 @@ import java.nio.file.Files; import java.nio.file.Path; import java.sql.SQLException; import java.util.Iterator; -import java.util.concurrent.TimeUnit; +import org.junit.AfterClass; import org.junit.BeforeClass; -import org.junit.Ignore; import org.junit.Test; import org.monetdb.embedded.MonetDBEmbedded; import org.monetdb.embedded.result.EmbeddedQueryResult; @@ -56,7 +55,7 @@ public class EmbeddedTest { datbaseDirectory = directoryPath.toFile(); db = new MonetDBEmbedded(datbaseDirectory); -// TimeUnit.SECONDS.sleep(15); + // TimeUnit.SECONDS.sleep(15); db.start(); db.query("CREATE TABLE test (id integer, val integer);"); @@ -191,7 +190,7 @@ public class EmbeddedTest { assertEquals(testValues[1][2], result1.getColumn(1).getValue(0)); assertEquals(testValues[1][3], result1.getColumn(1).getValue(1)); } - + @Test public void twoQueriesWithManualCleanupTest() throws SQLException, IOException { EmbeddedQueryResult result1 = db.query("SELECT * FROM test WHERE id > 1;"); @@ -205,7 +204,7 @@ public class EmbeddedTest { assertEquals(2, result1.getColumn(1).columnSize()); assertEquals(testValues[1][2], result1.getColumn(1).getValue(0)); assertEquals(testValues[1][3], result1.getColumn(1).getValue(1)); - + result1.close(); result2.close(); } @@ -220,7 +219,7 @@ public class EmbeddedTest { result.close(); } - + @Test public void dobuleManualCleanupTest() throws IOException, SQLException { @SuppressWarnings("resource") @@ -232,7 +231,7 @@ public class EmbeddedTest { result.close(); result.close(); } - + @Test public void resultAccessAfterClose() throws IOException, SQLException { @SuppressWarnings("resource") @@ -242,7 +241,7 @@ public class EmbeddedTest { assertEquals(null, result.getColumn(1).getValue(3)); result.close(); - + // The result of any column get should be null assertEquals(null, result.getColumn(1)); } @@ -273,4 +272,21 @@ public class EmbeddedTest { MonetDBEmbedded newDB = new MonetDBEmbedded(newDirectory); newDB.start(); } + + @Test + public void simpleJDBCTest() throws IOException, SQLException { + try (EmbeddedQueryResult result = db.query("SELECT * FROM test;")) { + assertEquals(4, result.getColumn(1).columnSize()); + assertEquals(Integer.valueOf(10), result.getColumn(1).getValue(0)); + assertEquals(10, result.getJDBCResultSet().getInt(1)); + } + } + + @AfterClass + public static void cleanup() throws SQLException { + db.query("DROP TABLE test"); + db.query("DROP TABLE numeric_types_test"); + db.query("DROP TABLE char_types_test"); + db.query("DROP TABLE boolean_types_test"); + } } diff --git a/java/pom.xml b/java/pom.xml --- a/java/pom.xml +++ b/java/pom.xml @@ -6,7 +6,7 @@ <groupId>monetdb</groupId> <artifactId>monetdb-jdbc</artifactId> - <version>2.18</version> + <version>2.19</version> <name>${project.groupId}:${project.artifactId}</name> <description>MonetDB JDBC driver</description> <url>https://www.monetdb.org</url> diff --git a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java --- a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java +++ b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetResultSet.java @@ -70,7 +70,7 @@ import nl.cwi.monetdb.mcl.parser.TupleLi */ _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list