pub struct Range<D> {
pub inner: Option<RangeInner<D>>,
}
Expand description
A range of values along the domain D
.
D
is generic to facilitate interoperating over multiple representation,
e.g. Datum
and mz_pgrepr::Value
. Because of the latter, we have to
“manually derive” traits over Range
.
Also notable, is that Datum
s themselves store ranges as
Range<DatumNested<'a>>
, which lets us avoid unnecessary boxing of the
range’s finite bounds, which are most often expressed as Datum
.
Fields§
§inner: Option<RangeInner<D>>
None value represents empty range
Implementations§
source§impl<D> Range<D>
impl<D> Range<D>
sourcepub fn new(inner: Option<(RangeLowerBound<D>, RangeUpperBound<D>)>) -> Range<D>
pub fn new(inner: Option<(RangeLowerBound<D>, RangeUpperBound<D>)>) -> Range<D>
Create a new range.
Note that when constructing Range<Datum<'a>>
, the range must still be
canonicalized. If this becomes a common operation, we should consider
addinga new_canonical
function that performs both steps.
sourcepub fn internal_flag_bits(&self) -> u8
pub fn internal_flag_bits(&self) -> u8
Get the flag bits appropriate to use in our internal (i.e. row) encoding of range values.
Note that this differs from the flags appropriate to encode with
Postgres, which has UB_INFINITE
and LB_INCLUSIVE
in the alternate
position.
sourcepub fn pg_flag_bits(&self) -> u8
pub fn pg_flag_bits(&self) -> u8
Get the flag bits appropriate to use in PG-compatible encodings of range values.
Note that this differs from the flags appropriate for our internal
encoding, which has UB_INFINITE
and LB_INCLUSIVE
in the alternate
position.
sourcepub fn into_bounds<F, O>(self, conv: F) -> Range<O>where
F: Fn(D) -> O,
pub fn into_bounds<F, O>(self, conv: F) -> Range<O>where
F: Fn(D) -> O,
Converts self
from having bounds of type D
to type O
, converting
the current bounds using conv
.
source§impl<'a, B: Copy + Ord + PartialOrd + Display + Debug> Range<B>
impl<'a, B: Copy + Ord + PartialOrd + Display + Debug> Range<B>
Range implementations meant to work with Range<Datum>
and Range<DatumNested>
.
pub fn contains_elem<T: RangeOps<'a>>(&self, elem: &T) -> bool
pub fn contains_range(&self, other: &Range<B>) -> bool
pub fn overlaps(&self, other: &Range<B>) -> bool
pub fn before(&self, other: &Range<B>) -> bool
pub fn after(&self, other: &Range<B>) -> bool
pub fn overleft(&self, other: &Range<B>) -> bool
pub fn overright(&self, other: &Range<B>) -> bool
pub fn adjacent(&self, other: &Range<B>) -> bool
pub fn union(&self, other: &Range<B>) -> Result<Range<B>, InvalidRangeError>
pub fn intersection(&self, other: &Range<B>) -> Range<B>
pub fn difference( &self, other: &Range<B>, ) -> Result<Range<Datum<'a>>, InvalidRangeError>
source§impl<'a> Range<Datum<'a>>
impl<'a> Range<Datum<'a>>
sourcepub fn canonicalize(&mut self) -> Result<(), InvalidRangeError>
pub fn canonicalize(&mut self) -> Result<(), InvalidRangeError>
Canonicalize the range by PG’s heuristics, which are:
- Infinite bounds are always exclusive
- If type has step:
- Exclusive lower bounds are rewritten as inclusive += step
- Inclusive lower bounds are rewritten as exclusive += step
- Ranges are empty if lower >= upper after prev. step unless range type does not have step and both bounds are inclusive
§Panics
- If the upper and lower bounds are finite and of different types.
Trait Implementations§
source§impl<'a, E> DatumType<'a, E> for Range<Datum<'a>>
impl<'a, E> DatumType<'a, E> for Range<Datum<'a>>
source§impl<'a, E> DatumType<'a, E> for Range<DatumNested<'a>>
impl<'a, E> DatumType<'a, E> for Range<DatumNested<'a>>
source§impl<'a, T: FromSql<'a>> FromSql<'a> for Range<T>
impl<'a, T: FromSql<'a>> FromSql<'a> for Range<T>
source§fn from_sql(
ty: &PgType,
raw: &'a [u8],
) -> Result<Range<T>, Box<dyn Error + Sync + Send>>
fn from_sql( ty: &PgType, raw: &'a [u8], ) -> Result<Range<T>, Box<dyn Error + Sync + Send>>
Type
in its binary format. Read moresource§fn accepts(ty: &PgType) -> bool
fn accepts(ty: &PgType) -> bool
Type
.source§impl<D: Ord> Ord for Range<D>
impl<D: Ord> Ord for Range<D>
source§impl<D: Ord + PartialOrd> PartialOrd for Range<D>
impl<D: Ord + PartialOrd> PartialOrd for Range<D>
impl<D: Copy> Copy for Range<D>
impl<D: Eq> Eq for Range<D>
Auto Trait Implementations§
impl<D> Freeze for Range<D>where
D: Freeze,
impl<D> RefUnwindSafe for Range<D>where
D: RefUnwindSafe,
impl<D> Send for Range<D>where
D: Send,
impl<D> Sync for Range<D>where
D: Sync,
impl<D> Unpin for Range<D>where
D: Unpin,
impl<D> UnwindSafe for Range<D>where
D: UnwindSafe,
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,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<Q, K> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§impl<T> FutureExt for T
impl<T> FutureExt for T
source§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
source§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
impl<T, U> OverrideFrom<Option<&T>> for Uwhere
U: OverrideFrom<T>,
source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> PreferredContainer for T
impl<T> PreferredContainer for T
source§impl<T> ProgressEventTimestamp for T
impl<T> ProgressEventTimestamp for T
source§impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
impl<P, R> ProtoType<R> for Pwhere
R: RustType<P>,
source§fn into_rust(self) -> Result<R, TryFromProtoError>
fn into_rust(self) -> Result<R, TryFromProtoError>
RustType::from_proto
.source§fn from_rust(rust: &R) -> P
fn from_rust(rust: &R) -> P
RustType::into_proto
.source§impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
impl<'a, S, T> Semigroup<&'a S> for Twhere
T: Semigroup<S>,
source§fn plus_equals(&mut self, rhs: &&'a S)
fn plus_equals(&mut self, rhs: &&'a S)
std::ops::AddAssign
, for types that do not implement AddAssign
.