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> Downcast for Twhere
T: AsAny + ?Sized,
impl<T> Downcast for Twhere
T: AsAny + ?Sized,
§fn downcast_ref<T>(&self) -> Option<&T>where
T: AsAny,
fn downcast_ref<T>(&self) -> Option<&T>where
T: AsAny,
Any.§fn downcast_mut<T>(&mut self) -> Option<&mut T>where
T: AsAny,
fn downcast_mut<T>(&mut self) -> Option<&mut T>where
T: AsAny,
Any.§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§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.