2022-10-20 10:25:34 +02: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-20 18:00:07 +02:00
use std ::ops ::ControlFlow ::{ self , Break , Continue } ;
2022-10-11 17:42:43 +02:00
use meilisearch_types ::milli ::update ::IndexDocumentsMethod ::{
self , ReplaceDocuments , UpdateDocuments ,
} ;
2022-10-12 16:10:28 +02:00
use meilisearch_types ::tasks ::TaskId ;
2022-09-13 14:59:03 +02:00
2022-10-12 03:21:25 +02:00
use crate ::KindWithContent ;
2022-10-20 10:25:34 +02: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 03:21:25 +02:00
enum AutobatchKind {
2023-01-23 20:16:16 +01:00
DocumentImport {
method : IndexDocumentsMethod ,
allow_index_creation : bool ,
primary_key : Option < String > ,
} ,
2024-05-08 15:26:21 +02:00
DocumentEdition ,
2024-08-29 15:56:24 +02:00
DocumentDeletion {
by_filter : bool ,
} ,
2022-10-12 03:21:25 +02:00
DocumentClear ,
2023-01-23 20:16:16 +01:00
Settings {
allow_index_creation : bool ,
} ,
2022-10-12 03:21:25 +02:00
IndexCreation ,
IndexDeletion ,
IndexUpdate ,
IndexSwap ,
}
2022-10-13 10:50:26 +02: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 ,
}
}
2023-01-23 20:16:16 +01:00
fn primary_key ( & self ) -> Option < Option < & str > > {
match self {
AutobatchKind ::DocumentImport { primary_key , .. } = > Some ( primary_key . as_deref ( ) ) ,
_ = > None ,
}
}
2022-10-13 10:50:26 +02:00
}
2022-10-12 03:21:25 +02:00
impl From < KindWithContent > for AutobatchKind {
fn from ( kind : KindWithContent ) -> Self {
match kind {
2023-01-23 20:16:16 +01:00
KindWithContent ::DocumentAdditionOrUpdate {
method ,
allow_index_creation ,
primary_key ,
..
} = > AutobatchKind ::DocumentImport { method , allow_index_creation , primary_key } ,
2024-05-08 15:26:21 +02:00
KindWithContent ::DocumentEdition { .. } = > AutobatchKind ::DocumentEdition ,
2024-08-29 15:56:24 +02:00
KindWithContent ::DocumentDeletion { .. } = > {
AutobatchKind ::DocumentDeletion { by_filter : false }
}
2022-10-12 03:21:25 +02:00
KindWithContent ::DocumentClear { .. } = > AutobatchKind ::DocumentClear ,
2023-03-07 10:02:04 +01:00
KindWithContent ::DocumentDeletionByFilter { .. } = > {
2024-08-29 15:56:24 +02:00
AutobatchKind ::DocumentDeletion { by_filter : true }
2023-03-07 10:02:04 +01:00
}
2022-10-21 18:03:10 +02:00
KindWithContent ::SettingsUpdate { allow_index_creation , is_deletion , .. } = > {
2022-10-20 18:00:07 +02:00
AutobatchKind ::Settings {
allow_index_creation : allow_index_creation & & ! is_deletion ,
}
}
2022-10-12 03:21:25 +02:00
KindWithContent ::IndexDeletion { .. } = > AutobatchKind ::IndexDeletion ,
KindWithContent ::IndexCreation { .. } = > AutobatchKind ::IndexCreation ,
KindWithContent ::IndexUpdate { .. } = > AutobatchKind ::IndexUpdate ,
2022-10-12 16:10:28 +02:00
KindWithContent ::IndexSwap { .. } = > AutobatchKind ::IndexSwap ,
2022-10-19 12:52:20 +02:00
KindWithContent ::TaskCancelation { .. }
| KindWithContent ::TaskDeletion { .. }
2022-10-24 19:08:15 +02:00
| KindWithContent ::DumpCreation { .. }
2022-10-25 10:44:58 +02:00
| KindWithContent ::SnapshotCreation = > {
2022-10-19 12:52:20 +02:00
panic! ( " The autobatcher should never be called with tasks that don't apply to an index. " )
}
2022-10-12 03:21:25 +02:00
}
}
}
2022-09-14 01:48:58 +02:00
#[ derive(Debug) ]
2022-09-09 12:16:19 +02:00
pub enum BatchKind {
2022-09-13 22:38:43 +02:00
DocumentClear {
2022-09-09 12:16:19 +02:00
ids : Vec < TaskId > ,
} ,
2023-02-08 18:07:59 +01:00
DocumentOperation {
2022-09-29 15:49:54 +02:00
method : IndexDocumentsMethod ,
2022-10-06 15:55:48 +02:00
allow_index_creation : bool ,
2023-01-23 20:16:16 +01:00
primary_key : Option < String > ,
2023-02-08 18:07:59 +01:00
operation_ids : Vec < TaskId > ,
2022-09-14 00:34:02 +02:00
} ,
2024-05-08 15:26:21 +02:00
DocumentEdition {
id : TaskId ,
} ,
2022-09-09 12:16:19 +02:00
DocumentDeletion {
deletion_ids : Vec < TaskId > ,
2024-08-29 15:56:24 +02:00
includes_by_filter : bool ,
2023-03-07 10:02:04 +01:00
} ,
2022-09-13 22:38:43 +02:00
ClearAndSettings {
2022-09-09 12:16:19 +02:00
other : Vec < TaskId > ,
2022-10-06 15:55:48 +02:00
allow_index_creation : bool ,
2022-09-09 12:16:19 +02:00
settings_ids : Vec < TaskId > ,
} ,
2023-02-08 18:07:59 +01:00
SettingsAndDocumentOperation {
2022-09-14 00:34:02 +02:00
settings_ids : Vec < TaskId > ,
2022-09-29 15:49:54 +02:00
method : IndexDocumentsMethod ,
2022-10-06 15:55:48 +02:00
allow_index_creation : bool ,
2023-01-23 20:16:16 +01:00
primary_key : Option < String > ,
2023-02-08 18:07:59 +01:00
operation_ids : Vec < TaskId > ,
2022-09-14 00:34:02 +02:00
} ,
2022-09-09 12:16:19 +02:00
Settings {
2022-10-06 15:55:48 +02:00
allow_index_creation : bool ,
2022-09-09 12:16:19 +02:00
settings_ids : Vec < TaskId > ,
} ,
2022-09-13 22:38:43 +02:00
IndexDeletion {
2022-09-09 12:16:19 +02:00
ids : Vec < TaskId > ,
} ,
2022-09-13 22:38:43 +02:00
IndexCreation {
2022-09-09 12:16:19 +02:00
id : TaskId ,
} ,
2022-09-13 22:38:43 +02:00
IndexUpdate {
2022-09-09 12:16:19 +02:00
id : TaskId ,
} ,
2022-09-13 22:38:43 +02:00
IndexSwap {
2022-09-09 12:16:19 +02:00
id : TaskId ,
} ,
}
2022-10-13 10:50:26 +02:00
impl BatchKind {
#[ rustfmt::skip ]
fn allow_index_creation ( & self ) -> Option < bool > {
match self {
2023-02-08 18:07:59 +01:00
BatchKind ::DocumentOperation { allow_index_creation , .. }
2022-10-13 10:50:26 +02:00
| BatchKind ::ClearAndSettings { allow_index_creation , .. }
2023-02-08 18:07:59 +01:00
| BatchKind ::SettingsAndDocumentOperation { allow_index_creation , .. }
2022-10-13 10:50:26 +02:00
| BatchKind ::Settings { allow_index_creation , .. } = > Some ( * allow_index_creation ) ,
_ = > None ,
}
}
2023-01-23 20:16:16 +01:00
fn primary_key ( & self ) -> Option < Option < & str > > {
match self {
2023-02-08 18:07:59 +01:00
BatchKind ::DocumentOperation { primary_key , .. }
| BatchKind ::SettingsAndDocumentOperation { primary_key , .. } = > {
2023-01-23 20:16:16 +01:00
Some ( primary_key . as_deref ( ) )
}
_ = > None ,
}
}
2022-10-13 10:50:26 +02:00
}
2022-09-09 12:16:19 +02:00
impl BatchKind {
2022-10-06 11:46:08 +02:00
/// Returns a `ControlFlow::Break` if you must stop right now.
2022-10-19 18:27:18 +02:00
/// The boolean tell you if an index has been created by the batched task.
2023-06-19 16:43:32 +08:00
/// To ease the writing of the code. `true` can be returned when you don't need to create an index
2022-10-19 18:27:18 +02:00
/// but false can't be returned if you needs to create an index.
2022-10-18 13:47:22 +02:00
// TODO use an AutoBatchKind as input
2022-10-19 18:27:18 +02:00
pub fn new (
task_id : TaskId ,
kind : KindWithContent ,
2023-01-23 20:16:16 +01:00
primary_key : Option < & str > ,
2022-10-19 18:27:18 +02:00
) -> ( ControlFlow < BatchKind , BatchKind > , bool ) {
2022-10-12 03:21:25 +02:00
use AutobatchKind as K ;
match AutobatchKind ::from ( kind ) {
2022-10-19 18:27:18 +02:00
K ::IndexCreation = > ( Break ( BatchKind ::IndexCreation { id : task_id } ) , true ) ,
2022-10-20 18:00:07 +02:00
K ::IndexDeletion = > ( Break ( BatchKind ::IndexDeletion { ids : vec ! [ task_id ] } ) , false ) ,
2022-10-19 18:27:18 +02:00
K ::IndexUpdate = > ( Break ( BatchKind ::IndexUpdate { id : task_id } ) , false ) ,
K ::IndexSwap = > ( Break ( BatchKind ::IndexSwap { id : task_id } ) , false ) ,
2022-10-20 18:00:07 +02:00
K ::DocumentClear = > ( Continue ( BatchKind ::DocumentClear { ids : vec ! [ task_id ] } ) , false ) ,
2023-01-23 20:16:16 +01:00
K ::DocumentImport { method , allow_index_creation , primary_key : pk }
if primary_key . is_none ( ) | | pk . is_none ( ) | | primary_key = = pk . as_deref ( ) = >
{
(
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::DocumentOperation {
2023-01-23 20:16:16 +01:00
method ,
allow_index_creation ,
primary_key : pk ,
2023-02-08 18:07:59 +01:00
operation_ids : vec ! [ task_id ] ,
2023-01-23 20:16:16 +01:00
} ) ,
allow_index_creation ,
)
}
// if the primary key set in the task was different than ours we should stop and make this batch fail asap.
K ::DocumentImport { method , allow_index_creation , primary_key } = > (
2023-02-08 18:07:59 +01:00
Break ( BatchKind ::DocumentOperation {
2022-10-19 18:27:18 +02:00
method ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key ,
2023-02-08 18:07:59 +01:00
operation_ids : vec ! [ task_id ] ,
2022-10-19 18:27:18 +02:00
} ) ,
2022-10-06 15:55:48 +02:00
allow_index_creation ,
2022-10-19 18:27:18 +02:00
) ,
2024-05-08 15:26:21 +02:00
K ::DocumentEdition = > ( Break ( BatchKind ::DocumentEdition { id : task_id } ) , false ) ,
2024-08-29 15:56:24 +02:00
K ::DocumentDeletion { by_filter : includes_by_filter } = > (
Continue ( BatchKind ::DocumentDeletion {
deletion_ids : vec ! [ task_id ] ,
includes_by_filter ,
} ) ,
false ,
) ,
2022-10-20 18:00:07 +02:00
K ::Settings { allow_index_creation } = > (
Continue ( BatchKind ::Settings { allow_index_creation , settings_ids : vec ! [ task_id ] } ) ,
2022-10-06 15:55:48 +02:00
allow_index_creation ,
2022-10-19 18:27:18 +02:00
) ,
2022-09-09 12:16:19 +02:00
}
}
2022-10-06 11:46:08 +02:00
/// Returns a `ControlFlow::Break` if you must stop right now.
2022-10-19 18:27:18 +02:00
/// The boolean tell you if an index has been created by the batched task.
2023-06-19 16:43:32 +08:00
/// To ease the writing of the code. `true` can be returned when you don't need to create an index
2022-10-19 18:27:18 +02:00
/// but false can't be returned if you needs to create an index.
2022-10-06 15:55:48 +02:00
#[ rustfmt::skip ]
2023-01-23 20:16:16 +01:00
fn accumulate ( self , id : TaskId , kind : AutobatchKind , index_already_exists : bool , primary_key : Option < & str > ) -> ControlFlow < BatchKind , BatchKind > {
2022-10-12 03:21:25 +02:00
use AutobatchKind as K ;
2022-10-19 19:15:53 +02:00
match ( self , kind ) {
// We don't batch any of these operations
2024-08-29 15:56:24 +02:00
( this , K ::IndexCreation | K ::IndexUpdate | K ::IndexSwap | K ::DocumentEdition ) = > Break ( this ) ,
2022-10-19 19:18:31 +02: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 16:35:42 +02:00
( this , kind ) if ! index_already_exists & & this . allow_index_creation ( ) = = Some ( false ) & & kind . allow_index_creation ( ) = = Some ( true ) = > {
2022-10-19 19:15:53 +02:00
Break ( this )
2022-10-19 18:27:18 +02:00
} ,
2023-01-23 20:16:16 +01:00
// NOTE: We need to negate the whole condition since we're checking if we need to break instead of continue.
// I wrote it this way because it's easier to understand than the other way around.
( this , kind ) if ! (
// 1. If both task don't interact with primary key -> we can continue
( this . primary_key ( ) . is_none ( ) & & kind . primary_key ( ) . is_none ( ) ) | |
// 2. Else ->
(
// 2.1 If we already have a primary-key ->
(
primary_key . is_some ( ) & &
// 2.1.1 If the task we're trying to accumulate have a pk it must be equal to our primary key
// 2.1.2 If the task don't have a primary-key -> we can continue
2023-01-24 17:45:53 +01:00
kind . primary_key ( ) . map_or ( true , | pk | pk = = primary_key )
2023-01-23 20:16:16 +01:00
) | |
// 2.2 If we don't have a primary-key ->
(
// 2.2.1 If both the batch and the task have a primary key they should be equal
// 2.2.2 If the batch is set to Some(None), the task should be too
// 2.2.3 If the batch is set to None -> we can continue
2023-01-24 17:45:53 +01:00
this . primary_key ( ) . zip ( kind . primary_key ( ) ) . map_or ( true , | ( this , kind ) | this = = kind )
2023-01-23 20:16:16 +01:00
)
)
) // closing the negation
= > {
Break ( this )
} ,
2022-10-19 18:27:18 +02:00
// The index deletion can batch with everything but must stop after
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::DocumentClear { mut ids }
2024-08-29 15:56:24 +02:00
| BatchKind ::DocumentDeletion { deletion_ids : mut ids , includes_by_filter : _ }
2023-02-08 18:07:59 +01:00
| BatchKind ::DocumentOperation { method : _ , allow_index_creation : _ , primary_key : _ , operation_ids : mut ids }
2022-10-19 18:27:18 +02:00
| BatchKind ::Settings { allow_index_creation : _ , settings_ids : mut ids } ,
K ::IndexDeletion ,
) = > {
ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Break ( BatchKind ::IndexDeletion { ids } )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::ClearAndSettings { settings_ids : mut ids , allow_index_creation : _ , mut other }
2023-02-08 18:07:59 +01:00
| BatchKind ::SettingsAndDocumentOperation { operation_ids : mut ids , method : _ , allow_index_creation : _ , primary_key : _ , settings_ids : mut other } ,
2022-10-19 18:27:18 +02:00
K ::IndexDeletion ,
) = > {
ids . push ( id ) ;
ids . append ( & mut other ) ;
2022-10-19 19:15:53 +02:00
Break ( BatchKind ::IndexDeletion { ids } )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::DocumentClear { mut ids } ,
2024-08-29 15:56:24 +02:00
K ::DocumentClear | K ::DocumentDeletion { by_filter : _ } ,
2022-10-19 18:27:18 +02:00
) = > {
ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::DocumentClear { ids } )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
this @ BatchKind ::DocumentClear { .. } ,
K ::DocumentImport { .. } | K ::Settings { .. } ,
2022-10-19 19:15:53 +02:00
) = > Break ( this ) ,
(
2023-02-08 18:10:59 +01:00
BatchKind ::DocumentOperation { method : _ , allow_index_creation : _ , primary_key : _ , mut operation_ids } ,
2022-10-19 18:27:18 +02:00
K ::DocumentClear ,
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
Continue ( BatchKind ::DocumentClear { ids : operation_ids } )
2022-10-19 18:27:18 +02:00
}
// we can autobatch the same kind of document additions / updates
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::DocumentOperation { method : ReplaceDocuments , allow_index_creation , primary_key : _ , mut operation_ids } ,
2023-01-23 20:16:16 +01:00
K ::DocumentImport { method : ReplaceDocuments , primary_key : pk , .. } ,
2022-10-19 18:27:18 +02:00
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::DocumentOperation {
2022-10-19 18:27:18 +02:00
method : ReplaceDocuments ,
allow_index_creation ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2023-01-23 20:16:16 +01:00
primary_key : pk ,
2022-10-19 19:15:53 +02:00
} )
2022-09-14 00:34:02 +02:00
}
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::DocumentOperation { method : UpdateDocuments , allow_index_creation , primary_key : _ , mut operation_ids } ,
2023-01-23 20:16:16 +01:00
K ::DocumentImport { method : UpdateDocuments , primary_key : pk , .. } ,
2022-10-19 18:27:18 +02:00
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::DocumentOperation {
2022-10-19 18:27:18 +02:00
method : UpdateDocuments ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key : pk ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2023-02-08 18:07:59 +01:00
(
2023-05-17 14:25:50 +02:00
BatchKind ::DocumentOperation { method , allow_index_creation , primary_key , mut operation_ids } ,
2024-08-29 15:56:24 +02:00
K ::DocumentDeletion { by_filter : false } ,
2023-05-17 14:25:50 +02:00
) = > {
operation_ids . push ( id ) ;
Continue ( BatchKind ::DocumentOperation {
method ,
allow_index_creation ,
primary_key ,
operation_ids ,
} )
}
2024-08-29 15:56:24 +02:00
// We can't batch a document operation with a delete by filter
(
this @ BatchKind ::DocumentOperation { .. } ,
K ::DocumentDeletion { by_filter : true } ,
) = > {
Break ( this )
}
2022-10-19 18:27:18 +02: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-19 19:15:53 +02:00
(
2023-02-08 18:07:59 +01:00
this @ BatchKind ::DocumentOperation { .. } ,
K ::DocumentImport { .. } ,
2022-10-19 19:15:53 +02:00
) = > Break ( this ) ,
2022-10-19 18:27:18 +02:00
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::DocumentOperation { method , allow_index_creation , primary_key , operation_ids } ,
2022-10-19 18:27:18 +02:00
K ::Settings { .. } ,
2023-02-08 18:07:59 +01:00
) = > Continue ( BatchKind ::SettingsAndDocumentOperation {
2022-10-19 18:27:18 +02:00
settings_ids : vec ! [ id ] ,
method ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2022-10-19 19:15:53 +02:00
} ) ,
2022-10-19 18:27:18 +02:00
2024-08-29 15:56:24 +02:00
( BatchKind ::DocumentDeletion { mut deletion_ids , includes_by_filter : _ } , K ::DocumentClear ) = > {
2022-10-19 18:27:18 +02:00
deletion_ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::DocumentClear { ids : deletion_ids } )
2022-10-19 18:27:18 +02:00
}
2024-08-29 15:56:24 +02:00
// we can't autobatch the deletion and import if the document deletion contained a filter
(
this @ BatchKind ::DocumentDeletion { deletion_ids : _ , includes_by_filter : true } ,
K ::DocumentImport { .. }
) = > Break ( this ) ,
2023-05-17 14:25:50 +02:00
// we can autobatch the deletion and import if the index already exists
(
2024-08-29 15:56:24 +02:00
BatchKind ::DocumentDeletion { mut deletion_ids , includes_by_filter : false } ,
2023-05-17 14:25:50 +02:00
K ::DocumentImport { method , allow_index_creation , primary_key }
) if index_already_exists = > {
deletion_ids . push ( id ) ;
Continue ( BatchKind ::DocumentOperation {
method ,
allow_index_creation ,
primary_key ,
operation_ids : deletion_ids ,
} )
}
// we can autobatch the deletion and import if both can't create an index
(
2024-08-29 15:56:24 +02:00
BatchKind ::DocumentDeletion { mut deletion_ids , includes_by_filter : false } ,
2023-05-17 14:25:50 +02:00
K ::DocumentImport { method , allow_index_creation , primary_key }
) if ! allow_index_creation = > {
deletion_ids . push ( id ) ;
Continue ( BatchKind ::DocumentOperation {
method ,
allow_index_creation ,
primary_key ,
operation_ids : deletion_ids ,
} )
}
// we can't autobatch a deletion and an import if the index does not exists but would be created by an addition
2023-02-08 21:24:27 +01:00
(
this @ BatchKind ::DocumentDeletion { .. } ,
K ::DocumentImport { .. }
) = > {
Break ( this )
}
2024-08-29 15:56:24 +02:00
( BatchKind ::DocumentDeletion { mut deletion_ids , includes_by_filter } , K ::DocumentDeletion { by_filter } ) = > {
2022-10-19 18:27:18 +02:00
deletion_ids . push ( id ) ;
2024-08-29 15:56:24 +02:00
Continue ( BatchKind ::DocumentDeletion { deletion_ids , includes_by_filter : includes_by_filter | by_filter } )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
( this @ BatchKind ::DocumentDeletion { .. } , K ::Settings { .. } ) = > Break ( this ) ,
2022-10-19 18:27:18 +02:00
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::Settings { settings_ids , allow_index_creation } ,
K ::DocumentClear ,
2022-10-19 19:15:53 +02:00
) = > Continue ( BatchKind ::ClearAndSettings {
2022-10-19 18:27:18 +02:00
settings_ids ,
allow_index_creation ,
other : vec ! [ id ] ,
2022-10-19 19:15:53 +02:00
} ) ,
(
2022-10-19 18:27:18 +02:00
this @ BatchKind ::Settings { .. } ,
2024-08-29 15:56:24 +02:00
K ::DocumentImport { .. } | K ::DocumentDeletion { .. } ,
2022-10-19 19:15:53 +02:00
) = > Break ( this ) ,
(
2022-10-19 18:27:18 +02:00
BatchKind ::Settings { mut settings_ids , allow_index_creation } ,
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::Settings {
2022-10-19 18:27:18 +02:00
allow_index_creation ,
settings_ids ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::ClearAndSettings { mut other , settings_ids , allow_index_creation } ,
K ::DocumentClear ,
) = > {
other . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-19 18:27:18 +02:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
( this @ BatchKind ::ClearAndSettings { .. } , K ::DocumentImport { .. } ) = > Break ( this ) ,
(
2022-10-19 18:27:18 +02:00
BatchKind ::ClearAndSettings {
mut other ,
settings_ids ,
allow_index_creation ,
} ,
2024-08-29 15:56:24 +02:00
K ::DocumentDeletion { .. } ,
2022-10-19 18:27:18 +02:00
) = > {
other . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-19 18:27:18 +02:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-10-19 18:27:18 +02:00
BatchKind ::ClearAndSettings { mut settings_ids , other , allow_index_creation } ,
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-19 18:27:18 +02:00
other ,
settings_ids ,
allow_index_creation ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::SettingsAndDocumentOperation { settings_ids , method : _ , mut operation_ids , allow_index_creation , primary_key : _ } ,
2022-10-19 18:27:18 +02:00
K ::DocumentClear ,
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
2022-10-19 19:15:53 +02:00
Continue ( BatchKind ::ClearAndSettings {
2022-10-19 18:27:18 +02:00
settings_ids ,
2023-02-08 18:10:59 +01:00
other : operation_ids ,
2022-10-19 18:27:18 +02:00
allow_index_creation ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::SettingsAndDocumentOperation { settings_ids , method : ReplaceDocuments , mut operation_ids , allow_index_creation , primary_key : _ } ,
2023-01-23 20:16:16 +01:00
K ::DocumentImport { method : ReplaceDocuments , primary_key : pk2 , .. } ,
2022-10-19 18:27:18 +02:00
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::SettingsAndDocumentOperation {
2022-10-19 18:27:18 +02:00
settings_ids ,
method : ReplaceDocuments ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key : pk2 ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2023-02-08 18:10:59 +01:00
BatchKind ::SettingsAndDocumentOperation { settings_ids , method : UpdateDocuments , allow_index_creation , primary_key : _ , mut operation_ids } ,
2023-01-23 20:16:16 +01:00
K ::DocumentImport { method : UpdateDocuments , primary_key : pk2 , .. } ,
2022-10-19 18:27:18 +02:00
) = > {
2023-02-08 18:10:59 +01:00
operation_ids . push ( id ) ;
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::SettingsAndDocumentOperation {
2022-10-19 18:27:18 +02:00
settings_ids ,
method : UpdateDocuments ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key : pk2 ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02: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-19 19:15:53 +02:00
(
2023-02-08 18:07:59 +01:00
this @ BatchKind ::SettingsAndDocumentOperation { .. } ,
2024-08-29 15:56:24 +02:00
K ::DocumentDeletion { .. } | K ::DocumentImport { .. } ,
2022-10-19 19:15:53 +02:00
) = > Break ( this ) ,
(
2023-02-08 18:10:59 +01:00
BatchKind ::SettingsAndDocumentOperation { mut settings_ids , method , allow_index_creation , primary_key , operation_ids } ,
2022-10-19 18:27:18 +02:00
K ::Settings { .. } ,
) = > {
settings_ids . push ( id ) ;
2023-02-08 18:07:59 +01:00
Continue ( BatchKind ::SettingsAndDocumentOperation {
2022-10-19 18:27:18 +02:00
settings_ids ,
method ,
allow_index_creation ,
2023-01-23 20:16:16 +01:00
primary_key ,
2023-02-08 18:10:59 +01:00
operation_ids ,
2022-10-19 19:15:53 +02:00
} )
2022-10-19 18:27:18 +02:00
}
2022-10-19 19:15:53 +02:00
(
2022-09-13 22:38:43 +02:00
BatchKind ::IndexCreation { .. }
| BatchKind ::IndexDeletion { .. }
| BatchKind ::IndexUpdate { .. }
2023-03-07 10:02:04 +01:00
| BatchKind ::IndexSwap { .. }
2024-08-29 15:56:24 +02:00
| BatchKind ::DocumentEdition { .. } ,
2022-09-09 12:16:19 +02:00
_ ,
) = > {
unreachable! ( )
}
}
}
}
2022-10-20 10:25:34 +02: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-19 18:27:18 +02:00
pub fn autobatch (
enqueued : Vec < ( TaskId , KindWithContent ) > ,
index_already_exists : bool ,
2023-01-23 20:16:16 +01:00
primary_key : Option < & str > ,
2022-10-19 18:27:18 +02:00
) -> Option < ( BatchKind , bool ) > {
2022-09-09 12:16:19 +02:00
let mut enqueued = enqueued . into_iter ( ) ;
let ( id , kind ) = enqueued . next ( ) ? ;
2022-10-19 18:27:18 +02: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 ;
2023-01-23 20:16:16 +01:00
let ( mut acc , must_create_index ) = match BatchKind ::new ( id , kind , primary_key ) {
2022-10-19 18:27:18 +02:00
( Continue ( acc ) , create ) = > ( acc , create ) ,
( Break ( acc ) , create ) = > return Some ( ( acc , create ) ) ,
2022-10-06 11:46:08 +02:00
} ;
2022-09-09 12:16:19 +02:00
2022-10-19 19:15:53 +02:00
// if an index has been created in the previous step we can consider it as existing.
index_exist | = must_create_index ;
2022-10-19 18:27:18 +02:00
2022-10-19 19:15:53 +02:00
for ( id , kind ) in enqueued {
2023-01-23 20:16:16 +01:00
acc = match acc . accumulate ( id , kind . into ( ) , index_exist , primary_key ) {
2022-10-19 19:15:53 +02:00
Continue ( acc ) = > acc ,
Break ( acc ) = > return Some ( ( acc , must_create_index ) ) ,
2022-09-13 14:59:03 +02:00
} ;
2022-09-09 12:16:19 +02:00
}
2022-10-19 18:27:18 +02:00
Some ( ( acc , must_create_index ) )
2022-09-14 01:48:58 +02:00
}
#[ cfg(test) ]
mod tests {
2022-10-26 12:57:29 +02:00
use meilisearch_types ::tasks ::IndexSwap ;
2022-10-20 18:00:07 +02:00
use uuid ::Uuid ;
2022-09-15 12:32:27 +02:00
2022-09-14 01:48:58 +02:00
use super ::* ;
2022-10-20 18:00:07 +02:00
use crate ::debug_snapshot ;
2022-09-14 01:48:58 +02:00
2022-10-19 19:15:53 +02:00
fn autobatch_from (
index_already_exists : bool ,
2023-01-23 20:56:12 +01:00
primary_key : Option < & str > ,
2022-10-19 19:15:53 +02:00
input : impl IntoIterator < Item = KindWithContent > ,
) -> Option < ( BatchKind , bool ) > {
2022-09-26 14:12:06 +02:00
autobatch (
2022-10-22 16:35:42 +02:00
input . into_iter ( ) . enumerate ( ) . map ( | ( id , kind ) | ( id as TaskId , kind ) ) . collect ( ) ,
2022-10-19 18:27:18 +02:00
index_already_exists ,
2023-01-23 20:56:12 +01:00
primary_key ,
2022-09-26 14:12:06 +02:00
)
2022-09-14 01:48:58 +02:00
}
2023-01-23 20:56:12 +01:00
fn doc_imp (
method : IndexDocumentsMethod ,
allow_index_creation : bool ,
primary_key : Option < & str > ,
) -> KindWithContent {
2022-10-21 18:03:10 +02:00
KindWithContent ::DocumentAdditionOrUpdate {
2022-10-12 03:21:25 +02:00
index_uid : String ::from ( " doggo " ) ,
2023-01-23 20:56:12 +01:00
primary_key : primary_key . map ( | pk | pk . to_string ( ) ) ,
2022-10-12 03:21:25 +02:00
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 ( ) ,
}
}
2024-08-29 15:56:24 +02:00
fn doc_del_fil ( ) -> KindWithContent {
KindWithContent ::DocumentDeletionByFilter {
index_uid : String ::from ( " doggo " ) ,
filter_expr : serde_json ::json! ( " cuteness > 100 " ) ,
}
}
2022-10-12 03:21:25 +02:00
fn doc_clr ( ) -> KindWithContent {
2022-10-20 18:00:07 +02:00
KindWithContent ::DocumentClear { index_uid : String ::from ( " doggo " ) }
2022-10-12 03:21:25 +02:00
}
fn settings ( allow_index_creation : bool ) -> KindWithContent {
2022-10-21 18:03:10 +02:00
KindWithContent ::SettingsUpdate {
2022-10-12 03:21:25 +02:00
index_uid : String ::from ( " doggo " ) ,
new_settings : Default ::default ( ) ,
is_deletion : false ,
allow_index_creation ,
}
}
fn idx_create ( ) -> KindWithContent {
2022-10-20 18:00:07 +02:00
KindWithContent ::IndexCreation { index_uid : String ::from ( " doggo " ) , primary_key : None }
2022-10-12 03:21:25 +02:00
}
fn idx_update ( ) -> KindWithContent {
2022-10-20 18:00:07 +02:00
KindWithContent ::IndexUpdate { index_uid : String ::from ( " doggo " ) , primary_key : None }
2022-10-12 03:21:25 +02:00
}
fn idx_del ( ) -> KindWithContent {
2022-10-20 18:00:07 +02:00
KindWithContent ::IndexDeletion { index_uid : String ::from ( " doggo " ) }
2022-10-12 03:21:25 +02:00
}
fn idx_swap ( ) -> KindWithContent {
2022-10-26 12:57:29 +02:00
KindWithContent ::IndexSwap {
swaps : vec ! [ IndexSwap { indexes : ( String ::from ( " doggo " ) , String ::from ( " catto " ) ) } ] ,
}
2022-10-12 03:21:25 +02:00
}
2022-09-14 01:48:58 +02:00
#[ test ]
fn autobatch_simple_operation_together ( ) {
2022-10-19 18:57:43 +02:00
// we can autobatch one or multiple `ReplaceDocuments` together.
// if the index exists.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1, 2] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
// if it doesn't exists.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
// we can autobatch one or multiple `UpdateDocuments` together.
// if the index exists.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_imp ( UpdateDocuments , false , None ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1, 2] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
// if it doesn't exists.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_imp ( UpdateDocuments , false , None ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1, 2] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
2022-09-14 01:48:58 +02:00
// we can autobatch one or multiple DocumentDeletion together
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_del ( ) , doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_del ( ) , doc_del ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2], includes_by_filter: false }, false)) " ) ;
// we can autobatch one or multiple DocumentDeletionByFilter together
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_del_fil ( ) , doc_del_fil ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , doc_del_fil ( ) , doc_del_fil ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0, 1, 2], includes_by_filter: true }, false)) " ) ;
2022-10-19 18:57:43 +02:00
2022-09-14 01:48:58 +02:00
// we can autobatch one or multiple Settings together
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ settings ( true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ settings ( false ) , settings ( false ) , settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0, 1, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( true ) , settings ( true ) , settings ( true ) ] ) , @ " Some((Settings { allow_index_creation: true, settings_ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( false ) , settings ( false ) , settings ( false ) ] ) , @ " Some((Settings { allow_index_creation: false, settings_ids: [0, 1, 2] }, false)) " ) ;
2023-02-08 18:07:59 +01:00
2023-05-17 14:25:50 +02:00
// We can autobatch document addition with document deletion
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) , doc_del ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
// And the other way around
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0, 1] }, false))"### ) ;
2024-08-29 15:56:24 +02:00
// But we can't autobatch document addition with document deletion by filter
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: Some("catto"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0] }, false))"### ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) , doc_del_fil ( ) ] ) , @ r ### "Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: Some("catto"), operation_ids: [0] }, false))"### ) ;
// And the other way around
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , false , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , false , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
2022-09-14 01:48:58 +02:00
}
#[ test ]
fn simple_document_operation_dont_autobatch_with_other ( ) {
2024-08-29 15:56:24 +02:00
// addition, updates and deletion by filter can't batch together
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_del_fil ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , idx_create ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , idx_create ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , idx_create ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , idx_create ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
2023-01-23 20:56:12 +01:00
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , idx_update ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , idx_update ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , idx_update ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , idx_update ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
2023-01-23 20:56:12 +01:00
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , idx_swap ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , idx_swap ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , idx_swap ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , idx_swap ( ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: true }, false)) " ) ;
2022-09-14 01:48:58 +02:00
}
#[ test ]
fn document_addition_batch_with_settings ( ) {
// simple case
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
// multiple settings and doc addition
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [2, 3], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [2, 3], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
// addition and setting unordered
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1, 3], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_imp ( UpdateDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1, 3], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 2] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
// We ensure this kind of batch doesn't batch with forbidden operations
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_del ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_del ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , idx_create ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , idx_create ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , idx_update ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , idx_update ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , idx_swap ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , idx_swap ( ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: UpdateDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
}
#[ test ]
fn clear_and_additions ( ) {
// these two doesn't need to batch
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_clr ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_clr ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
2022-09-14 01:48:58 +02:00
// Basic use case
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
// This batch kind doesn't mix with other document addition
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_clr ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) , doc_clr ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
// But you can batch multiple clear together
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) , doc_clr ( ) , doc_clr ( ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2, 3, 4] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , doc_imp ( UpdateDocuments , true , None ) , doc_clr ( ) , doc_clr ( ) , doc_clr ( ) ] ) , @ " Some((DocumentClear { ids: [0, 1, 2, 3, 4] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
}
#[ test ]
fn clear_and_additions_and_settings ( ) {
// A clear don't need to autobatch the settings that happens AFTER there is no documents
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_clr ( ) , settings ( true ) ] ) , @ " Some((DocumentClear { ids: [0] }, false)) " ) ;
2022-09-14 01:48:58 +02:00
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ settings ( true ) , doc_clr ( ) , settings ( true ) ] ) , @ " Some((ClearAndSettings { other: [1], allow_index_creation: true, settings_ids: [0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_clr ( ) ] ) , @ " Some((ClearAndSettings { other: [0, 2], allow_index_creation: true, settings_ids: [1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_clr ( ) ] ) , @ " Some((ClearAndSettings { other: [0, 2], allow_index_creation: true, settings_ids: [1] }, true)) " ) ;
2022-09-14 01:48:58 +02:00
}
#[ test ]
fn anything_and_index_deletion ( ) {
2022-10-19 18:57:43 +02:00
// The `IndexDeletion` doesn't batch with anything that happens AFTER.
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_del_fil ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , doc_clr ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , settings ( true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ idx_del ( ) , settings ( false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_imp ( UpdateDocuments , false , None ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_del_fil ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , doc_clr ( ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , settings ( true ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ idx_del ( ) , settings ( false ) ] ) , @ " Some((IndexDeletion { ids: [0] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
// The index deletion can accept almost any type of `BatchKind` and transform it to an `IndexDeletion`.
2022-09-14 01:48:58 +02:00
// First, the basic cases
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_del ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_del_fil ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_del_fil ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 1] }, false)) " ) ;
2022-10-19 18:57:43 +02:00
// Then the mixed cases.
// The index already exists, whatever is the right of the tasks it shouldn't change the result.
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
2022-10-19 19:15:53 +02:00
2022-10-19 18:57:43 +02: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.
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
2022-10-19 18:57:43 +02:00
// The right of the tasks following isn't really important.
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , true , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, true)) " ) ;
2022-10-19 18:57:43 +02:00
// 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.
2023-01-23 20:56:12 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( false ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [0, 2, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( false ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((IndexDeletion { ids: [1, 3, 0, 2] }, false)) " ) ;
2024-04-02 19:37:55 +08:00
// 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 whit what
2022-10-19 18:57:43 +02:00
// follows because we first need to process the erronous batch.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( true ) , idx_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( UpdateDocuments , false , None ) , settings ( true ) , doc_clr ( ) , idx_del ( ) ] ) , @ " Some((DocumentOperation { method: UpdateDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
2022-10-06 15:55:48 +02:00
}
#[ test ]
fn allowed_and_disallowed_index_creation ( ) {
2022-10-19 18:57:43 +02:00
// `DocumentImport` can't be mixed with those disallowed to do so except if the index already exists.
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , doc_imp ( ReplaceDocuments , false , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0, 1] }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , true , None ) , settings ( true ) ] ) , @ " Some((SettingsAndDocumentOperation { settings_ids: [1], method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_imp ( ReplaceDocuments , false , None ) , settings ( true ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: false, primary_key: None, operation_ids: [0] }, false)) " ) ;
2023-02-08 21:24:27 +01:00
// batch deletion and addition
2024-08-29 15:56:24 +02:00
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , true , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , true , Some ( " catto " ) ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
debug_snapshot! ( autobatch_from ( false , None , [ doc_del ( ) , doc_imp ( UpdateDocuments , true , None ) ] ) , @ " Some((DocumentDeletion { deletion_ids: [0], includes_by_filter: false }, false)) " ) ;
2023-01-23 20:56:12 +01:00
}
#[ test ]
fn autobatch_primary_key ( ) {
// ==> If I have a pk
// With a single update
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
2023-01-23 20:56:12 +01:00
// With a multiple updates
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0, 1] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , Some ( " id " ) , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
2023-01-23 20:56:12 +01:00
// ==> If I don't have a pk
// With a single update
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , Some ( " other " ) ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("other"), operation_ids: [0] }, true))"### ) ;
2023-01-23 20:56:12 +01:00
// With a multiple updates
2023-02-08 18:07:59 +01:00
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0, 1] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , None ) , doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) ] ) , @ " Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: None, operation_ids: [0] }, true)) " ) ;
debug_snapshot! ( autobatch_from ( true , None , [ doc_imp ( ReplaceDocuments , true , Some ( " id " ) ) , doc_imp ( ReplaceDocuments , true , None ) ] ) , @ r ### "Some((DocumentOperation { method: ReplaceDocuments, allow_index_creation: true, primary_key: Some("id"), operation_ids: [0] }, true))"### ) ;
2022-09-14 01:48:58 +02:00
}
2022-09-09 12:16:19 +02:00
}