pub enum Operation {
Show 16 variants
Append {
fragments: Vec<Fragment>,
},
Delete {
updated_fragments: Vec<Fragment>,
deleted_fragment_ids: Vec<u64>,
predicate: String,
},
Overwrite {
fragments: Vec<Fragment>,
schema: Schema,
config_upsert_values: Option<HashMap<String, String>>,
initial_bases: Option<Vec<BasePath>>,
},
CreateIndex {
new_indices: Vec<IndexMetadata>,
removed_indices: Vec<IndexMetadata>,
},
Rewrite {
groups: Vec<RewriteGroup>,
rewritten_indices: Vec<RewrittenIndex>,
frag_reuse_index: Option<IndexMetadata>,
},
DataReplacement {
replacements: Vec<DataReplacementGroup>,
},
DataOverlay {
groups: Vec<DataOverlayGroup>,
},
Merge {
fragments: Vec<Fragment>,
schema: Schema,
},
Restore {
version: u64,
},
ReserveFragments {
num_fragments: u32,
},
Update {
removed_fragment_ids: Vec<u64>,
updated_fragments: Vec<Fragment>,
new_fragments: Vec<Fragment>,
fields_modified: Vec<u32>,
merged_generations: Vec<MergedGeneration>,
fields_for_preserving_frag_bitmap: Vec<u32>,
update_mode: Option<UpdateMode>,
inserted_rows_filter: Option<KeyExistenceFilter>,
updated_fragment_offsets: Option<UpdatedFragmentOffsets>,
},
Project {
schema: Schema,
},
UpdateConfig {
config_updates: Option<UpdateMap>,
table_metadata_updates: Option<UpdateMap>,
schema_metadata_updates: Option<UpdateMap>,
field_metadata_updates: HashMap<i32, UpdateMap>,
},
UpdateMemWalState {
merged_generations: Vec<MergedGeneration>,
},
Clone {
is_shallow: bool,
ref_name: Option<String>,
ref_version: u64,
ref_path: String,
branch_name: Option<String>,
},
UpdateBases {
new_bases: Vec<BasePath>,
},
}Expand description
An operation on a dataset.
Variants§
Append
Adding new fragments to the dataset. The fragments contained within haven’t yet been assigned a final ID.
Delete
Updated fragments contain those that have been modified with new deletion files. The deleted fragment IDs are those that should be removed from the manifest.
Overwrite
Overwrite the entire dataset with the given fragments. This is also used when initially creating a table.
Fields
CreateIndex
A new index has been created.
Fields
new_indices: Vec<IndexMetadata>The new secondary indices, any existing indices with the same name will be replaced.
removed_indices: Vec<IndexMetadata>The indices that have been modified.
Rewrite
Data is rewritten but not modified. This is used for things like compaction or re-ordering. Contains the old fragments and the new ones that have been replaced.
This operation will modify the row addresses of existing rows and so any existing index covering a rewritten fragment will need to be remapped.
Fields
groups: Vec<RewriteGroup>Groups of fragments that have been modified
rewritten_indices: Vec<RewrittenIndex>Indices that have been updated with the new row addresses
frag_reuse_index: Option<IndexMetadata>The fragment reuse index to be created or updated to
DataReplacement
Replace data in a column in the dataset with new data. This is used for null column population where we replace an entirely null column with a new column that has data.
This operation will only allow replacing files that contain the same schema e.g. if the original files contain columns A, B, C and the new files contain only columns A, B then the operation is not allowed. As we would need to split the original files into two files, one with column A, B and the other with column C.
Corollary to the above: the operation will also not allow replacing files unless the affected columns all have the same datafile layout across the fragments being replaced.
e.g. if fragments being replaced contain files with different schema layouts on
the column being replaced, the operation is not allowed.
say frag_1: [A] [B, C] and frag_2: [A, B] [C] and we are trying to replace column A
with a new column A, the operation is not allowed.
Fields
replacements: Vec<DataReplacementGroup>DataOverlay
Attach overlay files to fragments, supplying new values for a subset of
(physical offset, field) cells without rewriting the fragments’ base
data files. See DataOverlayFile and the Data Overlay Files
specification for resolution, coverage, and versioning rules.
Fields
groups: Vec<DataOverlayGroup>Merge
Merge a new column in ‘fragments’ is the final fragments include all data files, the new fragments must align with old ones at rows. ‘schema’ is not forced to include existed columns, which means we could use Merge to drop column data
Restore
Restore an old version of the database
ReserveFragments
Reserves fragment ids for future use This can be used when row ids need to be known before a transaction has been committed. It is used during a rewrite operation to allow indices to be remapped to the new row ids as part of the operation.
Update
Update values in the dataset.
Updates are generally vertical or horizontal.
A vertical update adds new rows. In this case, the updated_fragments will only have existing rows deleted and will not have any new fields added. All new data will be contained in new_fragments. This is what is used by a merge_insert that matches the whole schema and what is used by the dataset updater.
A horizontal update adds new columns. In this case, the updated fragments may have fields removed or added. It is even possible for a field to be tombstoned and then added back in the same update. (which is a field modification). If any fields are modified in this way then they need to be added to the fields_modified list. This way we can correctly update the indices. This is what is used by a merge insert that does not match the whole schema.
Fields
merged_generations: Vec<MergedGeneration>List of MemWAL region generations to mark as merged after this transaction
fields_for_preserving_frag_bitmap: Vec<u32>The fields that used to judge whether to preserve the new frag’s id into the frag bitmap of the specified indices.
update_mode: Option<UpdateMode>The mode of update
inserted_rows_filter: Option<KeyExistenceFilter>Optional filter for detecting conflicts on inserted row keys. Only tracks keys from INSERT operations during merge insert, not updates.
updated_fragment_offsets: Option<UpdatedFragmentOffsets>Physical row offsets (per fragment) that matched update_columns for RewriteColumns.
None means callers did not supply offsets; build_manifest skips partial refresh then.
Project
Project to a new schema. This only changes the schema, not the data.
UpdateConfig
Update the dataset configuration.
Fields
UpdateMemWalState
Update merged generations in MemWAL index. This is used during merge-insert to atomically record which generations have been merged to the base table.
Fields
merged_generations: Vec<MergedGeneration>Clone
Clone a dataset.
Fields
UpdateBases
Implementations§
Trait Implementations§
Source§impl DeepSizeOf for Operation
impl DeepSizeOf for Operation
fn deep_size_of_children(&self, __context: &mut Context) -> usize
fn deep_size_of(&self) -> usize
Auto Trait Implementations§
impl !RefUnwindSafe for Operation
impl !UnwindSafe for Operation
impl Freeze for Operation
impl Send for Operation
impl Sync for Operation
impl Unpin for Operation
impl UnsafeUnpin for Operation
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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> ErasedDestructor for Twhere
T: 'static,
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> 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> 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 moreSource§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> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
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.