/* //$Id: MetadataTest.java 482 2012-01-05 23:27:27Z jhyde $ // //Licensed to Julian Hyde under one or more contributor license //agreements. See the NOTICE file distributed with this work for //additional information regarding copyright ownership. // //Julian Hyde licenses this file to you under the Apache License, //Version 2.0 (the "License"); you may not use this file except in //compliance with the License. You may obtain a copy of the License at: // //http://www.apache.org/licenses/LICENSE-2.0 // //Unless required by applicable law or agreed to in writing, software //distributed under the License is distributed on an "AS IS" BASIS, //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. //See the License for the specific language governing permissions and //limitations under the License. */ package org.olap4j; import java.sql.Connection; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.logging.Level; import junit.framework.TestCase; import org.olap4j.driver.olap4ld.Olap4ldUtil; import org.olap4j.driver.olap4ld.helper.Olap4ldLinkedDataUtil; import org.olap4j.impl.Olap4jUtil; import org.olap4j.metadata.Member; import org.olap4j.test.TestContext; import org.semanticweb.yars.nx.Literal; import org.semanticweb.yars.nx.Node; /** * This test simply tries to execute rowset metadata queries to a certain url. * * @version $Id: MetadataTest.java 482 2012-01-05 23:27:27Z jhyde $ */ public class GenericCubeReturnMetadataTest extends TestCase { // private static final String TESTURL = // "http://localhost/fios_xmla4js/example.ttl#ds"; // private static final String TESTURL = // "http://yahoofinancewrap.appspot.com/archive/BAC/2012-12-12#ds"; //private static final String TESTURL = "http://olap4ld.googlecode.com/git/OLAP4LD-trunk/tests/estatwrap/tec00114_ds.rdf#ds"; //private static final String TESTURL = "http://localhost/Auslagerung/lineorder_qb.ttl#ds"; //private static final String TESTURL = "http://olap4ld.googlecode.com/git/OLAP4LD-trunk/tests/estatwrap/tec00114_ds.rdf#ds,http://olap4ld.googlecode.com/git/OLAP4LD-trunk/tests/estatwrap/tsdec420_ds.rdf#ds"; //private static final String TESTURL = "http://lod.gesis.org/lodpilot/ALLBUS/ZA4570v590.rdf#ds"; // private static final String TESTURL = "http://estatwrap.ontologycentral.com/id/tec00114#ds,http://lod.gesis.org/lodpilot/ALLBUS/ZA4570v590.rdf#ds"; //private static final String TESTURL = "http://eurostat.linked-statistics.org/data/tec00114"; // private static final String TESTURL = "http://olap4ld.googlecode.com/git/OLAP4LD-trunk/tests/estatwrap/tec00114_ds.rdf#ds,http://lod.gesis.org/lodpilot/ALLBUS/ZA4570v590.rdf#ds"; //private static final String TESTURL = "http://estatwrap.ontologycentral.com/id/tec00115#ds"; //private static final String TESTURL = "http://pastebin.com/raw.php?i=839G2u72#ds"; //private static final String TESTURL = "http://olap4ld.googlecode.com/git/OLAP4LD-trunk/tests/ssb001/ttl/example.ttl#ds"; //private static final String TESTURL = "http://citydata.ai.wu.ac.at/Linked-UNData/data/240"; private static final String TESTURL = "http://estatwrap.ontologycentral.com/id/urb_cenv#ds"; // private static final String TESTURL = "http://lod.gesis.org/lodpilot/ALLBUS/ZA4570v590.rdf#ds,http://estatwrap.ontologycentral.com/id/tec00115#ds"; // "http://data.webfoundation.org/webindex/dataset/ITUA-Imputed"; private static final String NL = System.getProperty("line.separator"); private final TestContext testContext = TestContext.instance(); private final TestContext.Tester tester = testContext.getTester(); private Connection connection; private String catalogName; private OlapConnection olapConnection; private OlapDatabaseMetaData olapDatabaseMetaData; private final String propertyNamePattern = null; private final String dataSourceName = "xx"; private ResultsDecoratorHTML resultDecorator; private String cubeNamePattern; private static final List<String> CUBE_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "CUBE_TYPE", "CUBE_GUID", "CREATED_ON", "LAST_SCHEMA_UPDATE", "SCHEMA_UPDATED_BY", "LAST_DATA_UPDATE", "DATA_UPDATED_BY", "IS_DRILLTHROUGH_ENABLED", "IS_WRITE_ENABLED", "IS_LINKABLE", "IS_SQL_ENABLED", "DESCRIPTION"); private static final List<String> LITERALS_COLUMN_NAMES = Arrays.asList( "LITERAL_NAME", "LITERAL_VALUE", "LITERAL_INVALID_CHARS", "LITERAL_INVALID_STARTING_CHARS", "LITERAL_MAX_LENGTH"); private static final List<String> SETS_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "SET_NAME", "SCOPE"); private static final List<String> PROPERTIES_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "DIMENSION_UNIQUE_NAME", "HIERARCHY_UNIQUE_NAME", "LEVEL_UNIQUE_NAME", "MEMBER_UNIQUE_NAME", "PROPERTY_NAME", "PROPERTY_CAPTION", "PROPERTY_TYPE", "DATA_TYPE", "PROPERTY_CONTENT_TYPE", "DESCRIPTION"); private static final List<String> MEMBERS_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "DIMENSION_UNIQUE_NAME", "HIERARCHY_UNIQUE_NAME", "LEVEL_UNIQUE_NAME", "LEVEL_NUMBER", "MEMBER_ORDINAL", "MEMBER_NAME", "MEMBER_UNIQUE_NAME", "MEMBER_TYPE", "MEMBER_GUID", "MEMBER_CAPTION", "CHILDREN_CARDINALITY", "PARENT_LEVEL", "PARENT_UNIQUE_NAME", "PARENT_COUNT", "TREE_OP", "DEPTH"); private static final List<String> MEASURES_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "MEASURE_NAME", "MEASURE_UNIQUE_NAME", "MEASURE_CAPTION", "MEASURE_GUID", "MEASURE_AGGREGATOR", "DATA_TYPE", "MEASURE_IS_VISIBLE", "LEVELS_LIST", "DESCRIPTION"); private static final List<String> LEVELS_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "DIMENSION_UNIQUE_NAME", "HIERARCHY_UNIQUE_NAME", "LEVEL_NAME", "LEVEL_UNIQUE_NAME", "LEVEL_GUID", "LEVEL_CAPTION", "LEVEL_NUMBER", "LEVEL_CARDINALITY", "LEVEL_TYPE", "CUSTOM_ROLLUP_SETTINGS", "LEVEL_UNIQUE_SETTINGS", "LEVEL_IS_VISIBLE", "DESCRIPTION"); private static final List<String> HIERARCHIES_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "DIMENSION_UNIQUE_NAME", "HIERARCHY_NAME", "HIERARCHY_UNIQUE_NAME", "HIERARCHY_GUID", "HIERARCHY_CAPTION", "DIMENSION_TYPE", "HIERARCHY_CARDINALITY", "DEFAULT_MEMBER", "ALL_MEMBER", "DESCRIPTION", "STRUCTURE", "IS_VIRTUAL", "IS_READWRITE", "DIMENSION_UNIQUE_SETTINGS", "DIMENSION_IS_VISIBLE", "HIERARCHY_IS_VISIBLE", "HIERARCHY_ORDINAL", "DIMENSION_IS_SHARED", "PARENT_CHILD"); private static final List<String> FUNCTIONS_COLUMN_NAMES = Arrays.asList( "FUNCTION_NAME", "DESCRIPTION", "PARAMETER_LIST", "RETURN_TYPE", "ORIGIN", "INTERFACE_NAME", "LIBRARY_NAME", "CAPTION"); private static final List<String> DIMENSIONS_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "DIMENSION_NAME", "DIMENSION_UNIQUE_NAME", "DIMENSION_GUID", "DIMENSION_CAPTION", "DIMENSION_ORDINAL", "DIMENSION_TYPE", "DIMENSION_CARDINALITY", "DEFAULT_HIERARCHY", "DESCRIPTION", "IS_VIRTUAL", "IS_READWRITE", "DIMENSION_UNIQUE_SETTINGS", "DIMENSION_MASTER_UNIQUE_NAME", "DIMENSION_IS_VISIBLE"); private static final List<String> DATABASE_PROPERTIES_COLUMN_NAMES = Arrays .asList("PROPERTY_NAME", "PROPERTY_DESCRIPTION", "PROPERTY_TYPE", "PROPERTY_ACCESS_TYPE", "IS_REQUIRED", "PROPERTY_VALUE"); private static final List<String> DATASOURCES_COLUMN_NAMES = Arrays.asList( "DATA_SOURCE_NAME", "DATA_SOURCE_DESCRIPTION", "URL", "DATA_SOURCE_INFO", "PROVIDER_NAME", "PROVIDER_TYPE", "AUTHENTICATION_MODE"); private static final List<String> CATALOGS_COLUMN_NAMES = Arrays .asList("TABLE_CAT"); private static final List<String> SCHEMAS_COLUMN_NAMES = Arrays.asList( "TABLE_SCHEM", "TABLE_CAT"); private static final List<String> ACTIONS_COLUMN_NAMES = Arrays.asList( "CATALOG_NAME", "SCHEMA_NAME", "CUBE_NAME", "ACTION_NAME", "COORDINATE", "COORDINATE_TYPE"); /** * Most important part is the input of a cube name. * * @throws SQLException */ public GenericCubeReturnMetadataTest() throws SQLException { // String dsduri = // "http://public.b-kaempgen.de:8080/edg/archive/1013237/0001193125-11-005034#dsd"; Node node = new Literal(TESTURL); // New Yhf example this.cubeNamePattern = Olap4ldLinkedDataUtil.convertNodeToMDX(node); } protected void setUp() throws SQLException { connection = tester.createConnection(); catalogName = connection.getCatalog(); olapConnection = tester.getWrapper().unwrap(connection, OlapConnection.class); olapDatabaseMetaData = olapConnection.getMetaData(); this.resultDecorator = new ResultsDecoratorHTML(null); // We set the logging level // Set the level to a particular level // For debugging purposes Olap4ldUtil._log.setLevel(Level.CONFIG); // For monitoring usage // Olap4ldUtil._log.setLevel(Level.INFO); // For warnings (and errors) only //Olap4ldUtil._log.setLevel(Level.WARNING); Olap4ldUtil._isDebug = true; } protected void tearDown() throws Exception { if (connection != null && !connection.isClosed()) { connection.close(); connection = null; } } // ~ Helper methods ---------- private void assertContains(String seek, String s) { if (s.indexOf(seek) < 0) { fail("expected to find '" + seek + "' in '" + s + "'"); } } private void assertContainsLine(String partial, String seek, String s) { if (partial == null) { partial = seek; } int i = s.indexOf(partial); if (i < 0) { fail("expected to find '" + seek + "' in '" + s + "'"); } int start = i; while (start > 0 && s.charAt(start - 1) != 0x0D && s.charAt(start - 1) != 0x0A) { --start; } int end = i; while (end < s.length() && s.charAt(end) != 0x0D && s.charAt(end) != 0x0A) { ++end; } String line = s.substring(start, end); assertEquals(seek, line); } private void assertNotContains(String seek, String s) { if (s.indexOf(seek) >= 0) { fail("expected not to find '" + seek + "' in '" + s + "'"); } } private int linecount(String s) { int i = 0; int count = 0; while (i < s.length()) { int nl = s.indexOf('\n', i); if (nl < 0) { break; } i = nl + 1; ++count; } return count; } // ~ Tests follow ------------- /** * Problem is that the Linked Data Cubes Engine EmbeddedSesame (and other * probably too) for every connection initialises again the triple store. * Thus, we can only query for all metadata within one "session". Thus, we * have a test "testDatabaseMetaData()" that runs all tests in one session * * @throws SQLException */ public void testDatabaseMetaData() throws SQLException { // testDatabaseMetaDataGetDatasources(); // testDatabaseMetaDataGetCatalogs(); // testDatabaseMetaDataGetSchemas(); // testDatabaseMetaDataGetLiterals(); // testDatabaseMetaDataGetDatabaseProperties(); // testDatabaseMetaDataGetMdxKeywords(); // testDatabaseMetaDataGetCubes(); // testDatabaseMetaDataGetMeasures(); // testDatabaseMetaDataGetDimensions(); // testDatabaseMetaDataGetFunctions(); // testDatabaseMetaDataGetHierarchies(); // testDatabaseMetaDataGetLevels(); // testDatabaseMetaDataGetLiterals2(); // testDatabaseMetaDataGetMeasureMembers(); // testDatabaseMetaDataGetMembers(); // testDatabaseMetaDataGetSets(); fail("supposed to fail"); } /* * No tests for * * databases catalogs schemas actions */ public void testDatabaseMetaDataGetDatasources() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getDatabases(), DATASOURCES_COLUMN_NAMES); System.out.println("getDatabases(): " + s); } public void testDatabaseMetaDataGetCatalogs() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getCatalogs(), CATALOGS_COLUMN_NAMES); System.out.println("getCatalogs(): " + s); } public void testDatabaseMetaDataGetSchemas() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getSchemas(), SCHEMAS_COLUMN_NAMES); System.out.println("getSchemas(): " + s); } public void testDatabaseMetaDataGetLiterals() throws SQLException { // String s = checkResultSet(olapDatabaseMetaData.getLiterals(), // LITERALS_COLUMN_NAMES); // // System.out.println("getLiterals(): " + s); } public void testDatabaseMetaDataGetDatabaseProperties() throws SQLException { // String s = checkResultSet(olapDatabaseMetaData.getDatabaseProperties( // dataSourceName, propertyNamePattern), // DATABASE_PROPERTIES_COLUMN_NAMES); // System.out.println("getDatabaseProperties(): " + s); } public void testDatabaseMetaDataGetProperties() throws SQLException { // String s = checkResultSet(olapDatabaseMetaData.getProperties( // catalogName, null, null, null, null, null, null, null), // PROPERTIES_COLUMN_NAMES); // System.out.println("getProperties(): " + s); } public void testDatabaseMetaDataGetMdxKeywords() throws SQLException { String keywords = olapDatabaseMetaData.getMdxKeywords(); System.out.println("getMdxKeywords(): " + keywords); } /** * We ask for a specific cube and return its properties. * * @throws SQLException */ public void testDatabaseMetaDataGetCubes() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getCubes(catalogName, null, cubeNamePattern), CUBE_COLUMN_NAMES); System.out.println("getCubes(): " + s); } public void testDatabaseMetaDataGetMeasures() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getMeasures(catalogName, null, cubeNamePattern, null, null), MEASURES_COLUMN_NAMES); System.out.println("getMeasures(): " + s); } /** * We ask for all dimensions of the cube. * * @throws SQLException */ public void testDatabaseMetaDataGetDimensions() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getDimensions( catalogName, null, cubeNamePattern, null), DIMENSIONS_COLUMN_NAMES); System.out.println("getDimensions(): " + s); } public void testDatabaseMetaDataGetFunctions() throws SQLException { // String s = // checkResultSet(olapDatabaseMetaData.getOlapFunctions(null), // FUNCTIONS_COLUMN_NAMES); // System.out.println("getFunctions(): " + s); } /** * For each of the dimensions, we return the hierarchy. * * @throws SQLException */ public void testDatabaseMetaDataGetHierarchies() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getHierarchies( catalogName, null, cubeNamePattern, null, null), HIERARCHIES_COLUMN_NAMES); System.out.println("getHierarchies(): " + s); } public void testDatabaseMetaDataGetLevels() throws SQLException { String s = checkResultSet(olapDatabaseMetaData.getLevels(catalogName, null, cubeNamePattern, null, null, null), LEVELS_COLUMN_NAMES); System.out.println("getLevels(): " + s); } public void testDatabaseMetaDataGetLiterals2() throws SQLException { // String s = checkResultSet(olapDatabaseMetaData.getLiterals(), // LITERALS_COLUMN_NAMES); // System.out.println("getLiterals2(): " + s); } /** * For each measure, find the measure member. * * @throws SQLException */ public void testDatabaseMetaDataGetMeasureMembers() throws SQLException { ResultSet measures = olapDatabaseMetaData.getMeasures(catalogName, null, cubeNamePattern, null, null); while (measures.next()) { String measure = measures.getString(4); String s = checkResultSet(olapDatabaseMetaData.getMembers( catalogName, null, cubeNamePattern, null, null, null, measure, Olap4jUtil.enumSetOf(Member.TreeOp.SELF)), MEMBERS_COLUMN_NAMES); System.out.println("getMeasureMembers(" + measure + "): " + s); } } /** * For each level, find the members * * @throws SQLException */ public void testDatabaseMetaDataGetMembers() throws SQLException { ResultSet levels = olapDatabaseMetaData.getLevels(catalogName, null, cubeNamePattern, null, null, null); while (levels.next()) { String level = levels.getString(6); String s = checkResultSet(olapDatabaseMetaData.getMembers( catalogName, null, cubeNamePattern, null, null, level, null, null), MEMBERS_COLUMN_NAMES); System.out.println("getMembers(Level:" + level + "): " + s); } } public void testDatabaseMetaDataGetSets() throws SQLException { // String s = checkResultSet( // olapDatabaseMetaData.getSets(catalogName, null, null, null), // SETS_COLUMN_NAMES); // System.out.println("getSets(): " + s); } // todo: More tests required for other methods on DatabaseMetaData private String checkResultSet(ResultSet resultSet, List<String> columnNames) throws SQLException { ResultSetMetaData resultSetMetaData = resultSet.getMetaData(); final int columnCount = resultSetMetaData.getColumnCount(); List<String> rsColumnNames = new ArrayList<String>(); if (columnNames != null) { for (int k = 0; k < columnCount; k++) { rsColumnNames.add(resultSetMetaData.getColumnName(k + 1)); } final HashSet<String> set = new HashSet<String>(columnNames); set.removeAll(rsColumnNames); assertTrue("Expected columns not found: " + set, set.isEmpty()); } assertNotNull(resultSet); int k = 0; StringBuilder buf = new StringBuilder(); while (resultSet.next()) { ++k; for (int i = 0; i < columnCount; i++) { if (i > 0) { buf.append(", "); } String s = resultSet.getString(i + 1); buf.append(resultSetMetaData.getColumnName(i + 1)).append('=') .append(s); } buf.append(NL); } assertTrue(k >= 0); assertTrue(resultSet.isAfterLast()); return buf.toString(); } } // End MetadataTest.java