2626
2727namespace iceberg {
2828
29- class Evaluator :: EvalVisitor : public BoundVisitor<bool > {
29+ class EvalVisitor : public BoundVisitor <bool > {
3030 public:
31- void UpdateRow (const StructLike* row) { row_ = row; }
31+ explicit EvalVisitor (const StructLike& row) : row_( row) { }
3232
3333 Result<bool > AlwaysTrue () override { return true ; }
3434
@@ -45,56 +45,47 @@ class Evaluator::EvalVisitor : public BoundVisitor<bool> {
4545 }
4646
4747 Result<bool > IsNull (const std::shared_ptr<BoundTerm>& term) override {
48- ICEBERG_DCHECK (row_, " Row is not set" );
49- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
48+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
5049 return value.IsNull ();
5150 }
5251
5352 Result<bool > NotNull (const std::shared_ptr<BoundTerm>& term) override {
54- ICEBERG_DCHECK (row_, " Row is not set" );
55- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
56- return !value.IsNull ();
53+ ICEBERG_ASSIGN_OR_RAISE (auto value, IsNull (term));
54+ return !value;
5755 }
5856
5957 Result<bool > IsNaN (const std::shared_ptr<BoundTerm>& term) override {
60- ICEBERG_DCHECK (row_, " Row is not set" );
61- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
58+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
6259 return value.IsNaN ();
6360 }
6461
6562 Result<bool > NotNaN (const std::shared_ptr<BoundTerm>& term) override {
66- ICEBERG_DCHECK (row_, " Row is not set" );
67- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
68- return !value.IsNaN ();
63+ ICEBERG_ASSIGN_OR_RAISE (auto value, IsNaN (term));
64+ return !value;
6965 }
7066
7167 Result<bool > Lt (const std::shared_ptr<BoundTerm>& term, const Literal& lit) override {
72- ICEBERG_DCHECK (row_, " Row is not set" );
73- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
68+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
7469 return value < lit;
7570 }
7671
7772 Result<bool > LtEq (const std::shared_ptr<BoundTerm>& term, const Literal& lit) override {
78- ICEBERG_DCHECK (row_, " Row is not set" );
79- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
73+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
8074 return value <= lit;
8175 }
8276
8377 Result<bool > Gt (const std::shared_ptr<BoundTerm>& term, const Literal& lit) override {
84- ICEBERG_DCHECK (row_, " Row is not set" );
85- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
78+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
8679 return value > lit;
8780 }
8881
8982 Result<bool > GtEq (const std::shared_ptr<BoundTerm>& term, const Literal& lit) override {
90- ICEBERG_DCHECK (row_, " Row is not set" );
91- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
83+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
9284 return value >= lit;
9385 }
9486
9587 Result<bool > Eq (const std::shared_ptr<BoundTerm>& term, const Literal& lit) override {
96- ICEBERG_DCHECK (row_, " Row is not set" );
97- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
88+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
9889 return value == lit;
9990 }
10091
@@ -106,8 +97,7 @@ class Evaluator::EvalVisitor : public BoundVisitor<bool> {
10697
10798 Result<bool > In (const std::shared_ptr<BoundTerm>& term,
10899 const BoundSetPredicate::LiteralSet& literal_set) override {
109- ICEBERG_DCHECK (row_, " Row is not set" );
110- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
100+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
111101 return literal_set.contains (value);
112102 }
113103
@@ -119,8 +109,7 @@ class Evaluator::EvalVisitor : public BoundVisitor<bool> {
119109
120110 Result<bool > StartsWith (const std::shared_ptr<BoundTerm>& term,
121111 const Literal& lit) override {
122- ICEBERG_DCHECK (row_, " Row is not set" );
123- ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (*row_));
112+ ICEBERG_ASSIGN_OR_RAISE (auto value, term->Evaluate (row_));
124113
125114 // Both value and literal should be strings
126115 if (!std::holds_alternative<std::string>(value.value ()) ||
@@ -140,11 +129,11 @@ class Evaluator::EvalVisitor : public BoundVisitor<bool> {
140129 }
141130
142131 private:
143- const StructLike* row_{ nullptr } ;
132+ const StructLike& row_;
144133};
145134
146135Evaluator::Evaluator (std::shared_ptr<Expression> bound_expr)
147- : bound_expr_(std::move(bound_expr)), visitor_(std::make_unique<EvalVisitor>()) {}
136+ : bound_expr_(std::move(bound_expr)) {}
148137
149138Evaluator::~Evaluator () = default ;
150139
@@ -156,8 +145,8 @@ Result<std::unique_ptr<Evaluator>> Evaluator::Make(const Schema& schema,
156145}
157146
158147Result<bool > Evaluator::Eval (const StructLike& row) const {
159- visitor_-> UpdateRow (& row);
160- return Visit<bool , EvalVisitor>(bound_expr_, *visitor_ );
148+ EvalVisitor visitor ( row);
149+ return Visit<bool , EvalVisitor>(bound_expr_, visitor );
161150}
162151
163152} // namespace iceberg
0 commit comments