@@ -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