瀏覽代碼

Simplify instantiating SyntheticFieldLoader instances (#108247)

* Exclude SourceLoader.SyntheticFieldLoader.NOTHING loaders. These have nothing to add. Most meta field mappers return this instance. Only doc count field mapper returns a real synthetic loader.
* Only concat streams in root object mapper and not for any other object mapper.
Martijn van Groningen 1 年之前
父節點
當前提交
0b1d71e7c8

+ 3 - 1
server/src/main/java/org/elasticsearch/index/mapper/Mapping.java

@@ -21,6 +21,7 @@ import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
+import java.util.stream.Stream;
 
 
 /**
 /**
  * Wrapper around everything that defines a mapping, without references to
  * Wrapper around everything that defines a mapping, without references to
@@ -125,7 +126,8 @@ public final class Mapping implements ToXContentFragment {
     }
     }
 
 
     public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
     public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
-        return root.syntheticFieldLoader(Arrays.stream(metadataMappers));
+        var stream = Stream.concat(Stream.of(metadataMappers), root.mappers.values().stream());
+        return root.syntheticFieldLoader(stream);
     }
     }
 
 
     /**
     /**

+ 7 - 9
server/src/main/java/org/elasticsearch/index/mapper/ObjectMapper.java

@@ -751,19 +751,17 @@ public class ObjectMapper extends Mapper {
 
 
     }
     }
 
 
-    public SourceLoader.SyntheticFieldLoader syntheticFieldLoader(Stream<Mapper> extra) {
-        return new SyntheticSourceFieldLoader(
-            Stream.concat(extra, mappers.values().stream())
-                .sorted(Comparator.comparing(Mapper::name))
-                .map(Mapper::syntheticFieldLoader)
-                .filter(l -> l != null)
-                .toList()
-        );
+    public SourceLoader.SyntheticFieldLoader syntheticFieldLoader(Stream<Mapper> mappers) {
+        var fields = mappers.sorted(Comparator.comparing(Mapper::name))
+            .map(Mapper::syntheticFieldLoader)
+            .filter(l -> l != SourceLoader.SyntheticFieldLoader.NOTHING)
+            .toList();
+        return new SyntheticSourceFieldLoader(fields);
     }
     }
 
 
     @Override
     @Override
     public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
     public SourceLoader.SyntheticFieldLoader syntheticFieldLoader() {
-        return syntheticFieldLoader(Stream.empty());
+        return syntheticFieldLoader(mappers.values().stream());
     }
     }
 
 
     private class SyntheticSourceFieldLoader implements SourceLoader.SyntheticFieldLoader {
     private class SyntheticSourceFieldLoader implements SourceLoader.SyntheticFieldLoader {