32#include "iceberg/result.h"
45 const std::shared_ptr<T>& term()
const {
return term_; }
47 std::string ToString()
const override;
50 Aggregate(Expression::Operation op, std::shared_ptr<T> term)
51 : operation_(op), term_(
std::move(term)) {}
53 static constexpr bool IsSupportedOp(Expression::Operation op) {
54 return op == Expression::Operation::kCount ||
55 op == Expression::Operation::kCountNull ||
56 op == Expression::Operation::kCountStar || op == Expression::Operation::kMax ||
57 op == Expression::Operation::kMin;
60 Expression::Operation operation_;
61 std::shared_ptr<T> term_;
70 bool is_unbound_aggregate()
const override {
return true; }
77 using BASE = Aggregate<UnboundTerm<B>>;
80 static Result<std::shared_ptr<UnboundAggregateImpl<B>>> Make(
83 std::shared_ptr<NamedReference>
reference()
override {
84 return BASE::term() ? BASE::term()->reference() :
nullptr;
87 Result<std::shared_ptr<Expression>> Bind(
const Schema& schema,
88 bool case_sensitive)
const override;
92 : BASE(op,
std::move(term)) {
93 ICEBERG_DCHECK(BASE::IsSupportedOp(op),
"Unexpected aggregate operation");
94 ICEBERG_DCHECK(op == Expression::Operation::kCountStar || BASE::term() !=
nullptr,
95 "Aggregate term cannot be null except for COUNT(*)");
110 virtual Status Update(
const StructLike& data) = 0;
112 virtual Status Update(
const DataFile& file) = 0;
125 ICEBERG_DCHECK(term() !=
nullptr || op() == Expression::Operation::kCountStar,
126 "Bound aggregate term should not be null except for COUNT(*)");
127 return term() ? term()->reference() :
nullptr;
132 virtual Result<Literal> Evaluate(
const DataFile& file)
const = 0;
137 bool is_bound_aggregate()
const override {
return true; }
151 Result<Literal> Evaluate(
const StructLike& data)
const override;
152 Result<Literal> Evaluate(
const DataFile& file)
const override;
154 std::unique_ptr<Aggregator> NewAggregator()
const override;
169 static Result<std::unique_ptr<CountNonNullAggregate>> Make(
170 std::shared_ptr<BoundTerm> term);
172 Result<int64_t> CountFor(
const StructLike& data)
const override;
173 Result<int64_t> CountFor(
const DataFile& file)
const override;
174 bool HasValue(
const DataFile& file)
const override;
183 static Result<std::unique_ptr<CountNullAggregate>> Make(
184 std::shared_ptr<BoundTerm> term);
186 Result<int64_t> CountFor(
const StructLike& data)
const override;
187 Result<int64_t> CountFor(
const DataFile& file)
const override;
188 bool HasValue(
const DataFile& file)
const override;
197 static Result<std::unique_ptr<CountStarAggregate>> Make();
199 Result<int64_t> CountFor(
const StructLike& data)
const override;
200 Result<int64_t> CountFor(
const DataFile& file)
const override;
201 bool HasValue(
const DataFile& file)
const override;
210 static Result<std::unique_ptr<MaxAggregate>> Make(std::shared_ptr<BoundTerm> term);
212 Result<Literal> Evaluate(
const StructLike& data)
const override;
213 Result<Literal> Evaluate(
const DataFile& file)
const override;
214 bool HasValue(
const DataFile& file)
const override;
216 std::unique_ptr<Aggregator> NewAggregator()
const override;
225 static Result<std::unique_ptr<MinAggregate>> Make(std::shared_ptr<BoundTerm> term);
227 Result<Literal> Evaluate(
const StructLike& data)
const override;
228 Result<Literal> Evaluate(
const DataFile& file)
const override;
229 bool HasValue(
const DataFile& file)
const override;
231 std::unique_ptr<Aggregator> NewAggregator()
const override;
244 static Result<std::unique_ptr<AggregateEvaluator>> Make(
245 std::shared_ptr<BoundAggregate> aggregate);
250 static Result<std::unique_ptr<AggregateEvaluator>> Make(
251 std::vector<std::shared_ptr<BoundAggregate>> aggregates);
260 virtual Result<std::span<const Literal>>
GetResults()
const = 0;
Evaluates bound aggregates over StructLike data.
Definition aggregate.h:238
virtual Status Update(const DataFile &file)=0
Update aggregates using data file metrics.
virtual Result< Literal > GetResult() const =0
Convenience accessor when only one aggregate is evaluated.
virtual Status Update(const StructLike &data)=0
Update aggregates with a row.
virtual Result< std::span< const Literal > > GetResults() const =0
Final aggregated value.
virtual bool AllAggregatorsValid() const =0
Whether all aggregators are still valid (metrics present).
Base aggregate holding an operation and a term.
Definition aggregate.h:39
Expression::Operation op() const override
Returns the operation for an expression node.
Definition aggregate.h:43
Base class for aggregators.
Definition aggregate.h:106
virtual bool IsValid() const =0
Whether the aggregator is still valid.
virtual Literal GetResult() const =0
Get the result of the aggregation.
Base class for bound aggregates.
Definition aggregate.h:100
virtual std::unique_ptr< Aggregator > NewAggregator() const =0
Create a new aggregator for this aggregate.
virtual bool HasValue(const DataFile &file) const =0
Whether metrics in the data file are sufficient to evaluate.
std::shared_ptr< BoundReference > reference() override
Returns the underlying bound reference for this term.
Definition aggregate.h:124
Result< Literal > Evaluate(const StructLike &data) const override=0
Evaluate this expression against a row-based data.
Base class for bound terms.
Definition term.h:64
Interface for bound expressions that can be evaluated.
Definition expression.h:360
Base class for COUNT aggregates.
Definition aggregate.h:149
virtual Result< int64_t > CountFor(const StructLike &data) const =0
Count for a single row. Subclasses implement this.
virtual Result< int64_t > CountFor(const DataFile &file) const =0
Count using metrics from a data file.
COUNT(term) aggregate.
Definition aggregate.h:167
COUNT_NULL(term) aggregate.
Definition aggregate.h:181
COUNT(*) aggregate.
Definition aggregate.h:195
Represents a boolean expression tree.
Definition expression.h:37
Operation
Operation types for expressions.
Definition expression.h:40
Literal is a literal value that is associated with a primitive type.
Definition literal.h:39
Bound MAX aggregate.
Definition aggregate.h:208
Bound MIN aggregate.
Definition aggregate.h:223
A schema for a Table.
Definition schema.h:49
An immutable struct-like wrapper.
Definition struct_like.h:62
Template for unbound aggregates that carry a term and operation.
Definition aggregate.h:76
std::shared_ptr< NamedReference > reference() override
Returns the underlying named reference for this unbound term.
Definition aggregate.h:83
Base class for unbound aggregates.
Definition aggregate.h:66
Interface for unbound expressions that need schema binding.
Definition expression.h:339
DataFile carries data file path, partition tuple, metrics, ...
Definition manifest_entry.h:62