pub struct Scope {
pub items: Vec<ScopeItem>,
pub ungrouped_columns: Vec<ScopeUngroupedColumn>,
pub lateral_barrier: bool,
}
Fields§
§items: Vec<ScopeItem>
The items in this scope.
ungrouped_columns: Vec<ScopeUngroupedColumn>
The ungrouped columns in the scope.
lateral_barrier: bool
Implementations§
source§impl Scope
impl Scope
pub fn empty() -> Self
pub fn from_source<I, N>( table_name: Option<PartialItemName>, column_names: I, ) -> Self
sourcepub fn column_names(&self) -> impl Iterator<Item = &ColumnName>
pub fn column_names(&self) -> impl Iterator<Item = &ColumnName>
Constructs an iterator over the canonical name for each column.
pub fn len(&self) -> usize
sourcefn all_items<'a>(
&'a self,
outer_scopes: &'a [Scope],
) -> impl Iterator<Item = ScopeCursor<'a>> + 'a
fn all_items<'a>( &'a self, outer_scopes: &'a [Scope], ) -> impl Iterator<Item = ScopeCursor<'a>> + 'a
Iterates over all items in the scope.
Items are returned in order of preference, where the innermost scope has
the highest preference. For example, given scopes A(B(C))
, items are
presented in the order C
, B
, A
.
Items are returned alongside the column reference that targets that item
and the item’s “lateral level”. The latter bears explaining. The lateral
level is the number of lateral barriers between this scope and the item.
See Scope::lateral_barrier
for a diagram. Roughly speaking, items from
different levels but the same lateral level are items from different
joins in the same subquery, while items in different lateral levels are
items from different queries entirely. Rules about ambiguity apply
within an entire lateral level, not just within a single scope level.
NOTE(benesch): Scopereally shows its weaknesses here. Ideally we'd have separate types like
QueryScopeand
JoinScope` that more
naturally encode the concept of a “lateral level”, or at least something
along those lines.
sourcepub fn items_from_table<'a>(
&'a self,
outer_scopes: &'a [Scope],
table: &PartialItemName,
) -> Result<Vec<(ColumnRef, &'a ScopeItem)>, PlanError>
pub fn items_from_table<'a>( &'a self, outer_scopes: &'a [Scope], table: &PartialItemName, ) -> Result<Vec<(ColumnRef, &'a ScopeItem)>, PlanError>
Returns all items from the given table name in the closest scope.
If no tables with the given name are in scope, returns an empty iterator.
NOTE(benesch): This is wrong for zero-arity relations, because we can’t distinguish between “no such table” and a table that exists but has no columns. The current design of scope makes this difficult to fix, unfortunately.
sourcefn resolve_internal<'a, M>(
&'a self,
outer_scopes: &[Scope],
matches: M,
table_name: Option<&PartialItemName>,
column_name: &ColumnName,
) -> Result<ColumnRef, PlanError>
fn resolve_internal<'a, M>( &'a self, outer_scopes: &[Scope], matches: M, table_name: Option<&PartialItemName>, column_name: &ColumnName, ) -> Result<ColumnRef, PlanError>
Returns a matching ColumnRef
, if one exists.
Filters all visible items against the provided matches
closure, and then matches this
filtered set against the provided column_name
.
sourcepub fn resolve_column<'a>(
&'a self,
outer_scopes: &[Scope],
column_name: &ColumnName,
) -> Result<ColumnRef, PlanError>
pub fn resolve_column<'a>( &'a self, outer_scopes: &[Scope], column_name: &ColumnName, ) -> Result<ColumnRef, PlanError>
Resolves references to a column name to a single column, or errors if multiple columns are equally valid references.
sourcepub fn resolve_using_column(
&self,
column_name: &ColumnName,
join_side: JoinSide,
) -> Result<ColumnRef, PlanError>
pub fn resolve_using_column( &self, column_name: &ColumnName, join_side: JoinSide, ) -> Result<ColumnRef, PlanError>
Resolves a column name in a USING
clause.
pub fn resolve_table_column<'a>( &'a self, outer_scopes: &[Scope], table_name: &PartialItemName, column_name: &ColumnName, ) -> Result<ColumnRef, PlanError>
pub fn resolve<'a>( &'a self, outer_scopes: &[Scope], table_name: Option<&PartialItemName>, column_name: &ColumnName, ) -> Result<ColumnRef, PlanError>
sourcepub fn resolve_expr<'a>(&'a self, expr: &Expr<Aug>) -> Option<ColumnRef>
pub fn resolve_expr<'a>(&'a self, expr: &Expr<Aug>) -> Option<ColumnRef>
Look to see if there is an already-calculated instance of this expr. Failing to find one is not an error, so this just returns Option
pub fn product(self, right: Self) -> Result<Self, PlanError>
pub fn project(&self, columns: &[usize]) -> Self
pub fn table_names(&self) -> BTreeSet<&PartialItemName>
Trait Implementations§
Auto Trait Implementations§
impl Freeze for Scope
impl RefUnwindSafe for Scope
impl Send for Scope
impl Sync for Scope
impl Unpin for Scope
impl UnwindSafe for Scope
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> FmtForward for T
impl<T> FmtForward for T
source§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.source§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.source§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.source§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.source§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.source§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.source§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.source§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.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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
source§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 moresource§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 moresource§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
source§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
source§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.source§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.source§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.source§impl<T> Pointable for T
impl<T> Pointable 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
.source§impl<T> Tap for T
impl<T> Tap for T
source§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 moresource§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 moresource§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 moresource§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 moresource§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 moresource§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 moresource§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.source§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.source§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.source§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.source§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.source§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.source§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.