Browse Source

Optimize SearchHit#resolveLookupFields a little (#105222)

No need to copy the keyset here to do iteration + mutation. Just update the map entries directly to save a few cycles.
Armin Braun 1 year ago
parent
commit
5afe81cd75
1 changed files with 18 additions and 18 deletions
  1. 18 18
      server/src/main/java/org/elasticsearch/search/SearchHit.java

+ 18 - 18
server/src/main/java/org/elasticsearch/search/SearchHit.java

@@ -55,6 +55,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -578,25 +579,24 @@ public final class SearchHit implements Writeable, ToXContentObject, RefCounted
         if (lookupResults.isEmpty()) {
             return;
         }
-        final List<String> fields = new ArrayList<>(documentFields.keySet());
-        for (String field : fields) {
-            documentFields.computeIfPresent(field, (k, docField) -> {
-                if (docField.getLookupFields().isEmpty()) {
-                    return docField;
-                }
-                final List<Object> newValues = new ArrayList<>(docField.getValues());
-                for (LookupField lookupField : docField.getLookupFields()) {
-                    final List<Object> resolvedValues = lookupResults.get(lookupField);
-                    if (resolvedValues != null) {
-                        newValues.addAll(resolvedValues);
-                    }
-                }
-                if (newValues.isEmpty() && docField.getIgnoredValues().isEmpty()) {
-                    return null;
-                } else {
-                    return new DocumentField(docField.getName(), newValues, docField.getIgnoredValues());
+        for (Iterator<Map.Entry<String, DocumentField>> iterator = documentFields.entrySet().iterator(); iterator.hasNext();) {
+            Map.Entry<String, DocumentField> entry = iterator.next();
+            final DocumentField docField = entry.getValue();
+            if (docField.getLookupFields().isEmpty()) {
+                continue;
+            }
+            final List<Object> newValues = new ArrayList<>(docField.getValues());
+            for (LookupField lookupField : docField.getLookupFields()) {
+                final List<Object> resolvedValues = lookupResults.get(lookupField);
+                if (resolvedValues != null) {
+                    newValues.addAll(resolvedValues);
                 }
-            });
+            }
+            if (newValues.isEmpty() && docField.getIgnoredValues().isEmpty()) {
+                iterator.remove();
+            } else {
+                entry.setValue(new DocumentField(docField.getName(), newValues, docField.getIgnoredValues()));
+            }
         }
         assert hasLookupFields() == false : "Some lookup fields are not resolved";
     }