Ensure fetch fields aren't dropped when rewriting search. (#61390)

Previously we didn't retain the requested fields when performing a shallow copy
of the search source. This meant that when a search was rewritten, we could drop
the requested fields and fail to return them in the response.
This commit is contained in:
Julie Tibshirani 2020-08-20 14:58:58 -07:00 committed by GitHub
parent 00b56bf007
commit 85ad328df7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 4 deletions

View File

@ -92,6 +92,7 @@ setup:
fields: fields:
- field: keyword - field: keyword
format: "yyyy/MM/dd" format: "yyyy/MM/dd"
--- ---
"Test disable source": "Test disable source":
- do: - do:
@ -214,3 +215,43 @@ setup:
- match: { hits.hits.0.fields.keyword.0: "a" } - match: { hits.hits.0.fields.keyword.0: "a" }
- match: { hits.hits.0.fields.integer.0: 42 } - match: { hits.hits.0.fields.integer.0: 42 }
---
"Test search rewrite":
- do:
indices.create:
index: test
body:
settings:
index.number_of_shards: 1
mappings:
properties:
date:
type: date
- do:
index:
index: test
id: 1
body:
date: "1990-12-29T22:30:00.000Z"
- do:
indices.refresh:
index: [ test ]
- do:
search:
index: test
body:
query:
range:
date:
from: "1990-12-29T22:30:00.000Z"
fields:
- field: date
format: "yyyy/MM/dd"
- is_true: hits.hits.0._id
- is_true: hits.hits.0._source
- match: { hits.hits.0.fields.date.0: "1990/12/29" }

View File

@ -1045,6 +1045,7 @@ public final class SearchSourceBuilder implements Writeable, ToXContentObject, R
rewrittenBuilder.explain = explain; rewrittenBuilder.explain = explain;
rewrittenBuilder.extBuilders = extBuilders; rewrittenBuilder.extBuilders = extBuilders;
rewrittenBuilder.fetchSourceContext = fetchSourceContext; rewrittenBuilder.fetchSourceContext = fetchSourceContext;
rewrittenBuilder.fetchFields = fetchFields;
rewrittenBuilder.docValueFields = docValueFields; rewrittenBuilder.docValueFields = docValueFields;
rewrittenBuilder.storedFieldsContext = storedFieldsContext; rewrittenBuilder.storedFieldsContext = storedFieldsContext;
rewrittenBuilder.from = from; rewrittenBuilder.from = from;
@ -1603,10 +1604,10 @@ public final class SearchSourceBuilder implements Writeable, ToXContentObject, R
@Override @Override
public int hashCode() { public int hashCode() {
return Objects.hash(aggregations, explain, fetchSourceContext, docValueFields, storedFieldsContext, from, highlightBuilder, return Objects.hash(aggregations, explain, fetchSourceContext, fetchFields, docValueFields, storedFieldsContext, from,
indexBoosts, minScore, postQueryBuilder, queryBuilder, rescoreBuilders, scriptFields, size, highlightBuilder, indexBoosts, minScore, postQueryBuilder, queryBuilder, rescoreBuilders, scriptFields, size,
sorts, searchAfterBuilder, sliceBuilder, stats, suggestBuilder, terminateAfter, timeout, trackScores, version, sorts, searchAfterBuilder, sliceBuilder, stats, suggestBuilder, terminateAfter, timeout, trackScores, version,
seqNoAndPrimaryTerm, profile, extBuilders, collapse, trackTotalHitsUpTo); seqNoAndPrimaryTerm, profile, extBuilders, collapse, trackTotalHitsUpTo);
} }
@Override @Override
@ -1621,6 +1622,7 @@ public final class SearchSourceBuilder implements Writeable, ToXContentObject, R
return Objects.equals(aggregations, other.aggregations) return Objects.equals(aggregations, other.aggregations)
&& Objects.equals(explain, other.explain) && Objects.equals(explain, other.explain)
&& Objects.equals(fetchSourceContext, other.fetchSourceContext) && Objects.equals(fetchSourceContext, other.fetchSourceContext)
&& Objects.equals(fetchFields, other.fetchFields)
&& Objects.equals(docValueFields, other.docValueFields) && Objects.equals(docValueFields, other.docValueFields)
&& Objects.equals(storedFieldsContext, other.storedFieldsContext) && Objects.equals(storedFieldsContext, other.storedFieldsContext)
&& Objects.equals(from, other.from) && Objects.equals(from, other.from)

View File

@ -105,6 +105,14 @@ public class SearchSourceBuilderTests extends AbstractSearchTestCase {
} }
} }
public void testShallowCopy() {
for (int i = 0; i < 10; i++) {
SearchSourceBuilder original = createSearchSourceBuilder();
SearchSourceBuilder copy = original.shallowCopy();
assertEquals(original, copy);
}
}
public void testEqualsAndHashcode() throws IOException { public void testEqualsAndHashcode() throws IOException {
// TODO add test checking that changing any member of this class produces an object that is not equal to the original // TODO add test checking that changing any member of this class produces an object that is not equal to the original
EqualsHashCodeTestUtils.checkEqualsAndHashCode(createSearchSourceBuilder(), this::copyBuilder); EqualsHashCodeTestUtils.checkEqualsAndHashCode(createSearchSourceBuilder(), this::copyBuilder);

View File

@ -182,6 +182,13 @@ public class RandomSearchRequestGenerator {
throw new IllegalStateException(); throw new IllegalStateException();
} }
if (randomBoolean()) {
int numFields = randomInt(5);
for (int i = 0; i < numFields; i++) {
builder.fetchField(randomAlphaOfLengthBetween(5, 10));
}
}
if (randomBoolean()) { if (randomBoolean()) {
int scriptFieldsSize = randomInt(25); int scriptFieldsSize = randomInt(25);
for (int i = 0; i < scriptFieldsSize; i++) { for (int i = 0; i < scriptFieldsSize; i++) {