Skip to content

Commit 50e6c57

Browse files
committed
Use IgnoredFieldsLoader in FallbackSyntheticSourceBlockLoader
1 parent a5838d9 commit 50e6c57

File tree

12 files changed

+147
-100
lines changed

12 files changed

+147
-100
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.elasticsearch.index.mapper.FallbackSyntheticSourceBlockLoader;
4040
import org.elasticsearch.index.mapper.FieldMapper;
4141
import org.elasticsearch.index.mapper.IgnoreMalformedStoredValues;
42+
import org.elasticsearch.index.mapper.IgnoredSourceFieldMapper;
4243
import org.elasticsearch.index.mapper.MapperBuilderContext;
4344
import org.elasticsearch.index.mapper.NumberFieldMapper;
4445
import org.elasticsearch.index.mapper.SimpleMappedFieldType;
@@ -383,7 +384,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
383384
return new FallbackSyntheticSourceBlockLoader(
384385
fallbackSyntheticSourceBlockLoaderReader(),
385386
name(),
386-
blContext.indexSettings().getIndexVersionCreated()
387+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
387388
) {
388389
@Override
389390
public Builder builder(BlockFactory factory, int expectedCount) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ protected BlockLoader blockLoaderFromFallbackSyntheticSource(BlockLoaderContext
197197
return new FallbackSyntheticSourceBlockLoader(
198198
new GeometriesFallbackSyntheticSourceReader(),
199199
name(),
200-
blContext.indexSettings().getIndexVersionCreated()
200+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
201201
) {
202202
@Override
203203
public Builder builder(BlockFactory factory, int expectedCount) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
355355
return new FallbackSyntheticSourceBlockLoader(
356356
fallbackSyntheticSourceBlockLoaderReader(),
357357
name(),
358-
blContext.indexSettings().getIndexVersionCreated()
358+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
359359
) {
360360
@Override
361361
public Builder builder(BlockFactory factory, int expectedCount) {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
10051005
return new FallbackSyntheticSourceBlockLoader(
10061006
fallbackSyntheticSourceBlockLoaderReader(),
10071007
name(),
1008-
blContext.indexSettings().getIndexVersionCreated()
1008+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
10091009
) {
10101010
@Override
10111011
public Builder builder(BlockFactory factory, int expectedCount) {

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

Lines changed: 27 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,12 @@
1111

1212
import org.apache.lucene.index.LeafReaderContext;
1313
import org.apache.lucene.index.SortedSetDocValues;
14-
import org.apache.lucene.util.BytesRef;
15-
import org.elasticsearch.index.IndexVersion;
16-
import org.elasticsearch.index.IndexVersions;
1714
import org.elasticsearch.search.fetch.StoredFieldsSpec;
1815
import org.elasticsearch.xcontent.XContentParser;
1916
import org.elasticsearch.xcontent.XContentParserConfiguration;
2017

2118
import java.io.IOException;
2219
import java.util.ArrayList;
23-
import java.util.HashMap;
2420
import java.util.HashSet;
2521
import java.util.List;
2622
import java.util.Map;
@@ -44,12 +40,17 @@ public abstract class FallbackSyntheticSourceBlockLoader implements BlockLoader
4440
private final Reader<?> reader;
4541
private final String fieldName;
4642
private final Set<String> fieldPaths;
47-
private final IndexVersion indexCreatedVersion;
48-
49-
protected FallbackSyntheticSourceBlockLoader(Reader<?> reader, String fieldName, IndexVersion indexCreatedVersion) {
43+
private final IgnoredSourceFieldMapper.IgnoredFieldsLoader ignoredFieldsLoader;
44+
45+
protected FallbackSyntheticSourceBlockLoader(
46+
Reader<?> reader,
47+
String fieldName,
48+
IgnoredSourceFieldMapper.IgnoredFieldsLoader ignoredFieldsLoader
49+
) {
50+
assert ignoredFieldsLoader != IgnoredSourceFieldMapper.IgnoredFieldsLoader.NO_IGNORED_SOURCE;
5051
this.reader = reader;
5152
this.fieldName = fieldName;
52-
this.indexCreatedVersion = indexCreatedVersion;
53+
this.ignoredFieldsLoader = ignoredFieldsLoader;
5354
this.fieldPaths = splitIntoFieldPaths(fieldName);
5455
}
5556

@@ -60,13 +61,13 @@ public ColumnAtATimeReader columnAtATimeReader(LeafReaderContext context) throws
6061

6162
@Override
6263
public RowStrideReader rowStrideReader(LeafReaderContext context) throws IOException {
63-
return new IgnoredSourceRowStrideReader<>(fieldName, fieldPaths, reader, indexCreatedVersion);
64+
return new IgnoredSourceRowStrideReader<>(fieldName, fieldPaths, reader, ignoredFieldsLoader);
6465
}
6566

6667
@Override
6768
public StoredFieldsSpec rowStrideStoredFieldSpec() {
6869
Set<String> ignoredFieldNames;
69-
if (indexCreatedVersion.onOrAfter(IndexVersions.IGNORED_SOURCE_FIELDS_PER_ENTRY)) {
70+
if (ignoredFieldsLoader == IgnoredSourceFieldMapper.IgnoredFieldsLoader.PER_FIELD_IGNORED_SOURCE) {
7071
ignoredFieldNames = fieldPaths.stream().map(IgnoredSourceFieldMapper::ignoredFieldName).collect(Collectors.toSet());
7172
} else {
7273
ignoredFieldNames = Set.of(IgnoredSourceFieldMapper.NAME);
@@ -104,55 +105,30 @@ private static class IgnoredSourceRowStrideReader<T> implements RowStrideReader
104105
private final String fieldName;
105106
private final Set<String> fieldPaths;
106107
private final Reader<T> reader;
107-
private final IndexVersion indexCreatedVersion;
108-
109-
IgnoredSourceRowStrideReader(String fieldName, Set<String> fieldPaths, Reader<T> reader, IndexVersion indexCreatedVersion) {
108+
private final IgnoredSourceFieldMapper.IgnoredFieldsLoader ignoredFieldsLoader;
109+
110+
IgnoredSourceRowStrideReader(
111+
String fieldName,
112+
Set<String> fieldPaths,
113+
Reader<T> reader,
114+
IgnoredSourceFieldMapper.IgnoredFieldsLoader ignoredFieldsLoader
115+
) {
110116
this.fieldName = fieldName;
111117
this.fieldPaths = fieldPaths;
112118
this.reader = reader;
113-
this.indexCreatedVersion = indexCreatedVersion;
119+
this.ignoredFieldsLoader = ignoredFieldsLoader;
114120
}
115121

116122
@Override
117123
public void read(int docId, StoredFields storedFields, Builder builder) throws IOException {
118-
Map<String, List<IgnoredSourceFieldMapper.NameValue>> valuesForFieldAndParents = new HashMap<>();
119-
120-
if (indexCreatedVersion.onOrAfter(IndexVersions.IGNORED_SOURCE_FIELDS_PER_ENTRY)) {
121-
List<Object> ignoredSource = null;
122-
for (var parentPath : fieldPaths) {
123-
ignoredSource = storedFields.storedFields().get(IgnoredSourceFieldMapper.ignoredFieldName(parentPath));
124-
if (ignoredSource == null) {
125-
continue;
126-
}
127-
assert ignoredSource.size() == 1;
128-
129-
List<IgnoredSourceFieldMapper.NameValue> nameValues = IgnoredSourceFieldMapper.decodeMulti(
130-
(BytesRef) ignoredSource.getFirst()
131-
);
132-
133-
for (var nameValue : nameValues) {
134-
assert fieldPaths.contains(nameValue.name());
135-
valuesForFieldAndParents.computeIfAbsent(nameValue.name(), k -> new ArrayList<>()).add(nameValue);
136-
}
137-
}
138-
if (valuesForFieldAndParents.isEmpty()) {
139-
builder.appendNull();
140-
return;
141-
}
124+
Map<String, List<IgnoredSourceFieldMapper.NameValue>> valuesForFieldAndParents = ignoredFieldsLoader.loadSingleIgnoredField(
125+
fieldPaths,
126+
storedFields.storedFields()
127+
);
142128

143-
} else {
144-
var ignoredSource = storedFields.storedFields().get(IgnoredSourceFieldMapper.NAME);
145-
if (ignoredSource == null) {
146-
builder.appendNull();
147-
return;
148-
}
149-
150-
for (Object value : ignoredSource) {
151-
IgnoredSourceFieldMapper.NameValue nameValue = IgnoredSourceFieldMapper.decode(value);
152-
if (fieldPaths.contains(nameValue.name())) {
153-
valuesForFieldAndParents.computeIfAbsent(nameValue.name(), k -> new ArrayList<>()).add(nameValue);
154-
}
155-
}
129+
if (valuesForFieldAndParents.isEmpty()) {
130+
builder.appendNull();
131+
return;
156132
}
157133

158134
// TODO figure out how to handle XContentDataHelper#voidValue()

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

Lines changed: 78 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.elasticsearch.index.IndexSettings;
2727
import org.elasticsearch.index.IndexVersion;
2828
import org.elasticsearch.index.IndexVersions;
29-
import org.elasticsearch.index.fieldvisitor.LeafStoredFieldLoader;
3029
import org.elasticsearch.index.query.SearchExecutionContext;
3130
import org.elasticsearch.search.lookup.SourceFilter;
3231
import org.elasticsearch.xcontent.XContentBuilder;
@@ -275,58 +274,72 @@ public static Set<String> ensureLoaded(Set<String> fieldsToLoadForSyntheticSourc
275274
public enum IgnoredFieldsLoader {
276275
NO_IGNORED_SOURCE {
277276
@Override
278-
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
277+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadAllIgnoredFields(
279278
SourceFilter filter,
280-
LeafStoredFieldLoader storedFieldLoader,
281-
Map<String, SourceLoader.SyntheticFieldLoader.StoredFieldLoader> storedFieldLoaders
279+
Map<String, List<Object>> storedFields
280+
) {
281+
return Map.of();
282+
}
283+
284+
@Override
285+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadSingleIgnoredField(
286+
Set<String> fieldPaths,
287+
Map<String, List<Object>> storedFields
282288
) {
283289
return Map.of();
284290
}
285291
},
286292
SINGLE_IGNORED_SOURCE {
287293
@Override
288-
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
294+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadAllIgnoredFields(
289295
SourceFilter filter,
290-
LeafStoredFieldLoader storedFieldLoader,
291-
Map<String, SourceLoader.SyntheticFieldLoader.StoredFieldLoader> storedFieldLoaders
296+
Map<String, List<Object>> storedFields
292297
) {
293298
Map<String, List<IgnoredSourceFieldMapper.NameValue>> objectsWithIgnoredFields = null;
294-
for (Map.Entry<String, List<Object>> e : storedFieldLoader.storedFields().entrySet()) {
295-
SourceLoader.SyntheticFieldLoader.StoredFieldLoader loader = storedFieldLoaders.get(e.getKey());
296-
if (loader != null) {
297-
loader.load(e.getValue());
298-
}
299-
if (IgnoredSourceFieldMapper.NAME.equals(e.getKey())) {
300-
for (Object value : e.getValue()) {
301-
if (objectsWithIgnoredFields == null) {
302-
objectsWithIgnoredFields = new HashMap<>();
303-
}
304-
IgnoredSourceFieldMapper.NameValue nameValue = IgnoredSourceFieldMapper.decode(value);
305-
if (filter != null
306-
&& filter.isPathFiltered(nameValue.name(), XContentDataHelper.isEncodedObject(nameValue.value()))) {
307-
// This path is filtered by the include/exclude rules
308-
continue;
309-
}
310-
objectsWithIgnoredFields.computeIfAbsent(nameValue.getParentFieldName(), k -> new ArrayList<>()).add(nameValue);
299+
List<Object> storedValues = storedFields.get(IgnoredSourceFieldMapper.NAME);
300+
if (storedValues != null) {
301+
for (Object value : storedValues) {
302+
if (objectsWithIgnoredFields == null) {
303+
objectsWithIgnoredFields = new HashMap<>();
304+
}
305+
IgnoredSourceFieldMapper.NameValue nameValue = IgnoredSourceFieldMapper.decode(value);
306+
if (filter != null
307+
&& filter.isPathFiltered(nameValue.name(), XContentDataHelper.isEncodedObject(nameValue.value()))) {
308+
// This path is filtered by the include/exclude rules
309+
continue;
311310
}
311+
objectsWithIgnoredFields.computeIfAbsent(nameValue.getParentFieldName(), k -> new ArrayList<>()).add(nameValue);
312312
}
313313
}
314314
return objectsWithIgnoredFields;
315315
}
316+
317+
@Override
318+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadSingleIgnoredField(
319+
Set<String> fieldPaths,
320+
Map<String, List<Object>> storedFields
321+
) {
322+
Map<String, List<IgnoredSourceFieldMapper.NameValue>> valuesForFieldAndParents = new HashMap<>();
323+
var ignoredSource = storedFields.get(IgnoredSourceFieldMapper.NAME);
324+
if (ignoredSource != null) {
325+
for (Object value : ignoredSource) {
326+
IgnoredSourceFieldMapper.NameValue nameValue = IgnoredSourceFieldMapper.decode(value);
327+
if (fieldPaths.contains(nameValue.name())) {
328+
valuesForFieldAndParents.computeIfAbsent(nameValue.name(), k -> new ArrayList<>()).add(nameValue);
329+
}
330+
}
331+
}
332+
return valuesForFieldAndParents;
333+
}
316334
},
317335
PER_FIELD_IGNORED_SOURCE {
318336
@Override
319-
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
337+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadAllIgnoredFields(
320338
SourceFilter filter,
321-
LeafStoredFieldLoader storedFieldLoader,
322-
Map<String, SourceLoader.SyntheticFieldLoader.StoredFieldLoader> storedFieldLoaders
339+
Map<String, List<Object>> storedFields
323340
) {
324341
Map<String, List<IgnoredSourceFieldMapper.NameValue>> objectsWithIgnoredFields = null;
325-
for (Map.Entry<String, List<Object>> e : storedFieldLoader.storedFields().entrySet()) {
326-
SourceLoader.SyntheticFieldLoader.StoredFieldLoader loader = storedFieldLoaders.get(e.getKey());
327-
if (loader != null) {
328-
loader.load(e.getValue());
329-
}
342+
for (Map.Entry<String, List<Object>> e : storedFields.entrySet()) {
330343
if (e.getKey().startsWith(IgnoredSourceFieldMapper.NAME)) {
331344
assert e.getValue().size() == 1;
332345

@@ -348,12 +361,42 @@ public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
348361
}
349362
return objectsWithIgnoredFields;
350363
}
364+
365+
@Override
366+
public Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadSingleIgnoredField(
367+
Set<String> fieldPaths,
368+
Map<String, List<Object>> storedFields
369+
) {
370+
Map<String, List<IgnoredSourceFieldMapper.NameValue>> valuesForFieldAndParents = new HashMap<>();
371+
for (var parentPath : fieldPaths) {
372+
var ignoredSource = storedFields.get(IgnoredSourceFieldMapper.ignoredFieldName(parentPath));
373+
if (ignoredSource == null) {
374+
continue;
375+
}
376+
assert ignoredSource.size() == 1;
377+
378+
List<IgnoredSourceFieldMapper.NameValue> nameValues = IgnoredSourceFieldMapper.decodeMulti(
379+
(BytesRef) ignoredSource.getFirst()
380+
);
381+
382+
for (var nameValue : nameValues) {
383+
assert fieldPaths.contains(nameValue.name());
384+
valuesForFieldAndParents.computeIfAbsent(nameValue.name(), k -> new ArrayList<>()).add(nameValue);
385+
}
386+
}
387+
388+
return valuesForFieldAndParents;
389+
}
351390
};
352391

353-
public abstract Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadIgnoredFields(
392+
public abstract Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadAllIgnoredFields(
354393
SourceFilter filter,
355-
LeafStoredFieldLoader storedFieldLoader,
356-
Map<String, SourceLoader.SyntheticFieldLoader.StoredFieldLoader> storedFieldLoaders
394+
Map<String, List<Object>> storedFields
395+
);
396+
397+
public abstract Map<String, List<IgnoredSourceFieldMapper.NameValue>> loadSingleIgnoredField(
398+
Set<String> fieldPaths,
399+
Map<String, List<Object>> storedFields
357400
);
358401
}
359402

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,11 @@ public void writeToBlock(List<InetAddress> values, BlockLoader.Builder blockBuil
518518
}
519519
};
520520

521-
return new FallbackSyntheticSourceBlockLoader(reader, name(), blContext.indexSettings().getIndexVersionCreated()) {
521+
return new FallbackSyntheticSourceBlockLoader(
522+
reader,
523+
name(),
524+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
525+
) {
522526
@Override
523527
public Builder builder(BlockFactory factory, int expectedCount) {
524528
return factory.bytesRefs(expectedCount);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -805,7 +805,7 @@ public BlockLoader blockLoader(BlockLoaderContext blContext) {
805805
return new FallbackSyntheticSourceBlockLoader(
806806
fallbackSyntheticSourceBlockLoaderReader(),
807807
name(),
808-
blContext.indexSettings().getIndexVersionCreated()
808+
IgnoredSourceFieldMapper.ignoredFieldsLoader(blContext.indexSettings().getIndexVersionCreated())
809809
) {
810810
@Override
811811
public Builder builder(BlockFactory factory, int expectedCount) {

0 commit comments

Comments
 (0)