[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 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<String> columnIds;
private StringParameter dateRangeSelP;
private DateRange dateRange;
@ -78,6 +77,10 @@ public class GenericReport {
return this;
}
public Set<String> 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<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() {
return buildStream() //
.flatMap(e -> e.values().stream()) //
@ -123,7 +135,7 @@ public class GenericReport {
Collector.of( //
() -> new MapOfSets<String, StrolchRootElement>(), //
(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<JsonObject> 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<SimpleImmutableEntry<String, String>> evaluateColumns(Map<String, StrolchRootElement> row) {
private String evaluateColumnValue(StringParameter columnDefP, Map<String, StrolchRootElement> row) {
// get iterator to columns
Iterable<Parameter<?>> 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) {

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)));
}
}