Repository: metamodel Updated Branches: refs/heads/master 8156d76fd -> 3c4c12673
METAMODEL-152: Fixed Fixes #30 Project: http://git-wip-us.apache.org/repos/asf/metamodel/repo Commit: http://git-wip-us.apache.org/repos/asf/metamodel/commit/3c4c1267 Tree: http://git-wip-us.apache.org/repos/asf/metamodel/tree/3c4c1267 Diff: http://git-wip-us.apache.org/repos/asf/metamodel/diff/3c4c1267 Branch: refs/heads/master Commit: 3c4c1267309475a185d103508b63921f61ceef57 Parents: 8156d76 Author: Kasper Sørensen <[email protected]> Authored: Thu Jun 18 15:25:27 2015 +0200 Committer: Kasper Sørensen <[email protected]> Committed: Thu Jun 18 15:25:27 2015 +0200 ---------------------------------------------------------------------- CHANGES.md | 1 + .../apache/metamodel/AbstractDataContext.java | 15 +++++++++--- .../metamodel/QueryPostprocessDataContext.java | 24 ++++++++++---------- excel/pom.xml | 2 +- .../metamodel/excel/ExcelDataContext.java | 19 +++++++++++----- .../metamodel/excel/ExcelDataContextTest.java | 10 +++++--- 6 files changed, 46 insertions(+), 25 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/CHANGES.md ---------------------------------------------------------------------- diff --git a/CHANGES.md b/CHANGES.md index c6c6f80..d463e99 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ### Apache MetaModel (unreleased work) * [METAMODEL-148] - Added a 'hadoop' module with a HdfsResource class to allow CSV, Excel and Fixed-width file access on HDFS. + * [METAMODEL-152] - Fixed an issue of not clearing schema cache when refreshSchemas() is invoked. * [METAMODEL-149] - Added support for COUNTER data type in Cassandra. * [METAMODEL-151] - Added support for DOUBLE data type mapping in PostgreSQL http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/core/src/main/java/org/apache/metamodel/AbstractDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java index 0c00186..a42d7f6 100644 --- a/core/src/main/java/org/apache/metamodel/AbstractDataContext.java +++ b/core/src/main/java/org/apache/metamodel/AbstractDataContext.java @@ -54,10 +54,19 @@ public abstract class AbstractDataContext implements DataContext { public final DataContext refreshSchemas() { _schemaCache.clear(); _schemaNameCache = null; + onSchemaCacheRefreshed(); return this; } /** + * Method invoked when schemas have been refreshed using + * {@link #refreshSchemas()}. Can be overridden to add callback + * functionality in subclasses. + */ + protected void onSchemaCacheRefreshed() { + } + + /** * {@inheritDoc} */ @Override @@ -111,12 +120,12 @@ public abstract class AbstractDataContext implements DataContext { @Override public final Schema getDefaultSchema() throws MetaModelException { Schema result = null; - String defaultSchemaName = getDefaultSchemaName(); + final String defaultSchemaName = getDefaultSchemaName(); if (defaultSchemaName != null) { result = getSchemaByName(defaultSchemaName); } if (result == null) { - Schema[] schemas = getSchemas(); + final Schema[] schemas = getSchemas(); if (schemas.length == 1) { result = schemas[0]; } else { @@ -126,7 +135,7 @@ public abstract class AbstractDataContext implements DataContext { String name = schema.getName(); if (schema != null) { name = name.toLowerCase(); - boolean isInformationSchema = name.startsWith("information") && name.endsWith("schema"); + final boolean isInformationSchema = name.startsWith("information") && name.endsWith("schema"); if (!isInformationSchema && schema.getTableCount() > highestTableCount) { highestTableCount = schema.getTableCount(); result = schema; http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java index 0cdbe8b..872a7dd 100644 --- a/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java +++ b/core/src/main/java/org/apache/metamodel/QueryPostprocessDataContext.java @@ -76,8 +76,6 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im private final Map<Column, TypeConverter<?, ?>> _converters; - private Schema _mainSchema; - public QueryPostprocessDataContext() { super(); _converters = new HashMap<Column, TypeConverter<?, ?>>(); @@ -432,7 +430,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im schemaNames[1] = getMainSchemaName(); return schemaNames; } - + @Override protected String getDefaultSchemaName() throws MetaModelException { return getMainSchemaName(); @@ -449,7 +447,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im } if (name.equalsIgnoreCase(mainSchemaName)) { - return getMainSchemaInternal(); + return getMainSchema(); } else if (name.equals(INFORMATION_SCHEMA_NAME)) { return getInformationSchema(); } @@ -513,7 +511,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im final String tableName = table.getName(); final SelectItem[] columnSelectItems = MetaModelHelper.createSelectItems(table.getColumns()); final SimpleDataSetHeader header = new SimpleDataSetHeader(columnSelectItems); - final Table[] tables = getMainSchemaInternal().getTables(); + final Table[] tables = getDefaultSchema().getTables(); final List<Row> data = new ArrayList<Row>(); if ("tables".equals(tableName)) { // "tables" columns: name, type, num_columns, remarks @@ -541,7 +539,7 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im } else if ("relationships".equals(tableName)) { // "relationships" columns: primary_table, primary_column, // foreign_table, foreign_column - for (Relationship r : getMainSchemaInternal().getRelationships()) { + for (Relationship r : getDefaultSchema().getRelationships()) { Column[] primaryColumns = r.getPrimaryColumns(); Column[] foreignColumns = r.getForeignColumns(); Table pTable = r.getPrimaryTable(); @@ -571,13 +569,15 @@ public abstract class QueryPostprocessDataContext extends AbstractDataContext im return dataSet; } + /** + * + * @return + * + * @deprecated use {@link #getDefaultSchema()} instead + */ + @Deprecated protected Schema getMainSchemaInternal() { - Schema schema = _mainSchema; - if (schema == null) { - schema = getMainSchema(); - _mainSchema = schema; - } - return schema; + return getDefaultSchema(); } /** http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/pom.xml ---------------------------------------------------------------------- diff --git a/excel/pom.xml b/excel/pom.xml index c600f5d..d829c74 100644 --- a/excel/pom.xml +++ b/excel/pom.xml @@ -40,7 +40,7 @@ under the License. <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> - <version>3.9</version> + <version>3.12</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java ---------------------------------------------------------------------- diff --git a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java index 2342e3c..5963e69 100644 --- a/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java +++ b/excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java @@ -74,9 +74,9 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen * Constructs an Excel DataContext based on a resource and a custom * configuration. * - * The file provided can be either existing or non-existing. In the - * case of non-existing files, a file will be automatically created - * when a CREATE TABLE update is executed on the DataContext. + * The file provided can be either existing or non-existing. In the case of + * non-existing files, a file will be automatically created when a CREATE + * TABLE update is executed on the DataContext. * * @param file * @param configuration @@ -151,10 +151,10 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen try { SpreadsheetReaderDelegate delegate = getSpreadsheetReaderDelegate(inputStreamRef); inputStream = inputStreamRef.get(); - + // METAMODEL-47: Ensure that we have loaded the schema at this point getDefaultSchema(); - + DataSet dataSet = delegate.executeQuery(inputStream, table, columns, maxRows); return dataSet; } catch (Exception e) { @@ -191,6 +191,12 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen } } + @Override + protected void onSchemaCacheRefreshed() { + super.onSchemaCacheRefreshed(); + _spreadsheetReaderDelegate = null; + } + /** * Convenient method for testing and inspecting internal state. * @@ -203,7 +209,8 @@ public final class ExcelDataContext extends QueryPostprocessDataContext implemen return null; } - private SpreadsheetReaderDelegate getSpreadsheetReaderDelegate(Ref<InputStream> inputStream) throws MetaModelException { + private SpreadsheetReaderDelegate getSpreadsheetReaderDelegate(Ref<InputStream> inputStream) + throws MetaModelException { if (_spreadsheetReaderDelegate == null) { synchronized (this) { if (_spreadsheetReaderDelegate == null) { http://git-wip-us.apache.org/repos/asf/metamodel/blob/3c4c1267/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java ---------------------------------------------------------------------- diff --git a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java index f553ddf..c7c3696 100644 --- a/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java +++ b/excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java @@ -586,10 +586,15 @@ public class ExcelDataContextTest extends TestCase { assertFalse(ds.next()); } - public void testCreateTable() throws Exception { + public void testCreateTableXls() throws Exception { // run the same test with both XLS and XLSX (because of different // workbook implementations) runCreateTableTest(new File("target/xls_people_created.xls")); + } + + public void testCreateTableXlsx() throws Exception { + // run the same test with both XLS and XLSX (because of different + // workbook implementations) runCreateTableTest(new File("target/xls_people_created.xlsx")); } @@ -680,8 +685,7 @@ public class ExcelDataContextTest extends TestCase { dc.refreshSchemas(); - assertEquals("[my_table_2]", Arrays.toString(schema.getTableNames())); - + assertEquals("[my_table_2]", Arrays.toString(dc.getDefaultSchema().getTableNames())); assertEquals(1, dc.getDefaultSchema().getTableCount()); }
