Skip to content

Commit 42e51d4

Browse files
committed
Explain and test
1 parent e58094e commit 42e51d4

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

server/src/main/java/org/elasticsearch/search/fetch/StoredFieldsSpec.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ public StoredFieldsSpec merge(StoredFieldsSpec other) {
4444
}
4545
Set<String> mergedFields;
4646
if (other.requiredStoredFields.isEmpty()) {
47+
/*
48+
* In the very very common case that we don't need new stored fields
49+
* let's not clone the existing array.
50+
*/
4751
mergedFields = this.requiredStoredFields;
4852
} else {
4953
mergedFields = new HashSet<>(this.requiredStoredFields);

server/src/test/java/org/elasticsearch/search/fetch/StoredFieldsSpecTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@
1818
import org.elasticsearch.search.internal.SearchContext;
1919
import org.elasticsearch.test.ESTestCase;
2020

21+
import java.util.Set;
22+
2123
import static org.hamcrest.Matchers.hasSize;
24+
import static org.hamcrest.Matchers.sameInstance;
2225
import static org.mockito.Mockito.mock;
2326
import static org.mockito.Mockito.when;
2427

@@ -67,6 +70,18 @@ public void testScriptFieldsEnableMetadata() {
6770
assertTrue(spec.requiresMetadata());
6871
}
6972

73+
public void testNoCloneOnMerge() {
74+
StoredFieldsSpec spec = StoredFieldsSpec.NO_REQUIREMENTS;
75+
spec = spec.merge(StoredFieldsSpec.NEEDS_SOURCE);
76+
assertThat(spec.requiredStoredFields(), sameInstance(StoredFieldsSpec.NO_REQUIREMENTS.requiredStoredFields()));
77+
78+
StoredFieldsSpec needsCat = new StoredFieldsSpec(false, false, Set.of("cat"));
79+
StoredFieldsSpec withCat = spec.merge(needsCat);
80+
spec = withCat.merge(StoredFieldsSpec.NO_REQUIREMENTS);
81+
assertThat(spec.requiredStoredFields(), sameInstance(withCat.requiredStoredFields()));
82+
}
83+
84+
7085
private static SearchContext searchContext(SearchSourceBuilder sourceBuilder) {
7186
SearchContext sc = mock(SearchContext.class);
7287
when(sc.fetchSourceContext()).thenReturn(sourceBuilder.fetchSource());

0 commit comments

Comments
 (0)