iceberg-cpp
Loading...
Searching...
No Matches
expressions.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
20#pragma once
21
24
25#include <initializer_list>
26#include <memory>
27#include <string>
28#include <vector>
29
31#include "iceberg/expression/literal.h"
34#include "iceberg/iceberg_export.h"
35#include "iceberg/util/macros.h"
36
37namespace iceberg {
38
42class ICEBERG_EXPORT Expressions {
43 public:
44 // Logical operations
45
47 template <typename... Args>
48 static std::shared_ptr<Expression> And(std::shared_ptr<Expression> left,
49 std::shared_ptr<Expression> right,
50 Args&&... args)
51 requires std::conjunction_v<std::is_same<Args, std::shared_ptr<Expression>>...>
52 {
53 ICEBERG_ASSIGN_OR_THROW(auto and_expr,
54 iceberg::And::MakeFolded(std::move(left), std::move(right),
55 std::forward<Args>(args)...));
56 return and_expr;
57 }
58
60 template <typename... Args>
61 static std::shared_ptr<Expression> Or(std::shared_ptr<Expression> left,
62 std::shared_ptr<Expression> right, Args&&... args)
63 requires std::conjunction_v<std::is_same<Args, std::shared_ptr<Expression>>...>
64 {
65 ICEBERG_ASSIGN_OR_THROW(auto or_expr,
66 iceberg::Or::MakeFolded(std::move(left), std::move(right),
67 std::forward<Args>(args)...));
68 return or_expr;
69 }
70
78 static std::shared_ptr<Expression> Not(std::shared_ptr<Expression> child);
79
80 // Transform functions
81
83 static std::shared_ptr<UnboundTransform> Bucket(std::string name, int32_t num_buckets);
84
86 static std::shared_ptr<UnboundTransform> Year(std::string name);
87
89 static std::shared_ptr<UnboundTransform> Month(std::string name);
90
92 static std::shared_ptr<UnboundTransform> Day(std::string name);
93
95 static std::shared_ptr<UnboundTransform> Hour(std::string name);
96
98 static std::shared_ptr<UnboundTransform> Truncate(std::string name, int32_t width);
99
101 static std::shared_ptr<UnboundTransform> Transform(
102 std::string name, std::shared_ptr<Transform> transform);
103
104 // Aggregates
105
107 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Count(std::string name);
108
110 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Count(
111 std::shared_ptr<UnboundTerm<BoundReference>> expr);
112
114 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> CountNull(
115 std::string name);
116
118 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> CountNull(
119 std::shared_ptr<UnboundTerm<BoundReference>> expr);
120
122 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> CountNotNull(
123 std::string name);
124
126 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> CountNotNull(
127 std::shared_ptr<UnboundTerm<BoundReference>> expr);
128
130 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> CountStar();
131
133 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Max(std::string name);
134
136 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Max(
137 std::shared_ptr<UnboundTerm<BoundReference>> expr);
139 static std::shared_ptr<UnboundAggregateImpl<BoundTransform>> Max(
140 std::shared_ptr<UnboundTerm<BoundTransform>> expr);
141
143 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Min(std::string name);
144
146 static std::shared_ptr<UnboundAggregateImpl<BoundReference>> Min(
147 std::shared_ptr<UnboundTerm<BoundReference>> expr);
149 static std::shared_ptr<UnboundAggregateImpl<BoundTransform>> Min(
150 std::shared_ptr<UnboundTerm<BoundTransform>> expr);
151
152 // Unary predicates
153
155 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> IsNull(std::string name);
156
158 template <typename B>
159 static std::shared_ptr<UnboundPredicateImpl<B>> IsNull(
160 std::shared_ptr<UnboundTerm<B>> expr) {
161 ICEBERG_ASSIGN_OR_THROW(
162 auto pred,
163 UnboundPredicateImpl<B>::Make(Expression::Operation::kIsNull, std::move(expr)));
164 return pred;
165 }
166
168 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotNull(std::string name);
169
171 template <typename B>
172 static std::shared_ptr<UnboundPredicateImpl<B>> NotNull(
173 std::shared_ptr<UnboundTerm<B>> expr) {
174 ICEBERG_ASSIGN_OR_THROW(
175 auto pred,
176 UnboundPredicateImpl<B>::Make(Expression::Operation::kNotNull, std::move(expr)));
177 return pred;
178 }
179
181 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> IsNaN(std::string name);
182
184 template <typename B>
185 static std::shared_ptr<UnboundPredicateImpl<B>> IsNaN(
186 std::shared_ptr<UnboundTerm<B>> expr) {
187 ICEBERG_ASSIGN_OR_THROW(
188 auto pred,
189 UnboundPredicateImpl<B>::Make(Expression::Operation::kIsNan, std::move(expr)));
190 return pred;
191 }
192
194 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotNaN(std::string name);
195
197 template <typename B>
198 static std::shared_ptr<UnboundPredicateImpl<B>> NotNaN(
199 std::shared_ptr<UnboundTerm<B>> expr) {
200 ICEBERG_ASSIGN_OR_THROW(
201 auto pred,
202 UnboundPredicateImpl<B>::Make(Expression::Operation::kNotNan, std::move(expr)));
203 return pred;
204 }
205
206 // Comparison predicates
207
209 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> LessThan(std::string name,
210 Literal value);
211
213 template <typename B>
214 static std::shared_ptr<UnboundPredicateImpl<B>> LessThan(
215 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
216 ICEBERG_ASSIGN_OR_THROW(
217 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kLt,
218 std::move(expr), std::move(value)));
219 return pred;
220 }
221
223 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> LessThanOrEqual(
224 std::string name, Literal value);
225
227 template <typename B>
228 static std::shared_ptr<UnboundPredicateImpl<B>> LessThanOrEqual(
229 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
230 ICEBERG_ASSIGN_OR_THROW(
231 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kLtEq,
232 std::move(expr), std::move(value)));
233 return pred;
234 }
235
237 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> GreaterThan(
238 std::string name, Literal value);
239
241 template <typename B>
242 static std::shared_ptr<UnboundPredicateImpl<B>> GreaterThan(
243 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
244 ICEBERG_ASSIGN_OR_THROW(
245 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kGt,
246 std::move(expr), std::move(value)));
247 return pred;
248 }
249
251 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> GreaterThanOrEqual(
252 std::string name, Literal value);
253
255 template <typename B>
256 static std::shared_ptr<UnboundPredicateImpl<B>> GreaterThanOrEqual(
257 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
258 ICEBERG_ASSIGN_OR_THROW(
259 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kGtEq,
260 std::move(expr), std::move(value)));
261 return pred;
262 }
263
265 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> Equal(std::string name,
266 Literal value);
267
269 template <typename B>
270 static std::shared_ptr<UnboundPredicateImpl<B>> Equal(
271 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
272 ICEBERG_ASSIGN_OR_THROW(
273 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kEq,
274 std::move(expr), std::move(value)));
275 return pred;
276 }
277
279 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotEqual(std::string name,
280 Literal value);
281
283 template <typename B>
284 static std::shared_ptr<UnboundPredicateImpl<B>> NotEqual(
285 std::shared_ptr<UnboundTerm<B>> expr, Literal value) {
286 ICEBERG_ASSIGN_OR_THROW(
287 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kNotEq,
288 std::move(expr), std::move(value)));
289 return pred;
290 }
291
292 // String predicates
293
295 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> StartsWith(
296 std::string name, std::string value);
297
299 template <typename B>
300 static std::shared_ptr<UnboundPredicateImpl<B>> StartsWith(
301 std::shared_ptr<UnboundTerm<B>> expr, std::string value) {
302 ICEBERG_ASSIGN_OR_THROW(
303 auto pred,
304 UnboundPredicateImpl<B>::Make(Expression::Operation::kStartsWith, std::move(expr),
305 Literal::String(std::move(value))));
306 return pred;
307 }
308
310 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotStartsWith(
311 std::string name, std::string value);
312
314 template <typename B>
315 static std::shared_ptr<UnboundPredicateImpl<B>> NotStartsWith(
316 std::shared_ptr<UnboundTerm<B>> expr, std::string value) {
317 ICEBERG_ASSIGN_OR_THROW(
318 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kNotStartsWith,
319 std::move(expr),
320 Literal::String(std::move(value))));
321 return pred;
322 }
323
324 // Set predicates
325
327 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> In(
328 std::string name, std::vector<Literal> values);
329
331 template <typename B>
332 static std::shared_ptr<UnboundPredicateImpl<B>> In(std::shared_ptr<UnboundTerm<B>> expr,
333 std::vector<Literal> values) {
334 ICEBERG_ASSIGN_OR_THROW(
335 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kIn,
336 std::move(expr), std::move(values)));
337 return pred;
338 }
339
341 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> In(
342 std::string name, std::initializer_list<Literal> values);
343
345 template <typename B>
346 static std::shared_ptr<UnboundPredicateImpl<B>> In(
347 std::shared_ptr<UnboundTerm<B>> expr, std::initializer_list<Literal> values) {
348 return In<B>(std::move(expr), std::vector<Literal>(values));
349 }
350
352 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotIn(
353 std::string name, std::vector<Literal> values);
354
356 template <typename B>
357 static std::shared_ptr<UnboundPredicateImpl<B>> NotIn(
358 std::shared_ptr<UnboundTerm<B>> expr, std::vector<Literal> values) {
359 ICEBERG_ASSIGN_OR_THROW(
360 auto pred, UnboundPredicateImpl<B>::Make(Expression::Operation::kNotIn,
361 std::move(expr), std::move(values)));
362 return pred;
363 }
364
366 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> NotIn(
367 std::string name, std::initializer_list<Literal> values);
368
370 template <typename B>
371 static std::shared_ptr<UnboundPredicateImpl<B>> NotIn(
372 std::shared_ptr<UnboundTerm<B>> expr, std::initializer_list<Literal> values) {
373 return NotIn<B>(expr, std::vector<Literal>(values));
374 }
375
376 // Generic predicate factory
377
379 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> Predicate(
380 Expression::Operation op, std::string name, Literal value);
381
383 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> Predicate(
384 Expression::Operation op, std::string name, std::vector<Literal> values);
385
387 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> Predicate(
388 Expression::Operation op, std::string name, std::initializer_list<Literal> values);
389
391 static std::shared_ptr<UnboundPredicateImpl<BoundReference>> Predicate(
392 Expression::Operation op, std::string name);
393
395 template <typename B>
396 static std::shared_ptr<UnboundPredicateImpl<B>> Predicate(
397 Expression::Operation op, std::shared_ptr<UnboundTerm<B>> expr,
398 std::vector<Literal> values) {
399 ICEBERG_ASSIGN_OR_THROW(
400 auto pred, UnboundPredicateImpl<B>::Make(op, std::move(expr), std::move(values)));
401 return pred;
402 }
403
405 template <typename B>
406 static std::shared_ptr<UnboundPredicateImpl<B>> Predicate(
407 Expression::Operation op, std::shared_ptr<UnboundTerm<B>> expr,
408 std::initializer_list<Literal> values) {
409 return Predicate<B>(op, std::move(expr), std::vector<Literal>(values));
410 }
411
413 template <typename B>
414 static std::shared_ptr<UnboundPredicateImpl<B>> Predicate(
415 Expression::Operation op, std::shared_ptr<UnboundTerm<B>> expr) {
416 ICEBERG_ASSIGN_OR_THROW(auto pred,
417 UnboundPredicateImpl<B>::Make(op, std::move(expr)));
418 return pred;
419 }
420
421 // Constants
422
424 static std::shared_ptr<True> AlwaysTrue();
425
427 static std::shared_ptr<False> AlwaysFalse();
428
429 // Utilities
430
432 static std::shared_ptr<NamedReference> Ref(std::string name);
433
435 static Literal Lit(Literal::Value value, std::shared_ptr<PrimitiveType> type);
436};
437
438} // namespace iceberg
static Result< std::shared_ptr< Expression > > MakeFolded(std::shared_ptr< Expression > left, std::shared_ptr< Expression > right, Args &&... args)
Creates a folded And expression from two sub-expressions.
Definition expression.h:158
Operation
Operation types for expressions.
Definition expression.h:40
Fluent APIs to create expressions.
Definition expressions.h:42
static std::shared_ptr< UnboundPredicateImpl< B > > GreaterThan(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create a greater than predicate for an unbound term.
Definition expressions.h:242
static std::shared_ptr< UnboundPredicateImpl< B > > NotIn(std::shared_ptr< UnboundTerm< B > > expr, std::initializer_list< Literal > values)
Create a NOT IN predicate for an unbound term with initializer list.
Definition expressions.h:371
static std::shared_ptr< UnboundPredicateImpl< B > > NotNull(std::shared_ptr< UnboundTerm< B > > expr)
Create a NOT NULL predicate for an unbound term.
Definition expressions.h:172
static std::shared_ptr< UnboundPredicateImpl< B > > NotIn(std::shared_ptr< UnboundTerm< B > > expr, std::vector< Literal > values)
Create a NOT IN predicate for an unbound term.
Definition expressions.h:357
static std::shared_ptr< UnboundPredicateImpl< B > > LessThanOrEqual(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create a less than or equal predicate for an unbound term.
Definition expressions.h:228
static std::shared_ptr< UnboundPredicateImpl< B > > NotEqual(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create a not equal predicate for an unbound term.
Definition expressions.h:284
static std::shared_ptr< UnboundPredicateImpl< B > > Predicate(Expression::Operation op, std::shared_ptr< UnboundTerm< B > > expr)
Create a unary predicate for unbound term.
Definition expressions.h:414
static std::shared_ptr< UnboundPredicateImpl< B > > NotNaN(std::shared_ptr< UnboundTerm< B > > expr)
Create a NOT NaN predicate for an unbound term.
Definition expressions.h:198
static std::shared_ptr< UnboundPredicateImpl< B > > In(std::shared_ptr< UnboundTerm< B > > expr, std::vector< Literal > values)
Create an IN predicate for an unbound term.
Definition expressions.h:332
static std::shared_ptr< UnboundPredicateImpl< B > > Predicate(Expression::Operation op, std::shared_ptr< UnboundTerm< B > > expr, std::initializer_list< Literal > values)
Create a predicate with operation and multiple values.
Definition expressions.h:406
static std::shared_ptr< UnboundPredicateImpl< B > > GreaterThanOrEqual(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create a greater than or equal predicate for an unbound term.
Definition expressions.h:256
static std::shared_ptr< UnboundPredicateImpl< B > > IsNaN(std::shared_ptr< UnboundTerm< B > > expr)
Create an IS NaN predicate for an unbound term.
Definition expressions.h:185
static std::shared_ptr< UnboundPredicateImpl< B > > In(std::shared_ptr< UnboundTerm< B > > expr, std::initializer_list< Literal > values)
Create an IN predicate for an unbound term with initializer list.
Definition expressions.h:346
static std::shared_ptr< Expression > Or(std::shared_ptr< Expression > left, std::shared_ptr< Expression > right, Args &&... args)
Create an OR expression.
Definition expressions.h:61
static std::shared_ptr< UnboundPredicateImpl< B > > Predicate(Expression::Operation op, std::shared_ptr< UnboundTerm< B > > expr, std::vector< Literal > values)
Create a predicate for unbound term with multiple values.
Definition expressions.h:396
static std::shared_ptr< UnboundPredicateImpl< B > > NotStartsWith(std::shared_ptr< UnboundTerm< B > > expr, std::string value)
Create a not starts with predicate for an unbound term.
Definition expressions.h:315
static std::shared_ptr< UnboundPredicateImpl< B > > LessThan(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create a less than predicate for an unbound term.
Definition expressions.h:214
static std::shared_ptr< Expression > And(std::shared_ptr< Expression > left, std::shared_ptr< Expression > right, Args &&... args)
Create an AND expression.
Definition expressions.h:48
static std::shared_ptr< UnboundPredicateImpl< B > > IsNull(std::shared_ptr< UnboundTerm< B > > expr)
Create an IS NULL predicate for an unbound term.
Definition expressions.h:159
static std::shared_ptr< UnboundPredicateImpl< B > > StartsWith(std::shared_ptr< UnboundTerm< B > > expr, std::string value)
Create a starts with predicate for an unbound term.
Definition expressions.h:300
static std::shared_ptr< UnboundPredicateImpl< B > > Equal(std::shared_ptr< UnboundTerm< B > > expr, Literal value)
Create an equal predicate for an unbound term.
Definition expressions.h:270
Literal is a literal value that is associated with a primitive type.
Definition literal.h:39
An Expression that represents logical NOT operation.
Definition expression.h:289
static Result< std::shared_ptr< Expression > > MakeFolded(std::shared_ptr< Expression > left, std::shared_ptr< Expression > right, Args &&... args)
Creates a folded Or expression from two sub-expressions.
Definition expression.h:234
A predicate is a boolean expression that tests a term against some criteria.
Definition predicate.h:38
Represents a transform used in partitioning or sorting in Iceberg.
Definition transform.h:90
Unbound predicates contain unbound terms and must be bound to a concrete schema before they can be ev...
Definition predicate.h:95