This is an automated email from the ASF dual-hosted git repository. sgoeschl pushed a commit to branch FREEMARKER-144 in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit 1de16359559c2b35b252541236f2e7667ba2e3e5 Author: Siegfried Goeschl <[email protected]> AuthorDate: Wed Jun 17 18:47:06 2020 +0200 FREEMARKER-144 Proof Of Concept for providing DataFrames --- .../freemarker/generator/base/table/Table.java | 59 ++++++++++++---------- .../freemarker/generator/table/TableTest.java | 6 +-- .../templates/excel/dataframe/transform.ftl | 2 +- .../generator/tools/dataframe/DataFrameTool.java | 7 +-- .../tools/dataframe/converter/ListConverter.java | 2 +- .../tools/dataframe/DataFrameToolTest.java | 2 +- 6 files changed, 42 insertions(+), 36 deletions(-) diff --git a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/table/Table.java b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/table/Table.java index 7cf7a3e..966f395 100644 --- a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/table/Table.java +++ b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/table/Table.java @@ -25,10 +25,11 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static java.util.Collections.emptyList; import static java.util.Objects.requireNonNull; /** - * Simple table model filled from maps or lists representing tabular data. + * Simple table model filled from maps or rows representing tabular data. */ public class Table { @@ -41,13 +42,13 @@ public class Table { /** Table data as rows */ private final List<List<Object>> values; - /** Map column names to numeric column values */ + /** Map column names to column index */ private final Map<String, Integer> columnMap; private Table() { - this.columnNames = new ArrayList<>(); - this.columnTypes = new ArrayList<>(); - this.values = new ArrayList<>(); + this.columnNames = emptyList(); + this.columnTypes = emptyList(); + this.values = emptyList(); this.columnMap = new HashMap<>(); } @@ -55,11 +56,7 @@ public class Table { this.columnNames = new ArrayList<>(requireNonNull(columnNames)); this.columnTypes = new ArrayList<>(requireNonNull(columnTypes)); this.values = ListUtils.transpose(requireNonNull(columnValuesList)); - - this.columnMap = new HashMap<>(); - for (int i = 0; i < this.columnNames.size(); i++) { - this.columnMap.put(this.columnNames.get(i), i); - } + this.columnMap = columnMap(this.columnNames); } public List<String> getColumnNames() { @@ -127,15 +124,15 @@ public class Table { } /** - * Create a table from a list of lists representing tabular data. + * Create a table from a list of rows representing tabular data. * - * @param lists row values as lists + * @param rows row values * @return table */ - public static Table fromLists(List<List<Object>> lists) { - requireNonNull(lists, "lists is null"); + public static Table fromRows(List<List<Object>> rows) { + requireNonNull(rows, "rows is null"); - final List<List<Object>> columnValuesList = ListUtils.transpose(lists); + final List<List<Object>> columnValuesList = ListUtils.transpose(rows); final List<Class<?>> columnTypes = columnTypes(columnValuesList); return new Table( @@ -145,24 +142,24 @@ public class Table { } /** - * Create a table from a list of lists representing tabular data + * Create a table from a list of rows representing tabular data * where the first row may consists of column headers. * - * @param lists row values as lists + * @param rows row values * @param withFirstRowAsColumnNames column names as first row? * @return table */ - public static Table fromLists(List<List<Object>> lists, boolean withFirstRowAsColumnNames) { - if (ListUtils.isNullOrEmpty(lists) && withFirstRowAsColumnNames) { + public static Table fromRows(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { + if (ListUtils.isNullOrEmpty(rows) && withFirstRowAsColumnNames) { throw new IllegalArgumentException("Header columns expected but list is empty"); } if (withFirstRowAsColumnNames) { - final List<String> columnNames = columnNames(lists.get(0)); - final List<List<Object>> table = lists.subList(1, lists.size()); - return fromLists(columnNames, table); + final List<String> columnNames = columnNames(rows.get(0)); + final List<List<Object>> table = rows.subList(1, rows.size()); + return fromRows(columnNames, table); } else { - return fromLists(lists); + return fromRows(rows); } } @@ -170,14 +167,14 @@ public class Table { * Create a table from column names and row values. * * @param columnNames list of column names - * @param lists row values as lists + * @param rows row values as rows * @return table */ - public static Table fromLists(Collection<String> columnNames, List<List<Object>> lists) { + public static Table fromRows(Collection<String> columnNames, List<List<Object>> rows) { requireNonNull(columnNames, "columnNames is null"); - requireNonNull(lists, "lists is null"); + requireNonNull(rows, "rows is null"); - final List<List<Object>> columnValuesList = ListUtils.transpose(lists); + final List<List<Object>> columnValuesList = ListUtils.transpose(rows); final List<Class<?>> columnTypes = columnTypes(columnValuesList); return new Table( @@ -259,4 +256,12 @@ public class Table { private static Class<?> columnType(List<Object> columnValues) { return ListUtils.coalesce(columnValues).getClass(); } + + private static Map<String, Integer> columnMap(List<String> columnNames) { + final Map<String, Integer> result = new HashMap<>(); + for (int i = 0; i < columnNames.size(); i++) { + result.put(columnNames.get(i), i); + } + return result; + } } diff --git a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/table/TableTest.java b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/table/TableTest.java index 695e140..bd44efc 100644 --- a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/table/TableTest.java +++ b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/table/TableTest.java @@ -97,7 +97,7 @@ public class TableTest { @Test public void shouldConvertFromListsWithExplicitHeaders() { - final Table table = Table.fromLists(booksHeader, booksList); + final Table table = Table.fromRows(booksHeader, booksList); validateBooks(table); assertEquals(booksHeader, table.getColumnNames()); @@ -105,7 +105,7 @@ public class TableTest { @Test public void shouldConvertFromListsWithImplicitHeaders() { - final Table table = Table.fromLists(booksListWithHeaders, true); + final Table table = Table.fromRows(booksListWithHeaders, true); validateBooks(table); assertEquals(booksHeader, table.getColumnNames()); @@ -113,7 +113,7 @@ public class TableTest { @Test public void shouldConvertFromListsWithEmptyHeaders() { - final Table table = Table.fromLists(booksList); + final Table table = Table.fromRows(booksList); validateBooks(table); } diff --git a/freemarker-generator-cli/templates/excel/dataframe/transform.ftl b/freemarker-generator-cli/templates/excel/dataframe/transform.ftl index 46eb8d5..78540ef 100644 --- a/freemarker-generator-cli/templates/excel/dataframe/transform.ftl +++ b/freemarker-generator-cli/templates/excel/dataframe/transform.ftl @@ -29,7 +29,7 @@ <#assign sheets = ExcelTool.getSheets(workbook)> <#list sheets as sheet> <#assign table = ExcelTool.toTable(sheet)> - <#assign df = DataFrameTool.fromLists(table, true)> + <#assign df = DataFrameTool.fromRows(table, true)> ${DataFrameTool.print(df)}<#t> </#list> </#macro> diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java index 49a7cba..5441861 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/DataFrameTool.java @@ -27,6 +27,7 @@ import org.apache.freemarker.generator.tools.dataframe.converter.ListConverter; import org.apache.freemarker.generator.tools.dataframe.converter.MapConverter; import java.io.StringWriter; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -34,7 +35,7 @@ import java.util.Map; import static de.unknownreality.dataframe.DataFrameWriter.DEFAULT_PRINT_FORMAT; /** - * Create and manipulate data frame (tabular data structure). Data frames allow + * Create and manipulate data frames (tabular data structure). Data frames allow * easy manipulation and transformation of data, e.g. joining two data frames. * For more information see <a href="https://github.com/nRo/DataFrame">nRo/DataFrame</a>. */ @@ -56,7 +57,7 @@ public class DataFrameTool { * @param maps maps to build the data frame * @return data frame */ - public DataFrame fromMaps(List<Map<String, Object>> maps) { + public DataFrame fromMaps(Collection<Map<String, Object>> maps) { return MapConverter.toDataFrame(maps); } @@ -67,7 +68,7 @@ public class DataFrameTool { * @param withFirstRowAsColumnNames column names as first row? * @return data frame */ - public DataFrame fromLists(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { + public DataFrame fromRows(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { return ListConverter.toDataFrame(rows, withFirstRowAsColumnNames); } diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ListConverter.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ListConverter.java index c3e0dff..af96cf1 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ListConverter.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ListConverter.java @@ -15,7 +15,7 @@ public class ListConverter { * @return <code>DataFrame</code> */ public static DataFrame toDataFrame(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { - final Table table = Table.fromLists(rows, withFirstRowAsColumnNames); + final Table table = Table.fromRows(rows, withFirstRowAsColumnNames); return ConverterUtils.toDataFrame(table); } } diff --git a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java index 8076cbb..6965064 100644 --- a/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java +++ b/freemarker-generator-tools/src/test/java/org/apache/freemarker/generator/tools/dataframe/DataFrameToolTest.java @@ -116,7 +116,7 @@ public class DataFrameToolTest { final Workbook workbook = excelTool.parse(DataSourceFactory.create("./src/test/data/excel/test.xls")); final List<List<Object>> sheet = excelTool.toTable(workbook.getSheetAt(0)); - final DataFrame dataFrame = dataFrameTool().fromLists(sheet, true); + final DataFrame dataFrame = dataFrameTool().fromRows(sheet, true); assertEquals(7, dataFrame.getColumns().size()); assertEquals(2, dataFrame.getRows().size());
