Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import org.elasticsearch.index.mapper.MapperBuilderContext;
import org.elasticsearch.index.mapper.NumberFieldMapper;
import org.elasticsearch.index.mapper.SimpleMappedFieldType;
import org.elasticsearch.index.mapper.SortedNumericDocValuesSyntheticFieldLoader;
import org.elasticsearch.index.mapper.SortedNumericDocValuesSyntheticFieldLoaderLayer;
import org.elasticsearch.index.mapper.SortedNumericWithOffsetsDocValuesSyntheticFieldLoaderLayer;
import org.elasticsearch.index.mapper.SourceLoader;
import org.elasticsearch.index.mapper.SourceValueFetcher;
Expand Down Expand Up @@ -858,17 +858,17 @@ private SourceLoader.SyntheticFieldLoader docValuesSyntheticFieldLoader() {
}
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
} else {
return new SortedNumericDocValuesSyntheticFieldLoader(
fullPath(),
leafName(),
ignoreMalformed.value(),
indexSettings.getIndexVersionCreated()
) {
@Override
protected void writeValue(XContentBuilder b, long value) throws IOException {
b.value(decodeForSyntheticSource(value, scalingFactor));
}
};
var layers = new ArrayList<CompositeSyntheticFieldLoader.Layer>(2);
layers.add(
new SortedNumericDocValuesSyntheticFieldLoaderLayer(
fullPath(),
(b, value) -> b.value(decodeForSyntheticSource(value, scalingFactor))
)
);
if (ignoreMalformed.value()) {
layers.add(CompositeSyntheticFieldLoader.malformedValuesLayer(fullPath(), indexSettings.getIndexVersionCreated()));
}
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -663,17 +663,12 @@ private SourceLoader.SyntheticFieldLoader docValuesSyntheticFieldLoader() {
}
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
} else {
return new SortedNumericDocValuesSyntheticFieldLoader(
fullPath(),
leafName(),
ignoreMalformed.value(),
indexSettings.getIndexVersionCreated()
) {
@Override
protected void writeValue(XContentBuilder b, long value) throws IOException {
b.value(value == 1);
}
};
var layers = new ArrayList<CompositeSyntheticFieldLoader.Layer>(2);
layers.add(new SortedNumericDocValuesSyntheticFieldLoaderLayer(fullPath(), (b, value) -> b.value(value == 1)));
if (ignoreMalformed.value()) {
layers.add(CompositeSyntheticFieldLoader.malformedValuesLayer(fullPath(), indexSettings.getIndexVersionCreated()));
}
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@
import org.elasticsearch.search.lookup.FieldValues;
import org.elasticsearch.search.lookup.SearchLookup;
import org.elasticsearch.search.runtime.LongScriptFieldDistanceFeatureQuery;
import org.elasticsearch.xcontent.XContentBuilder;
import org.elasticsearch.xcontent.XContentParser;

import java.io.IOException;
Expand All @@ -71,6 +70,7 @@
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
Expand Down Expand Up @@ -1259,19 +1259,19 @@ public Long getNullValue() {
@Override
protected SyntheticSourceSupport syntheticSourceSupport() {
if (hasDocValues) {
return new SyntheticSourceSupport.Native(
() -> new SortedNumericDocValuesSyntheticFieldLoader(
fullPath(),
leafName(),
ignoreMalformed,
indexSettings.getIndexVersionCreated()
) {
@Override
protected void writeValue(XContentBuilder b, long value) throws IOException {
b.value(fieldType().format(value, fieldType().dateTimeFormatter()));
}
return new SyntheticSourceSupport.Native(() -> {
var layers = new ArrayList<CompositeSyntheticFieldLoader.Layer>(2);
layers.add(
new SortedNumericDocValuesSyntheticFieldLoaderLayer(
fullPath(),
(b, value) -> b.value(fieldType().format(value, fieldType().dateTimeFormatter()))
)
);
if (ignoreMalformed) {
layers.add(CompositeSyntheticFieldLoader.malformedValuesLayer(fullPath(), indexSettings.getIndexVersionCreated()));
}
);
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
});
}

return super.syntheticSourceSupport();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -655,22 +656,18 @@ protected void onMalformedValue(DocumentParserContext context, XContentBuilder m
@Override
protected SyntheticSourceSupport syntheticSourceSupport() {
if (fieldType().hasDocValues()) {
return new SyntheticSourceSupport.Native(
() -> new SortedNumericDocValuesSyntheticFieldLoader(
fullPath(),
leafName(),
ignoreMalformed(),
indexSettings.getIndexVersionCreated()
) {
final GeoPoint point = new GeoPoint();

@Override
protected void writeValue(XContentBuilder b, long value) throws IOException {
point.reset(GeoEncodingUtils.decodeLatitude((int) (value >>> 32)), GeoEncodingUtils.decodeLongitude((int) value));
point.toXContent(b, ToXContent.EMPTY_PARAMS);
}
return new SyntheticSourceSupport.Native(() -> {
final GeoPoint point = new GeoPoint();
var layers = new ArrayList<CompositeSyntheticFieldLoader.Layer>(2);
layers.add(new SortedNumericDocValuesSyntheticFieldLoaderLayer(fullPath(), (b, value) -> {
point.reset(GeoEncodingUtils.decodeLatitude((int) (value >>> 32)), GeoEncodingUtils.decodeLongitude((int) value));
point.toXContent(b, ToXContent.EMPTY_PARAMS);
}));
if (ignoreMalformed()) {
layers.add(CompositeSyntheticFieldLoader.malformedValuesLayer(fullPath(), indexSettings.getIndexVersionCreated()));
}
);
return new CompositeSyntheticFieldLoader(leafName(), fullPath(), layers);
});
}

return super.syntheticSourceSupport();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1861,12 +1861,12 @@ SourceLoader.SyntheticFieldLoader syntheticFieldLoader(
boolean ignoreMalformed,
IndexVersion indexVersion
) {
return new SortedNumericDocValuesSyntheticFieldLoader(fieldName, fieldSimpleName, ignoreMalformed, indexVersion) {
@Override
public void writeValue(XContentBuilder b, long value) throws IOException {
NumberType.this.writeValue(b, value);
}
};
var layers = new ArrayList<CompositeSyntheticFieldLoader.Layer>(2);
layers.add(new SortedNumericDocValuesSyntheticFieldLoaderLayer(fieldName, NumberType.this::writeValue));
if (ignoreMalformed) {
layers.add(CompositeSyntheticFieldLoader.malformedValuesLayer(fieldName, indexVersion));
}
return new CompositeSyntheticFieldLoader(fieldSimpleName, fieldName, layers);
}

abstract BlockLoader blockLoaderFromDocValues(String fieldName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,83 +13,37 @@
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.NumericDocValues;
import org.apache.lucene.index.SortedNumericDocValues;
import org.elasticsearch.index.IndexVersion;
import org.elasticsearch.xcontent.XContentBuilder;

import java.io.IOException;
import java.util.Map;
import java.util.stream.Stream;

/**
* Load {@code _source} fields from {@link SortedNumericDocValues}.
* A {@link CompositeSyntheticFieldLoader.DocValuesLayer} that loads values from {@link SortedNumericDocValues}.
*/
public abstract class SortedNumericDocValuesSyntheticFieldLoader implements SourceLoader.SyntheticFieldLoader {
private final String name;
private final String simpleName;

/**
* Optionally loads malformed values from stored fields.
*/
private final IgnoreMalformedStoredValues ignoreMalformedValues;
public class SortedNumericDocValuesSyntheticFieldLoaderLayer implements CompositeSyntheticFieldLoader.DocValuesLayer {

private Values values = NO_VALUES;

/**
* Build a loader from doc values and, optionally, a stored field for malformed values.
* @param name the name of the field to load from doc values
* @param simpleName the name to give the field in the rendered {@code _source}
* @param loadIgnoreMalformedValues should we load values skipped by {@code ignore_malformed}
*/
protected SortedNumericDocValuesSyntheticFieldLoader(String name, String simpleName, boolean loadIgnoreMalformedValues) {
this(name, simpleName, loadIgnoreMalformedValues ? IgnoreMalformedStoredValues.stored(name) : IgnoreMalformedStoredValues.empty());
}
private final String name;
private final SortedNumericWithOffsetsDocValuesSyntheticFieldLoaderLayer.NumericValueWriter valueWriter;
private Values docValues = NO_VALUES;

protected SortedNumericDocValuesSyntheticFieldLoader(
public SortedNumericDocValuesSyntheticFieldLoaderLayer(
String name,
String simpleName,
boolean loadIgnoreMalformedValues,
IndexVersion indexVersion
SortedNumericWithOffsetsDocValuesSyntheticFieldLoaderLayer.NumericValueWriter valueWriter
) {
this(
name,
simpleName,
loadIgnoreMalformedValues
? IgnoreMalformedStoredValues.forSyntheticSource(name, indexVersion)
: IgnoreMalformedStoredValues.empty()
);
}

private SortedNumericDocValuesSyntheticFieldLoader(String name, String simpleName, IgnoreMalformedStoredValues ignoreMalformedValues) {
this.name = name;
this.simpleName = simpleName;
this.ignoreMalformedValues = ignoreMalformedValues;
this.valueWriter = valueWriter;
}

protected abstract void writeValue(XContentBuilder b, long value) throws IOException;

@Override
public Stream<Map.Entry<String, StoredFieldLoader>> storedFieldLoaders() {
return ignoreMalformedValues.storedFieldLoaders();
public String fieldName() {
return name;
}

@Override
public DocValuesLoader docValuesLoader(LeafReader reader, int[] docIdsInLeaf) throws IOException {
DocValuesLoader fieldLoader = fieldDocValuesLoader(reader, docIdsInLeaf);
DocValuesLoader malformedLoader = ignoreMalformedValues.docValuesLoader(reader);

if (fieldLoader != null && malformedLoader != null) {
return docId -> fieldLoader.advanceToDoc(docId) | malformedLoader.advanceToDoc(docId);
} else if (malformedLoader != null) {
return malformedLoader;
} else {
return fieldLoader;
}
}

private DocValuesLoader fieldDocValuesLoader(LeafReader reader, int[] docIdsInLeaf) throws IOException {
SortedNumericDocValues dv = docValuesOrNull(reader, name);
if (dv == null) {
values = NO_VALUES;
docValues = NO_VALUES;
return null;
}
if (docIdsInLeaf != null && docIdsInLeaf.length > 1) {
Expand All @@ -101,47 +55,28 @@ private DocValuesLoader fieldDocValuesLoader(LeafReader reader, int[] docIdsInLe
NumericDocValues single = DocValues.unwrapSingleton(dv);
if (single != null) {
SingletonDocValuesLoader loader = buildSingletonDocValuesLoader(single, docIdsInLeaf);
values = loader == null ? NO_VALUES : loader;
docValues = loader == null ? NO_VALUES : loader;
return loader;
}
}
ImmediateDocValuesLoader loader = new ImmediateDocValuesLoader(dv);
values = loader;
docValues = loader;
return loader;
}

@Override
public boolean hasValue() {
return values.count() > 0 || ignoreMalformedValues.count() > 0;
return docValues.count() > 0;
}

@Override
public void write(XContentBuilder b) throws IOException {
switch (values.count() + ignoreMalformedValues.count()) {
case 0:
return;
case 1:
b.field(simpleName);
if (values.count() > 0) {
assert values.count() == 1;
assert ignoreMalformedValues.count() == 0;
values.write(b);
} else {
assert ignoreMalformedValues.count() == 1;
ignoreMalformedValues.write(b);
}
return;
default:
b.startArray(simpleName);
values.write(b);
ignoreMalformedValues.write(b);
b.endArray();
}
public long valueCount() {
return docValues.count();
}

@Override
public void reset() {
ignoreMalformedValues.reset();
public void write(XContentBuilder b) throws IOException {
docValues.write(b);
}

private interface Values {
Expand Down Expand Up @@ -184,7 +119,7 @@ public void write(XContentBuilder b) throws IOException {
return;
}
for (int i = 0; i < dv.docValueCount(); i++) {
writeValue(b, dv.nextValue());
valueWriter.writeLongValue(b, dv.nextValue());
}
}
}
Expand Down Expand Up @@ -257,7 +192,7 @@ public void write(XContentBuilder b) throws IOException {
if (hasValue[idx] == false) {
return;
}
writeValue(b, values[idx]);
valueWriter.writeLongValue(b, values[idx]);
}
}

Expand All @@ -278,9 +213,4 @@ public static SortedNumericDocValues docValuesOrNull(LeafReader reader, String f
}
return null;
}

@Override
public String fieldName() {
return name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
import org.elasticsearch.index.mapper.MapperBuilderContext;
import org.elasticsearch.index.mapper.NumberFieldMapper;
import org.elasticsearch.index.mapper.SimpleMappedFieldType;
import org.elasticsearch.index.mapper.SortedNumericDocValuesSyntheticFieldLoader;
import org.elasticsearch.index.mapper.SortedNumericDocValuesSyntheticFieldLoaderLayer;
import org.elasticsearch.index.mapper.SourceValueFetcher;
import org.elasticsearch.index.mapper.TextSearchInfo;
import org.elasticsearch.index.mapper.TimeSeriesParams;
Expand Down Expand Up @@ -841,7 +841,7 @@ public DocValuesLoader docValuesLoader(LeafReader reader, int[] docIdsInLeaf) th
metricDocValues.clear();
for (Metric m : metrics) {
String fieldName = subfieldName(name, m);
SortedNumericDocValues dv = SortedNumericDocValuesSyntheticFieldLoader.docValuesOrNull(reader, fieldName);
SortedNumericDocValues dv = SortedNumericDocValuesSyntheticFieldLoaderLayer.docValuesOrNull(reader, fieldName);
if (dv != null) {
metricDocValues.put(m, dv);
}
Expand Down
Loading