You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by sg...@apache.org on 2020/06/14 20:51:53 UTC
[freemarker-generator] 04/04: FREEMARKER-144 Proof Of Concept for
providing DataFrames
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 <si...@gmail.com>
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));
}