2020import java .io .IOException ;
2121
2222import static org .elasticsearch .xcontent .XContentFactory .jsonBuilder ;
23+ import static org .hamcrest .Matchers .nullValue ;
2324
2425public class OffsetDocValuesLoaderTests extends MapperServiceTestCase {
2526
@@ -31,6 +32,107 @@ protected Settings getIndexSettings() {
3132 .build ();
3233 }
3334
35+ public void testOffsetArrayNoDocValues () throws Exception {
36+ String mapping = """
37+ {
38+ "_doc": {
39+ "properties": {
40+ "field": {
41+ "type": "keyword",
42+ "doc_values": false
43+ }
44+ }
45+ }
46+ }
47+ """ ;
48+ try (var mapperService = createMapperService (mapping )) {
49+ var fieldMapper = mapperService .mappingLookup ().getMapper ("field" );
50+ assertThat (fieldMapper .getOffsetFieldName (), nullValue ());
51+ }
52+ }
53+
54+ public void testOffsetArrayStored () throws Exception {
55+ String mapping = """
56+ {
57+ "_doc": {
58+ "properties": {
59+ "field": {
60+ "type": "keyword",
61+ "store": true
62+ }
63+ }
64+ }
65+ }
66+ """ ;
67+ try (var mapperService = createMapperService (mapping )) {
68+ var fieldMapper = mapperService .mappingLookup ().getMapper ("field" );
69+ assertThat (fieldMapper .getOffsetFieldName (), nullValue ());
70+ }
71+ }
72+
73+ public void testOffsetMultiFields () throws Exception {
74+ String mapping = """
75+ {
76+ "_doc": {
77+ "properties": {
78+ "field": {
79+ "type": "keyword",
80+ "fields": {
81+ "sub": {
82+ "type": "text"
83+ }
84+ }
85+ }
86+ }
87+ }
88+ }
89+ """ ;
90+ try (var mapperService = createMapperService (mapping )) {
91+ var fieldMapper = mapperService .mappingLookup ().getMapper ("field" );
92+ assertThat (fieldMapper .getOffsetFieldName (), nullValue ());
93+ }
94+ }
95+
96+ public void testOffsetArrayNoSyntheticSource () throws Exception {
97+ String mapping = """
98+ {
99+ "_doc": {
100+ "properties": {
101+ "field": {
102+ "type": "keyword"
103+ }
104+ }
105+ }
106+ }
107+ """ ;
108+ try (var mapperService = createMapperService (Settings .EMPTY , mapping )) {
109+ var fieldMapper = mapperService .mappingLookup ().getMapper ("field" );
110+ assertThat (fieldMapper .getOffsetFieldName (), nullValue ());
111+ }
112+ }
113+
114+ public void testOffsetArrayNoSourceArrayKeep () throws Exception {
115+ String mapping = """
116+ {
117+ "_doc": {
118+ "properties": {
119+ "field": {
120+ "type": "keyword"
121+ }
122+ }
123+ }
124+ }
125+ """ ;
126+ var settingsBuilder = Settings .builder ().put ("index.mapping.source.mode" , "synthetic" );
127+ if (randomBoolean ()) {
128+ settingsBuilder .put ("index.mapping.synthetic_source_keep" , randomBoolean () ? "none" : "all" );
129+ }
130+ try (var mapperService = createMapperService (settingsBuilder .build (), mapping )) {
131+ var fieldMapper = mapperService .mappingLookup ().getMapper ("field" );
132+ assertThat (fieldMapper .getOffsetFieldName (), nullValue ());
133+ }
134+ }
135+
34136 public void testOffsetArray () throws Exception {
35137 verifyOffsets ("{\" field\" :[\" z\" ,\" x\" ,\" y\" ,\" c\" ,\" b\" ,\" a\" ]}" );
36138 verifyOffsets ("{\" field\" :[\" z\" ,null,\" y\" ,\" c\" ,null,\" a\" ]}" );
@@ -73,7 +175,7 @@ private void verifyOffsets(String source) throws IOException {
73175 }
74176
75177 private void verifyOffsets (String source , String expectedSource ) throws IOException {
76- var mapperService = createMapperService ( """
178+ String mapping = """
77179 {
78180 "_doc": {
79181 "properties": {
@@ -83,29 +185,35 @@ private void verifyOffsets(String source, String expectedSource) throws IOExcept
83185 }
84186 }
85187 }
86- """ );
87- var mapper = mapperService .documentMapper ();
88-
89- try (var directory = newDirectory ()) {
90- var iw = indexWriterForSyntheticSource (directory );
91- var doc = mapper .parse (new SourceToParse ("_id" , new BytesArray (source ), XContentType .JSON ));
92- doc .updateSeqID (0 , 0 );
93- doc .version ().setLongValue (0 );
94- iw .addDocuments (doc .docs ());
95- iw .close ();
96- try (var indexReader = wrapInMockESDirectoryReader (DirectoryReader .open (directory ))) {
97- var layer = new SortedSetWithOffsetsDocValuesSyntheticFieldLoaderLayer ("field" , "field.offsets" );
98- var leafReader = indexReader .leaves ().get (0 ).reader ();
99- var loader = (ImmediateDocValuesLoader ) layer .docValuesLoader (leafReader , new int [] { 0 });
100- assertTrue (loader .advanceToDoc (0 ));
101- assertTrue (loader .count () > 0 );
102- XContentBuilder builder = jsonBuilder ().startObject ();
103- builder .startArray ("field" );
104- loader .write (builder );
105- builder .endArray ().endObject ();
106-
107- var actual = Strings .toString (builder );
108- assertEquals (expectedSource , actual );
188+ """ ;
189+ verifyOffsets (mapping , source , expectedSource );
190+ }
191+
192+ private void verifyOffsets (String mapping , String source , String expectedSource ) throws IOException {
193+ try (var mapperService = createMapperService (mapping )) {
194+ var mapper = mapperService .documentMapper ();
195+
196+ try (var directory = newDirectory ()) {
197+ var iw = indexWriterForSyntheticSource (directory );
198+ var doc = mapper .parse (new SourceToParse ("_id" , new BytesArray (source ), XContentType .JSON ));
199+ doc .updateSeqID (0 , 0 );
200+ doc .version ().setLongValue (0 );
201+ iw .addDocuments (doc .docs ());
202+ iw .close ();
203+ try (var indexReader = wrapInMockESDirectoryReader (DirectoryReader .open (directory ))) {
204+ var layer = new SortedSetWithOffsetsDocValuesSyntheticFieldLoaderLayer ("field" , "field.offsets" );
205+ var leafReader = indexReader .leaves ().getFirst ().reader ();
206+ var loader = (ImmediateDocValuesLoader ) layer .docValuesLoader (leafReader , new int [] { 0 });
207+ assertTrue (loader .advanceToDoc (0 ));
208+ assertTrue (loader .count () > 0 );
209+ XContentBuilder builder = jsonBuilder ().startObject ();
210+ builder .startArray ("field" );
211+ loader .write (builder );
212+ builder .endArray ().endObject ();
213+
214+ var actual = Strings .toString (builder );
215+ assertEquals (expectedSource , actual );
216+ }
109217 }
110218 }
111219 }
0 commit comments