[Minor] Extended GenericReport to allow overriding column value extraction

This commit is contained in:
Robert von Burg 2023-03-20 10:42:46 +01:00
parent 358c37b9eb
commit d1007371d0
Signed by: eitch
GPG Key ID: 75DB9C85C74331F7
2 changed files with 40 additions and 34 deletions

View File

@ -11,7 +11,6 @@ public class ReportElement {
private final Function<String, String> columnGetter; private final Function<String, String> columnGetter;
public ReportElement(List<String> columnKeys, Function<String, String> columnGetter) { public ReportElement(List<String> columnKeys, Function<String, String> columnGetter) {
super();
this.columnGetter = columnGetter; this.columnGetter = columnGetter;
this.columnKeys = columnKeys; this.columnKeys = columnKeys;
} }

View File

@ -142,7 +142,9 @@ public class GenericReport extends ReportPolicy {
if (this.reportRes.hasParameterBag(BAG_ORDERING)) { if (this.reportRes.hasParameterBag(BAG_ORDERING)) {
ParameterBag orderingBag = this.reportRes.getParameterBag(BAG_ORDERING, true); ParameterBag orderingBag = this.reportRes.getParameterBag(BAG_ORDERING, true);
if (orderingBag.hasParameters()) { if (orderingBag.hasParameters()) {
this.orderingParams = orderingBag.getParameters().stream().map(e -> (StringParameter) e) this.orderingParams = orderingBag.getParameters()
.stream()
.map(e -> (StringParameter) e)
.collect(toList()); .collect(toList());
this.orderingParams.sort(comparingInt(AbstractParameter::getIndex)); this.orderingParams.sort(comparingInt(AbstractParameter::getIndex));
} }
@ -493,17 +495,24 @@ public class GenericReport extends ReportPolicy {
*/ */
@Override @Override
public Stream<ReportElement> doReport() { public Stream<ReportElement> doReport() {
return buildStream().map(e -> new ReportElement(this.columnIds, columnId -> { return buildStream().map(e -> new ReportElement(this.columnIds, columnId -> formatColumn(e, columnId)));
StringParameter columnDefP = this.columnsBag.getParameter(columnId, true); }
Object value = evaluateColumnValue(columnDefP, e, false);
if (value instanceof ZonedDateTime) protected String formatColumn(Map<String, StrolchRootElement> row, String columnId) {
return ISO8601.toString((ZonedDateTime) value); StringParameter columnDefP = this.columnsBag.getParameter(columnId, true);
if (value instanceof Date) Object value = evaluateColumnValue(columnDefP, row, false);
return ISO8601.toString((Date) value); if (value instanceof ZonedDateTime) {
if (value instanceof Parameter) return ISO8601.toString((ZonedDateTime) value);
return ((Parameter<?>) value).getValueAsString(); } else if (value instanceof Date) {
return ISO8601.toString((Date) value);
} else if (value instanceof Parameter) {
return formatColumn((Parameter<?>) value);
} else
return value.toString(); return value.toString();
})); }
protected String formatColumn(Parameter<?> param) {
return param.getValueAsString();
} }
@Override @Override
@ -584,20 +593,14 @@ public class GenericReport extends ReportPolicy {
if (!this.directCriteria.contains(type)) if (!this.directCriteria.contains(type))
return; return;
StringParameter filterCriteriaP = this.filterCriteriaParams.get(type); StringParameter filterCriteriaP = this.filterCriteriaParams.get(type);
Stream<? extends StrolchRootElement> stream; Stream<? extends StrolchRootElement> stream = switch (filterCriteriaP.getInterpretation()) {
switch (filterCriteriaP.getInterpretation()) { case INTERPRETATION_RESOURCE_REF -> tx().streamResources(filterCriteriaP.getUom());
case INTERPRETATION_RESOURCE_REF: case INTERPRETATION_ORDER_REF -> tx().streamOrders(filterCriteriaP.getUom());
stream = tx().streamResources(filterCriteriaP.getUom()); case INTERPRETATION_ACTIVITY_REF -> tx().streamActivities(filterCriteriaP.getUom());
break; default -> throw new IllegalArgumentException(
case INTERPRETATION_ORDER_REF: "Unhandled filter criteria interpretation " + filterCriteriaP.getInterpretation() + " for "
stream = tx().streamOrders(filterCriteriaP.getUom()); + filterCriteriaP.getLocator());
break; };
case INTERPRETATION_ACTIVITY_REF:
stream = tx().streamActivities(filterCriteriaP.getUom());
break;
default:
throw new IllegalArgumentException("Unhandled element type " + filterCriteriaP.getInterpretation());
}
stream = stream.map(this::mapFilterCriteria).filter(this::filterDirectCriteria); stream = stream.map(this::mapFilterCriteria).filter(this::filterDirectCriteria);
@ -628,8 +631,10 @@ public class GenericReport extends ReportPolicy {
} }
// stop if we have enough data // stop if we have enough data
if (result.stream().filter(e -> !this.directCriteria.contains(e.getKey())) if (result.stream()
.mapToInt(e -> e.getValue().size()).allMatch(v -> v >= maxFacetValues)) .filter(e -> !this.directCriteria.contains(e.getKey()))
.mapToInt(e -> e.getValue().size())
.allMatch(v -> v >= maxFacetValues))
break; break;
} }
@ -705,8 +710,8 @@ public class GenericReport extends ReportPolicy {
} }
/** /**
* Implements a sorting of the given two rows. This implementation using the ordering as is defined in {@link * Implements a sorting of the given two rows. This implementation using the ordering as is defined in
* ReportConstants#BAG_ORDERING} * {@link ReportConstants#BAG_ORDERING}
* *
* @param row1 * @param row1
* the left side * the left side
@ -767,8 +772,8 @@ public class GenericReport extends ReportPolicy {
} }
/** /**
* Returns true if a filter is defined, i.e. {@link ParameterBag ParameterBags} of type {@link * Returns true if a filter is defined, i.e. {@link ParameterBag ParameterBags} of type
* ReportConstants#TYPE_FILTER}, a date range * {@link ReportConstants#TYPE_FILTER}, a date range
* *
* @return true if a filter is defined * @return true if a filter is defined
*/ */
@ -934,7 +939,7 @@ public class GenericReport extends ReportPolicy {
columnValue = parameter; columnValue = parameter;
} else { } else {
columnValue = lookupParameter(columnDefP, column, allowNull) // columnValue = lookupParameter(columnDefP, column, allowNull) //
.orElseGet(() -> allowNull ? null : new StringParameter()); .orElseGet(() -> allowNull ? null : new StringParameter(columnDefP.getValue(), columnDef, ""));
} }
return columnValue; return columnValue;
@ -1129,7 +1134,9 @@ public class GenericReport extends ReportPolicy {
+ dependency.getLocator() + " has no ParameterBag " + BAG_RELATIONS); + dependency.getLocator() + " has no ParameterBag " + BAG_RELATIONS);
List<Parameter<?>> relationParams = relationsBag.getParametersByInterpretationAndUom(interpretation, joinType) List<Parameter<?>> relationParams = relationsBag.getParametersByInterpretationAndUom(interpretation, joinType)
.stream().filter(p -> p.getValueType() == StrolchValueType.STRING).collect(toList()); .stream()
.filter(p -> p.getValueType() == StrolchValueType.STRING)
.collect(toList());
if (relationParams.isEmpty()) if (relationParams.isEmpty())
throw new IllegalStateException("Found no relation parameters with UOM " + joinType + " of type " throw new IllegalStateException("Found no relation parameters with UOM " + joinType + " of type "