@@ -443,6 +443,167 @@ public void testRecoverySourceWithLogs() throws IOException {
443443        }
444444    }
445445
446+     public  void  testStandardIndexModeWithSourceModeSetting () throws  IOException  {
447+         // Test for IndexMode.STANDARD 
448+         {
449+             final  XContentBuilder  mappings  = topMapping (b  -> {});
450+             final  Settings  settings  = Settings .builder ()
451+                 .put (IndexSettings .MODE .getKey (), IndexMode .STANDARD .name ())
452+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .SYNTHETIC )
453+                 .build ();
454+             final  MapperService  mapperService  = createMapperService (settings , mappings );
455+             DocumentMapper  docMapper  = mapperService .documentMapper ();
456+             assertTrue (docMapper .sourceMapper ().isSynthetic ());
457+         }
458+         {
459+             final  XContentBuilder  mappings  = topMapping (b  -> {});
460+             final  Settings  settings  = Settings .builder ()
461+                 .put (IndexSettings .MODE .getKey (), IndexMode .STANDARD .name ())
462+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .STORED )
463+                 .build ();
464+             final  MapperService  mapperService  = createMapperService (settings , mappings );
465+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
466+             assertTrue (docMapper .sourceMapper ().isStored ());
467+         }
468+         {
469+             final  XContentBuilder  mappings  = topMapping (b  -> {});
470+             final  Settings  settings  = Settings .builder ()
471+                 .put (IndexSettings .MODE .getKey (), IndexMode .STANDARD .name ())
472+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .DISABLED )
473+                 .build ();
474+             final  MapperService  mapperService  = createMapperService (settings , mappings );
475+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
476+             assertTrue (docMapper .sourceMapper ().isDisabled ());
477+         }
478+ 
479+         // Test for IndexMode.LOGSDB 
480+         {
481+             final  XContentBuilder  mappings  = topMapping (b  -> {});
482+             final  Settings  settings  = Settings .builder ()
483+                 .put (IndexSettings .MODE .getKey (), IndexMode .LOGSDB .name ())
484+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .SYNTHETIC )
485+                 .build ();
486+             final  MapperService  mapperService  = createMapperService (settings , mappings );
487+             DocumentMapper  docMapper  = mapperService .documentMapper ();
488+             assertTrue (docMapper .sourceMapper ().isSynthetic ());
489+         }
490+         {
491+             final  XContentBuilder  mappings  = topMapping (b  -> {});
492+             final  Settings  settings  = Settings .builder ()
493+                 .put (IndexSettings .MODE .getKey (), IndexMode .LOGSDB .name ())
494+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .STORED )
495+                 .build ();
496+             final  MapperService  mapperService  = createMapperService (settings , mappings );
497+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
498+             assertTrue (docMapper .sourceMapper ().isStored ());
499+         }
500+         {
501+             final  XContentBuilder  mappings  = topMapping (b  -> {});
502+             final  Settings  settings  = Settings .builder ()
503+                 .put (IndexSettings .MODE .getKey (), IndexMode .LOGSDB .name ())
504+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .DISABLED )
505+                 .build ();
506+             var  ex  = expectThrows (MapperParsingException .class , () -> createMapperService (settings , mappings ));
507+             assertEquals ("Failed to parse mapping: _source can not be disabled in index using [logsdb] index mode" , ex .getMessage ());
508+         }
509+ 
510+         // Test for IndexMode.TIME_SERIES 
511+         {
512+             final  String  mappings  = """ 
513+                     { 
514+                         "_doc" : { 
515+                             "properties": { 
516+                                 "routing_field": { 
517+                                     "type": "keyword", 
518+                                     "time_series_dimension": true 
519+                                 } 
520+                             } 
521+                         } 
522+                     } 
523+                 """ ;
524+             final  Settings  settings  = Settings .builder ()
525+                 .put (IndexSettings .MODE .getKey (), IndexMode .TIME_SERIES .name ())
526+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .SYNTHETIC )
527+                 .put (IndexMetadata .INDEX_ROUTING_PATH .getKey (), "routing_field" )
528+                 .build ();
529+             final  MapperService  mapperService  = createMapperService (settings , mappings );
530+             DocumentMapper  docMapper  = mapperService .documentMapper ();
531+             assertTrue (docMapper .sourceMapper ().isSynthetic ());
532+         }
533+         {
534+             final  String  mappings  = """ 
535+                     { 
536+                         "_doc" : { 
537+                             "properties": { 
538+                                 "routing_field": { 
539+                                     "type": "keyword", 
540+                                     "time_series_dimension": true 
541+                                 } 
542+                             } 
543+                         } 
544+                     } 
545+                 """ ;
546+             final  Settings  settings  = Settings .builder ()
547+                 .put (IndexSettings .MODE .getKey (), IndexMode .TIME_SERIES .name ())
548+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .STORED )
549+                 .put (IndexMetadata .INDEX_ROUTING_PATH .getKey (), "routing_field" )
550+                 .build ();
551+             final  MapperService  mapperService  = createMapperService (settings , mappings );
552+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
553+             assertTrue (docMapper .sourceMapper ().isStored ());
554+         }
555+         {
556+             final  String  mappings  = """ 
557+                     { 
558+                         "_doc" : { 
559+                             "properties": { 
560+                                 "routing_field": { 
561+                                     "type": "keyword", 
562+                                     "time_series_dimension": true 
563+                                 } 
564+                             } 
565+                         } 
566+                     } 
567+                 """ ;
568+             final  Settings  settings  = Settings .builder ()
569+                 .put (IndexSettings .MODE .getKey (), IndexMode .TIME_SERIES .name ())
570+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .DISABLED )
571+                 .put (IndexMetadata .INDEX_ROUTING_PATH .getKey (), "routing_field" )
572+                 .build ();
573+             var  ex  = expectThrows (MapperParsingException .class , () -> createMapperService (settings , mappings ));
574+             assertEquals ("Failed to parse mapping: _source can not be disabled in index using [time_series] index mode" , ex .getMessage ());
575+         }
576+ 
577+         // Test cases without IndexMode (default to standard) 
578+         {
579+             final  XContentBuilder  mappings  = topMapping (b  -> {});
580+             final  Settings  settings  = Settings .builder ()
581+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .SYNTHETIC )
582+                 .build ();
583+             final  MapperService  mapperService  = createMapperService (settings , mappings );
584+             DocumentMapper  docMapper  = mapperService .documentMapper ();
585+             assertTrue (docMapper .sourceMapper ().isSynthetic ());
586+         }
587+         {
588+             final  XContentBuilder  mappings  = topMapping (b  -> {});
589+             final  Settings  settings  = Settings .builder ()
590+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .STORED )
591+                 .build ();
592+             final  MapperService  mapperService  = createMapperService (settings , mappings );
593+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
594+             assertTrue (docMapper .sourceMapper ().isStored ());
595+         }
596+         {
597+             final  XContentBuilder  mappings  = topMapping (b  -> {});
598+             final  Settings  settings  = Settings .builder ()
599+                 .put (SourceFieldMapper .INDEX_MAPPER_SOURCE_MODE_SETTING .getKey (), SourceFieldMapper .Mode .DISABLED )
600+                 .build ();
601+             final  MapperService  mapperService  = createMapperService (settings , mappings );
602+             final  DocumentMapper  docMapper  = mapperService .documentMapper ();
603+             assertTrue (docMapper .sourceMapper ().isDisabled ());
604+         }
605+     }
606+ 
446607    public  void  testRecoverySourceWithLogsCustom () throws  IOException  {
447608        XContentBuilder  mappings  = topMapping (b  -> b .startObject (SourceFieldMapper .NAME ).field ("mode" , "synthetic" ).endObject ());
448609        {
0 commit comments