@@ -151,19 +151,35 @@ pub(crate) fn new_text_flusher<RT: Runtime>(
151151mod tests {
152152 use common:: {
153153 bootstrap_model:: index:: {
154- text_index:: TextIndexState ,
154+ text_index:: {
155+ TextIndexBackfillState ,
156+ TextIndexSnapshot ,
157+ TextIndexSnapshotData ,
158+ TextIndexState ,
159+ TextSnapshotVersion ,
160+ } ,
155161 IndexConfig ,
162+ IndexMetadata ,
156163 } ,
157164 runtime:: testing:: TestRuntime ,
158- types:: TabletIndexName ,
165+ types:: {
166+ IndexName ,
167+ ObjectKey ,
168+ TabletIndexName ,
169+ } ,
159170 } ;
160171 use maplit:: btreemap;
161172 use must_let:: must_let;
162173 use value:: TableNamespace ;
163174
164- use crate :: tests:: text_test_utils:: {
165- IndexData ,
166- TextFixtures ,
175+ use crate :: {
176+ tests:: text_test_utils:: {
177+ backfilling_text_index,
178+ IndexData ,
179+ TextFixtures ,
180+ } ,
181+ IndexModel ,
182+ SystemMetadataModel ,
167183 } ;
168184
169185 #[ convex_macro:: test_runtime]
@@ -502,4 +518,101 @@ mod tests {
502518
503519 Ok ( ( ) )
504520 }
521+
522+ #[ convex_macro:: test_runtime]
523+ async fn backfill_with_backfilled_single_segment_format_backfills_with_multi_segment_format (
524+ rt : TestRuntime ,
525+ ) -> anyhow:: Result < ( ) > {
526+ let fixtures = TextFixtures :: new ( rt) . await ?;
527+ let index_name = create_backfilled_single_segment_text_index ( & fixtures) . await ?;
528+
529+ fixtures. add_document ( "cat" ) . await ?;
530+
531+ let mut flusher = fixtures. new_search_flusher2 ( ) ;
532+ flusher. step ( ) . await ?;
533+
534+ fixtures. enable_index ( & index_name) . await ?;
535+
536+ let results = fixtures. search ( index_name. clone ( ) , "cat" ) . await ?;
537+ assert_eq ! ( results. len( ) , 1 ) ;
538+ let segments = fixtures. get_segments_metadata ( index_name) . await ?;
539+ assert_eq ! ( segments. len( ) , 1 ) ;
540+ Ok ( ( ) )
541+ }
542+
543+ #[ convex_macro:: test_runtime]
544+ async fn backfill_with_snapshotted_at_single_segment_format_backfills_with_multi_segment_format (
545+ rt : TestRuntime ,
546+ ) -> anyhow:: Result < ( ) > {
547+ let fixtures = TextFixtures :: new ( rt) . await ?;
548+
549+ let index_name = create_backfilled_single_segment_text_index ( & fixtures) . await ?;
550+
551+ let mut tx = fixtures. db . begin_system ( ) . await ?;
552+ IndexModel :: new ( & mut tx)
553+ . enable_index_for_testing ( TableNamespace :: Global , & index_name)
554+ . await ?;
555+ fixtures. db . commit ( tx) . await ?;
556+
557+ fixtures. add_document ( "cat" ) . await ?;
558+
559+ let mut flusher = fixtures. new_search_flusher2 ( ) ;
560+ flusher. step ( ) . await ?;
561+
562+ let results = fixtures. search ( index_name. clone ( ) , "cat" ) . await ?;
563+ assert_eq ! ( results. len( ) , 1 ) ;
564+ let segments = fixtures. get_segments_metadata ( index_name) . await ?;
565+ assert_eq ! ( segments. len( ) , 1 ) ;
566+ Ok ( ( ) )
567+ }
568+
569+ async fn create_backfilled_single_segment_text_index (
570+ fixtures : & TextFixtures ,
571+ ) -> anyhow:: Result < IndexName > {
572+ let mut tx = fixtures. db . begin_system ( ) . await ?;
573+ let metadata = backfilling_text_index ( ) ?;
574+ let on_disk_state = TextIndexState :: Backfilling ( TextIndexBackfillState :: new ( ) ) ;
575+ must_let ! ( let IndexConfig :: Search {
576+ developer_config,
577+ ..
578+ } = metadata. config) ;
579+ let doc_id = IndexModel :: new ( & mut tx)
580+ . add_application_index (
581+ TableNamespace :: Global ,
582+ IndexMetadata :: new_search_index (
583+ metadata. name . clone ( ) ,
584+ developer_config,
585+ on_disk_state,
586+ ) ,
587+ )
588+ . await ?;
589+
590+ fixtures. db . commit ( tx) . await ?;
591+ let mut tx = fixtures. db . begin_system ( ) . await ?;
592+ let indexes = IndexModel :: new ( & mut tx) . get_all_indexes ( ) . await ?;
593+ let index = indexes
594+ . into_iter ( )
595+ . find ( |index| index. id ( ) == doc_id)
596+ . unwrap ( ) ;
597+ let ( id, value) = index. into_id_and_value ( ) ;
598+ must_let ! ( let IndexConfig :: Search {
599+ developer_config,
600+ ..
601+ } = value. config) ;
602+ let on_disk_state = TextIndexState :: Backfilled ( TextIndexSnapshot {
603+ data : TextIndexSnapshotData :: SingleSegment ( ObjectKey :: try_from ( "Fake" . to_string ( ) ) ?) ,
604+ ts : * tx. begin_timestamp ( ) ,
605+ version : TextSnapshotVersion :: V2UseStringIds ,
606+ } ) ;
607+
608+ SystemMetadataModel :: new_global ( & mut tx)
609+ . replace (
610+ id,
611+ IndexMetadata :: new_search_index ( value. name , developer_config, on_disk_state)
612+ . try_into ( ) ?,
613+ )
614+ . await ?;
615+ fixtures. db . commit ( tx) . await ?;
616+ Ok ( metadata. name )
617+ }
505618}
0 commit comments