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 0e092125ac7f60f18c8de9396dea5f46490d25d1 Author: Siegfried Goeschl <[email protected]> AuthorDate: Sun Jun 14 22:50:27 2020 +0200 FREEMARKER-144 Proof Of Concept for providing DataFrames --- .../freemarker/generator/cli/ManualTest.java | 4 +-- .../templates/dataframe/example.ftl | 6 +++- .../generator/tools/dataframe/DataFrameTool.java | 34 +++++++--------------- .../tools/dataframe/converter/CSVConverter.java | 13 +-------- .../tools/dataframe/converter/ConverterUtils.java | 32 ++++++++------------ .../tools/dataframe/converter/ListConverter.java | 10 +++---- .../tools/dataframe/converter/MapConverter.java | 4 --- .../tools/dataframe/DataFrameToolTest.java | 12 +++++++- 8 files changed, 47 insertions(+), 68 deletions(-) diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index 9fc8d49..ab9ceb9 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -48,8 +48,8 @@ public class ManualTest { // private static final String CMD = "-b ./src/test -t templates/demo.ftl -m env=./site/sample/properties/user_0001/user.properties"; // private static final String CMD = "-b ./src/test -t templates/demo.ftl -m ./site/sample/properties/user_0001/user.properties"; // private static final String CMD = "-b ./src/test --data-model post=https://jsonplaceholder.typicode.com/posts/2 -t templates/info.ftl"; - // private static final String CMD = "-DCSV_TOOL_DELIMITER=SEMICOLON -DCSV_TOOL_HEADERS=true -b ./src/test -t templates/dataframe/example.ftl https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv"; - private static final String CMD = "-b ./src/test -t site/template/ -m nginx.yaml"; + private static final String CMD = "-DCSV_TOOL_DELIMITER=SEMICOLON -DCSV_TOOL_HEADERS=true -b ./src/test -t templates/dataframe/example.ftl https://raw.githubusercontent.com/nRo/DataFrame/master/src/test/resources/users.csv"; + // private static final String CMD = "-b ./src/test -t site/template/ -m nginx.yaml"; public static void main(String[] args) { diff --git a/freemarker-generator-cli/templates/dataframe/example.ftl b/freemarker-generator-cli/templates/dataframe/example.ftl index 0ac3193..54d0ac2 100644 --- a/freemarker-generator-cli/templates/dataframe/example.ftl +++ b/freemarker-generator-cli/templates/dataframe/example.ftl @@ -22,6 +22,10 @@ Original Data ============================================================================= ${DataFrameTool.print(users)} +Select By Age +============================================================================= +${DataFrameTool.print(users.select("(age > 40)"))} + Select By Name & Country ============================================================================= <#assign country = "Germany"> @@ -39,6 +43,6 @@ ${DataFrameTool.print(users.getColumn("country").transform(DataFrameTool.transfo Group By Age & Country ============================================================================= -${DataFrameTool.print(users.groupBy("age", "country").sort("age"))} +${DataFrameTool.print(users.groupBy("country", "age").sort("country"))} 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 695cd04..0b75936 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 @@ -18,23 +18,21 @@ package org.apache.freemarker.generator.tools.dataframe; import de.unknownreality.dataframe.DataFrame; import de.unknownreality.dataframe.DataFrameWriter; +import de.unknownreality.dataframe.print.Printer; +import de.unknownreality.dataframe.print.PrinterBuilder; import de.unknownreality.dataframe.sort.SortColumn.Direction; import de.unknownreality.dataframe.transform.ColumnDataFrameTransform; import de.unknownreality.dataframe.transform.CountTransformer; import org.apache.commons.csv.CSVParser; -import org.apache.freemarker.generator.base.util.Validate; import org.apache.freemarker.generator.tools.dataframe.converter.CSVConverter; import org.apache.freemarker.generator.tools.dataframe.converter.ListConverter; import org.apache.freemarker.generator.tools.dataframe.converter.MapConverter; -import java.io.Writer; +import java.io.StringWriter; import java.util.HashMap; import java.util.List; import java.util.Map; -import static java.util.Objects.requireNonNull; -import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FREEMARKER_WRITER; - /** * Create and manipulate data frame (tabular data structure). Data frames allow * easy manipulation and transformation of data, e.g. joining two data frames. @@ -42,18 +40,6 @@ import static org.apache.freemarker.generator.base.FreeMarkerConstants.Model.FRE */ public class DataFrameTool { - /** Underlying FreeMarker writer for rendering templates */ - private final Writer writer; - - public DataFrameTool() { - this.writer = null; - } - - public DataFrameTool(Map<String, Object> settings) { - requireNonNull(settings); - this.writer = (Writer) settings.getOrDefault(FREEMARKER_WRITER, null); - } - /** * Create a data frame from Apache Commons CSVParser. * @@ -77,12 +63,12 @@ public class DataFrameTool { /** * Create a data frame from a list of rows. * - * @param lists lists to build the data frame from + * @param rows rows to build the data frame from * @param withFirstRowAsColumnNames column names as first row? * @return data frame */ - public DataFrame fromLists(List<List<Object>> lists, boolean withFirstRowAsColumnNames) { - return ListConverter.toDataFrame(lists, withFirstRowAsColumnNames); + public DataFrame fromLists(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { + return ListConverter.toDataFrame(rows, withFirstRowAsColumnNames); } /** @@ -113,9 +99,11 @@ public class DataFrameTool { * * @param dataFrame data frame */ - public void print(DataFrame dataFrame) { - Validate.notNull(writer, "No writer available"); - DataFrameWriter.write(writer, dataFrame, DataFrameWriter.DEFAULT_PRINT_FORMAT); + public String print(DataFrame dataFrame) { + final StringWriter writer = new StringWriter(); + final Printer printer = PrinterBuilder.create().withAutoWidth(dataFrame.getHeader()).build(); + DataFrameWriter.write(writer, dataFrame, printer); + return writer.toString(); } @Override diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/CSVConverter.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/CSVConverter.java index 06863fb..7b5a3d1 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/CSVConverter.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/CSVConverter.java @@ -28,7 +28,7 @@ public class CSVConverter { headerNames.forEach(builder::addStringColumn); } else { for (int i = 0; i < firstRecord.size(); i++) { - builder.addStringColumn(getAlphaColumnName(i + 1)); + builder.addStringColumn(ConverterUtils.getAlphaColumnName(i + 1)); } } @@ -49,15 +49,4 @@ public class CSVConverter { } } - private static String getAlphaColumnName(int num) { - String result = ""; - while (num > 0) { - num--; // 1 => a, not 0 => a - final int remainder = num % 26; - final char digit = (char) (remainder + 65); - result = digit + result; - num = (num - remainder) / 26; - } - return result; - } } diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ConverterUtils.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ConverterUtils.java index 9a1e4fb..c6d05af 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ConverterUtils.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/ConverterUtils.java @@ -13,6 +13,18 @@ public class ConverterUtils { return appendValues(dataFrame, table); } + static String getAlphaColumnName(int num) { + String result = ""; + while (num > 0) { + num--; // 1 => a, not 0 => a + final int remainder = num % 26; + final char digit = (char) (remainder + 65); + result = digit + result; + num = (num - remainder) / 26; + } + return result; + } + private static DataFrameBuilder addColumn(DataFrameBuilder builder, String name, Class<?> clazz) { switch (clazz.getName()) { case "java.lang.Boolean": @@ -51,14 +63,6 @@ public class ConverterUtils { return comparables; } - private static Comparable<?>[] toComparables(Object[] values) { - final Comparable<?>[] comparables = new Comparable<?>[values.length]; - for (int i = 0; i < values.length; i++) { - comparables[i] = (Comparable<?>) values[i]; - } - return comparables; - } - /** * Create a <code>DataFrame</code> from a table. * @@ -91,16 +95,4 @@ public class ConverterUtils { } return dataFrame; } - - private static String getAlphaColumnName(int num) { - String result = ""; - while (num > 0) { - num--; // 1 => a, not 0 => a - final int remainder = num % 26; - final char digit = (char) (remainder + 65); - result = digit + result; - num = (num - remainder) / 26; - } - return result; - } } 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 95bc6bf..c3e0dff 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 @@ -8,14 +8,14 @@ import java.util.List; public class ListConverter { /** - * Create a data frame from a list of lists. It is assumed - * that the lists represent tabular data. + * Create a data frame from a list of rows. It is assumed + * that the rows represent tabular data. * - * @param lists lists to build the data frame + * @param rows rows to build the data frame * @return <code>DataFrame</code> */ - public static DataFrame toDataFrame(List<List<Object>> lists, boolean withFirstRowAsColumnNames) { - final Table table = Table.fromLists(lists, withFirstRowAsColumnNames); + public static DataFrame toDataFrame(List<List<Object>> rows, boolean withFirstRowAsColumnNames) { + final Table table = Table.fromLists(rows, withFirstRowAsColumnNames); return ConverterUtils.toDataFrame(table); } } diff --git a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/MapConverter.java b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/MapConverter.java index e96d938..5970920 100644 --- a/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/MapConverter.java +++ b/freemarker-generator-tools/src/main/java/org/apache/freemarker/generator/tools/dataframe/converter/MapConverter.java @@ -29,10 +29,6 @@ public class MapConverter { * @return <code>DataFrame</code> */ public static DataFrame toDataFrame(List<Map<String, Object>> maps) { - if (maps == null || maps.isEmpty()) { - return DataFrameBuilder.createDefault(); - } - final Table table = Table.fromMaps(maps); 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 8c93dd3..8076cbb 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 @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import static junit.framework.TestCase.assertEquals; +import static junit.framework.TestCase.assertNotNull; import static org.apache.commons.csv.CSVFormat.DEFAULT; public class DataFrameToolTest { @@ -117,7 +118,16 @@ public class DataFrameToolTest { final DataFrame dataFrame = dataFrameTool().fromLists(sheet, true); - return; + assertEquals(7, dataFrame.getColumns().size()); + assertEquals(2, dataFrame.getRows().size()); + assertNotNull(dataFrame.getColumn("Text")); + assertNotNull(dataFrame.getColumn("Date")); + assertNotNull(dataFrame.getColumn("Number")); + assertNotNull(dataFrame.getColumn("Time")); + assertNotNull(dataFrame.getColumn("Percentage")); + assertNotNull(dataFrame.getColumn("Forumula")); + assertEquals("Row 1", dataFrame.getValue(0,0)); + assertEquals("C3*F3", dataFrame.getColumn("Forumula").get(1)); }
