/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.translator.excel;
import static org.junit.Assert.*;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.mockito.Mockito;
import org.teiid.cdk.api.TranslationUtility;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.language.Command;
import org.teiid.language.QueryExpression;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.translator.ExecutionContext;
import org.teiid.translator.FileConnection;
import org.teiid.translator.ResultSetExecution;
import org.teiid.translator.TranslatorException;
@SuppressWarnings("nls")
public class TestExcelExecution {
private ArrayList helpExecute(String ddl, FileConnection connection, String query) throws Exception {
ExcelExecutionFactory translator = new ExcelExecutionFactory();
translator.start();
TransformationMetadata metadata = RealMetadataFactory.fromDDL(ddl, "vdb", "excel");
TranslationUtility utility = new TranslationUtility(metadata);
Command cmd = utility.parseCommand(query);
ExecutionContext context = Mockito.mock(ExecutionContext.class);
ResultSetExecution execution = translator.createResultSetExecution((QueryExpression)cmd, context, utility.createRuntimeMetadata(), connection);
try {
execution.execute();
ArrayList results = new ArrayList();
while (true) {
List<?> row = execution.next();
if (row == null) {
break;
}
results.add(row);
}
return results;
} finally {
execution.close();
}
}
@Test
public void testExecutionNoDataNumberXLS() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '7'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '8'),\n" +
" column3 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '9'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xls');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[13, FirstName, LastName, Age], [14, John, Doe, 44.0], [15, Jane, Smith, 40.0], [16, Matt, Liek, 13.0], [17, Sarah, Byne, 10.0], [18, Rocky, Dog, 3.0], [19, Total, null, 110.0]]", results.toString());
}
@Test
public void testFileGlob() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '7'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '8'),\n" +
" column3 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '9'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" '*.xls');";
FileConnection connection = Mockito.mock(FileConnection.class);
File f = Mockito.mock(File.class);
Mockito.stub(f.isDirectory()).toReturn(true);
Mockito.stub(f.listFiles()).toReturn(new File[] {UnitTestUtil.getTestDataFile("names.xls")});
Mockito.stub(connection.getFile("*.xls")).toReturn(f);
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[13, FirstName, LastName, Age], [14, John, Doe, 44.0], [15, Jane, Smith, 40.0], [16, Matt, Liek, 13.0], [17, Sarah, Byne, 10.0], [18, Rocky, Dog, 3.0], [19, Total, null, 110.0]]", results.toString());
}
@Test
public void testExecutionNoDataNumberXLSX() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '1'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '2'),\n" +
" column3 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '3'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xlsx');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xlsx")).toReturn(UnitTestUtil.getTestDataFile("names.xlsx"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[1, FirstName, LastName, Age], [2, John, Doe, null], [3, Jane, Smith, 40.0], [4, Matt, Liek, 13.0], [5, Sarah, Byne, 10.0], [6, Rocky, Dog, 3.0]]", results.toString());
}
@Test
public void testExecutionColumnWithNullCell() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '1')\n" +
") OPTIONS (\"teiid_excel:FILE\" '3219.xlsx');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("3219.xlsx")).toReturn(UnitTestUtil.getTestDataFile("3219.xlsx"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals(results.size(), 7);
}
/**
* Test a sheet with a header row where 1 column is empty
* @throws Exception
*/
@Test
public void testExecutionHeaderWithEmptyCell() throws Exception {
String ddl = "SET NAMESPACE 'http://www.teiid.org/translator/excel/2014' AS teiid_excel;\n\n" +
"CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" FirstName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '1'),\n" +
" LastName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '2'),\n" +
" Age double OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '4'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (NAMEINSOURCE 'Sheet1', \"teiid_excel:FILE\" 'empty-ignore.xls', \"teiid_excel:FIRST_DATA_ROW_NUMBER\" '2');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("empty-ignore.xls")).toReturn(UnitTestUtil.getTestDataFile("empty-ignore.xls"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals(6, results.size());
ArrayList row = (ArrayList) results.get(4);
assertEquals(4, row.size());
}
@Test
public void testExecutionColumnsWithNullCell() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '1'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '2')\n" +
") OPTIONS (\"teiid_excel:FILE\" '3219.xlsx');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("3219.xlsx")).toReturn(UnitTestUtil.getTestDataFile("3219.xlsx"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals(results.size(), 7);
}
@Test
public void testExecutionWithDataNumberXLS() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '7'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '8'),\n" +
" column3 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '9'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xls', \"teiid_excel:FIRST_DATA_ROW_NUMBER\" '18');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[18, Rocky, Dog, 3.0], [19, Total, null, 110.0]]", results.toString());
}
@Test
public void testExecutionWithDataNumberXLSX() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" column1 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '1'),\n" +
" column2 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '2'),\n" +
" column3 string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '3'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xlsx', \"teiid_excel:FIRST_DATA_ROW_NUMBER\" '6');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xlsx")).toReturn(UnitTestUtil.getTestDataFile("names.xlsx"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[6, Rocky, Dog, 3.0]]", results.toString());
}
@Test
public void testExecutionWithDataNumberWithHeaderXLS() throws Exception {
String ddl = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" FirstName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '7'),\n" +
" LastName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '8'),\n" +
" Age double OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '9'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xls', \"teiid_excel:FIRST_DATA_ROW_NUMBER\" '18');";
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(ddl, connection, "select * from Sheet1");
assertEquals("[[18, Rocky, Dog, 3.0], [19, Total, null, 110.0]]", results.toString());
}
static String commonDDL = "CREATE FOREIGN TABLE Sheet1 (\n" +
" ROW_ID integer OPTIONS (SEARCHABLE 'All_Except_Like', \"teiid_excel:CELL_NUMBER\" 'ROW_ID'),\n" +
" FirstName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '7'),\n" +
" LastName string OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '8'),\n" +
" Age double OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '9'),\n" +
" \"time\" time OPTIONS (SEARCHABLE 'Unsearchable', \"teiid_excel:CELL_NUMBER\" '4'),\n" +
" CONSTRAINT PK0 PRIMARY KEY(ROW_ID)\n" +
") OPTIONS (\"teiid_excel:FILE\" 'names.xls', \"teiid_excel:FIRST_DATA_ROW_NUMBER\" '14');";
@Test
public void testExecutionEquals() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID=16");
assertEquals("[[Matt]]", results.toString());
}
@Test
public void testExecutionGT() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID>16");
assertEquals("[[Sarah], [Rocky], [Total]]", results.toString());
}
@Test
public void testExecutionGE() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID>=16");
assertEquals("[[Matt], [Sarah], [Rocky], [Total]]", results.toString());
}
@Test
public void testExecutionLT() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID < 16");
assertEquals("[[John], [Jane]]", results.toString());
}
@Test
public void testExecutionLE() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID <= 16");
assertEquals("[[John], [Jane], [Matt]]", results.toString());
}
@Test
public void testExecutionNE() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID != 16");
assertEquals("[[John], [Jane], [Sarah], [Rocky], [Total]]", results.toString());
}
@Test
public void testExecutionLimit() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 LIMIT 3,1");
assertEquals("[[Sarah]]", results.toString());
}
@Test
public void testExecutionLimit2() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 LIMIT 1");
assertEquals("[[John]]", results.toString());
}
@Test
public void testExecutionAnd() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID > 16 and ROW_ID < 18");
assertEquals("[[Sarah]]", results.toString());
}
@Test
public void testExecutionIN() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xls"));
ArrayList results = helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID IN (13, 18)");
assertEquals("[[John], [Total]]", results.toString());
}
@Test
public void testTime() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(UnitTestUtil.getTestDataFile("names.xlsx"));
ArrayList results = helpExecute(commonDDL, connection, "select \"time\" from Sheet1");
assertEquals("[[10:12:14]]", results.toString());
}
@Test(expected=TranslatorException.class)
public void testExecutionNoFile() throws Exception {
FileConnection connection = Mockito.mock(FileConnection.class);
Mockito.stub(connection.getFile("names.xls")).toReturn(new File("does not exist"));
helpExecute(commonDDL, connection, "select FirstName from Sheet1 WHERE ROW_ID != 16");
}
}