2022-10-20 16:25:34 +08:00
/*!
The autobatcher is responsible for combining the next enqueued
tasks affecting a single index into a [ batch ] ( crate ::batch ::Batch ) .
The main function of the autobatcher is [ ` next_autobatch ` ] .
* /
2022-10-21 00:00:07 +08:00
use std ::ops ::ControlFlow ::{ self , Break , Continue } ;
2022-10-11 23:42:43 +08:00
use meilisearch_types ::milli ::update ::IndexDocumentsMethod ::{
self , ReplaceDocuments , UpdateDocuments ,
} ;
2022-10-12 22:10:28 +08:00
use meilisearch_types ::tasks ::TaskId ;
2022-09-13 20:59:03 +08:00
2022-10-12 09:21:25 +08:00
use crate ::KindWithContent ;
2022-10-20 16:25:34 +08:00
/// Succinctly describes a task's [`Kind`](meilisearch_types::tasks::Kind)
/// for the purpose of simplifying the implementation of the autobatcher.
///
/// Only the non-prioritised tasks that can be grouped in a batch have a corresponding [`AutobatchKind`]
2022-10-12 09:21:25 +08:00
enum AutobatchKind {
2022-10-21 00:00:07 +08:00
DocumentImport { method : IndexDocumentsMethod , allow_index_creation : bool } ,
2022-10-12 09:21:25 +08:00
DocumentDeletion ,
DocumentClear ,
2022-10-21 00:00:07 +08:00
Settings { allow_index_creation : bool } ,
2022-10-12 09:21:25 +08:00
IndexCreation ,
IndexDeletion ,
IndexUpdate ,
IndexSwap ,
}
2022-10-13 16:50:26 +08:00
impl AutobatchKind {
#[ rustfmt::skip ]
fn allow_index_creation ( & self ) -> Option < bool > {
match self {
AutobatchKind ::DocumentImport { allow_index_creation , .. }
| AutobatchKind ::Settings { allow_index_creation , .. } = > Some ( * allow_index_creation ) ,
_ = > None ,
}
}
}
2022-10-12 09:21:25 +08:00
impl From < KindWithContent > for AutobatchKind {
fn from ( kind : KindWithContent ) -> Self {
match kind {
2022-10-22 00:03:10 +08:00
KindWithContent ::DocumentAdditionOrUpdate { method , allow_index_creation , .. } = > {
2022-10-21 00:00:07 +08:00
AutobatchKind ::DocumentImport { method , allow_index_creation }
}
2022-10-12 09:21:25 +08:00
KindWithContent ::DocumentDeletion { .. } = > AutobatchKind ::DocumentDeletion ,
KindWithContent ::DocumentClear { .. } = > AutobatchKind ::DocumentClear ,
2022-10-22 00:03:10 +08:00
KindWithContent ::SettingsUpdate { allow_index_creation , is_deletion , .. } = > {
2022-10-21 00:00:07 +08:00
AutobatchKind ::Settings {
allow_index_creation : allow_index_creation & & ! is_deletion ,
}
}
2022-10-12 09:21:25 +08:00
KindWithContent ::IndexDeletion { .. } = > AutobatchKind ::IndexDeletion ,
KindWithContent ::IndexCreation { .. } = > AutobatchKind ::IndexCreation ,
KindWithContent ::IndexUpdate { .. } = > AutobatchKind ::IndexUpdate ,
2022-10-12 22:10:28 +08:00
KindWithContent ::IndexSwap { .. } = > AutobatchKind ::IndexSwap ,
2022-10-19 18:52:20 +08:00
KindWithContent ::TaskCancelation { .. }
| KindWithContent ::TaskDeletion { .. }
2022-10-25 01:08:15 +08:00
| KindWithContent ::DumpCreation { .. }
2022-10-25 16:44:58 +08:00
| KindWithContent ::SnapshotCreation = > {
2022-10-19 18:52:20 +08:00
panic! ( " The autobatcher should never be called with tasks that don't apply to an index. " )
}
2022-10-12 09:21:25 +08:00
}
}
}
2022-09-14 07:48:58 +08:00
#[ derive(Debug) ]
2022-09-09 18:16:19 +08:00
pub enum BatchKind {
2022-09-14 04:38:43 +08:00
DocumentClear {
2022-09-09 18:16:19 +08:00
ids : Vec < TaskId > ,
} ,
2022-09-29 21:49:54 +08:00
DocumentImport {
method : IndexDocumentsMethod ,
2022-10-06 21:55:48 +08:00
allow_index_creation : bool ,
2022-09-29 21:49:54 +08:00
import_ids : Vec < TaskId > ,
2022-09-14 06:34:02 +08:00
} ,
2022-09-09 18:16:19 +08:00
DocumentDeletion {
deletion_ids : Vec < TaskId > ,
} ,
2022-09-14 04:38:43 +08:00
ClearAndSettings {
2022-09-09 18:16:19 +08:00
other : Vec < TaskId > ,
2022-10-06 21:55:48 +08:00
allow_index_creation : bool ,
2022-09-09 18:16:19 +08:00
settings_ids : Vec < TaskId > ,
} ,
2022-09-29 21:49:54 +08:00
SettingsAndDocumentImport {
2022-09-14 06:34:02 +08:00
settings_ids : Vec < TaskId > ,
2022-09-29 21:49:54 +08:00
method : IndexDocumentsMethod ,
2022-10-06 21:55:48 +08:00
allow_index_creation : bool ,
2022-09-29 21:49:54 +08:00
import_ids : Vec < TaskId > ,
2022-09-14 06:34:02 +08:00
} ,
2022-09-09 18:16:19 +08:00
Settings {
2022-10-06 21:55:48 +08:00
allow_index_creation : bool ,
2022-09-09 18:16:19 +08:00
settings_ids : Vec < TaskId > ,
} ,
2022-09-14 04:38:43 +08:00
IndexDeletion {
2022-09-09 18:16:19 +08:00
ids : Vec < TaskId > ,
} ,
2022-09-14 04:38:43 +08:00
IndexCreation {
2022-09-09 18:16:19 +08:00
id : TaskId ,
} ,
2022-09-14 04:38:43 +08:00
IndexUpdate {
2022-09-09 18:16:19 +08:00
id : TaskId ,
} ,
2022-09-14 04:38:43 +08:00
IndexSwap {
2022-09-09 18:16:19 +08:00
id : TaskId ,
} ,
}
2022-10-13 16:50:26 +08:00
impl BatchKind {
#[ rustfmt::skip ]
fn allow_index_creation ( & self ) -> Option < bool > {
match self {
BatchKind ::DocumentImport { allow_index_creation , .. }
| BatchKind ::ClearAndSettings { allow_index_creation , .. }
| BatchKind ::SettingsAndDocumentImport { allow_index_creation , .. }
| BatchKind ::Settings { allow_index_creation , .. } = > Some ( * allow_index_creation ) ,
_ = > None ,
}
}
}
2022-09-09 18:16:19 +08:00
impl BatchKind {
2022-10-06 17:46:08 +08:00
/// Returns a `ControlFlow::Break` if you must stop right now.
2022-10-20 00:27:18 +08:00
/// The boolean tell you if an index has been created by the batched task.
/// To ease the writting of the code. `true` can be returned when you don't need to create an index
/// but false can't be returned if you needs to create an index.
2022-10-18 19:47:22 +08:00
// TODO use an AutoBatchKind as input
2022-10-20 00:27:18 +08:00
pub fn new (
task_id : TaskId ,
kind : KindWithContent ,
) -> ( ControlFlow < BatchKind , BatchKind > , bool ) {
2022-10-12 09:21:25 +08:00
use AutobatchKind as K ;
match AutobatchKind ::from ( kind ) {
2022-10-20 00:27:18 +08:00
K ::IndexCreation = > ( Break ( BatchKind ::IndexCreation { id : task_id } ) , true ) ,
2022-10-21 00:00:07 +08:00
K ::IndexDeletion = > ( Break ( BatchKind ::IndexDeletion { ids : vec ! [ task_id ] } ) , false ) ,
2022-10-20 00:27:18 +08:00
K ::IndexUpdate = > ( Break ( BatchKind ::IndexUpdate { id : task_id } ) , false ) ,
K ::IndexSwap = > ( Break ( BatchKind ::IndexSwap { id : task_id } ) , false ) ,
2022-10-21 00:00:07 +08:00
K ::DocumentClear = > ( Continue ( BatchKind ::DocumentClear { ids : vec ! [ task_id ] } ) , false ) ,
K ::DocumentImport { method , allow_index_creation } = > (
2022-10-20 00:27:18 +08:00
Continue ( BatchKind ::DocumentImport {
method ,
allow_index_creation ,
import_ids : vec ! [ task_id ] ,
} ) ,
2022-10-06 21:55:48 +08:00
allow_index_creation ,
2022-10-20 00:27:18 +08:00
) ,
2022-10-21 00:00:07 +08:00
K ::DocumentDeletion = > {
( Continue ( BatchKind ::DocumentDeletion { deletion_ids : vec ! [ task_id ] } ) , false )
}
K ::Settings { allow_index_creation } = > (
Continue ( BatchKind ::Settings { allow_index_creation , settings_ids : vec ! [ task_id ] } ) ,
2022-10-06 21:55:48 +08:00
allow_index_creation ,
2022-10-20 00:27:18 +08:00
) ,
2022-09-09 18:16:19 +08:00
}
}
2022-10-06 17:46:08 +08:00
/// Returns a `ControlFlow::Break` if you must stop right now.
2022-10-20 00:27:18 +08:00
/// The boolean tell you if an index has been created by the batched task.
/// To ease the writting of the code. `true` can be returned when you don't need to create an index
/// but false can't be returned if you needs to create an index.
2022-10-06 21:55:48 +08:00
#[ rustfmt::skip ]
2022-10-20 01:15:53 +08:00
fn accumulate ( self , id : TaskId , kind : AutobatchKind , index_already_exists : bool ) -> ControlFlow < BatchKind , BatchKind > {
2022-10-12 09:21:25 +08:00
use AutobatchKind as K ;
2022-10-20 01:15:53 +08:00
match ( self , kind ) {
// We don't batch any of these operations
( this , K ::IndexCreation | K ::IndexUpdate | K ::IndexSwap ) = > Break ( this ) ,
2022-10-20 01:18:31 +08:00
// We must not batch tasks that don't have the same index creation rights if the index doesn't already exists.
2022-10-22 22:35:42 +08:00
( this , kind ) if ! index_already_exists & & this . allow_index_creation ( ) = = Some ( false ) & & kind . allow_index_creation ( ) = = Some ( true ) = > {
2022-10-20 01:15:53 +08:00
Break ( this )
2022-10-20 00:27:18 +08:00
} ,
// The index deletion can batch with everything but must stop after
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentClear { mut ids }
| BatchKind ::DocumentDeletion { deletion_ids : mut ids }
| BatchKind ::DocumentImport { method : _ , allow_index_creation : _ , import_ids : mut ids }
| BatchKind ::Settings { allow_index_creation : _ , settings_ids : mut ids } ,
K ::IndexDeletion ,
) = > {
ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Break ( BatchKind ::IndexDeletion { ids } )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::ClearAndSettings { settings_ids : mut ids , allow_index_creation : _ , mut other }
| BatchKind ::SettingsAndDocumentImport { import_ids : mut ids , method : _ , allow_index_creation : _ , settings_ids : mut other } ,
K ::IndexDeletion ,
) = > {
ids . push ( id ) ;
ids . append ( & mut other ) ;
2022-10-20 01:15:53 +08:00
Break ( BatchKind ::IndexDeletion { ids } )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentClear { mut ids } ,
K ::DocumentClear | K ::DocumentDeletion ,
) = > {
ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentClear { ids } )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
this @ BatchKind ::DocumentClear { .. } ,
K ::DocumentImport { .. } | K ::Settings { .. } ,
2022-10-20 01:15:53 +08:00
) = > Break ( this ) ,
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentImport { method : _ , allow_index_creation : _ , import_ids : mut ids } ,
K ::DocumentClear ,
) = > {
ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentClear { ids } )
2022-10-20 00:27:18 +08:00
}
// we can autobatch the same kind of document additions / updates
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentImport { method : ReplaceDocuments , allow_index_creation , mut import_ids } ,
K ::DocumentImport { method : ReplaceDocuments , .. } ,
) = > {
import_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentImport {
2022-10-20 00:27:18 +08:00
method : ReplaceDocuments ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-09-14 06:34:02 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentImport { method : UpdateDocuments , allow_index_creation , mut import_ids } ,
K ::DocumentImport { method : UpdateDocuments , .. } ,
) = > {
import_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentImport {
2022-10-20 00:27:18 +08:00
method : UpdateDocuments ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
// but we can't autobatch documents if it's not the same kind
// this match branch MUST be AFTER the previous one
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
this @ BatchKind ::DocumentImport { .. } ,
K ::DocumentDeletion | K ::DocumentImport { .. } ,
2022-10-20 01:15:53 +08:00
) = > Break ( this ) ,
2022-10-20 00:27:18 +08:00
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::DocumentImport { method , allow_index_creation , import_ids } ,
K ::Settings { .. } ,
2022-10-20 01:15:53 +08:00
) = > Continue ( BatchKind ::SettingsAndDocumentImport {
2022-10-20 00:27:18 +08:00
settings_ids : vec ! [ id ] ,
method ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} ) ,
2022-10-20 00:27:18 +08:00
2022-10-20 01:15:53 +08:00
( BatchKind ::DocumentDeletion { mut deletion_ids } , K ::DocumentClear ) = > {
2022-10-20 00:27:18 +08:00
deletion_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentClear { ids : deletion_ids } )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
( this @ BatchKind ::DocumentDeletion { .. } , K ::DocumentImport { .. } ) = > Break ( this ) ,
( BatchKind ::DocumentDeletion { mut deletion_ids } , K ::DocumentDeletion ) = > {
2022-10-20 00:27:18 +08:00
deletion_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::DocumentDeletion { deletion_ids } )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
( this @ BatchKind ::DocumentDeletion { .. } , K ::Settings { .. } ) = > Break ( this ) ,
2022-10-20 00:27:18 +08:00
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::Settings { settings_ids , allow_index_creation } ,
K ::DocumentClear ,
2022-10-20 01:15:53 +08:00
) = > Continue ( BatchKind ::ClearAndSettings {
2022-10-20 00:27:18 +08:00
settings_ids ,
allow_index_creation ,
other : vec ! [ id ] ,
2022-10-20 01:15:53 +08:00
} ) ,
(
2022-10-20 00:27:18 +08:00
this @ BatchKind ::Settings { .. } ,
K ::DocumentImport { .. } | K ::DocumentDeletion ,
2022-10-20 01:15:53 +08:00
) = > Break ( this ) ,
(
2022-10-20 00:27:18 +08:00
BatchKind ::Settings { mut settings_ids , allow_index_creation } ,
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::Settings {
2022-10-20 00:27:18 +08:00
allow_index_creation ,
settings_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::ClearAndSettings { mut other , settings_ids , allow_index_creation } ,
K ::DocumentClear ,
) = > {
other . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-20 00:27:18 +08:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
( this @ BatchKind ::ClearAndSettings { .. } , K ::DocumentImport { .. } ) = > Break ( this ) ,
(
2022-10-20 00:27:18 +08:00
BatchKind ::ClearAndSettings {
mut other ,
settings_ids ,
allow_index_creation ,
} ,
K ::DocumentDeletion ,
) = > {
other . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-20 00:27:18 +08:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::ClearAndSettings { mut settings_ids , other , allow_index_creation } ,
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-20 00:27:18 +08:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::SettingsAndDocumentImport { settings_ids , method : _ , import_ids : mut other , allow_index_creation } ,
K ::DocumentClear ,
) = > {
other . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-20 00:27:18 +08:00
settings_ids ,
other ,
allow_index_creation ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::SettingsAndDocumentImport { settings_ids , method : ReplaceDocuments , mut import_ids , allow_index_creation } ,
K ::DocumentImport { method : ReplaceDocuments , .. } ,
) = > {
import_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::SettingsAndDocumentImport {
2022-10-20 00:27:18 +08:00
settings_ids ,
method : ReplaceDocuments ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
BatchKind ::SettingsAndDocumentImport { settings_ids , method : UpdateDocuments , allow_index_creation , mut import_ids } ,
K ::DocumentImport { method : UpdateDocuments , .. } ,
) = > {
import_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::SettingsAndDocumentImport {
2022-10-20 00:27:18 +08:00
settings_ids ,
method : UpdateDocuments ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
// But we can't batch a settings and a doc op with another doc op
// this MUST be AFTER the two previous branch
2022-10-20 01:15:53 +08:00
(
2022-10-20 00:27:18 +08:00
this @ BatchKind ::SettingsAndDocumentImport { .. } ,
K ::DocumentDeletion | K ::DocumentImport { .. } ,
2022-10-20 01:15:53 +08:00
) = > Break ( this ) ,
(
2022-10-20 00:27:18 +08:00
BatchKind ::SettingsAndDocumentImport { mut settings_ids , method , allow_index_creation , import_ids } ,
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2022-10-20 01:15:53 +08:00
Continue ( BatchKind ::SettingsAndDocumentImport {
2022-10-20 00:27:18 +08:00
settings_ids ,
method ,
allow_index_creation ,
import_ids ,
2022-10-20 01:15:53 +08:00
} )
2022-10-20 00:27:18 +08:00
}
2022-10-20 01:15:53 +08:00
(
2022-09-14 04:38:43 +08:00
BatchKind ::IndexCreation { .. }
| BatchKind ::IndexDeletion { .. }
| BatchKind ::IndexUpdate { .. }
| BatchKind ::IndexSwap { .. } ,
2022-09-09 18:16:19 +08:00
_ ,
) = > {
unreachable! ( )
}
}
}
}
2022-10-20 16:25:34 +08:00
/// Create a batch from an ordered list of tasks.
///
/// ## Preconditions
/// 1. The tasks must be enqueued and given in the order in which they were enqueued
/// 2. The tasks must not be prioritised tasks (e.g. task cancellation, dump, snapshot, task deletion)
/// 3. The tasks must all be related to the same index
///
/// ## Return
/// `None` if the list of tasks is empty. Otherwise, an [`AutoBatch`] that represents
/// a subset of the given tasks.
2022-10-20 00:27:18 +08:00
pub fn autobatch (
enqueued : Vec < ( TaskId , KindWithContent ) > ,
index_already_exists : bool ,
) -> Option < ( BatchKind , bool ) > {
2022-09-09 18:16:19 +08:00
let mut enqueued = enqueued . into_iter ( ) ;
let ( id , kind ) = enqueued . next ( ) ? ;
2022-10-20 00:27:18 +08:00
// index_exist will keep track of if the index should exist at this point after the tasks we batched.
let mut index_exist = index_already_exists ;
2022-10-20 01:15:53 +08:00
let ( mut acc , must_create_index ) = match BatchKind ::new ( id , kind ) {
2022-10-20 00:27:18 +08:00
( Continue ( acc ) , create ) = > ( acc , create ) ,
( Break ( acc ) , create ) = > return Some ( ( acc , create ) ) ,
2022-10-06 17:46:08 +08:00
} ;
2022-09-09 18:16:19 +08:00
2022-10-20 01:15:53 +08:00
// if an index has been created in the previous step we can consider it as existing.
index_exist | = must_create_index ;
2022-10-20 00:27:18 +08:00
2022-10-20 01:15:53 +08:00
for ( id , kind ) in enqueued {
acc = match acc . accumulate ( id , kind . into ( ) , index_exist ) {
Continue ( acc ) = > acc ,
Break ( acc ) = > return Some ( ( acc , must_create_index ) ) ,
2022-09-13 20:59:03 +08:00
} ;
2022-09-09 18:16:19 +08:00
}
2022-10-20 00:27:18 +08:00
Some ( ( acc , must_create_index ) )
2022-09-14 07:48:58 +08:00
}
#[ cfg(test) ]
mod tests {
2022-10-26 18:57:29 +08:00
use meilisearch_types ::tasks ::IndexSwap ;
2022-10-21 00:00:07 +08:00
use uuid ::Uuid ;
2022-09-15 18:32:27 +08:00
2022-09-14 07:48:58 +08:00
use super ::* ;
2022-10-21 00:00:07 +08:00
use crate ::debug_snapshot ;
2022-09-14 07:48:58 +08:00
2022-10-20 01:15:53 +08:00
fn autobatch_from (
index_already_exists : bool ,
input : impl IntoIterator < Item = KindWithContent > ,
) -> Option < ( BatchKind , bool ) > {
2022-09-26 20:12:06 +08:00
autobatch (
2022-10-22 22:35:42 +08:00
input . into_iter ( ) . enumerate ( ) . map ( | ( id , kind ) | ( id as TaskId , kind ) ) . collect ( ) ,
2022-10-20 00:27:18 +08:00
index_already_exists ,
2022-09-26 20:12:06 +08:00
)
2022-09-14 07:48:58 +08:00
}
2022-10-12 09:21:25 +08:00
fn doc_imp ( method : IndexDocumentsMethod , allow_index_creation : bool ) -> KindWithContent {
2022-10-22 00:03:10 +08:00
KindWithContent ::DocumentAdditionOrUpdate {
2022-10-12 09:21:25 +08:00
index_uid : String ::from ( " doggo " ) ,
primary_key : None ,
method ,
content_file : Uuid ::new_v4 ( ) ,
documents_count : 0 ,
allow_index_creation ,
}
}
fn doc_del ( ) -> KindWithContent {
KindWithContent ::DocumentDeletion {
index_uid : String ::from ( " doggo " ) ,
documents_ids : Vec ::new ( ) ,
}
}
fn doc_clr ( ) -> KindWithContent {
2022-10-21 00:00:07 +08:00
KindWithContent ::DocumentClear { index_uid : String ::from ( " doggo " ) }
2022-10-12 09:21:25 +08:00
}
fn settings ( allow_index_creation : bool ) -> KindWithContent {
2022-10-22 00:03:10 +08:00
KindWithContent ::SettingsUpdate {
2022-10-12 09:21:25 +08:00
index_uid : String ::from ( " doggo " ) ,
new_settings : Default ::default ( ) ,
is_deletion : false ,
allow_index_creation ,
}
}
fn idx_create ( ) -> KindWithContent {
2022-10-21 00:00:07 +08:00
KindWithContent ::IndexCreation { index_uid : String ::from ( " doggo " ) , primary_key : None }
2022-10-12 09:21:25 +08:00
}
fn idx_update ( ) -> KindWithContent {
2022-10-21 00:00:07 +08:00
KindWithContent ::IndexUpdate { index_uid : String ::from ( " doggo " ) , primary_key : None }
2022-10-12 09:21:25 +08:00
}
fn idx_del ( ) -> KindWithContent {
2022-10-21 00:00:07 +08:00
KindWithContent ::IndexDeletion { index_uid : String ::from ( " doggo " ) }
2022-10-12 09:21:25 +08:00
}
fn idx_swap ( ) -> KindWithContent {
2022-10-26 18:57:29 +08:00
KindWithContent ::IndexSwap {
swaps : vec ! [ IndexSwap { indexes : ( String ::from ( " doggo " ) , String ::from ( " catto " ) ) } ] ,
}
2022-10-12 09:21:25 +08:00
}
2022-09-14 07:48:58 +08:00
#[ test ]
fn autobatch_simple_operation_together ( ) {
2022-10-20 00:57:43 +08:00
// we can autobatch one or multiple `ReplaceDocuments` together.
// if the index exists.
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1, 2] }, true)) " ) ;
2022-10-20 01:15:53 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0, 1, 2] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
// if it doesn't exists.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
// we can autobatch one or multiple `UpdateDocuments` together.
// if the index exists.
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0, 1, 2] }, true)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , doc_imp ( UpdateDocuments , false ) , doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0, 1, 2] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
// if it doesn't exists.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , doc_imp ( UpdateDocuments , false ) , doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0, 1, 2] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
// we can autobatch one or multiple DocumentDeletion together
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , doc_del ( ) , doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( false , [ doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_del ( ) , doc_del ( ) , doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
// we can autobatch one or multiple Settings together
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ settings ( true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0, 1, 2] }, true)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( false ) , settings ( false ) , settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0, 1, 2] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( false , [ settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ settings ( true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ settings ( false ) , settings ( false ) , settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0, 1, 2] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
}
#[ test ]
fn simple_document_operation_dont_autobatch_with_other ( ) {
// addition, updates and deletion can't batch together
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_del ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_del ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 01:15:53 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , idx_create ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , idx_create ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , idx_create ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , idx_update ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , idx_update ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , idx_update ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , idx_swap ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , idx_swap ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , idx_swap ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
}
#[ test ]
fn document_addition_batch_with_settings ( ) {
// simple case
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
// multiple settings and doc addition
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [2, 3], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [2, 3], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
// addition and setting unordered
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_imp ( ReplaceDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1, 3], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_imp ( UpdateDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1, 3], method: UpdateDocuments, allow_index_creation: true, import_ids: [0, 2] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
// We ensure this kind of batch doesn't batch with forbidden operations
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_del ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_del ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , idx_create ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , idx_create ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , idx_update ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , idx_update ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , idx_swap ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , idx_swap ( ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
}
#[ test ]
fn clear_and_additions ( ) {
// these two doesn't need to batch
2022-10-20 01:15:53 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_clr ( ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_clr ( ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
// Basic use case
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
// This batch kind doesn't mix with other document addition
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , doc_clr ( ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) , doc_clr ( ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
// But you can batch multiple clear together
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) , doc_clr ( ) , doc_clr ( ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2, 3, 4] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , doc_imp ( UpdateDocuments , true ) , doc_clr ( ) , doc_clr ( ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2, 3, 4] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
}
#[ test ]
fn clear_and_additions_and_settings ( ) {
// A clear don't need to autobatch the settings that happens AFTER there is no documents
2022-10-20 01:15:53 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_clr ( ) , settings ( true ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( true ) , doc_clr ( ) , settings ( true ) ] ) , @ " Some((ClearAndSettings { other: [1], allow_index_creation: true, settings_ids: [0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_clr ( ) ] ) , @ " Some((ClearAndSettings { other: [0, 2], allow_index_creation: true, settings_ids: [1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_clr ( ) ] ) , @ " Some((ClearAndSettings { other: [0, 2], allow_index_creation: true, settings_ids: [1] }, true)) " ) ;
2022-09-14 07:48:58 +08:00
}
#[ test ]
fn anything_and_index_deletion ( ) {
2022-10-20 00:57:43 +08:00
// The `IndexDeletion` doesn't batch with anything that happens AFTER.
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , doc_clr ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , settings ( true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ idx_del ( ) , settings ( false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_imp ( UpdateDocuments , true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_imp ( UpdateDocuments , false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , doc_clr ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , settings ( true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ idx_del ( ) , settings ( false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
// The index deletion can accept almost any type of `BatchKind` and transform it to an `IndexDeletion`.
2022-09-14 07:48:58 +08:00
// First, the basic cases
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
2022-10-20 01:15:53 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_del ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_del ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
// Then the mixed cases.
// The index already exists, whatever is the right of the tasks it shouldn't change the result.
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , false ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( UpdateDocuments , true ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
2022-10-20 01:15:53 +08:00
2022-10-20 00:57:43 +08:00
// When the index doesn't exists yet it's more complicated.
// Either the first task we encounter create it, in which case we can create a big batch with everything.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
// The right of the tasks following isn't really important.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , true ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
// Or, the second case; the first task doesn't create the index and thus we wants to batch it with only tasks that can't create an index.
// that can be a second task that don't have the right to create an index. Or anything that can't create an index like an index deletion, document deletion, document clear, etc.
// All theses tasks are going to throw an error `Index doesn't exist` once the batch is processed.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
// The third and final case is when the first task doesn't create an index but is directly followed by a task creating an index. In this case we can't batch whith what
// follows because we first need to process the erronous batch.
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( UpdateDocuments , false ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((DocumentImport { method: UpdateDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
2022-10-06 21:55:48 +08:00
}
#[ test ]
fn allowed_and_disallowed_index_creation ( ) {
2022-10-20 00:57:43 +08:00
// `DocumentImport` can't be mixed with those disallowed to do so except if the index already exists.
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0, 1] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0, 1] }, false)) " ) ;
2022-10-20 00:29:07 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
2022-10-20 01:18:31 +08:00
debug_snapshot! ( autobatch_from ( true , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
2022-10-20 00:57:43 +08:00
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , doc_imp ( ReplaceDocuments , true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: true, import_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , doc_imp ( ReplaceDocuments , false ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentImport { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, import_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , [ doc_imp ( ReplaceDocuments , false ) , settings ( true ) ] ) , @ " Some((DocumentImport { method: ReplaceDocuments, allow_index_creation: false, import_ids: [0] }, false)) " ) ;
2022-09-14 07:48:58 +08:00
}
2022-09-09 18:16:19 +08:00
}