From 3935a425e034914dedb933fb042b82f0adb57237 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Mon, 27 Mar 2017 11:51:53 +0200 Subject: [PATCH] [Minor] Simplified GenericReport implementation --- .../java/li/strolch/report/GenericReport.java | 97 +++++++++---------- .../java/li/strolch/report/ReportElement.java | 30 ++++++ 2 files changed, 76 insertions(+), 51 deletions(-) create mode 100644 li.strolch.service/src/main/java/li/strolch/report/ReportElement.java diff --git a/li.strolch.service/src/main/java/li/strolch/report/GenericReport.java b/li.strolch.service/src/main/java/li/strolch/report/GenericReport.java index 6d5c1800b..c386c4049 100644 --- a/li.strolch.service/src/main/java/li/strolch/report/GenericReport.java +++ b/li.strolch.service/src/main/java/li/strolch/report/GenericReport.java @@ -2,7 +2,6 @@ package li.strolch.report; import static li.strolch.utils.helper.StringHelper.DASH; -import java.util.AbstractMap.SimpleImmutableEntry; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -11,7 +10,6 @@ import java.util.Set; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.stream.StreamSupport; import com.google.gson.JsonObject; @@ -63,6 +61,7 @@ public class GenericReport { private Resource report; private ParameterBag columnsBag; + private Set columnIds; private StringParameter dateRangeSelP; private DateRange dateRange; @@ -78,6 +77,10 @@ public class GenericReport { return this; } + public Set getColumnKeys() { + return this.columnIds; + } + public GenericReport filter(String type, String... ids) { if (this.filtersByType == null) this.filtersByType = new MapOfSets<>(); @@ -110,12 +113,21 @@ public class GenericReport { // get the report this.report = this.tx.getResourceBy(TYPE_REPORT, this.reportId); this.columnsBag = this.report.getParameterBag(BAG_COLUMNS); + this.columnIds = this.columnsBag.getParameterKeySet(); this.dateRangeSelP = this.report.getParameter(BAG_PARAMETERS, PARAM_DATE_RANGE_SEL); // query the main objects and return a stream return queryRows().map(e -> evaluateRow(e)).filter(e -> filter(e)); } + public Stream doReport() { + + return buildStream().map(e -> new ReportElement(getColumnKeys(), columnId -> { + StringParameter columnDefP = (StringParameter) this.columnsBag.getParameter(columnId); + return evaluateColumnValue(columnDefP, e); + })); + } + public MapOfSets generateFilterCriteria() { return buildStream() // .flatMap(e -> e.values().stream()) // @@ -123,7 +135,7 @@ public class GenericReport { Collector.of( // () -> new MapOfSets(), // (m, e) -> m.addElement(e.getType(), e), // - (m1, m2) -> m1, // + (m1, m2) -> m1.addAll(m2), // m -> m)); } @@ -177,63 +189,46 @@ public class GenericReport { public Stream doReportAsJson() { - // generate the stream and map to JsonObject - return buildStream().map(row -> { - - // new json object - JsonObject jsonObject = new JsonObject(); - - // add columns - evaluateColumns(row).forEach(e -> jsonObject.addProperty(e.getKey(), e.getValue())); - - return jsonObject; + return doReport().map(e -> { + JsonObject o = new JsonObject(); + e.stream().forEach(elem -> o.addProperty(elem.getKey(), elem.getValue())); + return o; }); } - private Stream> evaluateColumns(Map row) { + private String evaluateColumnValue(StringParameter columnDefP, Map row) { - // get iterator to columns - Iterable> iterable = () -> this.columnsBag.getParameters().iterator(); + String columnDef = columnDefP.getValue(); + String refType = columnDefP.getUom(); - // generate a stream - return StreamSupport.stream(iterable.spliterator(), false).map(p -> { + // get the referenced object + StrolchRootElement column = row.get(refType); - // create the column id/value pair + String columnValue; - StringParameter columnDefP = (StringParameter) p; - - String columnId = columnDefP.getId(); - String refType = columnDefP.getUom(); - String columnDef = columnDefP.getValue(); - - // get the referenced object - StrolchRootElement column = row.get(refType); - - String columnValue; - if (column == null) { + if (column == null) + columnValue = DASH; + else if (columnDef.equals(COL_ID)) { + columnValue = column.getId(); + } else if (columnDef.equals(COL_NAME)) { + columnValue = column.getName(); + } else if (columnDef.equals(COL_TYPE)) { + columnValue = column.getType(); + } else if (columnDef.equals(COL_STATE)) { + columnValue = column.accept(new ElementStateVisitor()).name(); + } else if (columnDef.equals(COL_DATE)) { + columnValue = ISO8601FormatFactory.getInstance().formatDate(column.accept(new ElementDateVisitor())); + } else if (columnDef.startsWith(COL_SEARCH)) { + Parameter parameter = findParameter(columnDefP, column); + if (parameter == null) columnValue = DASH; - } else if (columnDef.equals(COL_ID)) { - columnValue = column.getId(); - } else if (columnDef.equals(COL_NAME)) { - columnValue = column.getName(); - } else if (columnDef.equals(COL_TYPE)) { - columnValue = column.getType(); - } else if (columnDef.equals(COL_STATE)) { - columnValue = column.accept(new ElementStateVisitor()).name(); - } else if (columnDef.equals(COL_DATE)) { - columnValue = ISO8601FormatFactory.getInstance().formatDate(column.accept(new ElementDateVisitor())); - } else if (columnDef.startsWith(COL_SEARCH)) { - Parameter parameter = findParameter(columnDefP, column); - if (parameter == null) - columnValue = DASH; - else - columnValue = parameter.getValueAsString(); - } else { - columnValue = lookupParameter(columnDefP, column).getValueAsString(); - } + else + columnValue = parameter.getValueAsString(); + } else { + columnValue = lookupParameter(columnDefP, column).getValueAsString(); + } - return new SimpleImmutableEntry<>(columnId, columnValue); - }); + return columnValue; } private Parameter findParameter(StringParameter columnDefP, StrolchRootElement column) { diff --git a/li.strolch.service/src/main/java/li/strolch/report/ReportElement.java b/li.strolch.service/src/main/java/li/strolch/report/ReportElement.java new file mode 100644 index 000000000..581387574 --- /dev/null +++ b/li.strolch.service/src/main/java/li/strolch/report/ReportElement.java @@ -0,0 +1,30 @@ +package li.strolch.report; + +import java.util.AbstractMap.SimpleEntry; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Stream; + +public class ReportElement { + + private Set columnKeys; + private Function columnGetter; + + public ReportElement(Set columnKeys, Function columnGetter) { + super(); + this.columnGetter = columnGetter; + this.columnKeys = columnKeys; + } + + public Set getColumnKeys() { + return this.columnKeys; + } + + public String getColumn(String key) { + return this.columnGetter.apply(key); + } + + public Stream> stream() { + return this.columnKeys.stream().map(k -> new SimpleEntry<>(k, this.columnGetter.apply(k))); + } +}