rdblue commented on code in PR #6622: URL: https://github.com/apache/iceberg/pull/6622#discussion_r1109166870
########## api/src/main/java/org/apache/iceberg/expressions/BoundAggregate.java: ########## @@ -44,4 +63,109 @@ public Type type() { return term().type(); } } + + public String columnName() { + if (op() == Operation.COUNT_STAR) { + return "*"; + } else { + return ref().name(); + } + } + + public String describe() { + switch (op()) { + case COUNT_STAR: + return "count(*)"; + case COUNT: + return "count(" + ExpressionUtil.describe(term()) + ")"; + case MAX: + return "max(" + ExpressionUtil.describe(term()) + ")"; + case MIN: + return "min(" + ExpressionUtil.describe(term()) + ")"; + default: + throw new UnsupportedOperationException("Unsupported aggregate type: " + op()); + } + } + + <V> V safeGet(Map<Integer, V> map, int key) { + return safeGet(map, key, null); + } + + <V> V safeGet(Map<Integer, V> map, int key, V defaultValue) { + if (map != null) { + return map.getOrDefault(key, defaultValue); + } + + return null; + } + + interface Aggregator<R> { + void update(StructLike struct); + + void update(DataFile file); + + boolean hasValue(DataFile file); + + R result(); + + boolean isValid(); + } + + abstract static class NullSafeAggregator<T, R> implements Aggregator<R> { + private final BoundAggregate<T, R> aggregate; + private boolean isValid = true; + + NullSafeAggregator(BoundAggregate<T, R> aggregate) { + this.aggregate = aggregate; + } + + protected abstract void update(R value); + + protected abstract R current(); + + @Override + public void update(StructLike struct) { + if (isValid) { + R value = aggregate.eval(struct); + if (value != null) { + update(value); + } else { + this.isValid = false; Review Comment: I don't think this is quite correct. A null value is a valid value if it comes from a struct, but it should be skipped rather than passing it into `update` because min/max/count skip null values. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org For additional commands, e-mail: issues-h...@iceberg.apache.org