Skip to main content

SqliteDataset

Struct SqliteDataset 

Source
pub struct SqliteDataset<I> { /* private fields */ }
Available on crate features dataset and sqlite and std only.
Expand description

This struct represents a dataset where all items are stored in an SQLite database. Each instance of this struct corresponds to a specific table within the SQLite database, and allows for interaction with the data stored in the table in a structured and typed manner.

The database is read and written with Turso, which implements the engine in Rust rather than linking libsqlite3, so the files stay interchangeable with any other SQLite tooling. Note that this does not make the build free of C: turso pulls simsimd for its SIMD kernels, which compiles C unconditionally.

The SQLite database must contain a table with the same name as the split field. This table should have a primary key column named row_id, which is used to index the rows in the table. The row_id should start at 1, while the corresponding dataset index should start at 0, i.e., row_id = index + 1.

Table columns can be represented in two ways:

  1. The table can have a column for each field in the I struct. In this case, the column names in the table should match the field names of the I struct. The field names can be a subset of column names and can be in any order.

For the supported field types, refer to SQLite data types. Each column is handed to serde as the value its storage class implies: INTEGER as i64, REAL as f64, TEXT as String, and BLOB as a byte sequence. Booleans are read back from integers, and a nullable column maps to an Option field. Reading a NULL into a bare f32 or f64 field yields NaN.

A Vec<u8> field derives as a sequence, so a large BLOB column is walked one byte at a time. Tagging the field #[serde(with = "serde_bytes")] moves the blob across instead, which is substantially cheaper for columns of any size.

  1. The fields in the I struct can be serialized into a single column item in the table. In this case, the table should have a single column named item of type BLOB. This is useful when the I struct contains complex fields that cannot be mapped to a SQLite type, such as nested structs, vectors, etc. The serialization is done using MessagePack.

Note: The code automatically figures out which of the above two cases is applicable, and uses the appropriate method to read the data from the table.

Implementations§

Source§

impl<I> SqliteDataset<I>

Source

pub fn from_db_file<P>( db_file: P, split: &str, ) -> Result<SqliteDataset<I>, SqliteDatasetError>
where P: AsRef<Path>,

Initializes a SqliteDataset from a SQLite database file and a split name.

Source

pub fn db_file(&self) -> PathBuf

Get the database file name.

Source

pub fn split(&self) -> &str

Get the split name.

Trait Implementations§

Source§

impl<I> Dataset<I, SqliteDatasetError> for SqliteDataset<I>

Source§

fn get(&self, index: usize) -> Result<I, SqliteDatasetError>

Get an item from the dataset.

§Panics

Panics if index >= len().

Source§

fn get_many(&self, indexes: Vec<usize>) -> Result<Vec<I>, SqliteDatasetError>

Get multiple items from the dataset in a single query.

§Panics

Panics if indexes[i] >= len().

Source§

fn len(&self) -> usize

Return the number of rows in the dataset.

Source§

fn is_empty(&self) -> bool

Checks if the dataset is empty.
Source§

fn iter(&self) -> DatasetIterator<'_, I, E> ⓘ
where Self: Sized,

Returns an iterator over the dataset.
Source§

impl<I> Debug for SqliteDataset<I>
where I: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<I> !RefUnwindSafe for SqliteDataset<I>

§

impl<I> !UnwindSafe for SqliteDataset<I>

§

impl<I> Freeze for SqliteDataset<I>
where PhantomData<I>: Freeze,

§

impl<I> Send for SqliteDataset<I>
where PhantomData<I>: Send,

§

impl<I> Sync for SqliteDataset<I>
where PhantomData<I>: Sync,

§

impl<I> Unpin for SqliteDataset<I>
where PhantomData<I>: Unpin,

§

impl<I> UnsafeUnpin for SqliteDataset<I>

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> 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

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

Source§

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

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

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

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

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

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

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

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

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

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

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

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

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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> IntoComptime for T

Source§

fn comptime(self) -> Self

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<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

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

Initializes a with the given initializer. Read more
Source§

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

Dereferences the given pointer. Read more
Source§

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

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

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

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

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

Source§

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> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

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

Source§

fn vzip(self) -> V

Source§

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

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

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