2626import org .elasticsearch .index .IndexSettings ;
2727import org .elasticsearch .index .IndexVersion ;
2828import org .elasticsearch .index .IndexVersions ;
29- import org .elasticsearch .index .fieldvisitor .LeafStoredFieldLoader ;
3029import org .elasticsearch .index .query .SearchExecutionContext ;
3130import org .elasticsearch .search .lookup .SourceFilter ;
3231import org .elasticsearch .xcontent .XContentBuilder ;
@@ -275,58 +274,72 @@ public static Set<String> ensureLoaded(Set<String> fieldsToLoadForSyntheticSourc
275274 public enum IgnoredFieldsLoader {
276275 NO_IGNORED_SOURCE {
277276 @ Override
278- public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadIgnoredFields (
277+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadAllIgnoredFields (
279278 SourceFilter filter ,
280- LeafStoredFieldLoader storedFieldLoader ,
281- Map <String , SourceLoader .SyntheticFieldLoader .StoredFieldLoader > storedFieldLoaders
279+ Map <String , List <Object >> storedFields
280+ ) {
281+ return Map .of ();
282+ }
283+
284+ @ Override
285+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadSingleIgnoredField (
286+ Set <String > fieldPaths ,
287+ Map <String , List <Object >> storedFields
282288 ) {
283289 return Map .of ();
284290 }
285291 },
286292 SINGLE_IGNORED_SOURCE {
287293 @ Override
288- public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadIgnoredFields (
294+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadAllIgnoredFields (
289295 SourceFilter filter ,
290- LeafStoredFieldLoader storedFieldLoader ,
291- Map <String , SourceLoader .SyntheticFieldLoader .StoredFieldLoader > storedFieldLoaders
296+ Map <String , List <Object >> storedFields
292297 ) {
293298 Map <String , List <IgnoredSourceFieldMapper .NameValue >> objectsWithIgnoredFields = null ;
294- for (Map .Entry <String , List <Object >> e : storedFieldLoader .storedFields ().entrySet ()) {
295- SourceLoader .SyntheticFieldLoader .StoredFieldLoader loader = storedFieldLoaders .get (e .getKey ());
296- if (loader != null ) {
297- loader .load (e .getValue ());
298- }
299- if (IgnoredSourceFieldMapper .NAME .equals (e .getKey ())) {
300- for (Object value : e .getValue ()) {
301- if (objectsWithIgnoredFields == null ) {
302- objectsWithIgnoredFields = new HashMap <>();
303- }
304- IgnoredSourceFieldMapper .NameValue nameValue = IgnoredSourceFieldMapper .decode (value );
305- if (filter != null
306- && filter .isPathFiltered (nameValue .name (), XContentDataHelper .isEncodedObject (nameValue .value ()))) {
307- // This path is filtered by the include/exclude rules
308- continue ;
309- }
310- objectsWithIgnoredFields .computeIfAbsent (nameValue .getParentFieldName (), k -> new ArrayList <>()).add (nameValue );
299+ List <Object > storedValues = storedFields .get (IgnoredSourceFieldMapper .NAME );
300+ if (storedValues != null ) {
301+ for (Object value : storedValues ) {
302+ if (objectsWithIgnoredFields == null ) {
303+ objectsWithIgnoredFields = new HashMap <>();
304+ }
305+ IgnoredSourceFieldMapper .NameValue nameValue = IgnoredSourceFieldMapper .decode (value );
306+ if (filter != null
307+ && filter .isPathFiltered (nameValue .name (), XContentDataHelper .isEncodedObject (nameValue .value ()))) {
308+ // This path is filtered by the include/exclude rules
309+ continue ;
311310 }
311+ objectsWithIgnoredFields .computeIfAbsent (nameValue .getParentFieldName (), k -> new ArrayList <>()).add (nameValue );
312312 }
313313 }
314314 return objectsWithIgnoredFields ;
315315 }
316+
317+ @ Override
318+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadSingleIgnoredField (
319+ Set <String > fieldPaths ,
320+ Map <String , List <Object >> storedFields
321+ ) {
322+ Map <String , List <IgnoredSourceFieldMapper .NameValue >> valuesForFieldAndParents = new HashMap <>();
323+ var ignoredSource = storedFields .get (IgnoredSourceFieldMapper .NAME );
324+ if (ignoredSource != null ) {
325+ for (Object value : ignoredSource ) {
326+ IgnoredSourceFieldMapper .NameValue nameValue = IgnoredSourceFieldMapper .decode (value );
327+ if (fieldPaths .contains (nameValue .name ())) {
328+ valuesForFieldAndParents .computeIfAbsent (nameValue .name (), k -> new ArrayList <>()).add (nameValue );
329+ }
330+ }
331+ }
332+ return valuesForFieldAndParents ;
333+ }
316334 },
317335 PER_FIELD_IGNORED_SOURCE {
318336 @ Override
319- public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadIgnoredFields (
337+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadAllIgnoredFields (
320338 SourceFilter filter ,
321- LeafStoredFieldLoader storedFieldLoader ,
322- Map <String , SourceLoader .SyntheticFieldLoader .StoredFieldLoader > storedFieldLoaders
339+ Map <String , List <Object >> storedFields
323340 ) {
324341 Map <String , List <IgnoredSourceFieldMapper .NameValue >> objectsWithIgnoredFields = null ;
325- for (Map .Entry <String , List <Object >> e : storedFieldLoader .storedFields ().entrySet ()) {
326- SourceLoader .SyntheticFieldLoader .StoredFieldLoader loader = storedFieldLoaders .get (e .getKey ());
327- if (loader != null ) {
328- loader .load (e .getValue ());
329- }
342+ for (Map .Entry <String , List <Object >> e : storedFields .entrySet ()) {
330343 if (e .getKey ().startsWith (IgnoredSourceFieldMapper .NAME )) {
331344 assert e .getValue ().size () == 1 ;
332345
@@ -348,12 +361,42 @@ public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
348361 }
349362 return objectsWithIgnoredFields ;
350363 }
364+
365+ @ Override
366+ public Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadSingleIgnoredField (
367+ Set <String > fieldPaths ,
368+ Map <String , List <Object >> storedFields
369+ ) {
370+ Map <String , List <IgnoredSourceFieldMapper .NameValue >> valuesForFieldAndParents = new HashMap <>();
371+ for (var parentPath : fieldPaths ) {
372+ var ignoredSource = storedFields .get (IgnoredSourceFieldMapper .ignoredFieldName (parentPath ));
373+ if (ignoredSource == null ) {
374+ continue ;
375+ }
376+ assert ignoredSource .size () == 1 ;
377+
378+ List <IgnoredSourceFieldMapper .NameValue > nameValues = IgnoredSourceFieldMapper .decodeMulti (
379+ (BytesRef ) ignoredSource .getFirst ()
380+ );
381+
382+ for (var nameValue : nameValues ) {
383+ assert fieldPaths .contains (nameValue .name ());
384+ valuesForFieldAndParents .computeIfAbsent (nameValue .name (), k -> new ArrayList <>()).add (nameValue );
385+ }
386+ }
387+
388+ return valuesForFieldAndParents ;
389+ }
351390 };
352391
353- public abstract Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadIgnoredFields (
392+ public abstract Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadAllIgnoredFields (
354393 SourceFilter filter ,
355- LeafStoredFieldLoader storedFieldLoader ,
356- Map <String , SourceLoader .SyntheticFieldLoader .StoredFieldLoader > storedFieldLoaders
394+ Map <String , List <Object >> storedFields
395+ );
396+
397+ public abstract Map <String , List <IgnoredSourceFieldMapper .NameValue >> loadSingleIgnoredField (
398+ Set <String > fieldPaths ,
399+ Map <String , List <Object >> storedFields
357400 );
358401 }
359402
0 commit comments