@@ -87,18 +87,29 @@ class ProjectionUtil {
8787 std::string_view name, const std::shared_ptr<BoundLiteralPredicate>& predicate,
8888 const std::shared_ptr<TransformFunction>& func) {
8989 const Literal& literal = predicate->literal ();
90- bool is_source_date_type = func->source_type ()->type_id () == TypeId::kDate ;
9190
9291 switch (predicate->op ()) {
9392 case Expression::Operation::kLt : {
9493 // adjust closed and then transform ltEq
95- ICEBERG_ASSIGN_OR_RAISE (
96- auto transformed,
97- func->Transform (is_source_date_type
98- ? Literal::Date (std::get<T>(literal.value ()) - 1 )
99- : Literal::Int (std::get<T>(literal.value ()) - 1 )));
100- return Expressions::Predicate (Expression::Operation::kLtEq , std::string (name),
101- transformed);
94+ if constexpr (std::is_same_v<T, int32_t >) {
95+ ICEBERG_ASSIGN_OR_RAISE (
96+ auto transformed,
97+ func->Transform (literal.type ()->type_id () == TypeId::kDate
98+ ? Literal::Date (std::get<T>(literal.value ()) - 1 )
99+ : Literal::Int (std::get<T>(literal.value ()) - 1 )));
100+ return Expressions::Predicate (Expression::Operation::kLtEq , std::string (name),
101+ transformed);
102+ } else {
103+ ICEBERG_ASSIGN_OR_RAISE (
104+ auto transformed,
105+ func->Transform (
106+ literal.type ()->type_id () == TypeId::kTimestamp ||
107+ literal.type ()->type_id () == TypeId::kTimestampTz
108+ ? Literal::Timestamp (std::get<int64_t >(literal.value ()) - 1 )
109+ : Literal::Long (std::get<int64_t >(literal.value ()) - 1 )));
110+ return Expressions::Predicate (Expression::Operation::kLtEq , std::string (name),
111+ transformed);
112+ }
102113 }
103114 case Expression::Operation::kLtEq : {
104115 ICEBERG_ASSIGN_OR_RAISE (auto transformed, func->Transform (literal));
@@ -107,13 +118,25 @@ class ProjectionUtil {
107118 }
108119 case Expression::Operation::kGt : {
109120 // adjust closed and then transform gtEq
110- ICEBERG_ASSIGN_OR_RAISE (
111- auto transformed,
112- func->Transform (is_source_date_type
113- ? Literal::Date (std::get<T>(literal.value ()) + 1 )
114- : Literal::Int (std::get<T>(literal.value ()) + 1 )));
115- return Expressions::Predicate (Expression::Operation::kGtEq , std::string (name),
116- transformed);
121+ if constexpr (std::is_same_v<T, int32_t >) {
122+ ICEBERG_ASSIGN_OR_RAISE (
123+ auto transformed,
124+ func->Transform (literal.type ()->type_id () == TypeId::kDate
125+ ? Literal::Date (std::get<T>(literal.value ()) + 1 )
126+ : Literal::Int (std::get<T>(literal.value ()) + 1 )));
127+ return Expressions::Predicate (Expression::Operation::kGtEq , std::string (name),
128+ transformed);
129+ } else {
130+ ICEBERG_ASSIGN_OR_RAISE (
131+ auto transformed,
132+ func->Transform (
133+ literal.type ()->type_id () == TypeId::kTimestamp ||
134+ literal.type ()->type_id () == TypeId::kTimestampTz
135+ ? Literal::Timestamp (std::get<int64_t >(literal.value ()) + 1 )
136+ : Literal::Long (std::get<int64_t >(literal.value ()) + 1 )));
137+ return Expressions::Predicate (Expression::Operation::kGtEq , std::string (name),
138+ transformed);
139+ }
117140 }
118141 case Expression::Operation::kGtEq : {
119142 ICEBERG_ASSIGN_OR_RAISE (auto transformed, func->Transform (literal));
0 commit comments