Skip to content

Commit a3f21f3

Browse files
martijnvgsmalyshev
authored andcommitted
Sometimes delegate to SourceLoader in ValueSourceReaderOperator for required stored fields (elastic#115114)
If source is required by a block loader then the StoredFieldsSpec that gets populated should be enhanced by SourceLoader#requiredStoredFields(...) in ValuesSourceReaderOperator. Otherwise in case of synthetic source many stored fields aren't loaded, which causes only a subset of _source to be synthesized. For example when unmapped fields exist or field values that exceed configured ignore above will not appear is _source. This happens when field types fallback to a block loader implementation that uses _source. The required field values are then extracted from the source once loaded. This change also reverts the production code changes introduced via elastic#114903. That change only ensured that _ignored_source field was added to the required list of stored fields. In reality more fields could be required. This change is better fix, since it handles also other cases and the SourceLoader implementation indicates which stored fields are needed. Closes elastic#115076
1 parent 5a0f62f commit a3f21f3

File tree

21 files changed

+276
-163
lines changed

21 files changed

+276
-163
lines changed

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/MatchOnlyTextFieldMapper.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -364,8 +364,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
364364
SourceValueFetcher fetcher = SourceValueFetcher.toString(blContext.sourcePaths(name()));
365365
// MatchOnlyText never has norms, so we have to use the field names field
366366
BlockSourceReader.LeafIteratorLookup lookup = BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name());
367-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
368-
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, lookup, sourceMode);
367+
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, lookup);
369368
}
370369

371370
@Override

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/extras/ScaledFloatFieldMapper.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
319319
BlockSourceReader.LeafIteratorLookup lookup = isStored() || isIndexed()
320320
? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name())
321321
: BlockSourceReader.lookupMatchingAll();
322-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
323-
return new BlockSourceReader.DoublesBlockLoader(valueFetcher, lookup, sourceMode);
322+
return new BlockSourceReader.DoublesBlockLoader(valueFetcher, lookup);
324323
}
325324

326325
@Override

muted-tests.yml

-12
Original file line numberDiff line numberDiff line change
@@ -282,18 +282,6 @@ tests:
282282
- class: org.elasticsearch.xpack.inference.DefaultEndPointsIT
283283
method: testInferDeploysDefaultElser
284284
issue: https://github.com/elastic/elasticsearch/issues/114913
285-
- class: org.elasticsearch.index.mapper.TextFieldMapperTests
286-
method: testBlockLoaderFromRowStrideReaderWithSyntheticSource
287-
issue: https://github.com/elastic/elasticsearch/issues/115066
288-
- class: org.elasticsearch.index.mapper.TextFieldMapperTests
289-
method: testBlockLoaderFromColumnReaderWithSyntheticSource
290-
issue: https://github.com/elastic/elasticsearch/issues/115073
291-
- class: org.elasticsearch.index.mapper.annotatedtext.AnnotatedTextFieldMapperTests
292-
method: testBlockLoaderFromColumnReaderWithSyntheticSource
293-
issue: https://github.com/elastic/elasticsearch/issues/115074
294-
- class: org.elasticsearch.index.mapper.annotatedtext.AnnotatedTextFieldMapperTests
295-
method: testBlockLoaderFromRowStrideReaderWithSyntheticSource
296-
issue: https://github.com/elastic/elasticsearch/issues/115076
297285
- class: org.elasticsearch.xpack.test.rest.XPackRestIT
298286
method: test {p0=esql/60_usage/Basic ESQL usage output (telemetry)}
299287
issue: https://github.com/elastic/elasticsearch/issues/115231

server/src/main/java/org/elasticsearch/index/mapper/AbstractGeometryFieldMapper.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
189189
protected BlockLoader blockLoaderFromSource(BlockLoaderContext blContext) {
190190
ValueFetcher fetcher = valueFetcher(blContext.sourcePaths(name()), nullValue, GeometryFormatterFactory.WKB);
191191
// TODO consider optimization using BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name())
192-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
193-
return new BlockSourceReader.GeometriesBlockLoader(fetcher, BlockSourceReader.lookupMatchingAll(), sourceMode);
192+
return new BlockSourceReader.GeometriesBlockLoader(fetcher, BlockSourceReader.lookupMatchingAll());
194193
}
195194

196195
protected abstract Object nullValueAsSource(T nullValue);

server/src/main/java/org/elasticsearch/index/mapper/BlockSourceReader.java

+18-29
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,13 @@
2222
import java.io.IOException;
2323
import java.util.ArrayList;
2424
import java.util.List;
25-
import java.util.Set;
2625

2726
/**
2827
* Loads values from {@code _source}. This whole process is very slow and cast-tastic,
2928
* so it doesn't really try to avoid megamorphic invocations. It's just going to be
3029
* slow.
3130
*/
3231
public abstract class BlockSourceReader implements BlockLoader.RowStrideReader {
33-
34-
// _ignored_source is needed when source mode is synthetic.
35-
static final StoredFieldsSpec NEEDS_SOURCE_AND_IGNORED_SOURCE = new StoredFieldsSpec(
36-
true,
37-
false,
38-
Set.of(IgnoredSourceFieldMapper.NAME)
39-
);
40-
4132
private final ValueFetcher fetcher;
4233
private final List<Object> ignoredValues = new ArrayList<>();
4334
private final DocIdSetIterator iter;
@@ -100,12 +91,10 @@ public interface LeafIteratorLookup {
10091
private abstract static class SourceBlockLoader implements BlockLoader {
10192
protected final ValueFetcher fetcher;
10293
private final LeafIteratorLookup lookup;
103-
private final SourceFieldMapper.Mode sourceMode;
10494

105-
private SourceBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
95+
private SourceBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
10696
this.fetcher = fetcher;
10797
this.lookup = lookup;
108-
this.sourceMode = sourceMode;
10998
}
11099

111100
@Override
@@ -115,7 +104,7 @@ public final ColumnAtATimeReader columnAtATimeReader(LeafReaderContext context)
115104

116105
@Override
117106
public final StoredFieldsSpec rowStrideStoredFieldSpec() {
118-
return sourceMode == SourceFieldMapper.Mode.SYNTHETIC ? NEEDS_SOURCE_AND_IGNORED_SOURCE : StoredFieldsSpec.NEEDS_SOURCE;
107+
return StoredFieldsSpec.NEEDS_SOURCE;
119108
}
120109

121110
@Override
@@ -151,8 +140,8 @@ public final String toString() {
151140
* Load {@code boolean}s from {@code _source}.
152141
*/
153142
public static class BooleansBlockLoader extends SourceBlockLoader {
154-
public BooleansBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
155-
super(fetcher, lookup, sourceMode);
143+
public BooleansBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
144+
super(fetcher, lookup);
156145
}
157146

158147
@Override
@@ -191,8 +180,8 @@ public String toString() {
191180
* Load {@link BytesRef}s from {@code _source}.
192181
*/
193182
public static class BytesRefsBlockLoader extends SourceBlockLoader {
194-
public BytesRefsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
195-
super(fetcher, lookup, sourceMode);
183+
public BytesRefsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
184+
super(fetcher, lookup);
196185
}
197186

198187
@Override
@@ -202,7 +191,7 @@ public final Builder builder(BlockFactory factory, int expectedCount) {
202191

203192
@Override
204193
protected RowStrideReader rowStrideReader(LeafReaderContext context, DocIdSetIterator iter) throws IOException {
205-
return new BytesRefs(fetcher, iter, null);
194+
return new BytesRefs(fetcher, iter);
206195
}
207196

208197
@Override
@@ -212,8 +201,8 @@ protected String name() {
212201
}
213202

214203
public static class GeometriesBlockLoader extends SourceBlockLoader {
215-
public GeometriesBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
216-
super(fetcher, lookup, sourceMode);
204+
public GeometriesBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
205+
super(fetcher, lookup);
217206
}
218207

219208
@Override
@@ -223,7 +212,7 @@ public final Builder builder(BlockFactory factory, int expectedCount) {
223212

224213
@Override
225214
protected RowStrideReader rowStrideReader(LeafReaderContext context, DocIdSetIterator iter) {
226-
return new Geometries(fetcher, iter, null);
215+
return new Geometries(fetcher, iter);
227216
}
228217

229218
@Override
@@ -235,7 +224,7 @@ protected String name() {
235224
private static class BytesRefs extends BlockSourceReader {
236225
private final BytesRef scratch = new BytesRef();
237226

238-
BytesRefs(ValueFetcher fetcher, DocIdSetIterator iter, SourceFieldMapper.Mode sourceMode) {
227+
BytesRefs(ValueFetcher fetcher, DocIdSetIterator iter) {
239228
super(fetcher, iter);
240229
}
241230

@@ -252,7 +241,7 @@ public String toString() {
252241

253242
private static class Geometries extends BlockSourceReader {
254243

255-
Geometries(ValueFetcher fetcher, DocIdSetIterator iter, SourceFieldMapper.Mode sourceMode) {
244+
Geometries(ValueFetcher fetcher, DocIdSetIterator iter) {
256245
super(fetcher, iter);
257246
}
258247

@@ -275,8 +264,8 @@ public String toString() {
275264
* Load {@code double}s from {@code _source}.
276265
*/
277266
public static class DoublesBlockLoader extends SourceBlockLoader {
278-
public DoublesBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
279-
super(fetcher, lookup, sourceMode);
267+
public DoublesBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
268+
super(fetcher, lookup);
280269
}
281270

282271
@Override
@@ -315,8 +304,8 @@ public String toString() {
315304
* Load {@code int}s from {@code _source}.
316305
*/
317306
public static class IntsBlockLoader extends SourceBlockLoader {
318-
public IntsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
319-
super(fetcher, lookup, sourceMode);
307+
public IntsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
308+
super(fetcher, lookup);
320309
}
321310

322311
@Override
@@ -355,8 +344,8 @@ public String toString() {
355344
* Load {@code long}s from {@code _source}.
356345
*/
357346
public static class LongsBlockLoader extends SourceBlockLoader {
358-
public LongsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup, SourceFieldMapper.Mode sourceMode) {
359-
super(fetcher, lookup, sourceMode);
347+
public LongsBlockLoader(ValueFetcher fetcher, LeafIteratorLookup lookup) {
348+
super(fetcher, lookup);
360349
}
361350

362351
@Override

server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
314314
BlockSourceReader.LeafIteratorLookup lookup = isIndexed() || isStored()
315315
? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name())
316316
: BlockSourceReader.lookupMatchingAll();
317-
return new BlockSourceReader.BooleansBlockLoader(fetcher, lookup, blContext.indexSettings().getIndexMappingSourceMode());
317+
return new BlockSourceReader.BooleansBlockLoader(fetcher, lookup);
318318
}
319319

320320
@Override

server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -793,8 +793,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
793793
BlockSourceReader.LeafIteratorLookup lookup = isStored() || isIndexed()
794794
? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name())
795795
: BlockSourceReader.lookupMatchingAll();
796-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
797-
return new BlockSourceReader.LongsBlockLoader(sourceValueFetcher(blContext.sourcePaths(name())), lookup, sourceMode);
796+
return new BlockSourceReader.LongsBlockLoader(sourceValueFetcher(blContext.sourcePaths(name())), lookup);
798797
}
799798

800799
@Override

server/src/main/java/org/elasticsearch/index/mapper/KeywordFieldMapper.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -634,8 +634,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
634634
return new BlockStoredFieldsReader.BytesFromBytesRefsBlockLoader(name());
635635
}
636636
SourceValueFetcher fetcher = sourceValueFetcher(blContext.sourcePaths(name()));
637-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
638-
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, sourceBlockLoaderLookup(blContext), sourceMode);
637+
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, sourceBlockLoaderLookup(blContext));
639638
}
640639

641640
private BlockSourceReader.LeafIteratorLookup sourceBlockLoaderLookup(BlockLoaderContext blContext) {

server/src/main/java/org/elasticsearch/index/mapper/NumberFieldMapper.java

+16-49
Original file line numberDiff line numberDiff line change
@@ -462,12 +462,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
462462
}
463463

464464
@Override
465-
BlockLoader blockLoaderFromSource(
466-
SourceValueFetcher sourceValueFetcher,
467-
BlockSourceReader.LeafIteratorLookup lookup,
468-
SourceFieldMapper.Mode sourceMode
469-
) {
470-
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup, sourceMode);
465+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
466+
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup);
471467
}
472468
},
473469
FLOAT("float", NumericType.FLOAT) {
@@ -650,12 +646,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
650646
}
651647

652648
@Override
653-
BlockLoader blockLoaderFromSource(
654-
SourceValueFetcher sourceValueFetcher,
655-
BlockSourceReader.LeafIteratorLookup lookup,
656-
SourceFieldMapper.Mode sourceMode
657-
) {
658-
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup, sourceMode);
649+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
650+
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup);
659651
}
660652
},
661653
DOUBLE("double", NumericType.DOUBLE) {
@@ -804,12 +796,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
804796
}
805797

806798
@Override
807-
BlockLoader blockLoaderFromSource(
808-
SourceValueFetcher sourceValueFetcher,
809-
BlockSourceReader.LeafIteratorLookup lookup,
810-
SourceFieldMapper.Mode sourceMode
811-
) {
812-
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup, sourceMode);
799+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
800+
return new BlockSourceReader.DoublesBlockLoader(sourceValueFetcher, lookup);
813801
}
814802
},
815803
BYTE("byte", NumericType.BYTE) {
@@ -921,12 +909,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
921909
}
922910

923911
@Override
924-
BlockLoader blockLoaderFromSource(
925-
SourceValueFetcher sourceValueFetcher,
926-
BlockSourceReader.LeafIteratorLookup lookup,
927-
SourceFieldMapper.Mode sourceMode
928-
) {
929-
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup, sourceMode);
912+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
913+
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup);
930914
}
931915

932916
private boolean isOutOfRange(Object value) {
@@ -1038,12 +1022,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
10381022
}
10391023

10401024
@Override
1041-
BlockLoader blockLoaderFromSource(
1042-
SourceValueFetcher sourceValueFetcher,
1043-
BlockSourceReader.LeafIteratorLookup lookup,
1044-
SourceFieldMapper.Mode sourceMode
1045-
) {
1046-
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup, sourceMode);
1025+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
1026+
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup);
10471027
}
10481028

10491029
private boolean isOutOfRange(Object value) {
@@ -1229,12 +1209,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
12291209
}
12301210

12311211
@Override
1232-
BlockLoader blockLoaderFromSource(
1233-
SourceValueFetcher sourceValueFetcher,
1234-
BlockSourceReader.LeafIteratorLookup lookup,
1235-
SourceFieldMapper.Mode sourceMode
1236-
) {
1237-
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup, sourceMode);
1212+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
1213+
return new BlockSourceReader.IntsBlockLoader(sourceValueFetcher, lookup);
12381214
}
12391215
},
12401216
LONG("long", NumericType.LONG) {
@@ -1380,12 +1356,8 @@ BlockLoader blockLoaderFromDocValues(String fieldName) {
13801356
}
13811357

13821358
@Override
1383-
BlockLoader blockLoaderFromSource(
1384-
SourceValueFetcher sourceValueFetcher,
1385-
BlockSourceReader.LeafIteratorLookup lookup,
1386-
SourceFieldMapper.Mode sourceMode
1387-
) {
1388-
return new BlockSourceReader.LongsBlockLoader(sourceValueFetcher, lookup, sourceMode);
1359+
BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup) {
1360+
return new BlockSourceReader.LongsBlockLoader(sourceValueFetcher, lookup);
13891361
}
13901362

13911363
private boolean isOutOfRange(Object value) {
@@ -1663,11 +1635,7 @@ protected void writeValue(XContentBuilder b, long value) throws IOException {
16631635

16641636
abstract BlockLoader blockLoaderFromDocValues(String fieldName);
16651637

1666-
abstract BlockLoader blockLoaderFromSource(
1667-
SourceValueFetcher sourceValueFetcher,
1668-
BlockSourceReader.LeafIteratorLookup lookup,
1669-
SourceFieldMapper.Mode sourceMode
1670-
);
1638+
abstract BlockLoader blockLoaderFromSource(SourceValueFetcher sourceValueFetcher, BlockSourceReader.LeafIteratorLookup lookup);
16711639
}
16721640

16731641
public static class NumberFieldType extends SimpleMappedFieldType {
@@ -1806,8 +1774,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
18061774
BlockSourceReader.LeafIteratorLookup lookup = isStored() || isIndexed()
18071775
? BlockSourceReader.lookupFromFieldNames(blContext.fieldNames(), name())
18081776
: BlockSourceReader.lookupMatchingAll();
1809-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
1810-
return type.blockLoaderFromSource(sourceValueFetcher(blContext.sourcePaths(name())), lookup, sourceMode);
1777+
return type.blockLoaderFromSource(sourceValueFetcher(blContext.sourcePaths(name())), lookup);
18111778
}
18121779

18131780
@Override

server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java

+1-13
Original file line numberDiff line numberDiff line change
@@ -1007,20 +1007,8 @@ protected String delegatingTo() {
10071007
if (isStored()) {
10081008
return new BlockStoredFieldsReader.BytesFromStringsBlockLoader(name());
10091009
}
1010-
if (isSyntheticSource && syntheticSourceDelegate == null) {
1011-
/*
1012-
* When we're in synthetic source mode we don't currently
1013-
* support text fields that are not stored and are not children
1014-
* of perfect keyword fields. We'd have to load from the parent
1015-
* field and then convert the result to a string. In this case,
1016-
* even if we would synthesize the source, the current field
1017-
* would be missing.
1018-
*/
1019-
return null;
1020-
}
10211010
SourceValueFetcher fetcher = SourceValueFetcher.toString(blContext.sourcePaths(name()));
1022-
var sourceMode = blContext.indexSettings().getIndexMappingSourceMode();
1023-
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, blockReaderDisiLookup(blContext), sourceMode);
1011+
return new BlockSourceReader.BytesRefsBlockLoader(fetcher, blockReaderDisiLookup(blContext));
10241012
}
10251013

10261014
/**

server/src/test/java/org/elasticsearch/index/mapper/BlockSourceReaderTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void testEmptyArray() throws IOException {
5151
private void loadBlock(LeafReaderContext ctx, Consumer<TestBlock> test) throws IOException {
5252
ValueFetcher valueFetcher = SourceValueFetcher.toString(Set.of("field"));
5353
BlockSourceReader.LeafIteratorLookup lookup = BlockSourceReader.lookupFromNorms("field");
54-
BlockLoader loader = new BlockSourceReader.BytesRefsBlockLoader(valueFetcher, lookup, null);
54+
BlockLoader loader = new BlockSourceReader.BytesRefsBlockLoader(valueFetcher, lookup);
5555
assertThat(loader.columnAtATimeReader(ctx), nullValue());
5656
BlockLoader.RowStrideReader reader = loader.rowStrideReader(ctx);
5757
assertThat(loader.rowStrideStoredFieldSpec(), equalTo(StoredFieldsSpec.NEEDS_SOURCE));

0 commit comments

Comments
 (0)