[Minor] Simplified GenericReport implementation

This commit is contained in:
Robert von Burg 2017-03-27 11:51:53 +02:00
parent 2bc76ca79b
commit 3935a425e0
2 changed files with 76 additions and 51 deletions

View File

@ -2,7 +2,6 @@ package li.strolch.report;
import static li.strolch.utils.helper.StringHelper.DASH; import static li.strolch.utils.helper.StringHelper.DASH;
import java.util.AbstractMap.SimpleImmutableEntry;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -11,7 +10,6 @@ import java.util.Set;
import java.util.stream.Collector; import java.util.stream.Collector;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
@ -63,6 +61,7 @@ public class GenericReport {
private Resource report; private Resource report;
private ParameterBag columnsBag; private ParameterBag columnsBag;
private Set<String> columnIds;
private StringParameter dateRangeSelP; private StringParameter dateRangeSelP;
private DateRange dateRange; private DateRange dateRange;
@ -78,6 +77,10 @@ public class GenericReport {
return this; return this;
} }
public Set<String> getColumnKeys() {
return this.columnIds;
}
public GenericReport filter(String type, String... ids) { public GenericReport filter(String type, String... ids) {
if (this.filtersByType == null) if (this.filtersByType == null)
this.filtersByType = new MapOfSets<>(); this.filtersByType = new MapOfSets<>();
@ -110,12 +113,21 @@ public class GenericReport {
// get the report // get the report
this.report = this.tx.getResourceBy(TYPE_REPORT, this.reportId); this.report = this.tx.getResourceBy(TYPE_REPORT, this.reportId);
this.columnsBag = this.report.getParameterBag(BAG_COLUMNS); this.columnsBag = this.report.getParameterBag(BAG_COLUMNS);
this.columnIds = this.columnsBag.getParameterKeySet();
this.dateRangeSelP = this.report.getParameter(BAG_PARAMETERS, PARAM_DATE_RANGE_SEL); this.dateRangeSelP = this.report.getParameter(BAG_PARAMETERS, PARAM_DATE_RANGE_SEL);
// query the main objects and return a stream // query the main objects and return a stream
return queryRows().map(e -> evaluateRow(e)).filter(e -> filter(e)); return queryRows().map(e -> evaluateRow(e)).filter(e -> filter(e));
} }
public Stream<ReportElement> doReport() {
return buildStream().map(e -> new ReportElement(getColumnKeys(), columnId -> {
StringParameter columnDefP = (StringParameter) this.columnsBag.getParameter(columnId);
return evaluateColumnValue(columnDefP, e);
}));
}
public MapOfSets<String, StrolchRootElement> generateFilterCriteria() { public MapOfSets<String, StrolchRootElement> generateFilterCriteria() {
return buildStream() // return buildStream() //
.flatMap(e -> e.values().stream()) // .flatMap(e -> e.values().stream()) //
@ -123,7 +135,7 @@ public class GenericReport {
Collector.of( // Collector.of( //
() -> new MapOfSets<String, StrolchRootElement>(), // () -> new MapOfSets<String, StrolchRootElement>(), //
(m, e) -> m.addElement(e.getType(), e), // (m, e) -> m.addElement(e.getType(), e), //
(m1, m2) -> m1, // (m1, m2) -> m1.addAll(m2), //
m -> m)); m -> m));
} }
@ -177,63 +189,46 @@ public class GenericReport {
public Stream<JsonObject> doReportAsJson() { public Stream<JsonObject> doReportAsJson() {
// generate the stream and map to JsonObject return doReport().map(e -> {
return buildStream().map(row -> { JsonObject o = new JsonObject();
e.stream().forEach(elem -> o.addProperty(elem.getKey(), elem.getValue()));
// new json object return o;
JsonObject jsonObject = new JsonObject();
// add columns
evaluateColumns(row).forEach(e -> jsonObject.addProperty(e.getKey(), e.getValue()));
return jsonObject;
}); });
} }
private Stream<SimpleImmutableEntry<String, String>> evaluateColumns(Map<String, StrolchRootElement> row) { private String evaluateColumnValue(StringParameter columnDefP, Map<String, StrolchRootElement> row) {
// get iterator to columns String columnDef = columnDefP.getValue();
Iterable<Parameter<?>> iterable = () -> this.columnsBag.getParameters().iterator(); String refType = columnDefP.getUom();
// generate a stream // get the referenced object
return StreamSupport.stream(iterable.spliterator(), false).map(p -> { StrolchRootElement column = row.get(refType);
// create the column id/value pair String columnValue;
StringParameter columnDefP = (StringParameter) p; if (column == null)
columnValue = DASH;
String columnId = columnDefP.getId(); else if (columnDef.equals(COL_ID)) {
String refType = columnDefP.getUom(); columnValue = column.getId();
String columnDef = columnDefP.getValue(); } else if (columnDef.equals(COL_NAME)) {
columnValue = column.getName();
// get the referenced object } else if (columnDef.equals(COL_TYPE)) {
StrolchRootElement column = row.get(refType); columnValue = column.getType();
} else if (columnDef.equals(COL_STATE)) {
String columnValue; columnValue = column.accept(new ElementStateVisitor()).name();
if (column == null) { } 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; columnValue = DASH;
} else if (columnDef.equals(COL_ID)) { else
columnValue = column.getId(); columnValue = parameter.getValueAsString();
} else if (columnDef.equals(COL_NAME)) { } else {
columnValue = column.getName(); columnValue = lookupParameter(columnDefP, column).getValueAsString();
} 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();
}
return new SimpleImmutableEntry<>(columnId, columnValue); return columnValue;
});
} }
private Parameter<?> findParameter(StringParameter columnDefP, StrolchRootElement column) { private Parameter<?> findParameter(StringParameter columnDefP, StrolchRootElement column) {

View File

@ -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<String> columnKeys;
private Function<String, String> columnGetter;
public ReportElement(Set<String> columnKeys, Function<String, String> columnGetter) {
super();
this.columnGetter = columnGetter;
this.columnKeys = columnKeys;
}
public Set<String> getColumnKeys() {
return this.columnKeys;
}
public String getColumn(String key) {
return this.columnGetter.apply(key);
}
public Stream<SimpleEntry<String, String>> stream() {
return this.columnKeys.stream().map(k -> new SimpleEntry<>(k, this.columnGetter.apply(k)));
}
}