package org.xenei.jdbc4sparql.meta;
import java.util.Arrays;
import java.util.List;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.xenei.jdbc4sparql.config.MemDatasetProducer;
import org.xenei.jdbc4sparql.iface.DatasetProducer;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Literal;
public class MetaCatalogTests {
private DatasetProducer dpProducer;
private final String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "
+ "SELECT ?tbl ?colName WHERE { ?tbl a <http://org.xenei.jdbc4sparql/entity/Table> ;"
+ "<http://www.w3.org/2000/01/rdf-schema#label> '%s' ;"
+ "<http://org.xenei.jdbc4sparql/entity/Table#column> ?list ."
+ "?list rdf:rest*/rdf:first ?column ."
+ "?column <http://www.w3.org/2000/01/rdf-schema#label> ?colName ; "
+ " }";
@Before
public void setup() {
dpProducer = new MemDatasetProducer();
MetaCatalogBuilder.getInstance(dpProducer);
}
@After
public void tearDown() throws Exception {
dpProducer.close();
}
@Test
public void testAttributesTable() {
final String[] names = {
"TYPE_CAT", "TYPE_SCHEM", "TYPE_NAME", "ATTR_NAME",
"DATA_TYPE", "ATTR_TYPE_NAME", "ATTR_SIZE", "DECIMAL_DIGITS",
"NUM_PREC_RADIX", "NULLABLE", "REMARKS", "ATTR_DEF",
"SQL_DATA_TYPE", "SQL_DATETIME_SUB", "CHAR_OCTET_LENGTH",
"ORDINAL_POSITION", "IS_NULLABLE", "SCOPE_CATALOG",
"SCOPE_SCHEMA", "SCOPE_TABLE", "SOURCE_DATA_TYPE"
};
verifyNames(MetaCatalogBuilder.ATTRIBUTES_TABLE, names);
}
@Test
public void testBestRowTable() {
final String[] names = {
"SCOPE", "COLUMN_NAME", "DATA_TYPE", "TYPE_NAME",
"COLUMN_SIZE", "BUFFER_LENGTH", "DECIMAL_DIGITS",
"PSEUDO_COLUMN"
};
verifyNames(MetaCatalogBuilder.BEST_ROW_TABLE, names);
}
@Test
public void testCatalogsTable() {
final String[] names = {
"TABLE_CAT"
};
verifyNames(MetaCatalogBuilder.CATALOGS_TABLE, names);
}
@Test
public void testClientInfoTable() {
final String[] names = {
"NAME", "MAX_LEN", "DEFAULT_VALUE", "DESCRIPTION"
};
verifyNames(MetaCatalogBuilder.CLIENT_INFO_TABLE, names);
}
@Test
public void testColumnPriviligesTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME",
"GRANTOR", "GRANTEE", "PRIVILEGE", "IS_GRANTABLE"
};
verifyNames(MetaCatalogBuilder.COLUMN_PRIVILIGES_TABLE, names);
}
@Test
public void testColumnsTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME",
"DATA_TYPE", "TYPE_NAME", "COLUMN_SIZE", "BUFFER_LENGTH",
"DECIMAL_DIGITS", "NUM_PREC_RADIX", "NULLABLE", "REMARKS",
"COLUMN_DEF", "SQL_DATA_TYPE", "SQL_DATETIME_SUB",
"CHAR_OCTET_LENGTH", "ORDINAL_POSITION", "IS_NULLABLE",
"SCOPE_CATLOG", "SCOPE_SCHEMA", "SCOPE_TABLE",
"SOURCE_DATA_TYPE", "IS_AUTOINCREMENT"
};
verifyNames(MetaCatalogBuilder.COLUMNS_TABLE, names);
}
@Test
public void testExportedKeysTable() {
final String[] names = {
"PKTABLE_CAT", "PKTABLE_SCHEM", "PKTABLE_NAME",
"PKCOLUMN_NAME", "FKTABLE_CAT", "FKTABLE_SCHEM",
"FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ", "UPDATE_RULE",
"DELETE_RULE", "FK_NAME", "PK_NAME", "DEFERRABILITY"
};
verifyNames(MetaCatalogBuilder.EXPORTED_KEYS_TABLE, names);
}
@Test
public void testFunctionColumnsTable() {
final String[] names = {
"FUNCTION_CAT", "FUNCTION_SCHEM", "FUNCTION_NAME",
"COLUMN_NAME", "COLUMN_TYPE", "DATA_TYPE", "TYPE_NAME",
"PRECISION", "LENGTH", "SCALE", "RADIX", "NULLABLE", "REMARKS",
"CHAR_OCTET_LENGTH", "ORDINAL_POSITION", "IS_NULLABLE",
"SPECIFIC_NAME"
};
verifyNames(MetaCatalogBuilder.FUNCTION_COLUMNS_TABLE, names);
}
@Test
public void testFunctionsTable() {
final String[] names = {
"FUNCTION_CAT", "FUNCTION_SCHEM", "FUNCTION_NAME", "REMARKS",
"FUNCTION_TYPE", "SPECIFIC_NAME"
};
verifyNames(MetaCatalogBuilder.FUNCTIONS_TABLE, names);
}
@Test
public void testImportedKeysTable() {
final String[] names = {
"PKTABLE_CAT", "PKTABLE_SCHEM", "PKTABLE_NAME",
"PKCOLUMN_NAME", "FKTABLE_CAT", "FKTABLE_SCHEM",
"FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ", "UPDATE_RULE",
"DELETE_RULE", "FK_NAME", "PK_NAME", "DEFERRABILITY"
};
verifyNames(MetaCatalogBuilder.IMPORTED_KEYS_TABLE, names);
}
@Test
public void testIndexInfoTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "NON_UNIQUE",
"INDEX_QUALIFIER", "INDEX_NAME", "TYPE", "ORDINAL_POSITION",
"COLUMN_NAME", "ASC_OR_DESC", "CARDINALITY", "PAGES",
"FILTER_CONDITION"
};
verifyNames(MetaCatalogBuilder.INDEXINFO_TABLE, names);
}
@Test
public void testPrimaryKeyTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME",
"KEY_SEQ", "PK_NAME"
};
verifyNames(MetaCatalogBuilder.PRIMARY_KEY_TABLE, names);
}
@Test
public void testProcedureColumnsTable() {
final String[] names = {
"PROCEDURE_CAT", "PROCEDURE_SCHEM", "PROCEDURE_NAME",
"COLUMN_NAME", "COLUMN_TYPE", "DATA_TYPE", "TYPE_NAME",
"PRECISION", "LENGTH", "SCALE", "RADIX", "NULLABLE", "REMARKS",
"COLUMN_DEF", "SQL_DATA_TYPE", "SQL_DATETIME_SUB",
"CHAR_OCTET_LENGTH", "ORDINAL_POSITION", "IS_NULLABLE",
"SPECIFIC_NAME"
};
verifyNames(MetaCatalogBuilder.PROCEDURE_COLUMNS_TABLE, names);
}
@Test
public void testProceduresTable() {
final String[] names = {
"PROCEDURE_CAT", "PROCEDURE_SCHEM", "PROCEDURE_NAME",
"FUTURE1", "FUTURE2", "FUTURE3", "REMARKS", "PROCEDURE_TYPE",
"SPECIFIC_NAME"
};
verifyNames(MetaCatalogBuilder.PROCEDURES_TABLE, names);
}
@Test
public void testSchemasTable() {
final String[] names = {
"TABLE_SCHEM", "TABLE_CATALOG"
};
verifyNames(MetaCatalogBuilder.SCHEMAS_TABLE, names);
}
@Test
public void testSuperTablesTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "SUPERTABLE_NAME"
};
verifyNames(MetaCatalogBuilder.SUPER_TABLES_TABLE, names);
}
@Test
public void testSuperTypesTable() {
final String[] names = {
"TYPE_CAT", "TYPE_SCHEM", "TYPE_NAME", "SUPERTYPE_CAT",
"SUPERTYPE_SCHEM", "SUPERTYPE_NAME"
};
verifyNames(MetaCatalogBuilder.SUPER_TYPES_TABLE, names);
}
@Test
public void testTablePrivilegesTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "GRANTOR", "GRANTEE",
"PRIVILEGE", "IS_GRANTABLE"
};
verifyNames(MetaCatalogBuilder.TABLE_PRIVILEGES_TABLE, names);
}
@Test
public void testTablesTable() {
final String[] names = {
"TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "TABLE_TYPE",
"REMARKS", "TYPE_CAT", "TYPE_SCHEM", "TYPE_NAME",
"SELF_REFERENCING_COL_NAME", "REF_GENERATION"
};
verifyNames(MetaCatalogBuilder.TABLES_TABLE, names);
}
@Test
public void testTableTypesTable() {
final String[] names = {
"TABLE_TYPE"
};
verifyNames(MetaCatalogBuilder.TABLE_TYPES_TABLE, names);
}
@Test
public void testTypeInfoTableTable() {
final String[] names = {
"TYPE_NAME", "DATA_TYPE", "PRECISION", "LITERAL_PREFIX",
"LITERAL_SUFFIX", "CREATE_PARAMS", "NULLABLE",
"CASE_SENSITIVE", "SEARCHABLE", "UNSIGNED_ATTRIBUTE",
"FIXED_PREC_SCALE", "AUTO_INCREMENT", "LOCAL_TYPE_NAME",
"MINIMUM_SCALE", "MAXIMUM_SCALE", "SQL_DATA_TYPE",
"SQL_DATETIME_SUB", "NUM_PREC_RADIX"
};
verifyNames(MetaCatalogBuilder.TYPEINFO_TABLE, names);
}
@Test
public void testUDTTable() {
final String[] names = {
"TYPE_CAT", "TYPE_SCHEM", "TYPE_NAME", "CLASS_NAME",
"DATA_TYPE", "REMARKS", "BASE_TYPE"
};
verifyNames(MetaCatalogBuilder.UDT_TABLES, names);
}
@Test
public void testVersionColumnsTable() {
final String[] names = {
"SCOPE", "COLUMN_NAME", "DATA_TYPE", "TYPE_NAME",
"COLUMN_SIZE", "BUFFER_LENGTH", "DECIMAL_DIGITS",
"PSEUDO_COLUMN"
};
verifyNames(MetaCatalogBuilder.VERSION_COLUMNS_TABLE, names);
}
@Test
public void testXrefTable() {
final String[] names = {
"PKTABLE_CAT", "PKTABLE_SCHEM", "PKTABLE_NAME",
"PKCOLUMN_NAME", "FKTABLE_CAT", "FKTABLE_SCHEM",
"FKTABLE_NAME", "FKCOLUMN_NAME", "KEY_SEQ", "UPDATE_RULE",
"DELETE_RULE", "FK_NAME", "PK_NAME", "DEFERRABILITY"
};
verifyNames(MetaCatalogBuilder.XREF_TABLE, names);
}
private void verifyNames(final String tblName, final String[] colNames) {
final List<String> names = Arrays.asList(colNames);
int count = 0;
final Query query = QueryFactory.create(String.format(queryString,
tblName));
final QueryExecution qexec = QueryExecutionFactory.create(query,
dpProducer.getMetaDatasetUnionModel());
try {
final ResultSet results = qexec.execSelect();
for (; results.hasNext();) {
count++;
final QuerySolution soln = results.nextSolution();
final Literal l = soln.getLiteral("colName");
Assert.assertTrue(l.getString() + " is missing",
names.contains(l.getString()));
}
Assert.assertEquals(names.size(), count);
} finally {
qexec.close();
}
}
}