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)");
source§impl PartialEq for Predicate
impl PartialEq for Predicate
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.