package com.orientechnologies.orient.jdbc;
import com.orientechnologies.orient.core.OConstants;
import org.junit.Before;
import org.junit.Test;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
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:test", metaData.getURL());
assertEquals("admin", metaData.getUserName());
assertEquals("OrientDB", metaData.getDatabaseProductName());
assertEquals(OConstants.ORIENT_VERSION, metaData.getDatabaseProductVersion());
assertEquals(2, metaData.getDatabaseMajorVersion());
assertEquals(1, metaData.getDatabaseMinorVersion());
assertEquals("OrientDB JDBC Driver", metaData.getDriverName());
assertEquals("OrientDB 2.1 JDBC Driver", metaData.getDriverVersion());
assertEquals(2, metaData.getDriverMajorVersion());
assertEquals(1, 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*")), hasItem("TRAVERSE"));
}
@Test
public void getFields() throws SQLException {
ResultSet rs = conn.createStatement().executeQuery("select from OUser");
ResultSetMetaData metaData = rs.getMetaData();
int cc = metaData.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 = metaData.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 = metaData.getCatalogName(i);
String schema = metaData.getSchemaName(i);
String table = metaData.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 = this.metaData.getTables(null, null, null, null);
int tableCount = rsSizeOf(rs);
assertThat(tableCount, is(11));
}
private int rsSizeOf(ResultSet rs) throws SQLException {
int tableCount = 0;
while (rs.next()) {
tableCount++;
}
return tableCount;
}
@Test
public void shouldGetAllTablesFilteredByAllTypes() throws SQLException {
ResultSet rs = this.metaData.getTableTypes();
List<String> tableTypes = new ArrayList<String>(2);
while (rs.next()) {
tableTypes.add(rs.getString(1));
}
rs = this.metaData.getTables(null, null, null, tableTypes.toArray(new String[2]));
int tableCount = rsSizeOf(rs);
assertThat(tableCount, is(11));
}
@Test
public void getNoTablesFilteredByEmptySetOfTypes() throws SQLException {
final ResultSet rs = this.metaData.getTables(null, null, null, new String[0]);
int tableCount = rsSizeOf(rs);
assertThat(tableCount,is(0));
}
@Test
public void getSingleTable() throws SQLException {
ResultSet rs = this.metaData.getTables(null, null, "ouser", null);
assertThat(rsSizeOf(rs), is(1));
}
@Test
public void shouldGetSingleColumnOfArticle() throws SQLException {
ResultSet rs = this.metaData.getColumns(null, null, "Article", "uuid");
assertThat(rsSizeOf(rs), is(1));
}
@Test
public void shouldGetAllColumnsOfArticle() throws SQLException {
ResultSet rs = this.metaData.getColumns(null, null, "Article", null);
assertThat(rsSizeOf(rs),is(5));
}
@Test
//FIXME this is not a test: what is the target?
public void shouldGetAllFields() throws SQLException {
ResultSet rsmc = conn.getMetaData().getColumns(null, null, "OUser", null);
Set<String> fieldNames = new HashSet<String>();
while (rsmc.next()) {
fieldNames.add(rsmc.getString("COLUMN_NAME"));
}
fieldNames.removeAll(Arrays.asList("name", "password", "roles", "status"));
}
}