Struct re_dataframe::query::QueryHandle

source ·
pub struct QueryHandle<E: StorageEngineLike> {
    pub(crate) engine: E,
    pub(crate) query: QueryExpression,
    state: OnceLock<QueryHandleState>,
}
Expand description

A handle to a dataframe query, ready to be executed.

Cheaply created via QueryEngine::query.

See QueryHandle::next_row or QueryHandle::into_iter.

Fields§

§engine: E

Handle to the QueryEngine.

§query: QueryExpression

The original query expression used to instantiate this handle.

§state: OnceLock<QueryHandleState>

Internal private state. Lazily computed.

It is important that handles stay cheap to create.

Implementations§

source§

impl<E: StorageEngineLike> QueryHandle<E>

source

pub(crate) fn new(engine: E, query: QueryExpression) -> Self

source§

impl<E: StorageEngineLike> QueryHandle<E>

source

fn init(&self) -> &QueryHandleState

Lazily initialize internal private state.

It is important that query handles stay cheap to create.

source

fn init_(&self, store: &ChunkStore, cache: &QueryCache) -> QueryHandleState

source

fn compute_user_selection( &self, view_contents: &[ColumnDescriptor], selection: &[ColumnSelector] ) -> Vec<(usize, ColumnDescriptor)>

source

fn fetch_view_chunks( &self, store: &ChunkStore, cache: &QueryCache, query: &RangeQuery, view_contents: &[ColumnDescriptor] ) -> (Option<usize>, Vec<Vec<(AtomicU64, Chunk)>>)

source

fn fetch_clear_chunks( &self, store: &ChunkStore, cache: &QueryCache, query: &RangeQuery, view_contents: &[ColumnDescriptor] ) -> IntMap<EntityPath, Vec<Chunk>>

Returns all potentially relevant clear [Chunk]s for each unique entity path in the view contents.

These chunks take recursive clear semantics into account and are guaranteed to be properly densified. The component data is stripped out, only the indices are left.

source

fn fetch_chunks<const N: usize>( &self, _store: &ChunkStore, cache: &QueryCache, query: &RangeQuery, entity_path: &EntityPath, component_names: [ComponentName; N] ) -> Option<Vec<(AtomicU64, Chunk)>>

source

pub fn query(&self) -> &QueryExpression

The query used to instantiate this handle.

source

pub fn view_contents(&self) -> &[ColumnDescriptor]

Describes the columns that make up this view.

See [QueryExpression::view_contents].

source

pub fn selected_contents(&self) -> &[(usize, ColumnDescriptor)]

Describes the columns that make up this selection.

The extra usize is the index in Self::view_contents that this selection points to.

See [QueryExpression::selection].

source

pub fn schema(&self) -> &ArrowSchema

All results returned by this handle will strictly follow this Arrow schema.

Columns that do not yield any data will still be present in the results, filled with null values.

source

pub fn seek_to_row(&self, row_idx: usize)

Advance all internal cursors so that the next row yielded will correspond to row_idx.

Does nothing if row_idx is out of bounds.

§Concurrency

Cursors are implemented using atomic variables, which means calling any of the seek_* while iteration is concurrently ongoing is memory-safe but logically undefined racy behavior. Be careful.

§Performance

This requires going through every chunk once, and for each chunk running a binary search if the chunk’s time range contains the index_value.

I.e.: it’s pretty cheap already.

source

fn seek_to_index_value(&self, index_value: IndexValue)

Advance all internal cursors so that the next row yielded will correspond to index_value.

If index_value isn’t present in the dataset, this seeks to the first index value available past that point, if any.

§Concurrency

Cursors are implemented using atomic variables, which means calling any of the seek_* while iteration is concurrently ongoing is memory-safe but logically undefined racy behavior. Be careful.

§Performance

This requires going through every chunk once, and for each chunk running a binary search if the chunk’s time range contains the index_value.

I.e.: it’s pretty cheap already.

source

pub fn num_rows(&self) -> u64

How many rows of data will be returned?

The number of rows depends and only depends on the view contents. The selected contents has no influence on this value.

source

pub fn next_row(&self) -> Option<Vec<Box<dyn ArrowArray>>>

Returns the next row’s worth of data.

The returned vector of Arrow arrays strictly follows the schema specified by Self::schema. Columns that do not yield any data will still be present in the results, filled with null values.

Each cell in the result corresponds to the latest locally known value at that particular point in the index, for each respective ColumnDescriptor. See [QueryExpression::sparse_fill_strategy] to go beyond local resolution.

Example:

while let Some(row) = query_handle.next_row() {
    // …
}
§Pagination

Use Self::seek_to_row:

query_handle.seek_to_row(42);
for row in query_handle.into_iter().take(len) {
    // …
}
source

pub fn next_row_async( &self ) -> impl Future<Output = Option<Vec<Box<dyn ArrowArray>>>>
where E: 'static + Send + Clone,

Asynchronously returns the next row’s worth of data.

The returned vector of Arrow arrays strictly follows the schema specified by Self::schema. Columns that do not yield any data will still be present in the results, filled with null values.

Each cell in the result corresponds to the latest locally known value at that particular point in the index, for each respective ColumnDescriptor. See [QueryExpression::sparse_fill_strategy] to go beyond local resolution.

Example:

while let Some(row) = query_handle.next_row_async().await {
    // …
}
source

pub fn _next_row( &self, store: &ChunkStore, cache: &QueryCache ) -> Option<Vec<Box<dyn ArrowArray>>>

source

pub fn next_row_batch(&self) -> Option<RecordBatch>

Calls Self::next_row and wraps the result in a RecordBatch.

Only use this if you absolutely need a RecordBatch as this adds a lot of allocation overhead.

See Self::next_row for more information.

source

pub async fn next_row_batch_async(&self) -> Option<RecordBatch>
where E: 'static + Send + Clone,

source§

impl<E: StorageEngineLike> QueryHandle<E>

source

pub fn iter(&self) -> impl Iterator<Item = Vec<Box<dyn ArrowArray>>> + '_

Returns an iterator backed by Self::next_row.

source

pub fn into_iter(self) -> impl Iterator<Item = Vec<Box<dyn ArrowArray>>>

Returns an iterator backed by Self::next_row.

source

pub fn batch_iter(&self) -> impl Iterator<Item = RecordBatch> + '_

Returns an iterator backed by Self::next_row_batch.

source

pub fn into_batch_iter(self) -> impl Iterator<Item = RecordBatch>

Returns an iterator backed by Self::next_row_batch.

Auto Trait Implementations§

§

impl<E> !Freeze for QueryHandle<E>

§

impl<E> !RefUnwindSafe for QueryHandle<E>

§

impl<E> Send for QueryHandle<E>
where E: Send,

§

impl<E> Sync for QueryHandle<E>
where E: Sync,

§

impl<E> Unpin for QueryHandle<E>
where E: Unpin,

§

impl<E> !UnwindSafe for QueryHandle<E>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Az for T

source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

source§

fn cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T> CheckedAs for T

source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
source§

impl<Src, Dst> LosslessTryInto<Dst> for Src
where Dst: LosslessTryFrom<Src>,

source§

fn lossless_try_into(self) -> Option<Dst>

Performs the conversion.
source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

source§

fn lossy_into(self) -> Dst

Performs the conversion.
source§

impl<T> OverflowingAs for T

source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatingAs for T

source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> UnwrappedAs for T

source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
source§

impl<T> WrappingAs for T

source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.
§

impl<T> Ungil for T
where T: Send,