package com.orientechnologies.orient.jdbc; import com.orientechnologies.orient.core.id.ORecordId; import org.junit.Test; import java.math.BigDecimal; import java.sql.*; import java.util.Calendar; import java.util.TimeZone; import static java.sql.Types.BIGINT; import static org.assertj.core.api.Assertions.assertThat; public class OrientJdbcResultSetMetaDataTest extends OrientJdbcBaseTest { @Test public void shouldMapOrientTypesToJavaSQLTypes() throws Exception { ResultSet rs = conn.createStatement().executeQuery("SELECT stringKey, intKey, text, length, date, score FROM Item"); ResultSetMetaData metaData = rs.getMetaData(); assertThat(metaData).isNotNull(); assertThat(metaData.getColumnCount()).isEqualTo(6); assertThat(metaData.getColumnType(1)).isEqualTo(Types.VARCHAR); assertThat(metaData.getColumnClassName(1)).isEqualTo(String.class.getName()); assertThat(metaData.getColumnType(2)).isEqualTo(Types.INTEGER); assertThat(metaData.getColumnType(3)).isEqualTo(Types.VARCHAR); assertThat(rs.getObject(3)).isInstanceOf(String.class); assertThat(metaData.getColumnType(4)).isEqualTo(BIGINT); assertThat(metaData.getColumnType(5)).isEqualTo(Types.TIMESTAMP); assertThat(metaData.getColumnType(6)).isEqualTo(Types.DECIMAL); } @Test public void shouldMapReturnTypes() throws Exception { assertThat(conn.isClosed()).isFalse(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT stringKey, intKey, text, length, date, score FROM Item"); assertThat(rs.getString(1)).isEqualTo("1"); assertThat(rs.getString("stringKey")).isEqualTo("1"); assertThat(rs.findColumn("stringKey")).isEqualTo(1); assertThat(rs.getInt(2)).isEqualTo(1); assertThat(rs.getInt("intKey")).isEqualTo(1); assertThat(rs.getString("text")).hasSize(rs.getInt("length")); Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")); cal.add(Calendar.HOUR_OF_DAY, -1); Date date = new Date(cal.getTimeInMillis()); assertThat(rs.getDate("date").toString()).isEqualTo(date.toString()); assertThat(rs.getDate(5).toString()).isEqualTo(date.toString()); //DECIMAL assertThat(rs.getBigDecimal("score")).isEqualTo(BigDecimal.valueOf(959)); } @Test public void shouldMapRatingToDouble() throws Exception { ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Author limit 10"); int size = 0; while (rs.next()) { assertThat(rs.getDouble("rating")).isNotNull().isInstanceOf(Double.class); size++; } assertThat(size).isEqualTo(10); } @Test public void shouldConvertUUIDToDouble() throws Exception { ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM Author limit 10"); int count = 0; while (rs.next()) { assertThat(rs.getDouble("uuid")).isNotNull().isInstanceOf(Double.class); count++; } assertThat(count).isEqualTo(10); } @Test public void shouldNavigateResultSetByMetadata() throws Exception { assertThat(conn.isClosed()).isFalse(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT @rid, @class, stringKey, intKey, text, length, date FROM Item"); rs.next(); ResultSetMetaData metaData = rs.getMetaData(); assertThat(metaData.getColumnCount()).isEqualTo(7); assertThat(metaData.getColumnName(1)).isEqualTo("@rid"); assertThat(new ORecordId(rs.getString(1)).isPersistent()).isEqualTo(true); assertThat(rs.getObject(1)).isInstanceOf(String.class); assertThat(metaData.getColumnName(2)).isEqualTo("@class"); assertThat(rs.getString(2)).isEqualTo("Item"); assertThat(rs.getObject(2)).isInstanceOf(String.class); assertThat(metaData.getColumnName(3)).isEqualTo("stringKey"); assertThat(rs.getObject(3)).isInstanceOf(String.class); assertThat(metaData.getColumnName(4)).isEqualTo("intKey"); assertThat(metaData.getColumnName(5)).isEqualTo("text"); assertThat(rs.getObject(5)).isInstanceOf(String.class); assertThat(metaData.getColumnName(6)).isEqualTo("length"); assertThat(metaData.getColumnName(7)).isEqualTo("date"); } @Test public void shouldMapMissingFieldsToNull() throws Exception { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( "select uuid, posts.* as post_ from (\n" + " select uuid, out('Writes') as posts from writer unwind posts) order by uuid"); ResultSetMetaData metaData = rs.getMetaData(); while (rs.next()) { if (rs.getMetaData().getColumnCount() == 6) { //record with all attributes assertThat(rs.getTimestamp("post_date")).isNotNull(); assertThat(rs.getTime("post_date")).isNotNull(); assertThat(rs.getDate("post_date")).isNotNull(); } else { //record missing date; only 5 column assertThat(rs.getTimestamp("post_date")).isNull(); assertThat(rs.getTime("post_date")).isNull(); assertThat(rs.getDate("post_date")).isNull(); } } } @Test public void shouldFetchMetadataTheSparkStyle() throws Exception { //set spark "profile" conn.getInfo().setProperty("spark", "true"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from (select * from item) where 1=0"); ResultSetMetaData metaData = rs.getMetaData(); assertThat(metaData.getColumnName(1)).isEqualTo("stringKey"); assertThat(metaData.getColumnTypeName(1)).isEqualTo("STRING"); assertThat(rs.getObject(1)).isInstanceOf(String.class); } @Test public void shouldReadBoolean() throws Exception { Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT isActive, is_active FROM Writer"); while (rs.next()) { assertThat(rs.getBoolean(1)).isTrue(); assertThat(rs.getBoolean(2)).isTrue(); } } }