package com.orientechnologies.orient.jdbc;
import com.orientechnologies.orient.core.OConstants;
import com.orientechnologies.orient.core.metadata.schema.OType;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.*;
public class OrientJdbcDatabaseMetaDataTest extends OrientJdbcBaseTest {
private DatabaseMetaData metaData;
@Before
public void setup() throws SQLException {
metaData = conn.getMetaData();
}
@Test
public void verifyDriverAndDatabaseVersions() throws SQLException {
assertEquals("memory:OrientJdbcDatabaseMetaDataTest", metaData.getURL());
assertEquals("admin", metaData.getUserName());
assertEquals("OrientDB", metaData.getDatabaseProductName());
assertEquals(OConstants.ORIENT_VERSION, metaData.getDatabaseProductVersion());
assertEquals(2, metaData.getDatabaseMajorVersion());
assertEquals(2, metaData.getDatabaseMinorVersion());
assertEquals("OrientDB JDBC Driver", metaData.getDriverName());
assertEquals("OrientDB " + OConstants.getVersion() + " JDBC Driver", metaData.getDriverVersion());
assertEquals(2, metaData.getDriverMajorVersion());
assertEquals(2, metaData.getDriverMinorVersion());
}
@Test
public void shouldRetrievePrimaryKeysMetadata() throws SQLException {
ResultSet primaryKeys = metaData.getPrimaryKeys(null, null, "Item");
assertTrue(primaryKeys.next());
assertEquals("intKey", primaryKeys.getString(4));
assertEquals("Item.intKey", primaryKeys.getString(6));
assertEquals(1, primaryKeys.getInt(5));
assertTrue(primaryKeys.next());
assertEquals("stringKey", primaryKeys.getString("COLUMN_NAME"));
assertEquals("Item.stringKey", primaryKeys.getString("PK_NAME"));
assertEquals(1, primaryKeys.getInt("KEY_SEQ"));
}
@Test
public void shouldRetrieveTableTypes() throws SQLException {
ResultSet tableTypes = metaData.getTableTypes();
assertTrue(tableTypes.next());
assertEquals("TABLE", tableTypes.getString(1));
assertTrue(tableTypes.next());
assertEquals("SYSTEM TABLE", tableTypes.getString(1));
assertFalse(tableTypes.next());
}
@Test
public void shouldRetrieveKeywords() throws SQLException {
final String keywordsStr = metaData.getSQLKeywords();
assertNotNull(keywordsStr);
assertThat(Arrays.asList(keywordsStr.toUpperCase().split(",\\s*"))).contains("TRAVERSE");
}
@Test
public void shouldRetrieveUniqueIndexInfoForTable() throws Exception {
ResultSet indexInfo = metaData
.getIndexInfo("OrientJdbcDatabaseMetaDataTest", "OrientJdbcDatabaseMetaDataTest", "Item", true, false);
indexInfo.next();
assertThat(indexInfo.getString("INDEX_NAME")).isEqualTo("Item.intKey");
assertThat(indexInfo.getBoolean("NON_UNIQUE")).isFalse();
indexInfo.next();
assertThat(indexInfo.getString("INDEX_NAME")).isEqualTo("Item.stringKey");
assertThat(indexInfo.getBoolean("NON_UNIQUE")).isFalse();
}
@Test
@Ignore
public void getFields() throws SQLException {
ResultSet rs = conn.createStatement().executeQuery("select from OUser");
ResultSetMetaData rsMetaData = rs.getMetaData();
int cc = rsMetaData.getColumnCount();
Set<String> colset = new HashSet<String>();
List<Map<String, Object>> columns = new ArrayList<Map<String, Object>>(cc);
for (int i = 1; i <= cc; i++) {
String name = rsMetaData.getColumnLabel(i);
// if (colset.contains(name))
// continue;
colset.add(name);
Map<String, Object> field = new HashMap<String, Object>();
field.put("name", name);
try {
String catalog = rsMetaData.getCatalogName(i);
String schema = rsMetaData.getSchemaName(i);
String table = rsMetaData.getTableName(i);
ResultSet rsmc = conn.getMetaData().getColumns(catalog, schema, table, name);
while (rsmc.next()) {
field.put("description", rsmc.getString("REMARKS"));
break;
}
} catch (SQLException se) {
se.printStackTrace();
}
columns.add(field);
}
for (Map<String, Object> c : columns) {
System.out.println(c);
}
}
@Test
public void shouldFetchAllTables() throws SQLException {
ResultSet rs = metaData.getTables(null, null, null, null);
int tableCount = sizeOf(rs);
assertThat(tableCount).isEqualTo(16);
}
@Test
public void shouldFillSchemaAndCatalogWithDatabaseName() throws SQLException {
ResultSet rs = metaData.getTables(null, null, null, null);
while (rs.next()) {
assertThat(rs.getString("TABLE_SCHEM")).isEqualTo("OrientJdbcDatabaseMetaDataTest");
assertThat(rs.getString("TABLE_CAT")).isEqualTo("OrientJdbcDatabaseMetaDataTest");
}
}
@Test
public void shouldGetAllTablesFilteredByAllTypes() throws SQLException {
ResultSet rs = metaData.getTableTypes();
List<String> tableTypes = new ArrayList<String>(2);
while (rs.next()) {
tableTypes.add(rs.getString(1));
}
rs = metaData.getTables(null, null, null, tableTypes.toArray(new String[2]));
int tableCount = sizeOf(rs);
assertThat(tableCount).isEqualTo(16);
}
@Test
public void getNoTablesFilteredByEmptySetOfTypes() throws SQLException {
final ResultSet rs = metaData.getTables(null, null, null, new String[0]);
int tableCount = sizeOf(rs);
assertThat(tableCount).isEqualTo(0);
}
@Test
public void getSingleTable() throws SQLException {
ResultSet rs = metaData.getTables(null, null, "ouser", null);
rs.next();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
System.out.println(
rs.getMetaData().getColumnName(i));
}
assertThat(rs.getString("TABLE_NAME")).isEqualTo("OUser");
assertThat(rs.getString("TABLE_CAT")).isEqualTo("OrientJdbcDatabaseMetaDataTest");
assertThat(rs.getString("TABLE_SCHEM")).isEqualTo("OrientJdbcDatabaseMetaDataTest");
assertThat(rs.getString("REMARKS")).isNull();
assertThat(rs.getString("REF_GENERATION")).isNull();
assertThat(rs.getString("TYPE_NAME")).isNull();
//
assertThat(rs.next()).isFalse();
}
@Test
public void shouldGetSingleColumnOfArticle() throws SQLException {
ResultSet rs = metaData.getColumns(null, null, "Article", "uuid");
rs.next();
assertThat(rs.getString("TABLE_NAME")).isEqualTo("Article");
assertThat(rs.getString("COLUMN_NAME")).isEqualTo("uuid");
assertThat(rs.getString("TYPE_NAME")).isEqualTo("INTEGER");
assertThat(rs.getInt("DATA_TYPE")).isEqualTo(4);
assertThat(rs.next()).isFalse();
}
@Test
public void shouldGetAllColumnsOfArticle() throws SQLException {
ResultSet rs = metaData.getColumns(null, null, "Article", null);
while (rs.next()) {
assertThat(rs.getString("TABLE_NAME")).isEqualTo("Article");
assertThat(rs.getString("COLUMN_NAME")).isIn("date", "uuid", "author", "title", "content");
assertThat(rs.getInt("DATA_TYPE")).isIn(9, 12, 4, 91, 2000);
assertThat(rs.getString("TYPE_NAME")).isIn("LINK", "DATE", "STRING", "INTEGER");
}
}
@Test
public void shouldGetAllIndexesOnArticle() throws Exception {
ResultSet rs = metaData.getIndexInfo(null, null, "Article", true, true);
rs.next();
assertThat(rs.getString("COLUMN_NAME")).isEqualTo("uuid");
assertThat(rs.getString("INDEX_NAME")).isEqualTo("Article.uuid");
assertThat(rs.getBoolean("NON_UNIQUE")).isFalse();
}
@Test
public void shouldGetPrimaryKeyOfArticle() throws Exception {
ResultSet rs = metaData.getPrimaryKeys(null, null, "Article");
rs.next();
assertThat(rs.getString("TABLE_NAME")).isEqualTo("Article");
assertThat(rs.getString("COLUMN_NAME")).isEqualTo("uuid");
assertThat(rs.getString("PK_NAME")).isEqualTo("Article.uuid");
assertThat(rs.getInt("KEY_SEQ")).isEqualTo(1);
}
private int sizeOf(ResultSet rs) throws SQLException {
int tableCount = 0;
while (rs.next()) {
tableCount++;
}
return tableCount;
}
}