pub enum Predicate {
AlwaysTrue,
AlwaysFalse,
And(LogicalExpression<Predicate, 2>),
Or(LogicalExpression<Predicate, 2>),
Not(LogicalExpression<Predicate, 1>),
Unary(UnaryExpression<Reference>),
Binary(BinaryExpression<Reference>),
Set(SetExpression<Reference>),
}
Expand description
Unbound predicate expression before binding to a schema.
Variants§
AlwaysTrue
AlwaysTrue predicate, for example, TRUE
.
AlwaysFalse
AlwaysFalse predicate, for example, FALSE
.
And(LogicalExpression<Predicate, 2>)
And predicate, for example, a > 10 AND b < 20
.
Or(LogicalExpression<Predicate, 2>)
Or predicate, for example, a > 10 OR b < 20
.
Not(LogicalExpression<Predicate, 1>)
Not predicate, for example, NOT (a > 10)
.
Unary(UnaryExpression<Reference>)
Unary expression, for example, a IS NULL
.
Binary(BinaryExpression<Reference>)
Binary expression, for example, a > 10
.
Set(SetExpression<Reference>)
Set predicates, for example, a in (1, 2, 3)
.
Implementations§
Source§impl Predicate
impl Predicate
Sourcepub fn and(self, other: Predicate) -> Predicate
pub fn and(self, other: Predicate) -> Predicate
Combines two predicates with AND
.
§Example
use std::ops::Bound::Unbounded;
use iceberg::expr::BoundPredicate::Unary;
use iceberg::expr::Reference;
use iceberg::spec::Datum;
let expr1 = Reference::new("a").less_than(Datum::long(10));
let expr2 = Reference::new("b").less_than(Datum::long(20));
let expr = expr1.and(expr2);
assert_eq!(&format!("{expr}"), "(a < 10) AND (b < 20)");
Sourcepub fn or(self, other: Predicate) -> Predicate
pub fn or(self, other: Predicate) -> Predicate
Combines two predicates with OR
.
§Example
use std::ops::Bound::Unbounded;
use iceberg::expr::BoundPredicate::Unary;
use iceberg::expr::Reference;
use iceberg::spec::Datum;
let expr1 = Reference::new("a").less_than(Datum::long(10));
let expr2 = Reference::new("b").less_than(Datum::long(20));
let expr = expr1.or(expr2);
assert_eq!(&format!("{expr}"), "(a < 10) OR (b < 20)");
Sourcepub fn negate(self) -> Predicate
pub fn negate(self) -> Predicate
Returns a predicate representing the negation (‘NOT’) of this one,
by using inverse predicates rather than wrapping in a NOT
.
Used for NOT
elimination.
§Example
use std::ops::Bound::Unbounded;
use iceberg::expr::BoundPredicate::Unary;
use iceberg::expr::{LogicalExpression, Predicate, Reference};
use iceberg::spec::Datum;
let expr1 = Reference::new("a").less_than(Datum::long(10));
let expr2 = Reference::new("b")
.less_than(Datum::long(5))
.and(Reference::new("c").less_than(Datum::long(10)));
let result = expr1.negate();
assert_eq!(&format!("{result}"), "a >= 10");
let result = expr2.negate();
assert_eq!(&format!("{result}"), "(b >= 5) OR (c >= 10)");
Sourcepub fn rewrite_not(self) -> Predicate
pub fn rewrite_not(self) -> Predicate
Simplifies the expression by removing NOT
predicates,
directly negating the inner expressions instead. The transformation
applies logical laws (such as De Morgan’s laws) to
recursively negate and simplify inner expressions within NOT
predicates.
§Example
use std::ops::Not;
use iceberg::expr::{LogicalExpression, Predicate, Reference};
use iceberg::spec::Datum;
let expression = Reference::new("a").less_than(Datum::long(5)).not();
let result = expression.rewrite_not();
assert_eq!(&format!("{result}"), "a >= 5");
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Predicate
impl<'de> Deserialize<'de> for Predicate
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl Not for Predicate
impl Not for Predicate
Source§fn not(self) -> Self::Output
fn not(self) -> Self::Output
Create a predicate which is the reverse of this predicate. For example: NOT (a > 10)
.
This is different from Predicate::negate()
since it doesn’t rewrite expression, but
just adds a NOT
operator.
§Example
use std::ops::Bound::Unbounded;
use iceberg::expr::BoundPredicate::Unary;
use iceberg::expr::Reference;
use iceberg::spec::Datum;
let expr1 = Reference::new("a").less_than(Datum::long(10));
let expr = !expr1;
assert_eq!(&format!("{expr}"), "NOT (a < 10)");
impl StructuralPartialEq for Predicate
Auto Trait Implementations§
impl Freeze for Predicate
impl RefUnwindSafe for Predicate
impl Send for Predicate
impl Sync for Predicate
impl Unpin for Predicate
impl UnwindSafe for Predicate
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more