Skip to content

Commit f65d89c

Browse files
committed
address comments
1 parent e240eab commit f65d89c

File tree

2 files changed

+20
-33
lines changed

2 files changed

+20
-33
lines changed

src/iceberg/expression/evaluator.cc

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626

2727
namespace 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

146135
Evaluator::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

149138
Evaluator::~Evaluator() = default;
150139

@@ -156,8 +145,8 @@ Result<std::unique_ptr<Evaluator>> Evaluator::Make(const Schema& schema,
156145
}
157146

158147
Result<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

src/iceberg/expression/evaluator.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace iceberg {
3636
/// if the row matches the expression criteria. The evaluator binds unbound expressions
3737
/// to a schema on construction and then can be used to evaluate multiple data rows.
3838
///
39-
/// \note: The evaluator is not thread-safe.
39+
/// \note: The evaluator is thread-safe.
4040
class ICEBERG_EXPORT Evaluator {
4141
public:
4242
/// \brief Make an evaluator for an unbound expression.
@@ -59,9 +59,7 @@ class ICEBERG_EXPORT Evaluator {
5959
private:
6060
explicit Evaluator(std::shared_ptr<Expression> bound_expr);
6161

62-
class EvalVisitor;
6362
std::shared_ptr<Expression> bound_expr_;
64-
std::unique_ptr<EvalVisitor> visitor_;
6563
};
6664

6765
} // namespace iceberg

0 commit comments

Comments
 (0)