METAMODEL-47: Fixed
authorKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Fri, 4 Apr 2014 08:50:13 +0000 (10:50 +0200)
committerKasper Sørensen <i.am.kasper.sorensen@gmail.com>
Fri, 4 Apr 2014 08:50:13 +0000 (10:50 +0200)
CHANGES.txt
core/src/main/java/org/apache/metamodel/data/RowPublisherDataSet.java
excel/src/main/java/org/apache/metamodel/excel/DefaultSpreadsheetReaderDelegate.java
excel/src/main/java/org/apache/metamodel/excel/ExcelDataContext.java
excel/src/main/java/org/apache/metamodel/excel/XlsxSpreadsheetReaderDelegate.java
excel/src/test/java/org/apache/metamodel/excel/ExcelDataContextTest.java

index 764599c..6e0f69d 100644 (file)
@@ -4,6 +4,7 @@
  * [METAMODEL-13] - Added support for Apache HBase via the new module "MetaModel-hbase"!
  * [METAMODEL-11] - New module "MetaModel-spring" which adds a convenient FactoryBean to produce various types of DataContext objects based on externalizable parameters, for Spring framework users.
  * [METAMODEL-32] - Fixed thread-safety issue in Excel module when tables (sheets) metadata is updated.
+ * [METAMODEL-47] - Fixed issue in Excel of loading schema if query is fired based on metadata from a previous DataContext instance.
  * [METAMODEL-35] - Improved query rewriting for DB2 when paged queries contain ORDER BY clause.
  * [METAMODEL-44] - Added an optional method for QueryPostprocessDataContext implementations to do a row-lookup by primary key value.
  * [METAMODEL-43] - Made CSV datastores skip empty lines in file instead of treating them of rows with null values.
index 8717136..47f0325 100644 (file)
@@ -30,8 +30,6 @@ import org.slf4j.LoggerFactory;
  * instead allows a publshing action to publish rows to the dataset in a
  * blocking manner, and thereby to adapt without having to load all rows into
  * memory.
- * 
- * @author Kasper Sørensen
  */
 public final class RowPublisherDataSet extends AbstractDataSet {
 
@@ -59,7 +57,10 @@ public final class RowPublisherDataSet extends AbstractDataSet {
        public void close() {
                super.close();
                _closed = true;
-               _rowPublisher.finished();
+               if (_rowPublisher != null) {
+                   _rowPublisher.finished();
+                   _rowPublisher = null;
+               }
        }
 
        @Override
index 48a96f3..c1e2015 100644 (file)
@@ -43,8 +43,6 @@ import org.slf4j.LoggerFactory;
 /**
  * The default {@link SpreadsheetReaderDelegate}, which uses POI's main user
  * model to read spreadsheets: the Workbook class.
- * 
- * @author Kasper Sørensen
  */
 final class DefaultSpreadsheetReaderDelegate implements SpreadsheetReaderDelegate {
 
index f29f86b..26a64c7 100644 (file)
@@ -147,6 +147,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) {
index d2e0e98..810330d 100644 (file)
@@ -50,8 +50,6 @@ import org.xml.sax.XMLReader;
  * {@link SpreadsheetReaderDelegate} implementation for the "new" XLSX format.
  * This implementation is very efficient as it uses SAX XML parsing which does
  * not bloat memory usage in the same way that POI's user model does.
- * 
- * @author Kasper Sørensen
  */
 final class XlsxSpreadsheetReaderDelegate implements SpreadsheetReaderDelegate {
 
index 010dd03..f553ddf 100644 (file)
@@ -85,8 +85,8 @@ public class ExcelDataContextTest extends TestCase {
     }
 
     public void testUnexistingHeaderLine() throws Exception {
-        DataContext dc = new ExcelDataContext(new File("src/test/resources/xls_people.xls"), new ExcelConfiguration(20, true,
-                false));
+        DataContext dc = new ExcelDataContext(new File("src/test/resources/xls_people.xls"), new ExcelConfiguration(20,
+                true, false));
         assertEquals(1, dc.getDefaultSchema().getTableCount());
 
         Table table = dc.getDefaultSchema().getTables()[0];
@@ -163,8 +163,8 @@ public class ExcelDataContextTest extends TestCase {
 
         assertTrue(ds.next());
         row = ds.getRow();
-        assertEquals("TismmerswerskisMFSTLandsmeers                                                          ", row.getValue(0)
-                .toString());
+        assertEquals("TismmerswerskisMFSTLandsmeers                                                          ", row
+                .getValue(0).toString());
 
         assertTrue(ds.next());
         row = ds.getRow();
@@ -172,8 +172,8 @@ public class ExcelDataContextTest extends TestCase {
 
         assertTrue(ds.next());
         row = ds.getRow();
-        assertEquals("TismmerswerskisMFSTLandsmeers                                                          ", row.getValue(0)
-                .toString());
+        assertEquals("TismmerswerskisMFSTLandsmeers                                                          ", row
+                .getValue(0).toString());
 
         assertFalse(ds.next());
         ds.close();
@@ -185,7 +185,8 @@ public class ExcelDataContextTest extends TestCase {
         Table table = dc.getDefaultSchema().getTables()[0];
         Column[] columns = table.getColumns();
 
-        assertEquals("[some number, some mixed formula, some int only formula]", Arrays.toString(table.getColumnNames()));
+        assertEquals("[some number, some mixed formula, some int only formula]",
+                Arrays.toString(table.getColumnNames()));
 
         Query q = dc.query().from(table).select(columns).toQuery();
         DataSet ds = dc.executeQuery(q);
@@ -294,7 +295,8 @@ public class ExcelDataContextTest extends TestCase {
 
     public void testConfigurationWithoutHeader() throws Exception {
         File file = new File("src/test/resources/xls_people.xls");
-        DataContext dc = new ExcelDataContext(file, new ExcelConfiguration(ExcelConfiguration.NO_COLUMN_NAME_LINE, true, true));
+        DataContext dc = new ExcelDataContext(file, new ExcelConfiguration(ExcelConfiguration.NO_COLUMN_NAME_LINE,
+                true, true));
         Table table = dc.getDefaultSchema().getTables()[0];
 
         String[] columnNames = table.getColumnNames();
@@ -516,10 +518,10 @@ public class ExcelDataContextTest extends TestCase {
         Table table = schema.getTableByName("Sheet1");
         assertEquals(
 
-        "[Column[name=Pkg No.,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
-                + "Column[name=Description,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
-                + "Column[name=Room,columnNumber=2,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
-                + "Column[name=Level,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
+                "[Column[name=Pkg No.,columnNumber=0,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
+                        + "Column[name=Description,columnNumber=1,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
+                        + "Column[name=Room,columnNumber=2,type=VARCHAR,nullable=true,nativeType=null,columnSize=null], "
+                        + "Column[name=Level,columnNumber=3,type=VARCHAR,nullable=true,nativeType=null,columnSize=null]]",
                 Arrays.toString(table.getColumns()));
     }
 
@@ -542,7 +544,8 @@ public class ExcelDataContextTest extends TestCase {
             public void run(UpdateCallback cb) {
                 Style clownStyle = new StyleBuilder().bold().foreground(255, 0, 0).background(0, 0, 255).create();
 
-                Style thirtyStyle = new StyleBuilder().italic().underline().centerAligned().foreground(10, 10, 200).create();
+                Style thirtyStyle = new StyleBuilder().italic().underline().centerAligned().foreground(10, 10, 200)
+                        .create();
 
                 cb.insertInto(table).value("id", 1000).value(nameColumn, "pennywise the [clown]", clownStyle)
                         .value("gender", "male").value("age", 30, thirtyStyle).execute();
@@ -566,7 +569,8 @@ public class ExcelDataContextTest extends TestCase {
         assertEquals("mike", ds.getRow().getValue(0).toString());
         assertTrue(ds.next());
         assertEquals("pennywise the [clown]", ds.getRow().getValue(0).toString());
-        assertEquals("font-weight: bold;color: rgb(255,0,0);background-color: rgb(0,0,255);", ds.getRow().getStyle(0).toString());
+        assertEquals("font-weight: bold;color: rgb(255,0,0);background-color: rgb(0,0,255);", ds.getRow().getStyle(0)
+                .toString());
         assertTrue(ds.next());
         assertEquals("peter", ds.getRow().getValue(0).toString());
         assertTrue(ds.next());
@@ -577,8 +581,8 @@ public class ExcelDataContextTest extends TestCase {
         ds = dc.query().from(table).select("age").where("age").eq(30).execute();
         assertTrue(ds.next());
         assertEquals("30", ds.getRow().getValue(0));
-        assertEquals("font-style: italic;text-decoration: underline;text-align: center;color: rgb(0,0,255);", ds.getRow()
-                .getStyle(0).toCSS());
+        assertEquals("font-style: italic;text-decoration: underline;text-align: center;color: rgb(0,0,255);", ds
+                .getRow().getStyle(0).toCSS());
         assertFalse(ds.next());
     }
 
@@ -598,15 +602,15 @@ public class ExcelDataContextTest extends TestCase {
             @Override
             public void run(UpdateCallback cb) {
                 Schema schema = dc.getDefaultSchema();
-                Table table1 = cb.createTable(schema, "my_table_1").withColumn("foo").withColumn("bar").withColumn("baz")
-                        .execute();
+                Table table1 = cb.createTable(schema, "my_table_1").withColumn("foo").withColumn("bar")
+                        .withColumn("baz").execute();
 
                 assertEquals(1, schema.getTableCount());
                 assertSame(table1.getSchema(), schema);
                 assertSame(table1, schema.getTables()[0]);
 
-                Table table2 = cb.createTable(schema, "my_table_2").withColumn("foo").withColumn("bar").withColumn("baz")
-                        .execute();
+                Table table2 = cb.createTable(schema, "my_table_2").withColumn("foo").withColumn("bar")
+                        .withColumn("baz").execute();
 
                 assertSame(table2.getSchema(), schema);
                 assertSame(table2, schema.getTables()[1]);
@@ -626,7 +630,7 @@ public class ExcelDataContextTest extends TestCase {
             @Override
             public void run(UpdateCallback cb) {
                 cb.insertInto(dc.getTableByQualifiedLabel("my_table_1")).value("foo", 456.2)
-                .value("bar", "парфюмерия +и косметика").value("baz", false).execute();
+                        .value("bar", "парфюмерия +и косметика").value("baz", false).execute();
             }
         });
 
@@ -655,8 +659,9 @@ public class ExcelDataContextTest extends TestCase {
             }
         });
 
-        assertEquals("1", MetaModelHelper.executeSingleRowQuery(dc, dc.query().from("my_table_1").selectCount().toQuery())
-                .getValue(0).toString());
+        assertEquals("1",
+                MetaModelHelper.executeSingleRowQuery(dc, dc.query().from("my_table_1").selectCount().toQuery())
+                        .getValue(0).toString());
 
         ds = dc.query().from("my_table_1").select("foo").and("bar").and("baz").execute();
         assertTrue(ds.next());
@@ -738,4 +743,25 @@ public class ExcelDataContextTest extends TestCase {
 
         assertFalse(ds.next());
     }
+
+    /**
+     * Tests that you can execute a query on a ExcelDataContext even though the
+     * schema has not yet been (explicitly) loaded.
+     */
+    public void testExecuteQueryBeforeLoadingSchema() throws Exception {
+        // first use one DataContext to retreive the schema/table/column objects
+        ExcelDataContext dc1 = new ExcelDataContext(new File("src/test/resources/Spreadsheet2007.xlsx"));
+        Schema schema = dc1.getDefaultSchema();
+        Table table = schema.getTable(0);
+        Column column = table.getColumn(0);
+
+        // query another DataContext using the schemas of the one above
+        ExcelDataContext dc2 = new ExcelDataContext(new File("src/test/resources/Spreadsheet2007.xlsx"));
+        DataSet ds = dc2.executeQuery(new Query().from(table).select(column));
+
+        // previously we would crash at this point!
+
+        assertNotNull(ds);
+        ds.close();
+    }
 }
\ No newline at end of file