@@ -669,6 +669,64 @@ public void testNestedFields() throws IOException {
669
669
assertEquals ("value4b" , eval ("inner_nested.0.f4.0" , obj1 ));
670
670
}
671
671
672
+ @ SuppressWarnings ("unchecked" )
673
+ public void testFlattenedField () throws IOException {
674
+ XContentBuilder mapping = XContentFactory .jsonBuilder ().startObject ()
675
+ .startObject ("_doc" )
676
+ .startObject ("properties" )
677
+ .startObject ("flat" )
678
+ .field ("type" , "flattened" )
679
+ .endObject ()
680
+ .endObject ()
681
+ .endObject ()
682
+ .endObject ();
683
+
684
+ MapperService mapperService = createMapperService (mapping );
685
+
686
+ XContentBuilder source = XContentFactory .jsonBuilder ().startObject ()
687
+ .startObject ("flat" )
688
+ .field ("f1" , "value1" )
689
+ .field ("f2" , 1 )
690
+ .endObject ()
691
+ .endObject ();
692
+
693
+ // requesting via wildcard should retrieve the root field as a structured map
694
+ Map <String , DocumentField > fields = fetchFields (mapperService , source , fieldAndFormatList ("*" , null , false ));
695
+ assertEquals (1 , fields .size ());
696
+ assertThat (fields .keySet (), containsInAnyOrder ("flat" ));
697
+ Map <String , Object > flattendedValue = (Map <String , Object >) fields .get ("flat" ).getValue ();
698
+ assertThat (flattendedValue .keySet (), containsInAnyOrder ("f1" , "f2" ));
699
+ assertEquals ("value1" , flattendedValue .get ("f1" ));
700
+ assertEquals (1 , flattendedValue .get ("f2" ));
701
+
702
+ // direct retrieval of subfield is possible
703
+ List <FieldAndFormat > fieldAndFormatList = new ArrayList <>();
704
+ fieldAndFormatList .add (new FieldAndFormat ("flat.f1" , null ));
705
+ fields = fetchFields (mapperService , source , fieldAndFormatList );
706
+ assertEquals (1 , fields .size ());
707
+ assertThat (fields .keySet (), containsInAnyOrder ("flat.f1" ));
708
+ assertThat (fields .get ("flat.f1" ).getValue (), equalTo ("value1" ));
709
+
710
+ // direct retrieval of root field and subfield is possible
711
+ fieldAndFormatList .add (new FieldAndFormat ("*" , null ));
712
+ fields = fetchFields (mapperService , source , fieldAndFormatList );
713
+ assertEquals (2 , fields .size ());
714
+ assertThat (fields .keySet (), containsInAnyOrder ("flat" , "flat.f1" ));
715
+ flattendedValue = (Map <String , Object >) fields .get ("flat" ).getValue ();
716
+ assertThat (flattendedValue .keySet (), containsInAnyOrder ("f1" , "f2" ));
717
+ assertEquals ("value1" , flattendedValue .get ("f1" ));
718
+ assertEquals (1 , flattendedValue .get ("f2" ));
719
+ assertThat (fields .get ("flat.f1" ).getValue (), equalTo ("value1" ));
720
+
721
+ // retrieval of subfield with widlcard is not possible
722
+ fields = fetchFields (mapperService , source , fieldAndFormatList ("flat.f*" , null , false ));
723
+ assertEquals (0 , fields .size ());
724
+
725
+ // retrieval of non-existing subfield returns empty result
726
+ fields = fetchFields (mapperService , source , fieldAndFormatList ("flat.baz" , null , false ));
727
+ assertEquals (0 , fields .size ());
728
+ }
729
+
672
730
public void testUnmappedFieldsInsideObject () throws IOException {
673
731
XContentBuilder mapping = XContentFactory .jsonBuilder ().startObject ()
674
732
.startObject ("_doc" )
0 commit comments